Skip to content

Commit

Permalink
updates jaeger tracer to shutdown in the main call
Browse files Browse the repository at this point in the history
Signed-off-by: Afzal Ansari <afzal442@gmail.com>
  • Loading branch information
afzal442 committed Jul 13, 2023
1 parent ce29456 commit d429861
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 19 deletions.
1 change: 1 addition & 0 deletions cmd/query/app/handler_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

Expand Down
2 changes: 1 addition & 1 deletion cmd/query/app/http_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
57 changes: 40 additions & 17 deletions pkg/jtracer/jtracer.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
}
3 changes: 2 additions & 1 deletion plugin/metrics/prometheus/metricsstore/reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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),
Expand Down

0 comments on commit d429861

Please sign in to comment.