@@ -4,24 +4,34 @@ import (
44 "context"
55 "fmt"
66 "strings"
7+ "time"
78
8- "github.com/google/uuid"
9+ "go.opentelemetry.io/otel/sdk/resource"
10+ semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
911
1012 "github.com/NdoleStudio/httpsms/pkg/telemetry"
1113 "github.com/gofiber/fiber/v2"
14+ "github.com/google/uuid"
1215 "github.com/palantir/stacktrace"
1316 "go.opentelemetry.io/otel"
1417 "go.opentelemetry.io/otel/attribute"
18+ "go.opentelemetry.io/otel/metric"
1519 "go.opentelemetry.io/otel/trace"
1620)
1721
1822const (
19- clientVersionHeader = "X-Client-Version"
23+ clientVersionHeader = "X-Client-Version"
24+ metricNameHTTPServerDuration = "http.server.duration"
2025)
2126
2227// OtelTraceContext adds a trace for an HTTP request
23- func OtelTraceContext (tracer telemetry.Tracer , logger telemetry.Logger , header string , namespace string ) fiber.Handler {
28+ func OtelTraceContext (tracer telemetry.Tracer , logger telemetry.Logger , resources * resource.Resource , namespace string ) fiber.Handler {
29+ httpServerDuration , err := otel .GetMeterProvider ().Meter (namespace ).Int64Histogram (metricNameHTTPServerDuration , metric .WithUnit ("ms" ), metric .WithDescription ("measures the duration inbound HTTP requests" ))
30+ if err != nil {
31+ otel .Handle (err )
32+ }
2433 return func (c * fiber.Ctx ) error {
34+ start := time .Now ()
2535 otelTracer := otel .Tracer (namespace )
2636 ctx , span := otelTracer .Start (context .Background (), fmt .Sprintf ("%s %s" , c .Method (), fixURL (c .OriginalURL ())), trace .WithSpanKind (trace .SpanKindServer ))
2737 defer span .End ()
@@ -40,6 +50,14 @@ func OtelTraceContext(tracer telemetry.Tracer, logger telemetry.Logger, header s
4050
4151 c .Locals (telemetry .TracerContextKey , trace .ContextWithSpan (ctx , span ))
4252
53+ defer func () {
54+ attributes := append ([]attribute.KeyValue {
55+ semconv .HTTPMethod (c .Method ()),
56+ semconv .HTTPURL (fixURL (c .OriginalURL ())),
57+ }, resources .Attributes ()... )
58+ httpServerDuration .Record (ctx , time .Since (start ).Milliseconds (), metric .WithAttributes (attributes ... ))
59+ }()
60+
4361 // Go to next middleware:
4462 response := c .Next ()
4563
0 commit comments