Sobes.tech
Back to questions
Senior
5

Как измерить время выполнения HTTP-ручки используя только counters (без histogram)?

Companies where asked
Не указано

Answer from AI

sobes.tech AI

Если нельзя использовать гистограммы, а есть только счётчики (counters), можно приблизительно оценить время выполнения HTTP-ручки, используя два счётчика:

  1. Счётчик общего количества вызовов ручки (например, requests_total).
  2. Счётчик суммарного времени выполнения всех вызовов (например, requests_duration_seconds_total).

В каждом обработчике HTTP нужно:

  • Засечь время начала и конца обработки запроса.
  • Добавить 1 к счётчику вызовов.
  • Добавить разницу времени (продолжительность) к счётчику суммарного времени.

Среднее время выполнения можно получить как отношение суммарного времени к количеству вызовов:

var (
    requestsTotal = prometheus.NewCounter(prometheus.CounterOpts{Name: "requests_total"})
    requestsDuration = prometheus.NewCounter(prometheus.CounterOpts{Name: "requests_duration_seconds_total"})
)

func handler(w http.ResponseWriter, r *http.Request) {
    start := time.Now()
    // обработка запроса
    // ...
    duration := time.Since(start).Seconds()

    requestsTotal.Inc()
    requestsDuration.Add(duration)
}

Таким образом, хотя мы не получаем распределение времени, можно вычислить среднее время выполнения: requests_duration_seconds_total / requests_total. Это простой и эффективный способ при ограничениях на использование гистограмм.