tracinghandler.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package handler
  2. import (
  3. "net/http"
  4. "github.com/zeromicro/go-zero/core/trace"
  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. // TracingHandler return a middleware that process the opentelemetry.
  11. func TracingHandler(serviceName, path string) func(http.Handler) http.Handler {
  12. return func(next http.Handler) http.Handler {
  13. propagator := otel.GetTextMapPropagator()
  14. tracer := otel.GetTracerProvider().Tracer(trace.TraceName)
  15. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  16. ctx := propagator.Extract(r.Context(), propagation.HeaderCarrier(r.Header))
  17. spanName := path
  18. if len(spanName) == 0 {
  19. spanName = r.URL.Path
  20. }
  21. spanCtx, span := tracer.Start(
  22. ctx,
  23. spanName,
  24. oteltrace.WithSpanKind(oteltrace.SpanKindServer),
  25. oteltrace.WithAttributes(semconv.HTTPServerAttributesFromHTTPRequest(
  26. serviceName, spanName, r)...),
  27. )
  28. defer span.End()
  29. // convenient for tracking error messages
  30. sc := span.SpanContext()
  31. if sc.HasTraceID() {
  32. w.Header().Set(trace.TraceIdKey, sc.TraceID().String())
  33. }
  34. next.ServeHTTP(w, r.WithContext(spanCtx))
  35. })
  36. }
  37. }