tracing.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package tracing
  2. import (
  3. "context"
  4. "github.com/gin-gonic/gin"
  5. "go.opentelemetry.io/otel"
  6. "go.opentelemetry.io/otel/exporters/jaeger"
  7. "go.opentelemetry.io/otel/propagation"
  8. "go.opentelemetry.io/otel/sdk/resource"
  9. tracesdk "go.opentelemetry.io/otel/sdk/trace"
  10. semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
  11. "go.opentelemetry.io/otel/trace"
  12. )
  13. // NewTracerProvider returns an OpenTelemetry TracerProvider configured to use
  14. // the Jaeger exporter that will send spans to the provided url. The returned
  15. // TracerProvider will also use a Resource configured with all the information
  16. // about the application.
  17. func NewTracerProvider(serviceName, version, serviceID, url string) (*tracesdk.TracerProvider, error) {
  18. // Create the Jaeger exporter
  19. exp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))
  20. if err != nil {
  21. return nil, err
  22. }
  23. tp := tracesdk.NewTracerProvider(
  24. tracesdk.WithBatcher(exp),
  25. tracesdk.WithResource(resource.NewWithAttributes(
  26. semconv.SchemaURL,
  27. semconv.ServiceNameKey.String(serviceName),
  28. semconv.ServiceVersionKey.String(version),
  29. semconv.ServiceInstanceIDKey.String(serviceID),
  30. )),
  31. tracesdk.WithSampler(tracesdk.AlwaysSample()),
  32. )
  33. otel.SetTracerProvider(tp)
  34. otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
  35. return tp, nil
  36. }
  37. // func TracingContextWrapper(next http.Handler) http.Handler {
  38. // return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  39. // propagator, md := otel.GetTextMapPropagator(), make(metadata.Metadata)
  40. // propagator.Inject(r.Context(), propagation.MapCarrier(md))
  41. // r2 := r.WithContext(metadata.NewContext(r.Context(), md))
  42. // next.ServeHTTP(w, r2)
  43. // })
  44. // }
  45. func NewTracingContextWrapper() gin.HandlerFunc {
  46. return func(c *gin.Context) {
  47. propagator := otel.GetTextMapPropagator()
  48. // 从 Gin 上下文中提取 HTTP 请求头
  49. md := make(map[string]string)
  50. propagator.Inject(c.Request.Context(), propagation.HeaderCarrier(c.Request.Header))
  51. propagator.Inject(c.Request.Context(), propagation.MapCarrier(md))
  52. // 创建包含提取的元数据的新 Gin 上下文
  53. ctx := trace.ContextWithSpan(c.Request.Context(), trace.SpanFromContext(c.Request.Context()))
  54. ctx = context.WithValue(ctx, "metadata", md)
  55. c.Request = c.Request.WithContext(ctx)
  56. // 继续处理请求
  57. c.Next()
  58. }
  59. }