mirror of
https://github.com/grafana/grafana.git
synced 2024-12-22 23:23:49 -06:00
Backend: Inject server-timing header to match initial loads with client-side telemetry (#94978)
feat: inject server-timing header to match initial loads with client-side telemetry Faro Web SDK can read the server-timing info and correlate the initial request with the client side telemetry gather from navigation timings.
This commit is contained in:
parent
2364299a8c
commit
89e7e25b60
@ -381,6 +381,15 @@ func TraceIDFromContext(ctx context.Context, requireSampled bool) string {
|
||||
return spanCtx.TraceID().String()
|
||||
}
|
||||
|
||||
func ServerTimingForSpan(span trace.Span) string {
|
||||
spanCtx := span.SpanContext()
|
||||
if !spanCtx.HasTraceID() || !spanCtx.IsValid() {
|
||||
return ""
|
||||
}
|
||||
|
||||
return fmt.Sprintf("00-%s-%s-01", spanCtx.TraceID().String(), spanCtx.SpanID().String())
|
||||
}
|
||||
|
||||
// Error sets the status to error and record the error as an exception in the provided span.
|
||||
func Error(span trace.Span, err error) error {
|
||||
attr := []attribute.KeyValue{}
|
||||
|
@ -94,6 +94,14 @@ func RequestTracing(tracer tracing.Tracer) web.Middleware {
|
||||
), trace.WithSpanKind(trace.SpanKindServer))
|
||||
defer span.End()
|
||||
|
||||
// inject local root span context into the response via server-timing header
|
||||
// we're doing it this early so that we can capture the root span context
|
||||
// which is not available later-on.
|
||||
serverTimingValue := tracing.ServerTimingForSpan(span)
|
||||
if serverTimingValue != "" {
|
||||
w.Header().Set("server-timing", fmt.Sprintf("traceparent;desc=\"%s\"", serverTimingValue))
|
||||
}
|
||||
|
||||
req = req.WithContext(ctx)
|
||||
|
||||
// Ensure the response writer's status can be captured.
|
||||
|
Loading…
Reference in New Issue
Block a user