package main
import (
"context"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/jaeger"
"go.opentelemetry.io/otel/sdk/trace"
)
func InitTracer(serviceName string) error {
exporter, err := jaeger.New(jaeger.WithCollectorEndpoint(
jaeger.WithEndpoint("http://localhost:14268/api/traces"),
))
if err != nil {
return err
}
tp := trace.NewTracerProvider(
trace.WithBatcher(exporter),
trace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(serviceName),
)),
)
otel.SetTracerProvider(tp)
return nil
}
func HandleRequest(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
tracer := otel.Tracer("my-service")
ctx, span := tracer.Start(ctx, "handle-request")
defer span.End()
// 调用其他服务
callUserService(ctx)
callOrderService(ctx)
w.Write([]byte("OK"))
}
func callUserService(ctx context.Context) {
tracer := otel.Tracer("my-service")
_, span := tracer.Start(ctx, "call-user-service")
defer span.End()
// HTTP请求传递TraceID
// ...
}关键要点:
- ✅ 链路追踪定位性能瓶颈
- ✅ OpenTelemetry统一标准
- ✅ Jaeger可视化分析
- ✅ TraceID跨服务传递