Add otel tracer

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2026-01-21 16:59:53 +08:00
parent b8f89ab655
commit 3f44d2d9c2
6 changed files with 112 additions and 1 deletions

58
tracer/otel_tracer.go Normal file
View File

@@ -0,0 +1,58 @@
package tracer
import (
"context"
"log/slog"
"time"
"github.com/spf13/viper"
"go.opentelemetry.io/otel"
"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.24.0"
)
func Init(ctx context.Context) func(context.Context) error {
endpoint := viper.GetString("tracer.otel_controller_endpoint")
if endpoint == "" {
endpoint = "localhost:4317"
}
clientCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
exporter, err := otlptracegrpc.New(clientCtx,
otlptracegrpc.WithEndpoint(endpoint),
otlptracegrpc.WithInsecure(),
)
if err != nil {
slog.Error("[Tracer] Failed to create trace exporter", "err", err)
return func(context.Context) error { return nil }
}
res, err := resource.New(ctx,
resource.WithAttributes(
semconv.ServiceNameKey.String("nixcn-cms-backend"),
),
)
if err != nil {
slog.Error("[Tracer] Failed to create resource", "err", err)
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(res),
sdktrace.WithSampler(sdktrace.AlwaysSample()),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
))
return tp.Shutdown
}