Files
Zach LeslieandGitHub 576c7e10a5 Move tracing install to pkg/tracing (#5634)
* Move tracing install to pkg/tracing

* Maintain composite version

* Drop build references in favor of version
2025-09-11 16:45:48 +00:00

72 lines
2.0 KiB
Go

// Package tracing provides OpenTelemetry tracing setup for the application.
package tracing
import (
"context"
"fmt"
"os"
"time"
"github.com/go-kit/log/level"
"github.com/grafana/tempo/pkg/util/log"
"github.com/prometheus/common/version"
"go.opentelemetry.io/contrib/exporters/autoexport"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
tracesdk "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.25.0"
)
func InstallOpenTelemetryTracer(appName, target string) (func(), error) {
level.Info(log.Logger).Log("msg", "initialising OpenTelemetry tracer")
exp, err := autoexport.NewSpanExporter(context.Background())
if err != nil {
return nil, fmt.Errorf("failed to create OTEL exporter: %w", err)
}
resources, err := resource.New(context.Background(),
resource.WithAttributes(
semconv.ServiceNameKey.String(fmt.Sprintf("%s-%s", appName, target)),
semconv.ServiceVersionKey.String(fmt.Sprintf("%s-%s", version.Version, version.Revision)),
),
resource.WithHost(),
resource.WithTelemetrySDK(),
)
if err != nil {
return nil, fmt.Errorf("failed to initialise trace resources: %w", err)
}
otel.SetErrorHandler(otelErrorHandlerFunc(func(err error) {
level.Error(log.Logger).Log("msg", "OpenTelemetry.ErrorHandler", "err", err)
}))
tp := tracesdk.NewTracerProvider(
tracesdk.WithBatcher(exp),
tracesdk.WithResource(resources),
)
otel.SetTracerProvider(tp)
shutdown := func() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := tp.Shutdown(ctx); err != nil {
level.Error(log.Logger).Log("msg", "OpenTelemetry trace provider failed to shutdown", "err", err)
os.Exit(1)
}
}
propagator := propagation.NewCompositeTextMapPropagator(propagation.Baggage{}, propagation.TraceContext{})
otel.SetTextMapPropagator(propagator)
return shutdown, nil
}
type otelErrorHandlerFunc func(error)
// Handle implements otel.ErrorHandler
func (f otelErrorHandlerFunc) Handle(err error) {
f(err)
}