Как я могу измерить продолжительность каждого ответа API, используя `http_server_requests_seconds_sum`

В Grafana я хочу показать, сколько времени требуется моим API для возврата ответа.

Итак, что я сделал, так это создал панель инструментов, затем панель и добавил туда эти запросы prometheus:

  • http_server_requests_seconds_sum{uri = "/doc"}
  • http_server_requests_seconds_sum{uri = "/list-doc"}
  • http_server_requests_seconds_sum{uri = "/cont"}
  • http_server_requests_seconds_sum{uri = "/list-cont"}
  • ... // да, мне также нужно поработать над именами API

Затем он дал мне красивый график, например:

Я думаю, что этот график на самом деле отображает суммирование продолжительности, но я хочу отображать отдельные значения. Я могу сделать наоборот, используя преобразование сокращения. Но я застрял здесь, ваша помощь будет очень признательна.

Подробное объяснение:

Допустим, я сделал 4 запроса (для одной и той же конечной точки)

  • запрос 1 занимает 1 секунду,
  • запрос 2 занимает 2 секунды,
  • запрос 3 занимает 1 секунду,
  • запрос 4 занимает 4 секунды,

Таким образом, значение http_server_requests_seconds_sum для этой конечной точки станет следующим:

  • 1
  • 3 (1+2)
  • 4 (3+1)
  • 8 (4+4)

То, что я сейчас планирую, это 1,3,4,8

То, что я хочу построить, это 1,2,1,4

Как я могу сделать это, используя это http_server_requests_seconds_sum ??

Я не хочу показывать среднее значение или скорость, я хочу отображать конкретную продолжительность каждого обращения к API.

Как, по-вашему, это должно работать, если между скрейпами происходит несколько запросов?

markalex 20.04.2023 19:46

@markalex Я на самом деле не знаю ... Я новичок в графане, и я в основном нашел место, где можно изучить новые технологии, задавая вопросы ... Вот почему я спрашиваю ...

Maifee Ul Asad 20.04.2023 21:13

@markalex Я сделал это ... и я разместил свое решение в качестве ответа, пожалуйста, проверьте и дайте мне знать, есть ли какие-то изменения, которые вы хотите добавить туда ... спасибо ...

Maifee Ul Asad 01.05.2023 07:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
109
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У Prometheus нет данных по каждому запросу в отдельности. Он очищает метрики, которые содержат уже агрегированные данные. И в результате он не может показать информацию об отдельных запросах.

Ближайшее к тому, что вы описали, может быть достигнуто с помощью этого запроса:

rate(http_server_requests_seconds_sum[$__rate_interval]) / rate(http_server_requests_seconds_count[$__rate_interval])

Рассчитывает отношение роста общей продолжительности запросов к росту количества запросов. Это значение может быть разумной оценкой того, сколько времени требуется для ответа на запросы.

Ответ принят как подходящий

Сначала мы должны создать новый Gauge и зарегистрировать его, например:

    private final CollectorRegistry registry = CollectorRegistry.defaultRegistry;

    private final Gauge dictOfMetrics = Gauge.build()
            .name("duration_metric")
            .labelNames("uri")
            .help("duration_metric_help")
            .register(registry);

И тогда мы можем использовать класс @Component, реализующий HandlerInterceptor, и он должен выполнить следующие шаги:

  • когда запрос попадает на наш сервер, мы добавим новый заголовок с указанием текущего времени
  • когда запрос будет обслужен, мы получим этот заголовок, измерим разницу во времени, установим его для измерения и удалим этот заголовок.

Можно сделать так:

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        request.setAttribute("x-start-time", System.currentTimeMillis());
        return true;
    }

@Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        Long startTime = (Long) request.getAttribute("x-start-time");
        long executeTime = System.currentTimeMillis() - startTime;
        String uri = request.getRequestURI();
        request.removeAttribute("x-start-time");

        dictOfMetrics.labels(uri).set(Double.parseDouble(durationMapString));
    }

1. В этом коде отсутствует определение durationMapString. 2. Этот подход вообще даст только длительность последнего запроса. Если между парсингами было несколько запросов, будет показана только продолжительность последнего, а все остальные будут проигнорированы.

markalex 02.05.2023 08:13

Другие вопросы по теме