feat(telemetry): bridge configurable gateway trace headers

This commit is contained in:
2026-10-06 21:21:35 +08:00
parent d65af03162
commit 9665fb5974
20 changed files with 484 additions and 25 deletions

View File

@@ -21,10 +21,11 @@ import (
)
type Config struct {
Service string `json:"service"`
SampleRatio float64 `json:"sampleRatio"`
Exporter sdktrace.SpanExporter `json:"-"`
Reader sdkmetric.Reader `json:"-"`
Service string `json:"service"`
SampleRatio float64 `json:"sampleRatio"`
Exporter sdktrace.SpanExporter `json:"-"`
Reader sdkmetric.Reader `json:"-"`
Propagator propagation.TextMapPropagator `json:"-"`
}
type Runtime struct {
traces *sdktrace.TracerProvider
@@ -48,7 +49,11 @@ func New(cfg Config) (*Runtime, error) {
if cfg.Reader != nil {
metricOptions = append(metricOptions, sdkmetric.WithReader(cfg.Reader))
}
r := &Runtime{traces: sdktrace.NewTracerProvider(traceOptions...), meters: sdkmetric.NewMeterProvider(metricOptions...), propagator: propagation.TraceContext{}}
propagator := cfg.Propagator
if propagator == nil {
propagator = propagation.TraceContext{}
}
r := &Runtime{traces: sdktrace.NewTracerProvider(traceOptions...), meters: sdkmetric.NewMeterProvider(metricOptions...), propagator: propagator}
r.tracer = r.traces.Tracer("git.yuntuo.hk/k2safe/go-omni")
meter := r.meters.Meter("git.yuntuo.hk/k2safe/go-omni")
r.duration, _ = meter.Float64Histogram("http.server.request.duration", metric.WithUnit("s"), metric.WithExplicitBucketBoundaries(.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10))
@@ -121,8 +126,14 @@ func (r *Runtime) Middleware() httpx.Middleware {
r.duration.Record(ctx, time.Since(started).Seconds(), metric.WithAttributes(attrs...))
span.End()
// Preserve correlation for outer access-log middleware without
// exposing an ended span as its active span.
c.WithContext(logx.WithTraceID(parent, span.SpanContext().TraceID().String()))
// exposing an ended span as its active span. A custom propagator may
// have supplied a request ID that the built-in RequestID middleware
// did not know about, so carry that value back as well.
outer := logx.WithTraceID(parent, span.SpanContext().TraceID().String())
if requestID := logx.RequestID(ctx); requestID != "" {
outer = logx.WithRequestID(outer, requestID)
}
c.WithContext(outer)
if p != nil {
panic(p)
}