В 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"}
Затем он дал мне красивый график, например:
Я думаю, что этот график на самом деле отображает суммирование продолжительности, но я хочу отображать отдельные значения. Я могу сделать наоборот, используя преобразование сокращения. Но я застрял здесь, ваша помощь будет очень признательна.
Подробное объяснение:
Допустим, я сделал 4 запроса (для одной и той же конечной точки)
Таким образом, значение http_server_requests_seconds_sum
для этой конечной точки станет следующим:
То, что я сейчас планирую, это 1,3,4,8
То, что я хочу построить, это 1,2,1,4
Как я могу сделать это, используя это http_server_requests_seconds_sum
??
Я не хочу показывать среднее значение или скорость, я хочу отображать конкретную продолжительность каждого обращения к API.
@markalex Я на самом деле не знаю ... Я новичок в графане, и я в основном нашел место, где можно изучить новые технологии, задавая вопросы ... Вот почему я спрашиваю ...
@markalex Я сделал это ... и я разместил свое решение в качестве ответа, пожалуйста, проверьте и дайте мне знать, есть ли какие-то изменения, которые вы хотите добавить туда ... спасибо ...
У 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. Этот подход вообще даст только длительность последнего запроса. Если между парсингами было несколько запросов, будет показана только продолжительность последнего, а все остальные будут проигнорированы.
Как, по-вашему, это должно работать, если между скрейпами происходит несколько запросов?