Files
Edu/packages/shared-go/tracer/tracer.go
SpecialX faaaf29f67 docs: ai 协作文档体系重构与多 ai 仲裁结果落地
1.AI 协作文档体系重构(objections/worklines/contracts+matrix.md)

2.coord 仲裁文档(final-decisions/cross-review/final-rulings/orchestration)

3.各服务 01/02 文档补全

4.共享包初始化(shared-ts/shared-go/hooks/ui-components/ui-tokens)

5.Proto 契约补全

6.004 架构影响地图更新

7.端口分配表

8.设计规格文档
2026-07-10 12:58:22 +08:00

93 lines
2.5 KiB
Go

// Package tracer bootstraps the OpenTelemetry SDK for a service and exports
// traces over OTLP/HTTP (default endpoint localhost:4318, overridable via the
// OTEL_EXPORTER_OTLP_ENDPOINT environment variable).
//
// Typical usage:
//
// if err := tracer.Init("api-gateway"); err != nil { log.Fatal(err) }
// defer tracer.Shutdown(context.Background())
package tracer
import (
"context"
"fmt"
"os"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"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"
"go.opentelemetry.io/otel/trace"
)
// tp is the process-wide TracerProvider created by Init and torn down by
// Shutdown.
var tp *sdktrace.TracerProvider
// Init initializes the OpenTelemetry SDK with an OTLP HTTP exporter and
// registers it as the global TracerProvider. The service is identified by
// serviceName on all exported spans.
func Init(serviceName string) error {
endpoint := os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
if endpoint == "" {
endpoint = "localhost:4318"
}
exp, err := otlptracehttp.New(
context.Background(),
otlptracehttp.WithEndpoint(endpoint),
otlptracehttp.WithInsecure(),
)
if err != nil {
return fmt.Errorf("tracer: creating OTLP exporter: %w", err)
}
res, err := resource.Merge(
resource.Default(),
resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName(serviceName),
),
)
if err != nil {
return fmt.Errorf("tracer: building resource: %w", err)
}
tp = sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exp),
sdktrace.WithResource(res),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
))
return nil
}
// Shutdown flushes pending spans and releases resources held by the
// TracerProvider. It is a no-op when Init was never called. The provided
// context bounds the flush to 5 seconds.
func Shutdown(ctx context.Context) error {
if tp == nil {
return nil
}
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
if err := tp.Shutdown(ctx); err != nil {
return fmt.Errorf("tracer: shutting down provider: %w", err)
}
return nil
}
// FromContext returns the active span from ctx. When no span is active the
// returned span is a no-op, so callers may safely record attributes or events
// without nil checks.
func FromContext(ctx context.Context) trace.Span {
return trace.SpanFromContext(ctx)
}