Мониторинг играет решающую роль в обеспечении производительности, доступности и стабильности FastAPI-приложений. Отслеживание ключевых показателей и выявление потенциальных проблем поможет разработчикам вовремя принимать решения и улучшить его работу. В этом гайде мы рассмотрим, как настроить мониторинг FastAPI-приложения с помощью двух мощных инструментов: Grafana и Prometheus.

Что такое Prometheus?

Prometheus — это система мониторинга с открытым исходным кодом, которая собирает метрики из вашего приложения и сохраняет их в базе данных временных рядов (time series database). Он может мониторить производительности вашего приложения и предупредит вас, когда что-то пойдет не так.

Что такое Grafana?

Grafana — это инструмент визуализации с открытым исходным кодом, который можно использовать для создания дашбордов для вашего приложения. Его можно использовать для создания информационных панелей, отображающих статус вашего приложения.

Как работает связка Grafana и Prometheus в мониторинге

Prometheus используется для сбора метрик из вашего приложения. Например, использование CPU, памяти и сетевой трафик. А Grafana — это инструмент для визуализации данных. В нем создают дашборды.

Что понадобится

  • Docker

  • Docker Compose

  • Python 3.8+ and Pip

  • Terminal or Command Prompt

  • Текстовый редактор или IDE (VS Code, PyCharm, etc.)

  • Базовые знания FastAPI, Docker и Python

  • Базовые знания Prometheus и Grafana

  • Базовые знания Docker и Docker Compose

Настройка проекта

Мы будем использовать существующее приложение FastAPI. Вы можете клонировать репозиторий здесь. Однако, вы можете создать или использовать собственное приложение FastAPI.

git clone https://github.com/KenMwaura1/Fast-Api-example.git

После того как вы клонировали репозиторий, запустите следующие команды, чтобы создать виртуальную среду и установить зависимости.

cd Fast-Api-example
python3 -m venv venv
source venv/bin/activate
cd src
pip install -r requirements.txt

Чтобы запустить приложение, выполните следующую команду:

uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8002

Эта команда запустит приложение на порту 8002. Вы можете получить доступ к приложению, зайдя в http://localhost:8002/docs в своем браузере. Не стесняйтесь изменять команду на своё усмотрение. Порт по умолчанию обычно 8000.

Настройка Prometheus

A. Установка и настройка Prometheus с помощью Docker

Установите Docker в вашей системе, если он еще не установлен.

Извлеките образ Prometheus Docker из официального репозитория с помощью команды:

docker pull prom/prometheus

Создайте папку prometheus_data, внутри нее создайте файл конфигурации с именем: prometheus.yml для определения настроек и целей Prometheus. Пример конфигурации:

global:
  scrape_interval: 15s
scrape_configs:
  - job_name: 'fastapi-app'
    static_configs:
      - targets: ['web:8000']

Эта конфигурация задает интервал очистки и устанавливает цель — отслеживать приложение FastAPI.

Запустите контейнер Prometheus с помощью следующей команды:

docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

Замените /path/to/prometheus.yml фактическим путем к вашему файлу конфигурации prometheus.yml.

Получите доступ к Prometheus, перейдя по адресу http://localhost:9090 в веб-браузере. Вы должны увидеть веб-интерфейс Prometheus.

B. Инструментирование приложения FastAPI для метрик Prometheus

Создайте виртуальное окружение для FastAPI-приложения и активируйте его. Затем установите необходимые Python-библиотеки для запуска приложения для интеграции с Prometheus:

python3 -m venv venv
source venv/bin/activate
cd src
pip install -r requirements.txt
pip install prometheus-fastapi-instrumentator

В главном файле вашего приложения FastAPI (в данном случае он находится в src/app/main.py) импортируйте класс Instrumentator из prometheus_fastapi_instrumentator:

from prometheus_fastapi_instrumentator import Instrumentator

Инициализируйте и инструментируйте свое приложение FastAPI с помощью Instrumentator:

Instrumentator().instrument(app).expose(app)

Этот шаг автоматически добавляет метрики Prometheus в ваше приложение FastAPI и предоставляет конечную точку метрик.

Перезапустите приложение FastAPI, чтобы применить изменения. Если все прошло успешно, должна появиться новая конечная точка по адресу http://localhost:8002/metrics, которая возвращает метрики Prometheus.

Подключение Prometheus и Grafana

Чтобы соединить Prometheus и Grafana, мы будем использовать плагин источника данных. Этот плагин позволяет создавать дашборды, отображающие статус вашего приложения.

Установка плагина источника данных Prometheus для Grafana

Чтобы установить подключаемый модуль источника данных Prometheus для Grafana, вам необходимо загрузить плагин с веб-сайта Grafana. Скачать плагин можно отсюда. Однако в докере плагин уже установлен.

После того как вы загрузили плагин, вы можете установить его, выполнив следующую команду:

grafana-cli plugins install grafana-prometheus-datasource

Запуск приложения с помощью Docker Compose

Теперь, когда наше приложение запущено, мы можем использовать Docker Compose для его запуска с Prometheus и Grafana. Мы будем использовать официальные образы Prometheus и Grafana из Docker Hub.

Файл Docker Compose

Мы будем использовать файл Docker Compose для запуска нашего приложения с Prometheus и Grafana. Он будет содержать следующие сервисы:

  • Приложение FastAPI как веб-сервис

  • Prometheus 

  • Grafana 

  • Postgres как служба базы данных

Файл Docker Compose также будет содержать следующие тома:

  • Prometheus data volume

  • Grafana data volume

Файл Docker Compose также будет содержать следующую сеть:

  • hello_fastapi_network

Теперь создайте файл с именем docker-compose.yml в корневом каталоге вашего проекта и добавьте следующий код:

version: "3.8"

services:
  web:
    build: ./src
    command: uvicorn app.main:app --reload --workers 1 --host 0.0.0.0 --port 8000
    volumes:
      - ./src/:/usr/src/app/
    ports:
      - "8002:8000"
    environment:
      - DATABASE_URL=postgresql://hello_fastapi:hello_f
---> Verify that Prometheus is scraping the metrics from your FastAPI app by visiting <http://localhost:9090/targets> in your web browser. The FastAPI app target should be listed with a "UP" state.
With Prometheus now installed and configured in a Docker container, and your FastAPI app instrumented with Prometheus metrics, you are ready to move on to the next steps of integrating Grafana for visualization and analysis.astapi@db/hello_fastapi_dev
    depends_on:
      - db
  db:
    image: postgres:13.1-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=hello_fastapi
      - POSTGRES_PASSWORD=hello_fastapi
      - POSTGRES_DB=hello_fastapi_dev

    ports:
      - "5432:5432"

  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - 9090:9090
    volumes:
      - ./prometheus_data/prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'


  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - 3000:3000
    volumes:
      - grafana_data:/var/lib/grafana

volumes:
  prometheus_data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: ./prometheus_data
  grafana_data:
    driver: local
    driver_opts:
      o: bind
      type: none
      device: ./grafana_data
  postgres_data:

networks:
  default: 
    name: hello_fastapi

Давайте пройдемся по приведенному выше коду и посмотрим, что делает каждая часть:

version: '3.8' Это версия формата файлов Docker Compose, которую мы используем. Вы можете найти больше информации о формате файлов Docker Compose здесь.

services Это начало раздела сервисов файла Docker Compose. Он содержит все сервисы, которые мы хотим запустить с помощью Docker Compose. Каждая служба будет работать в своем собственном контейнере. Для получения дополнительной информации о сервисах Docker Compose вы можете прочитать документацию по Docker Compose.

prometheus Этот сервис будет запускать образ Prometheus из Docker Hub.

image: prom/prometheus Это образ, который мы хотим запустить с сервисом prometheus. Он является официальным образом Prometheus от Docker Hub.

container_name: prometheus Это имя контейнера, который мы хотим запустить с сервисом prometheus. Это имя будет использоваться для ссылки на контейнер в других частях файла Docker Compose.

ports Этот раздел содержит все порты, которые мы хотим открыть с помощью службы prometheus.

9090:9090 Это порт, который мы хотим открыть с помощью службы prometheus. Этот порт будет использоваться для доступа к веб-интерфейсу Prometheus.

volumes Этот раздел содержит все тома, которые мы хотим смонтировать с помощью службы prometheus.

./prometheus_data/prometheus.yml:/etc/prometheus/prometheus.yml Это том, который мы хотим смонтировать с помощью службы prometheus. Этот том будет использоваться для хранения файла конфигурации Prometheus.

command Это запуск командной части сервиса prometheus. Этот раздел содержит все команды, которые мы хотим запустить с сервисом prometheus.

--config.file=/etc/prometheus/prometheus.yml Это команда, которую мы хотим запустить с сервисом prometheus. Эта команда будет использоваться для указания местоположения конфигурационного файла Prometheus.

networks Здесь мы указываем сеть, которую хотим использовать для сервиса prometheus. Она будет использоваться для подключения службы prometheus к другим службам.

grafana Этот сервис будет запускать образ Grafana из Docker Hub.

image: grafana/grafana Это образ, который мы хотим запустить с помощью службы grafana. Этот образ является официальным образом Grafana от Docker Hub.

container_name: grafana Это имя контейнера, который мы хотим запустить с сервисом grafana. Это имя будет использоваться для ссылки на контейнер в других частях файла Docker Compose.

ports Этот раздел содержит все порты, которые мы хотим открыть с помощью службы grafana.

3000:3000 Это порт, который мы хотим открыть с помощью службы grafana. Этот порт будет использоваться для доступа к веб-интерфейсу Grafana.

volumes Этот раздел содержит все тома, которые мы хотим смонтировать с помощью службы grafana.

grafana_data:/var/lib/grafana Это том, который мы хотим смонтировать с помощью службы grafana. Он будет использоваться для хранения данных Grafana.

networks Здесь мы указываем сеть, которую мы хотим использовать для службы grafana. Она будет использоваться для подключения сервиса grafana к другим сервисам.

volumes Этот раздел содержит все тома, которые мы хотим смонтировать с файлом Docker Compose.

prometheus_data Этот том будет использоваться для хранения данных Prometheus.

Конфигурационный файл Prometheus

Как упоминалось ранее, prometheus нужен файл конфигурации, чтобы знать, что отслеживать. Мы будем использовать файл конфигурации по умолчанию, который поставляется с Prometheus. Однако нам нужно будет внести в него некоторые изменения, чтобы он работал с нашим приложением.

Обновите prometheus_data/prometheus.yml файл следующим кодом:

# config file for prometheus

# global config
global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 15s
alerting:
  alertmanagers:
  - follow_redirects: true
    enable_http2: true
    scheme: http
    timeout: 10s
    api_version: v2
    static_configs:
    - targets: []
scrape_configs:
- job_name: prometheus
  honor_timestamps: true
  scrape_interval: 15s
  scrape_timeout: 10s
  metrics_path: /metrics
  scheme: http
  follow_redirects: true
  enable_http2: true
  static_configs:
  - targets:
    - localhost:9090
- job_name: 'fastapi'
  scrape_interval: 10s
  metrics_path: /metrics
  static_configs:
    - targets: ['web:8000']

Давайте пройдемся по приведенному выше коду и посмотрим, что делает каждая часть:

global В этом разделе собраны все глобальные настройки Prometheus.

scrape_interval: 15s Интервал очистки. Он сообщает Prometheus как часто очищать цели.

scrape_timeout: 10s Этот параметр сообщает Prometheus, как долго ждать завершения очистки до истечения времени ожидания.

evaluation_interval: 15s Это интервал оценки для Prometheus. Он сообщает, как часто следует оценивать правила.

alerting В этом разделе собраны все настройки оповещений для Prometheus.

alertmanagers В этом разделе собраны все настройки алертменеджеров для Prometheus.

follow_redirects: true Этот параметр указывает Prometheus следовать перенаправлениям при отправке предупреждений в alertmanager.

enable_http2: true Этот параметр сообщает Prometheus о включении HTTP/2 при отправке предупреждений диспетчеру предупреждений.

scheme: http Этот параметр указывает Prometheus использовать HTTP при отправке предупреждений в alertmanager.

timeout: 10s Этот параметр сообщает Prometheus, как долго ждать ответа от менеджера предупреждений до истечения времени ожидания.

api_version: v2 Этот параметр указывает Prometheus использовать v2 API при отправке предупреждений в alertmanager.

static_configs Этот раздел содержит все настройки static_configs для Prometheus.

targets: [] Этот параметр указывает Prometheus использовать диспетчер предупреждений по умолчанию.

scrape_configs В этом разделе собраны все настройки scrape_configs для Prometheus.

job_name: prometheus Это название работы, которую мы хотим очистить от Prometheus. Это имя будет использоваться для ссылки на задание в других частях конфигурационного файла Prometheus.

honor_timestamps: true Этот параметр указывает Prometheus учитывать временные метки при очистке задания.

scrape_interval: 15s Это интервал очистки для задания. Этот параметр сообщает Prometheus, как часто выполнять очистку задания.

scrape_timeout: 10s Это тайм-аут очистки для задания. Он сообщает Prometheus, как долго ждать завершения очистки до истечения времени ожидания.

metrics_path: /metrics Этот параметр сообщает Prometheus, где найти метрики для задания.

scheme: http Этот параметр указывает Prometheus использовать HTTP при очистке задания.

follow_redirects: true Этот параметр указывает Prometheus следовать перенаправлениям при очистке задания.

enable_http2: true Этот параметр указывает Prometheus включить HTTP/2 при очистке задания.

static_configs Этот раздел содержит все настройки static_configs для Prometheus.

targets В этом разделе собраны все настройки таргетов для Prometheus.

localhost:9090 Это цель, которую мы хотим очистить с помощью Prometheus. Эта цель будет использоваться для ссылки на цель в других частях файла конфигурации Prometheus.

job_name: 'fastapi' Это название работы, которую мы хотим очистить от Prometheus. Это имя будет использоваться для ссылки на задание в других частях конфигурационного файла Prometheus.

scrape_interval: 10s Этот параметр сообщает Prometheus, как часто выполнять очистку задания.

metrics_path: /metrics Этот параметр сообщает Prometheus, где найти метрики для задания.

static_configs Этот раздел содержит все настройки static_configs для Prometheus.

targets В этом разделе собраны все настройки таргетов для Prometheus.

web:8000 Это цель, которую мы хотим очистить с помощью Prometheus. Эта цель будет использоваться для ссылки на цель в других частях файла конфигурации Prometheus.

Мы используем web:8000, потому что это имя службы, которое мы определили в файле Docker Compose.

Если вы хотите узнать больше о конфигурационном файле Prometheus, вы можете прочитать документацию Prometheus.

Запуск приложения

Теперь, когда у нас есть файл Docker Compose и файл конфигурации Prometheus, можно запустить приложение. Для запуска приложения нам нужно выполнить следующую команду:

docker-compose up -d

Убедитесь, что Prometheus извлекает метрики из вашего приложения FastAPI, посетив http://localhost:9090/targets в веб-браузере. Целевое приложение FastAPI должно быть указано в состоянии «UP». Пример скриншота:

Дашборд в Grafana

Теперь, когда у нас запущен Prometheus, мы можем создать дашборд для визуализации метрик из нашего приложения. Чтобы его создать, нам нужно сделать следующее:

  1. Создайте новый дашборд Grafana.

  2. Добавьте новый источник данных Prometheus.

  3. Добавьте новую графическую панель.

  4. Добавьте новый запрос на графическую панель.

  5. Примените изменения к графической панели.

  6. Сохраните дашборд.

  7. Просмотрите дашборд.

  8. Повторите шаги 3–7 для каждой метрики, которую вы хотите визуализировать.

  9. Повторите шаги 2–8 для каждой панели мониторинга, которую вы хотите создать.

  10. Повторите шаги 1–9 для каждого приложения, которое вы хотите отслеживать.

Создайте новый дашборд Grafana

После запуска Grafana перейдите по адресу: localhost:3000. Вы должны увидеть следующий экран:

Введите имя пользователя и пароль по умолчанию (admin/admin) и нажмите «Войти». Вам должно быть предложено изменить пароль. Введите новый пароль и нажмите «Сохранить». Вы должны увидеть следующий экран:

Нажмите на кнопку «Создать свой первый источник данных». Вы должны увидеть следующий экран:

Нажмите на кнопку Prometheus. Вы должны увидеть следующий экран:

Введите следующую информацию:

  1. Name: Prometheus

  2. URL: http://prometheus:9090

  3. Access: Server (Default)

  4. Scrape interval: 15s

  5. HTTP Method: GET

  6. HTTP Auth: None

  7. Basic Auth: None

  8. With Credentials: No

  9. TLS Client Auth: None

  10. TLS CA Certificate: None

Нажмите на кнопку Save & Test. Вы должны увидеть следующий экран:

Нажмите на кнопку Dashboards. Вы должны увидеть следующий экран:

Нажмите кнопку New Dashboard. Вы должны увидеть следующий экран:

Нажмите на кнопку "Add Visualization". Вы должны увидеть следующий экран:

Здесь вы можете выбрать тип визуализации, которую хотите добавить на панель мониторинга. Для этого примера мы выберем визуализацию «Временные ряды» ("Time Series"). Вы должны увидеть следующий экран:

Теперь давайте добавим запрос к графику. Нажмите на кнопку Query. Вы должны увидеть следующий экран:

![Grafana add query]](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8y8z07btrwrtgw1yriu4.png)

Grafana предоставляет конструктор запросов. Мы можем использовать его для выбора метрик, которые мы хотим визуализировать.

  • Нажмите на кнопку Metrics.

  • Мы будем использовать api_request_duration_seconds_count в качестве метрики, которую хотим визуализировать.

  • Нажмите на кнопку «label_filters». Выберите endpoint оттуда выберите /notes/{id}.

  • Нажмите + Add Filter. Выберите «http_status», оттуда выберите 200.

  • Теперь нажмите «Run Query». Вы должны увидеть график серии томов для api_request_duration_seconds_count метрики:

  • Введите название панели: api_request_duration_seconds_count и нажмите Apply.

Нажмите на кнопку Save. Вы должны увидеть следующий экран:

Повторите этот процесс с каждой метрикой, которую вы хотите визуализировать. Можно добавить несколько графиков на одну и ту же панель мониторинга.

Не стесняйтесь использовать мой дашборд Grafana в качестве отправной точки. Найдите JSON-файл в репозитории GitHub .

Пример дашборда:

Заключение

В этой статье мы узнали, как отслеживать приложение FastAPI с помощью Prometheus и Grafana. Мы научились создавать файл Docker Compose для запуска Prometheus и Grafana. Мы также узнали, как создать файл конфигурации Prometheus для сбора метрик из нашего приложения FastAPI. Наконец, мы научились создавать панель инструментов Grafana для визуализации метрик из нашего приложения FastAPI.

Рекомендации


Если вы хотите научиться работать со связкой Prometheus+Grafana, разбираться в работе системы и читать созданные графики, приходите на курс «Мониторинг в Grafana». Вы узнаете о подходах в мониторинге, создадите свои первые дашборды и настроите алертинг.

Старт потока — 27 июня 2023 года.

До встречи на курсе!

Комментарии (0)