Skip to content

Commit f91bdfc

Browse files
committed
Add http request duration metric
1 parent 1cbafa1 commit f91bdfc

3 files changed

Lines changed: 23 additions & 5 deletions

File tree

api/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ require (
3737
github.com/thedevsaddam/govalidator v1.9.10
3838
github.com/uptrace/uptrace-go v1.16.0
3939
go.opentelemetry.io/otel v1.16.0
40+
go.opentelemetry.io/otel/metric v1.16.0
4041
go.opentelemetry.io/otel/sdk v1.16.0
4142
go.opentelemetry.io/otel/sdk/metric v0.39.0
4243
go.opentelemetry.io/otel/trace v1.16.0
@@ -127,7 +128,6 @@ require (
127128
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect
128129
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.16.0 // indirect
129130
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.16.0 // indirect
130-
go.opentelemetry.io/otel/metric v1.16.0 // indirect
131131
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
132132
go.uber.org/atomic v1.11.0 // indirect
133133
go.uber.org/multierr v1.11.0 // indirect

api/pkg/di/container.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ func (container *Container) App() (app *fiber.App) {
151151
app.Use(fiberLogger.New())
152152
}
153153

154-
app.Use(middlewares.OtelTraceContext(container.Tracer(), container.Logger(), "X-Cloud-Trace-Context", os.Getenv("GCP_PROJECT_ID")))
154+
app.Use(middlewares.OtelTraceContext(container.Tracer(), container.Logger(), container.OtelResources(container.version, container.projectID), os.Getenv("GCP_PROJECT_ID")))
155155

156156
// Default config
157157
app.Use(cors.New())

api/pkg/middlewares/otel_context_middleware.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

1822
const (
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

Comments
 (0)