From fe7e4ef552f10713e2d3d30bd8a5cc379ff166b0 Mon Sep 17 00:00:00 2001 From: Bryan Frimin Date: Wed, 2 Jul 2025 10:08:07 +0200 Subject: [PATCH] Add tracing and logging to html2pdf Signed-off-by: Bryan Frimin --- pkg/html2pdf/converter.go | 48 ++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/pkg/html2pdf/converter.go b/pkg/html2pdf/converter.go index 6833c48c6..9560c9635 100644 --- a/pkg/html2pdf/converter.go +++ b/pkg/html2pdf/converter.go @@ -25,6 +25,9 @@ import ( "github.com/chromedp/cdproto/page" "github.com/chromedp/chromedp" "go.gearno.de/kit/log" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" ) var ( @@ -32,6 +35,8 @@ var ( var ready bool return chromedp.Evaluate(`document.readyState === 'complete'`, &ready).Do(ctx) } + + tracerName = "github.com/getprobo/probo/pkg/html2pdf" ) type ( @@ -49,8 +54,10 @@ type ( Option func(*Converter) Converter struct { - l *log.Logger - addr string + l *log.Logger + tracerProvider trace.TracerProvider + tracer trace.Tracer + addr string } ) @@ -60,16 +67,24 @@ func WithLogger(l *log.Logger) Option { } } +func WithTracerProvider(tp trace.TracerProvider) Option { + return func(c *Converter) { + c.tracerProvider = tp + } +} + func NewConverter(addr string, opts ...Option) *Converter { c := &Converter{ - addr: addr, - l: log.NewLogger(log.WithOutput(io.Discard)), + addr: addr, + l: log.NewLogger(log.WithOutput(io.Discard)), + tracerProvider: otel.GetTracerProvider(), } for _, opt := range opts { opt(c) } - c.l = c.l.Named("mdpdf").With(log.String("addr", addr)) + c.l = c.l.Named("html2pdf").With(log.String("addr", addr)) + c.tracer = c.tracerProvider.Tracer(tracerName) return c } @@ -93,6 +108,20 @@ func getPageDimensions(format PageFormat, orientation Orientation) (width, heigh } func (c *Converter) GeneratePDF(ctx context.Context, htmlDocument []byte, cfg RenderConfig) (io.Reader, error) { + var ( + rootSpan = trace.SpanFromContext(ctx) + span trace.Span + ) + + if rootSpan.IsRecording() { + ctx, span = c.tracer.Start( + ctx, + "GeneratePDF", + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + } + allocCtx, cancel := chromedp.NewRemoteAllocator(ctx, c.addr) defer cancel() @@ -156,7 +185,14 @@ func (c *Converter) GeneratePDF(ctx context.Context, htmlDocument []byte, cfg Re ) if err != nil { - return nil, fmt.Errorf("cannot run chromedp: %w", err) + err2 := fmt.Errorf("cannot run chromedp: %w", err) + + if rootSpan.IsRecording() { + span.RecordError(err2) + span.SetStatus(codes.Error, err2.Error()) + } + + return nil, err2 } return bytes.NewReader(pdfBytes), nil