Мониторинг играет решающую роль в обеспечении производительности, доступности и стабильности 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, мы можем создать дашборд для визуализации метрик из нашего приложения. Чтобы его создать, нам нужно сделать следующее:
Создайте новый дашборд Grafana.
Добавьте новый источник данных Prometheus.
Добавьте новую графическую панель.
Добавьте новый запрос на графическую панель.
Примените изменения к графической панели.
Сохраните дашборд.
Просмотрите дашборд.
Повторите шаги 3–7 для каждой метрики, которую вы хотите визуализировать.
Повторите шаги 2–8 для каждой панели мониторинга, которую вы хотите создать.
Повторите шаги 1–9 для каждого приложения, которое вы хотите отслеживать.
Создайте новый дашборд Grafana
После запуска Grafana перейдите по адресу: localhost:3000. Вы должны увидеть следующий экран:
Введите имя пользователя и пароль по умолчанию (admin/admin) и нажмите «Войти». Вам должно быть предложено изменить пароль. Введите новый пароль и нажмите «Сохранить». Вы должны увидеть следующий экран:
Нажмите на кнопку «Создать свой первый источник данных». Вы должны увидеть следующий экран:
Нажмите на кнопку Prometheus. Вы должны увидеть следующий экран:
Введите следующую информацию:
Name: Prometheus
Access: Server (Default)
Scrape interval: 15s
HTTP Method: GET
HTTP Auth: None
Basic Auth: None
With Credentials: No
TLS Client Auth: None
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 года.
До встречи на курсе!