MCPcopy
hub / github.com/grafana/dskit / NewOTelFromEnv

Function NewOTelFromEnv

tracing/otel.go:37–95  ·  view source on GitHub ↗

NewOTelFromEnv is a convenience function to allow OpenTelemetry tracing configuration via environment variables. Refer to official OTel SDK configuration docs to see the available options. https://opentelemetry.io/docs/languages/sdk-configuration/general/

(serviceName string, logger log.Logger, opts ...OTelOption)

Source from the content-addressed store, hash-verified

35// Refer to official OTel SDK configuration docs to see the available options.
36// https://opentelemetry.io/docs/languages/sdk-configuration/general/
37func NewOTelFromEnv(serviceName string, logger log.Logger, opts ...OTelOption) (io.Closer, error) {
38 if os.Getenv("OTEL_TRACES_EXPORTER") == "" && os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT") == "" && os.Getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT") == "" {
39 // No tracing is configured, so don't initialize the tracer as it would complain on every span about localhost:4718 not accepting traces.
40 return ioCloser(func() error { return nil }), nil
41 }
42
43 level.Info(logger).Log("msg", "initialising OpenTelemetry tracer")
44
45 exp, err := autoexport.NewSpanExporter(context.Background())
46 if err != nil {
47 return nil, fmt.Errorf("failed to create OTEL exporter: %w", err)
48 }
49
50 var cfg config
51 for _, opt := range opts {
52 opt.apply(&cfg)
53 }
54
55 resource, err := NewResource(serviceName, cfg.resourceAttributes)
56 if err != nil {
57 return nil, fmt.Errorf("failed to initialise trace resource: %w", err)
58 }
59
60 options := []tracesdk.TracerProviderOption{
61 tracesdk.WithBatcher(exp),
62 tracesdk.WithResource(resource),
63 }
64 if jaegerRemoteSampler, ok, err := maybeJaegerRemoteSamplerFromEnv(serviceName); err != nil {
65 return nil, fmt.Errorf("failed to create Jaeger remote sampler: %w", err)
66 } else if ok {
67 options = append(options, tracesdk.WithSampler(&JaegerDebuggingSampler{jaegerRemoteSampler}))
68 } else {
69 options = append(options, tracesdk.WithSampler(&JaegerDebuggingSampler{otelSamplerFromEnv()}))
70 }
71 options = append(options, cfg.tracerProviderOptions...)
72
73 level.Debug(logger).Log("msg", "OpenTelemetry tracer provider initialized from OTel environment variables")
74 tpsdk := tracesdk.NewTracerProvider(options...)
75 tp := trace.TracerProvider(tpsdk)
76 if !cfg.pyroscopeDisabled {
77 tp = otelpyroscope.NewTracerProvider(tp)
78 }
79
80 otel.SetTracerProvider(tp)
81 otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(OTelPropagatorsFromEnv()...))
82 otel.SetErrorHandler(otelErrorHandlerFunc(func(err error) {
83 level.Error(logger).Log("msg", "OpenTelemetry.ErrorHandler", "err", err)
84 }))
85
86 return ioCloser(func() error {
87 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
88 defer cancel()
89 if err := tpsdk.Shutdown(ctx); err != nil {
90 level.Error(logger).Log("msg", "OpenTelemetry trace provider failed to shutdown", "err", err)
91 return err
92 }
93 return nil
94 }), nil

Callers 5

initFunction · 0.92
TestNoTracingConfiguredFunction · 0.92
NewOTelOrJaegerFromEnvFunction · 0.85
TestNewOTelFromEnvFunction · 0.85

Calls 11

ioCloserFuncType · 0.85
NewResourceFunction · 0.85
otelSamplerFromEnvFunction · 0.85
OTelPropagatorsFromEnvFunction · 0.85
otelErrorHandlerFuncFuncType · 0.85
ErrorfMethod · 0.80
applyMethod · 0.65
LogMethod · 0.45
ErrorMethod · 0.45
ShutdownMethod · 0.45

Tested by 4

initFunction · 0.74
TestNoTracingConfiguredFunction · 0.74
TestNewOTelFromEnvFunction · 0.68