9. Проверьте на веб-интерфейсе Prometheus метрику `node_memory_MemFree_bytes` - она показывает количество свободной оперативной памяти хост-машины(и берет ее из `/proc/meminfo`).
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`. \
1. Дополните compose-файл так, чтобы в сети `todo` запустить контейнер из образа `grafana/grafana`. \
- Интерфейс grafana по умолчанию доступен на порту 3000, пробростье этот порт на хост машину.
- Интерфейс grafana по умолчанию доступен на порту 3000, пробростье этот порт на хост машину.
@ -78,11 +131,7 @@
8. Добавьте визуализацию свободной памяти на хост-машине. Сделайте так чтобы визуализация показывала минимальное за последние 5 минут значение, \
8. Добавьте визуализацию свободной памяти на хост-машине. Сделайте так чтобы визуализация показывала минимальное за последние 5 минут значение, \
а сам график выводил показывал отрезок времени в последний час. Сохраните визуализацию и Dashboard.
а сам график выводил показывал отрезок времени в последний час. Сохраните визуализацию и Dashboard.
9. API-сервис отдает метрику `http_request_duration_seconds`. Она собирает время обработки HTTP-запроса API-сервисом в секундах. \
9. Добавьте визуализацию среднего времени обработки HTTP-запросов API-сервером за последние 5 минут. Сохраните Dashboard.
`http_request_duration_seconds_bucket` - значения метрики в виде гистограммы. \
`http_request_duration_seconds_sum` и `http_request_duration_seconds_count` - части этой метрики, отдающие, соответственно сумму времени всех запросов, и общее количество запросов.
Добавьте визуализацию среднего времени обработки HTTP-запросов API-сервером за последние 5 минут. Сохраните Dashboard.
10. Перезапустите всю систему, но уже не в Docker Compose, а в Docker Swarm. Сделайте так, чтобы API-сервис работал на трех репликах.
10. Перезапустите всю систему, но уже не в Docker Compose, а в Docker Swarm. Сделайте так, чтобы API-сервис работал на трех репликах.