From 5dc21ee681d2e81cc4f7bad2a71e269ecf921511 Mon Sep 17 00:00:00 2001 From: Dmitry Ignatiev Date: Wed, 22 Nov 2023 18:12:28 +0300 Subject: [PATCH] PromQL tasks --- module2/10_monitoring_basics/tasks.md | 63 ++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 7 deletions(-) diff --git a/module2/10_monitoring_basics/tasks.md b/module2/10_monitoring_basics/tasks.md index cc2bd1d..12190cc 100644 --- a/module2/10_monitoring_basics/tasks.md +++ b/module2/10_monitoring_basics/tasks.md @@ -1,6 +1,6 @@ # Задания -## Prometheus +## 1. Prometheus 1. Обновите приложение `todo_app` из задания 08 сделав `git pull` ветки `main`. @@ -49,7 +49,60 @@ 9. Проверьте на веб-интерфейсе Prometheus метрику `node_memory_MemFree_bytes` - она показывает количество свободной оперативной памяти хост-машины(и берет ее из `/proc/meminfo`). -## Grafana +### 1.1 PromQL + +1. При выборке данных в PromQL, значение метрик можно фильтровать по меткам. + + Например, `process_cpu_seconds_total{job="todo_api"}` - здесь метрики будут отфильтрованы по имени службы(job), \ + указанной в конфигурации Prometheus. + + На веб-интерфейсе Prometheus, выведите сначала все временные ряды, связаннные с этой метрикой, а потом только для API-сервиса. + +2. Записывая метрику в запросе как `process_cpu_seconds_total` - мы получаем так называемый `instant vector`. Это значение временного ряда(или рядов) за все время. + + Если же мы запишем метрику как `process_cpu_seconds_total[5m]` - мы получим `range vector`, то есть значения за определенный период времени.\ + Значения по диапазону нельзя напрямую вывести на экран того же веб-интерфейса Prometheus, но можно применить к нему какую-либо функцию. + + Одна из наиболее часто используемых функций, особенно с метриками типа `Counter` - это функция `rate`.\ + Она выводит среднее посекундное изменение значения какой-либо метрики, за определенное время, и получает на вход как раз `range vector`.\ + Пример необходиомости ее использования: метрика `process_cpu_seconds_total`, которая сама по себе, говорит нам не очень о многом, \ + это всего лишь счетчик секунд процессорного времени, занимаемого процессом; зато вот скорость изменения этой метрики \ + за какое-то время - может нам показать нагрузку сервисов за это время. + + Выведите на веб-интерфейс Prometheus степень изменения метрики `process_cpu_seconds_total` за последние 5 минут. + +2. Метрики типа `Gauge` - самые простые метрики, они показывают текущее значение какого-либо параметра. + + `node_memory_MemFree_bytes` - как раз метрика такого типа, показывает свободную память в операционной системе. \ + Если взять от нее значения по диапазону(`range vector`), то к ним можно применить какие-либо функции PromQL, работающие с диапазонами. + + Используя функцию `avg_over_time` - выведите среднее значение этой метрики за последние 5 минут. + +3. API-сервис отдает метрику `http_request_duration_seconds`. Она собирает время обработки HTTP-запроса API-сервисом в секундах. + + `http_request_duration_seconds_bucket` - значения метрики в виде гистограммы. \ + `http_request_duration_seconds_sum` и `http_request_duration_seconds_count` - части этой метрики, отдающие, соответственно сумму времени всех запросов, и общее количество запросов. Эти части - сами по себе метрики типа `Counter`. + + Выведите среднее время обработки запроса за все время(подсказка: сумма времени деленное на количество запросов), так и за последние 5 минут(подсказка: примените функцию rate к диапазону значений за 5 минут). + +4. Как видно, на веб-интерфейс Prometheus выводится несколько значений, сгруппированные по меткам, отображающим в частности URL метода API-сервиса. + + Для того чтобы слить все эти значения в одно, вы можете применить к нему функции аггрегации из PromQL, такие как `sum()`. Функции аггрегации чем-то напоминают аггрегацию по `group by` из SQL, и к ним тоже можно добавлять суффикс `by`. Так, например, можно сгруппировать значения `http_request_duration_seconds_sum` или `_count` по имени метода API-сервиса, обрабатывающего запрос(метка `action`). + + Выведите среднее время обработки запроса за последние 5 минут, которое бы включало все метки без исключения. + +5. `http_request_duration_seconds_bucket` - непосредственно значения гистограммы времени HTTP-запросов, сгруппированное по диапазонам отражающим количество секунд, которое заняла обработка конкретного запроса. + + Так как значения гистограммы - это счетчики, то к ним также можно применять функции `rate` и `sum`.\ + Если мы аггрегируем эту метрику с помощью суммы по метке `le`(собственно значения той оси гистограммы, которые показывают время обработки запроса), \ + то к полученному результату мы можем применить функции PromQL, работающие с гистограммами, например `histogram_quantile`. + + Функцию `histogram_quantile` поможет посчитать время обработки запроса по заданному квантилю. Так, если первым параметром ей передать число 0.5,\ + то мы можем оценить примерное медианное время обработки запроса(половина запросов отрабатывает быстрее, половина медленнее). + + Выведите медианное время обработки запроса за последние 5 минут. + +## 2. Grafana 1. Дополните compose-файл так, чтобы в сети `todo` запустить контейнер из образа `grafana/grafana`. \ - Интерфейс grafana по умолчанию доступен на порту 3000, пробростье этот порт на хост машину. @@ -78,11 +131,7 @@ 8. Добавьте визуализацию свободной памяти на хост-машине. Сделайте так чтобы визуализация показывала минимальное за последние 5 минут значение, \ а сам график выводил показывал отрезок времени в последний час. Сохраните визуализацию и Dashboard. -9. API-сервис отдает метрику `http_request_duration_seconds`. Она собирает время обработки HTTP-запроса API-сервисом в секундах. \ - `http_request_duration_seconds_bucket` - значения метрики в виде гистограммы. \ - `http_request_duration_seconds_sum` и `http_request_duration_seconds_count` - части этой метрики, отдающие, соответственно сумму времени всех запросов, и общее количество запросов. - - Добавьте визуализацию среднего времени обработки HTTP-запросов API-сервером за последние 5 минут. Сохраните Dashboard. +9. Добавьте визуализацию среднего времени обработки HTTP-запросов API-сервером за последние 5 минут. Сохраните Dashboard. 10. Перезапустите всю систему, но уже не в Docker Compose, а в Docker Swarm. Сделайте так, чтобы API-сервис работал на трех репликах.