mirror of
https://github.com/hanzoai/traces.git
synced 2026-10-30 18:20:41 +00:00
* Move tracing install to pkg/tracing * Maintain composite version * Drop build references in favor of version
72 lines
2.0 KiB
Go
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)
|
|
}
|