otelhandler.go 964 B

123456789101112131415161718192021222324252627282930313233343536
  1. package handler
  2. import (
  3. "net/http"
  4. "github.com/tal-tech/go-zero/core/opentelemetry"
  5. "go.opentelemetry.io/otel"
  6. "go.opentelemetry.io/otel/propagation"
  7. semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
  8. oteltrace "go.opentelemetry.io/otel/trace"
  9. )
  10. func OtelHandler(path string) func(http.Handler) http.Handler {
  11. return func(next http.Handler) http.Handler {
  12. if !opentelemetry.Enabled() {
  13. return next
  14. }
  15. propagator := otel.GetTextMapPropagator()
  16. tracer := otel.GetTracerProvider().Tracer(opentelemetry.TraceName)
  17. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  18. ctx := propagator.Extract(r.Context(), propagation.HeaderCarrier(r.Header))
  19. spanCtx, span := tracer.Start(
  20. ctx,
  21. path,
  22. oteltrace.WithSpanKind(oteltrace.SpanKindServer),
  23. oteltrace.WithAttributes(semconv.HTTPServerAttributesFromHTTPRequest("", path, r)...),
  24. )
  25. defer span.End()
  26. next.ServeHTTP(w, r.WithContext(spanCtx))
  27. })
  28. }
  29. }