mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-18 21:22:15 +01:00
refactor(libreoffice): classify Pdf errors and set span error.type
This commit is contained in:
@@ -635,20 +635,11 @@ func (a *Api) Pdf(ctx context.Context, logger *slog.Logger, inputPath, outputPat
|
|||||||
reason := ""
|
reason := ""
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch {
|
status = "error"
|
||||||
case errors.Is(err, context.DeadlineExceeded):
|
if errors.Is(err, context.DeadlineExceeded) {
|
||||||
status = "timeout"
|
status = "timeout"
|
||||||
reason = "timeout"
|
|
||||||
case errors.Is(err, context.Canceled):
|
|
||||||
status = "error"
|
|
||||||
reason = "context_cancelled"
|
|
||||||
case errors.Is(err, gotenberg.ErrMaximumQueueSizeExceeded) || errors.Is(err, gotenberg.ErrProcessAlreadyRestarting):
|
|
||||||
status = "error"
|
|
||||||
reason = "libreoffice_unavailable"
|
|
||||||
default:
|
|
||||||
status = "error"
|
|
||||||
reason = "unknown"
|
|
||||||
}
|
}
|
||||||
|
reason = libreofficeErrorType(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Record metrics.
|
// Record metrics.
|
||||||
@@ -657,6 +648,7 @@ func (a *Api) Pdf(ctx context.Context, logger *slog.Logger, inputPath, outputPat
|
|||||||
|
|
||||||
if reason != "" {
|
if reason != "" {
|
||||||
a.errsCounter.Add(ctx, 1, metric.WithAttributes(attribute.String("reason", reason)))
|
a.errsCounter.Add(ctx, 1, metric.WithAttributes(attribute.String("reason", reason)))
|
||||||
|
gotenberg.SpanErrorType(span, reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !conversionStart.IsZero() {
|
if !conversionStart.IsZero() {
|
||||||
@@ -688,6 +680,22 @@ func (a *Api) Pdf(ctx context.Context, logger *slog.Logger, inputPath, outputPat
|
|||||||
return fmt.Errorf("supervisor run task: %w", err)
|
return fmt.Errorf("supervisor run task: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// libreofficeErrorType maps a conversion error to LibreOffice's bounded reason
|
||||||
|
// value, reused as the span error.type. Generic failures fall back to
|
||||||
|
// [gotenberg.ClassifyError].
|
||||||
|
func libreofficeErrorType(err error) string {
|
||||||
|
switch {
|
||||||
|
case errors.Is(err, ErrInvalidPdfFormats):
|
||||||
|
return gotenberg.ErrorTypeInvalidInput
|
||||||
|
case errors.Is(err, ErrUnoException), errors.Is(err, ErrRuntimeException):
|
||||||
|
return "libreoffice_exception"
|
||||||
|
case errors.Is(err, gotenberg.ErrMaximumQueueSizeExceeded), errors.Is(err, gotenberg.ErrProcessAlreadyRestarting):
|
||||||
|
return "libreoffice_unavailable"
|
||||||
|
default:
|
||||||
|
return gotenberg.ClassifyError(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Extensions returns the file extensions available for conversions.
|
// Extensions returns the file extensions available for conversions.
|
||||||
// FIXME: don't care, take all on the route level?
|
// FIXME: don't care, take all on the route level?
|
||||||
func (a *Api) Extensions() []string {
|
func (a *Api) Extensions() []string {
|
||||||
|
|||||||
33
pkg/modules/libreoffice/api/errortype_test.go
Normal file
33
pkg/modules/libreoffice/api/errortype_test.go
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/gotenberg/gotenberg/v8/pkg/gotenberg"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestLibreofficeErrorType(t *testing.T) {
|
||||||
|
for _, tc := range []struct {
|
||||||
|
name string
|
||||||
|
err error
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{"deadline", context.DeadlineExceeded, "timeout"},
|
||||||
|
{"canceled", context.Canceled, "context_cancelled"},
|
||||||
|
{"invalid pdf formats", ErrInvalidPdfFormats, "invalid_input"},
|
||||||
|
{"uno exception", ErrUnoException, "libreoffice_exception"},
|
||||||
|
{"runtime exception", ErrRuntimeException, "libreoffice_exception"},
|
||||||
|
{"queue size exceeded", gotenberg.ErrMaximumQueueSizeExceeded, "libreoffice_unavailable"},
|
||||||
|
{"process restarting", gotenberg.ErrProcessAlreadyRestarting, "libreoffice_unavailable"},
|
||||||
|
{"core dumped", ErrCoreDumped, "unknown"},
|
||||||
|
{"unknown", errors.New("boom"), "unknown"},
|
||||||
|
} {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
if got := libreofficeErrorType(tc.err); got != tc.want {
|
||||||
|
t.Errorf("libreofficeErrorType(%v) = %q, want %q", tc.err, got, tc.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user