mirror of https://github.com/grafana/grafana
Add interface Tracer, add Opentelemetry (#41963)
* Add interface Tracer, add Opentelemetry * Fix lint * Fix failing tests and return error if config not parsed fo opentelemetry * Update defaults.ini Add comment with jaeger url * go mod tidy * Remove comments that are not needed * Move OpentracingSpan to tracing.go * Add opentelemetry to sample.inipull/42612/head
parent
be578e5700
commit
d993b12415
@ -0,0 +1,123 @@ |
|||||||
|
package tracing |
||||||
|
|
||||||
|
import ( |
||||||
|
"context" |
||||||
|
"time" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/infra/log" |
||||||
|
"github.com/grafana/grafana/pkg/setting" |
||||||
|
"go.opentelemetry.io/otel" |
||||||
|
"go.opentelemetry.io/otel/attribute" |
||||||
|
"go.opentelemetry.io/otel/exporters/jaeger" |
||||||
|
"go.opentelemetry.io/otel/sdk/resource" |
||||||
|
tracesdk "go.opentelemetry.io/otel/sdk/trace" |
||||||
|
semconv "go.opentelemetry.io/otel/semconv/v1.4.0" |
||||||
|
trace "go.opentelemetry.io/otel/trace" |
||||||
|
) |
||||||
|
|
||||||
|
type Tracer interface { |
||||||
|
Start(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, Span) |
||||||
|
Run(context.Context) error |
||||||
|
} |
||||||
|
|
||||||
|
type Span interface { |
||||||
|
End() |
||||||
|
SetAttributes(kv ...attribute.KeyValue) |
||||||
|
} |
||||||
|
|
||||||
|
var ( |
||||||
|
GlobalTracer trace.Tracer |
||||||
|
) |
||||||
|
|
||||||
|
type OpentelemetryTracingService struct { |
||||||
|
enabled bool |
||||||
|
address string |
||||||
|
log log.Logger |
||||||
|
|
||||||
|
tracerProvider *tracesdk.TracerProvider |
||||||
|
|
||||||
|
Cfg *setting.Cfg |
||||||
|
} |
||||||
|
|
||||||
|
type OpentelemetrySpan struct { |
||||||
|
span trace.Span |
||||||
|
} |
||||||
|
|
||||||
|
func (ots *OpentelemetryTracingService) parseSettingsOpentelemetry() error { |
||||||
|
section, err := ots.Cfg.Raw.GetSection("tracing.opentelemetry.jaeger") |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
ots.address = section.Key("address").MustString("") |
||||||
|
if ots.address != "" { |
||||||
|
ots.enabled = true |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (ots *OpentelemetryTracingService) initTracerProvider() (*tracesdk.TracerProvider, error) { |
||||||
|
// Create the Jaeger exporter
|
||||||
|
exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(ots.address))) |
||||||
|
if err != nil { |
||||||
|
return nil, err |
||||||
|
} |
||||||
|
|
||||||
|
tp := tracesdk.NewTracerProvider( |
||||||
|
tracesdk.WithBatcher(exp), |
||||||
|
tracesdk.WithResource(resource.NewWithAttributes( |
||||||
|
semconv.SchemaURL, |
||||||
|
semconv.ServiceNameKey.String("grafana"), |
||||||
|
attribute.String("environment", "production"), |
||||||
|
)), |
||||||
|
) |
||||||
|
|
||||||
|
return tp, nil |
||||||
|
} |
||||||
|
|
||||||
|
func (ots *OpentelemetryTracingService) initOpentelemetryTracer() error { |
||||||
|
tp, err := ots.initTracerProvider() |
||||||
|
if err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
// Register our TracerProvider as the global so any imported
|
||||||
|
// instrumentation in the future will default to using it
|
||||||
|
// only if tracing is enabled
|
||||||
|
if ots.enabled { |
||||||
|
otel.SetTracerProvider(tp) |
||||||
|
} |
||||||
|
|
||||||
|
ots.tracerProvider = tp |
||||||
|
GlobalTracer = otel.GetTracerProvider().Tracer("component-main") |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (ots *OpentelemetryTracingService) Run(ctx context.Context) error { |
||||||
|
<-ctx.Done() |
||||||
|
|
||||||
|
ots.log.Info("Closing tracing") |
||||||
|
ctxShutdown, cancel := context.WithTimeout(ctx, time.Second*5) |
||||||
|
defer cancel() |
||||||
|
|
||||||
|
if err := ots.tracerProvider.Shutdown(ctxShutdown); err != nil { |
||||||
|
return err |
||||||
|
} |
||||||
|
|
||||||
|
return nil |
||||||
|
} |
||||||
|
|
||||||
|
func (ots *OpentelemetryTracingService) Start(ctx context.Context, spanName string, opts ...trace.SpanStartOption) (context.Context, Span) { |
||||||
|
ctx, span := GlobalTracer.Start(ctx, spanName) |
||||||
|
oSpan := OpentelemetrySpan{span: span} |
||||||
|
return ctx, oSpan |
||||||
|
} |
||||||
|
|
||||||
|
func (s OpentelemetrySpan) End() { |
||||||
|
s.span.End() |
||||||
|
} |
||||||
|
|
||||||
|
func (s OpentelemetrySpan) SetAttributes(kv ...attribute.KeyValue) { |
||||||
|
s.span.SetAttributes(kv...) |
||||||
|
} |
||||||
Loading…
Reference in new issue