frostfs-observability/tracing/http/request.go
Dmitrii Stepanov 7b123d020c [#2] tracing: Add HTTP tracing module
Signed-off-by: Dmitrii Stepanov <d.stepanov@yadro.com>
2023-05-29 12:00:29 +03:00

30 lines
1 KiB
Go

package http
import (
"context"
"git.frostfs.info/TrueCloudLab/frostfs-platform/tracing"
"github.com/valyala/fasthttp"
"go.opentelemetry.io/otel/attribute"
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
"go.opentelemetry.io/otel/trace"
)
// StartServerSpan starts root HTTP server span.
func StartServerSpan(ctx context.Context, req *fasthttp.RequestCtx, operationName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
ctx = extractHTTPTraceInfo(ctx, req)
opts = append(opts, trace.WithAttributes(
attribute.String("http.client_address", req.RemoteAddr().String()),
attribute.String("http.path", string(req.Path())),
semconv.HTTPMethod(string(req.Method())),
), trace.WithSpanKind(trace.SpanKindServer))
return tracing.StartSpanFromContext(ctx, operationName, opts...)
}
func extractHTTPTraceInfo(ctx context.Context, req *fasthttp.RequestCtx) context.Context {
if req == nil {
return ctx
}
carrier := &httpCarrier{r: req}
return tracing.Propagator.Extract(ctx, carrier)
}