Как организовать сбор и визуализацию метрик приложения с помощью Prometheus и Grafana?

Ответ

Процесс включает три основных этапа: инструментацию приложения, сбор метрик сервером Prometheus и их визуализацию в Grafana.

1. Инструментация приложения (Exposing Metrics)

Приложение должно предоставлять метрики по HTTP-эндпоинту (обычно /metrics) в формате, понятном Prometheus. Для этого используются клиентские библиотеки.

Пример на Python с prometheus_client:

from prometheus_client import start_http_server, Counter
import time
import random

# Создаем метрику типа Counter
REQUESTS = Counter('http_requests_total', 'Total HTTP requests processed', ['method', 'endpoint'])

def process_request(method, endpoint):
    # Инкрементируем счетчик с указанными лейблами
    REQUESTS.labels(method=method, endpoint=endpoint).inc()

if __name__ == '__main__':
    # Запускаем HTTP-сервер для отдачи метрик на порту 8000
    start_http_server(8000)
    print("Prometheus metrics available on http://localhost:8000")
    # Эмуляция работы приложения
    while True:
        process_request('GET', '/api/users')
        time.sleep(random.uniform(0.5, 1.5))
        process_request('POST', '/api/users')
        time.sleep(random.uniform(1, 2))

2. Сбор метрик (Prometheus)

Prometheus настраивается на периодический опрос (scrape) эндпоинта /metrics вашего приложения. Собранные данные сохраняются во внутреннюю time-series базу данных.

3. Визуализация и оповещения (Grafana)

  • Grafana подключается к Prometheus как к источнику данных (Data Source).
  • В Grafana создаются дашборды с графиками и панелями, которые запрашивают данные у Prometheus с помощью языка запросов PromQL (например, rate(http_requests_total[5m])).
  • Настраиваются правила оповещений (Alerting), которые при срабатывании (например, резкий рост ошибок) отправляют уведомления через Alertmanager в Slack, PagerDuty и т.д.

Ответ 18+ 🔞

Ну вот, сидишь ты такой, пишешь свой код, и тут бац — тебе говорят: «А давай-ка мы за тобой будем следить, как ты работаешь». И ты такой: «Окей, блядь, следите». А следить-то надо по-умному, не просто в лоб пялиться, а метрики собирать. И вот тут начинается эта трёхактная пьеса под названием «Запросы, графики и пиздец».

Акт первый: Приложение стучит в дверь и говорит «Заберите мои цифры»

Твоё приложение должно вывесить на всеобщее обозрение табличку с цифрами, как бабка на рынке — ценник на картошку. Делается это через специальную дырку в заборе, обычно по адресу /metrics. Туда любой желающий (ну, то есть Prometheus) может заглянуть и всё посчитать.

Смотри, как это на Питоне с prometheus_client выглядит, прям как в жизни:

from prometheus_client import start_http_server, Counter
import time
import random

# Заводим счётчик. Это как одометр в машине, только для запросов.
REQUESTS = Counter('http_requests_total', 'Total HTTP requests processed', ['method', 'endpoint'])

def process_request(method, endpoint):
    # Щёлк — и счётчик подрос. Метод и эндпоинт — это как бирки на ухе у коровы.
    REQUESTS.labels(method=method, endpoint=endpoint).inc()

if __name__ == '__main__':
    # Поднимаем сервачок на 8000 порту, который будет эти метрики отдавать.
    start_http_server(8000)
    print("Prometheus metrics available on http://localhost:8000")
    # А тут мы просто прикидываемся, что работаем.
    while True:
        process_request('GET', '/api/users')
        time.sleep(random.uniform(0.5, 1.5))
        process_request('POST', '/api/users')
        time.sleep(random.uniform(1, 2))

Вот и всё, приложение теперь не просто так болтается, а ещё и стучит каблучками: «Смотрите, сколько я уже сделал!»

Акт второй: Приходит Прометеус и всё записывает в свою толстую тетрадь

Prometheus — это такой дотошный бухгалтер, который раз в N секунд ходит по всем этим /metrics и аккуратно переписывает оттуда все циферки. Настраивается это в конфиге, где ты ему говоришь: «Вот, дружок, ходи по этому адресу и срисовывай». А он ходит и срисовывает, складывая всё в свою собственную, ёбта, базу данных временных рядов. Удобно, всё под рукой.

Акт третий: Графана надевает очки и начинает рисовать красивые картинки

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

  • Дашборды: Налепишь там кучу красивых панелек, которые запрашивают данные с помощью PromQL. Типа rate(http_requests_total[5m]) — «покажи-ка, дружок, с какой скоростью у нас запросы летели последние пять минут».
  • Оповещения (Alerting): А это самая вкусная часть, блядь. Настраиваешь правила: «Если ошибок больше десяти в минуту — значит, кто-то накосячил». И когда такое случается, Alertmanager (приятель Прометеуса) начинает орать на все лады — слать сообщения в Slack, звонить в PagerDuty, в общем, поднимать всех на уши, пока ты не прибежишь и не починишь эту, блядь, хитрожопую систему.

Вот и вся магия. Сначала приложение говорит «Вот мои цифры», потом бухгалтер их записывает, а потом художник рисует по ним картину, на которой видно, где у тебя всё летит в пизду, а где работает как швейцарские часы. Красота, ёпта!