github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/lib/telemetry/httpmetrics/metrics.go (about) 1 // Package httpmetrics - Content managed by Project Forge, see [projectforge.md] for details. 2 package httpmetrics 3 4 import ( 5 "net/http" 6 "sync" 7 8 "github.com/prometheus/client_golang/prometheus" 9 10 "github.com/kyleu/dbaudit/app/lib/telemetry" 11 "github.com/kyleu/dbaudit/app/util" 12 ) 13 14 var ( 15 reqCnt *prometheus.CounterVec 16 reqDur *prometheus.HistogramVec 17 reqSize prometheus.Summary 18 rspSize prometheus.Summary 19 20 metricsMu sync.Mutex 21 ) 22 23 type Metrics struct { 24 Key string 25 MetricsPath string 26 } 27 28 func NewMetrics(key string, logger util.Logger) *Metrics { 29 m := &Metrics{Key: key, MetricsPath: defaultMetricPath} 30 if reqCnt == nil { 31 metricsMu.Lock() 32 if reqCnt == nil { 33 registerHTTPMetrics(logger) 34 } 35 metricsMu.Unlock() 36 } 37 return m 38 } 39 40 func InjectHTTP(statusCode int, r *http.Request, span *telemetry.Span) { 41 span.Attributes( 42 &telemetry.Attribute{Key: "http.host", Value: r.Host}, 43 &telemetry.Attribute{Key: "http.method", Value: r.Method}, 44 &telemetry.Attribute{Key: "http.url", Value: r.URL.String()}, 45 &telemetry.Attribute{Key: "http.scheme", Value: r.URL.Scheme}, 46 ) 47 if s := r.Header.Get("User-Agent"); s != "" { 48 span.Attribute("http.user_agent", s) 49 } 50 if s := r.Header.Get("Content-Length"); s != "" { 51 span.Attribute("http.request_content_length", s) 52 } 53 span.SetHTTPStatus(statusCode) 54 } 55 56 func registerHTTPMetrics(logger util.Logger) { 57 subsystem := "http" 58 reqCnt = telemetry.MetricsCounter(subsystem, "requests_total", "The HTTP request counts processed.", logger, "key", "code", "method") 59 reqDur = telemetry.MetricsHistogram(subsystem, "request_duration_seconds", "The HTTP request duration in seconds.", logger, "key", "code") 60 reqSize = telemetry.MetricsSummary(subsystem, "request_size_bytes", "The HTTP request sizes in bytes.", logger) 61 rspSize = telemetry.MetricsSummary(subsystem, "response_size_bytes", "The HTTP response sizes in bytes.", logger) 62 }