Как собирают метрики

Ответ

В Go метрики собирают с помощью библиотек, таких как Prometheus, expvar или OpenTelemetry.

Prometheus (наиболее популярный):

import (
    "net/http"
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var (
    requests = prometheus.NewCounter(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total HTTP requests",
        },
    )
)

func init() {
    prometheus.MustRegister(requests)
}

func handler(w http.ResponseWriter, r *http.Request) {
    requests.Inc()
    w.Write([]byte("OK"))
}

func main() {
    http.HandleFunc("/", handler)
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":8080", nil)
}

expvar (встроенный пакет):

import (
    "expvar"
    "net/http"
)

var (
    counter = expvar.NewInt("requests")
)

func handler(w http.ResponseWriter, r *http.Request) {
    counter.Add(1)
    w.Write([]byte("OK"))
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

Метрики можно экспортировать в формате JSON (/debug/vars для expvar) или Prometheus (через /metrics).

OpenTelemetry (современный стандарт): Предоставляет унифицированный набор API и SDK для сбора телеметрии (метрик, трассировок, логов) и экспорта их в различные бэкенды. Это более универсальное решение, чем Prometheus или expvar по отдельности, так как охватывает все виды телеметрии.