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.

10 KiB

Задания

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-сервисом так, чтобы они показывали средние значения по всем трем репликам.