You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
10 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Задания
## Prometheus
1. Обновите приложение `todo_app` из задания 08 сделав `git pull` ветки `main`.
API-сервис приложения теперь отдает метрики Prometheus на порту `9123`(можно поменять через переменную среды `Metrics__Port`) и по url `/metrics`.
Таким образом, полное URL для получения метрик, выглядит, например, как `http://todo_api:9123/metrics`.
Дополните Compose-файл для `todo_app` так, чтобы в сети `todo` запускался контейнер из образа `prom/prometheus`, при этом:
- Напишите для него конфигурацию, то есть файл `prometheus.yml` \
(который должен в итоге находится в контейнере на месте `/etc/prometheus/prometheus.yml`), \
таким образом чтобы Prometheus собирал метрики из `todo_api` каждые 5 секунд.
- Прокиньте порт `9090`, на котором находится веб-интерфейс Prometheus по умолчанию, на хост машины с Docker.
- Создайте том данных `todo_prometheus_data`, который бы хранил данные внутренней БД Prometheus, и который бы\
монтировался на директорию `/prometheus` внутри его контейнера.
Убедитесь, что веб-интерфейс Prometheus не был доступен извне. Для доступа к нему, сделайте SSH-туннель на вашу локальную машину.
2. Запустите систему в Compose-режиме, то есть не в режиме кластера, и без дополнительных реплик.
3. На веб-интерфейсе Prometheus, проверьте, что он собирает метрики из `todo_api`(на вкладке `Targets`)
4. На веб-интерфейсе Prometheus, выведите значение метрики `dotnet_total_memory_bytes` - общее число байт, находящихся в управляемой(т.е. подотчетной сборщику мусора .NET) памяти API-сервиса.
5. Выведите максимальное значение этой метрики за последние 15 минут.
6. Дополните compose-файл так, чтобы в сети `todo` запустить контейнер из образа `bitnami/postgres-exporter`, при этом:
- Установите для этого контейнера переменную среды `DATA_SOURCE_NAME`\
в значение `postgresql://todo:todo@todo_postgres:5432/todo?sslmode=disable`(при необходимости поменяйте здесь порт, хост, итд.)
- Отредактируйте конфигурацию `prometheus.yml` так, чтобы теперь также собирать метрики из `postgres-exporter`. \
Postgres Exporter по умолчанию отдает метрики на порту `9187`, и по URL `/metrics`
7. Проверьте на веб-интерфейсе Prometheus метрику `pg_stat_user_tables_size_bytes` (она показывает количество памяти, занимаемой пользовательскими таблицами в PostgreSQL)
8. Дополните compose-файл так, чтобы также запускать контейнер из образа `prom/node-exporter`.\
Учтите, что так как этот exporter используется для мониторинга хост-машин, ему не нужна такая изоляция, как обычным приложениям, и даже наоборот:
- Для этого контейнера необходимо примонтировать корневую директорию хост-машины в read-only режиме, \
чтобы она была доступна например как директория `/host` внутри контейнера.
- При старте этого контейнера, передайте ему аргумент `--path.rootfs=/host`
- Также, установите значение `--pid` в `host` (`pid: host` в compose-файле)
- Желательно также установить режим сети в `host` (`network_mode: host` в compose-файле) (N.B.: Работает только на Linux, и не работает на Docker Desktop на macOS и Windows)
node-exporter по умолчанию отдает метрики на порту `9100` и по URL `/metrics`. \
Доступ к `host`-машине Docker изнутри контейнера Prometheus можно получить по адресу (`host.docker.internal`)
Дополните конфигурацию `prometheus.yml` так чтобы собирать метрики и из `node-exporter`
9. Проверьте на веб-интерфейсе Prometheus метрику `node_memory_MemFree_bytes` - она показывает количество свободной оперативной памяти хост-машины(и берет ее из `/proc/meminfo`).
## Grafana
1. Дополните compose-файл так, чтобы в сети `todo` запустить контейнер из образа `grafana/grafana`. \
- Интерфейс grafana по умолчанию доступен на порту 3000, пробростье этот порт на хост машину.
- Также, создайте том данных `todo_grafana_data`, примонтированный в контейнер по пути `/var/lib/grafana`
- Установите для контейнера переменную окружения `GF_USERS_ALLOW_SIGN_UP` в значение `false`, чтобы отключить возможность регистрации пользователей.
2. Перезапустите систему. Убедитесь что `grafana` доступна извне. Для этого настройте конфигурацию `nginx` на хост-системе, если вы используете его в качестве внешнего прокси.
3. Зайдите на веб-интерфейс grafana. Логин и пароль по умолчанию - `admin` `admin`(пароль можно поменять установив переменную окружения `GF_SECURITY_ADMIN_PASSWORD`). \
Поменяйте пароль на свой, если вы не установили его как переменную среды.
4. Добавьте пользователя с именем `viewer`, и разрешением на просмотр визуализаций(роль `Viewer`).
5. Добавьте источник данных `Prometheus`, при этом установите его URL в `http://todo_prometheus:9090` (поменяйте хост на имя контейнера, в котором запускается Prometheus)
6. Создайте новый Dashboard, и добавьте на него новую визуализацию метрики `dotnet_total_memory_bytes`.
- Выберите тип графика как `Time Series`
- Назовите график с визуализацией `.NET Total Memory Bytes`
- Поставьте единицу измерения `bytes(SI)`
- Установите display name для выводимого поля, например в `.NET memory`
- Сделайте так, чтобы на график выводилось значение за последние 5 минут.
- Добавьте вывод порогового значения(`threshold`) в 10 мегабайт, так чтобы график выше этого значения был закрашен желтым.
7. Сохраните Dashboard под именем `My Dashboard`. Установите график обновления в 5 секунд.
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.
10. Перезапустите всю систему, но уже не в Docker Compose, а в Docker Swarm. Сделайте так, чтобы API-сервис работал на трех репликах.
Убедитесь, что Prometheus правильно собирает метрики со всех трех реплик одновременно(в Targets на интерфейсе Prometheus должны присутствовать все три).
Отредактируйте визуализации, связанные с API-сервисом так, чтобы они показывали средние значения по всем трем репликам.