From d4298614660e4b87e73e7ae5f0c10953cfa3d877 Mon Sep 17 00:00:00 2001 From: Afzal Ansari Date: Thu, 13 Jul 2023 15:15:05 +0000 Subject: [PATCH] updates jaeger tracer to shutdown in the main call Signed-off-by: Afzal Ansari --- cmd/query/app/handler_options.go | 1 + cmd/query/app/http_handler_test.go | 2 +- pkg/jtracer/jtracer.go | 57 +++++++++++++------ .../metrics/prometheus/metricsstore/reader.go | 3 +- 4 files changed, 44 insertions(+), 19 deletions(-) diff --git a/cmd/query/app/handler_options.go b/cmd/query/app/handler_options.go index b39db2a3a7a..7a1459711aa 100644 --- a/cmd/query/app/handler_options.go +++ b/cmd/query/app/handler_options.go @@ -65,6 +65,7 @@ func (handlerOptions) QueryLookbackDuration(queryLookbackDuration time.Duration) func (handlerOptions) Tracer(tracer jtracer.JTracer) HandlerOption { return func(apiHandler *APIHandler) { apiHandler.tracer.OT = tracer.OT + apiHandler.tracer.OTEL = tracer.OTEL } } diff --git a/cmd/query/app/http_handler_test.go b/cmd/query/app/http_handler_test.go index 81c7f6cae09..cee3b4bc800 100644 --- a/cmd/query/app/http_handler_test.go +++ b/cmd/query/app/http_handler_test.go @@ -312,7 +312,7 @@ func TestGetTrace(t *testing.T) { ) // Use the bridgeTracer as OpenTracing tracer(otTrace). otTracer, _ := otbridge.NewTracerPair(tracerProvider.Tracer("")) - jTracer := jtracer.JTracer{OT: otTracer} + jTracer := jtracer.JTracer{OT: otTracer, OTEL: tracerProvider} ts := initializeTestServer(HandlerOptions.Tracer(jTracer)) defer ts.server.Close() diff --git a/pkg/jtracer/jtracer.go b/pkg/jtracer/jtracer.go index 31916f179cc..b426b1768cc 100644 --- a/pkg/jtracer/jtracer.go +++ b/pkg/jtracer/jtracer.go @@ -16,46 +16,54 @@ package jtracer import ( "context" + "fmt" "log" "sync" + "time" "github.com/opentracing/opentracing-go" "go.opentelemetry.io/otel" otbridge "go.opentelemetry.io/otel/bridge/opentracing" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" - "go.opentelemetry.io/otel/trace" + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" ) type JTracer struct { OT opentracing.Tracer - OTEL trace.TracerProvider + OTEL *sdktrace.TracerProvider + // logger *zap.Logger } var once sync.Once func New() JTracer { opentracingTracer, otelTracerProvider := initBoth() + + // Shutdown the tracerProvider to clean up resources + defer func() { + if err := otelTracerProvider.Shutdown(context.Background()); err != nil { + log.Fatal("Error shutting down tracer provider: %w", err) + } + }() return JTracer{OT: opentracingTracer, OTEL: otelTracerProvider} } func NoOp() JTracer { - return JTracer{OT: opentracing.NoopTracer{}, OTEL: trace.NewNoopTracerProvider()} + return JTracer{OT: opentracing.NoopTracer{}, OTEL: &sdktrace.TracerProvider{}} } // initBoth initializes OpenTelemetry SDK and uses OTel-OpenTracing Bridge -func initBoth() (opentracing.Tracer, trace.TracerProvider) { - opts := []otlptracehttp.Option{otlptracehttp.WithInsecure()} - traceExporter, err := otlptrace.New( - context.Background(), - otlptracehttp.NewClient(opts...), - ) +func initBoth() (opentracing.Tracer, *sdktrace.TracerProvider) { + ctx := context.Background() + traceExporter, err := newExporter(ctx) if err != nil { - log.Fatal("failed to create exporter: %w", err) + log.Fatal("failed to create exporter", zap.Any("error", err)) } // Register the trace exporter with a TracerProvider, using a batch @@ -78,13 +86,28 @@ func initBoth() (opentracing.Tracer, trace.TracerProvider) { }) // Use the bridgeTracer as your OpenTracing tracer(otTrace). - otTracer, wrapperTracerProvider := otbridge.NewTracerPair(tracerProvider.Tracer("")) + otTracer, _ := otbridge.NewTracerPair(tracerProvider.Tracer("")) - // Shutdown the tracerProvider to clean up resources - err = tracerProvider.Shutdown(context.Background()) + return otTracer, tracerProvider +} + +// newExporter returns a console exporter. +func newExporter(ctx context.Context) (sdktrace.SpanExporter, error) { + ctx, cancel := context.WithTimeout(ctx, time.Second) + defer cancel() + conn, err := grpc.DialContext(ctx, "otel_collector:4317", + // Note the use of insecure transport here. TLS is recommended in production. + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithBlock(), + ) if err != nil { - log.Fatal("failed to shutdown tracerProvider: ", err) + return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err) } - return otTracer, wrapperTracerProvider + // Set up a trace exporter + traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn)) + if err != nil { + return nil, fmt.Errorf("failed to create trace exporter: %w", err) + } + return traceExporter, nil } diff --git a/plugin/metrics/prometheus/metricsstore/reader.go b/plugin/metrics/prometheus/metricsstore/reader.go index 9ad141e683d..849eb49cb1c 100644 --- a/plugin/metrics/prometheus/metricsstore/reader.go +++ b/plugin/metrics/prometheus/metricsstore/reader.go @@ -29,6 +29,7 @@ import ( "github.com/prometheus/client_golang/api" promapi "github.com/prometheus/client_golang/api/prometheus/v1" "go.opentelemetry.io/otel/attribute" + sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.20.0" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" @@ -290,7 +291,7 @@ func promqlDurationString(d *time.Duration) string { return string(b) } -func startSpanForQuery(ctx context.Context, metricName, query string, tp trace.TracerProvider) (context.Context, trace.Span) { +func startSpanForQuery(ctx context.Context, metricName, query string, tp *sdktrace.TracerProvider) (context.Context, trace.Span) { ctx, span := tp.Tracer("prom-metrics-reader").Start(ctx, metricName) span.SetAttributes( attribute.Key(semconv.DBStatementKey).String(query),