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  }