package middleware import ( "context" "net/http" "time" ) // O11yRecorder matches api.Deps.O11y but lets this package avoid an // import cycle. type O11yRecorder interface { RecordRequest(ctx context.Context, route string, status int, durationMs int64) } // Telemetry records every request through deps.O11y. Safe with a nil // recorder — the middleware becomes a no-op pass-through. func Telemetry(rec O11yRecorder) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { if rec == nil { return next } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() sw := &statusWriter{ResponseWriter: w, status: http.StatusOK} next.ServeHTTP(sw, r) rec.RecordRequest(r.Context(), r.URL.Path, sw.status, time.Since(start).Milliseconds()) }) } } type statusWriter struct { http.ResponseWriter status int } func (s *statusWriter) WriteHeader(code int) { s.status = code s.ResponseWriter.WriteHeader(code) }