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.

16 KiB

Задания

1. 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).

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 минут.

  3. Метрики типа Gauge - самые простые метрики, они показывают текущее значение какого-либо параметра.

    node_memory_MemFree_bytes - как раз метрика такого типа, показывает свободную память в операционной системе.
    Если взять от нее значения по диапазону(range vector), то к ним можно применить какие-либо функции PromQL, работающие с диапазонами.

    Используя функцию avg_over_time - выведите среднее значение этой метрики за последние 5 минут.

  4. 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 минут).

  5. Как видно, на веб-интерфейс Prometheus выводится несколько значений, сгруппированные по меткам, отображающим в частности URL метода API-сервиса.

    Для того чтобы слить все эти значения в одно, вы можете применить к нему функции аггрегации из PromQL, такие как sum(). Функции аггрегации чем-то напоминают аггрегацию по group by из SQL, и к ним тоже можно добавлять суффикс by. Так, например, можно сгруппировать значения http_request_duration_seconds_sum или _count по имени метода API-сервиса, обрабатывающего запрос(метка action).

    Выведите среднее время обработки запроса за последние 5 минут, которое бы включало все метки без исключения.

  6. 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, пробростье этот порт на хост машину.
    • Также, создайте том данных 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. Добавьте визуализацию среднего времени обработки HTTP-запросов API-сервером за последние 5 минут. Сохраните Dashboard.

  10. Перезапустите всю систему, но уже не в Docker Compose, а в Docker Swarm. Сделайте так, чтобы API-сервис работал на трех репликах.

    Убедитесь, что Prometheus правильно собирает метрики со всех трех реплик одновременно(в Targets на интерфейсе Prometheus должны присутствовать все три).

    Отредактируйте визуализации, связанные с API-сервисом так, чтобы они показывали средние значения по всем трем репликам.