Что такое Prometheus

Ответ

Prometheus — это ведущая open-source система для мониторинга и оповещения, изначально разработанная в SoundCloud. Она является стандартом де-факто для мониторинга в облачных и Kubernetes-средах.

Ее ключевой особенностью является pull-модель сбора метрик: Prometheus сам периодически опрашивает целевые сервисы (endpoints) по HTTP, собирает данные и сохраняет их в своей временной базе данных (TSDB).

Ключевые концепции:

  • Многомерная модель данных: Метрики идентифицируются по имени и набору пар ключ-значение, называемых лейблами (labels). Это позволяет гибко фильтровать и агрегировать данные.
  • PromQL: Мощный и гибкий язык запросов для анализа и агрегации собранных временных рядов в реальном времени.
  • Service Discovery: Механизмы автоматического обнаружения целей для мониторинга, что идеально подходит для динамических сред.
  • Alerting: Интеграция с компонентом Alertmanager для управления оповещениями (группировка, подавление, отправка в Slack, PagerDuty и т.д.).

Пример экспорта метрик в Python:

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

from prometheus_client import start_http_server, Counter
import time

# Создаем метрику типа Counter. Она может только увеличиваться.
# 'http_requests_total' - имя метрики
# 'Total HTTP Requests' - описание
REQUESTS = Counter('http_requests_total', 'Total HTTP Requests', ['method', 'endpoint'])

if __name__ == '__main__':
    # Запускаем HTTP-сервер на порту 8000, который будет отдавать метрики
    # по эндпоинту /metrics для сбора Prometheus'ом.
    start_http_server(8000)
    print("Prometheus metrics server started on port 8000")

    # Имитация обработки запросов
    while True:
        REQUESTS.labels(method='get', endpoint='/api/data').inc()
        time.sleep(1)
        REQUESTS.labels(method='post', endpoint='/api/submit').inc()
        time.sleep(1.5)

Ответ 18+ 🔞

Ну, слушай, а Prometheus-то — это, блядь, такая open-source система для мониторинга и оповещения, которую изначально в SoundCloud высидели. Она сейчас, сука, как стандарт де-факто для мониторинга в облаках и в этих ваших Kubernetes-средах считается, пиздец.

Главная её фишка, на которую все молятся — это pull-модель сбора метрик. То есть не ты ему пиздишь данные, а он сам, как голодный зверь, периодически ходит и опрашивает твои сервисы по HTTP, собирает всё, что плохо лежит, и запихивает в свою временную базу данных (TSDB). Удобно, нахуй!

Основные штуки, которые надо понимать, а то нихуя не понятно будет:

  • Многомерная модель данных: Это когда каждая метрика — это не просто имя, а ещё и куча этих... лейблов, блядь! Пар ключ-значение. Благодаря этому можно потом всё это добро как угодно фильтровать и агрегировать. Очень гибко, ебать мои старые костыли.
  • PromQL: Это такой мощный язык запросов, на котором можно, грубо говоря, вытворять с временными рядами всё, что душе угодно. Анализ, агрегация в реальном времени — красота, а не хуйня.
  • Service Discovery: Механизм, который сам находит, что мониторить. В динамических средах, где сервисы то появляются, то исчезают — просто спасение, блядь.
  • Alerting: Ну и куда же без оповещений. Есть отдельный компонент Alertmanager, который всю эту кашу с алертами разгребает — группирует, подавляет, шлёт в Slack, PagerDuty и прочие радости жизни.

Как своё приложение к этому делу прикрутить, на примере Python:

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

from prometheus_client import start_http_server, Counter
import time

# Создаём метрику типа Counter. Она, сука, только расти может.
# 'http_requests_total' - имя, 'Total HTTP Requests' - описание
REQUESTS = Counter('http_requests_total', 'Total HTTP Requests', ['method', 'endpoint'])

if __name__ == '__main__':
    # Запускаем HTTP-сервер на порту 8000, который будет отдавать метрики
    # по эндпоинту /metrics для сбора Prometheus'ом.
    start_http_server(8000)
    print("Prometheus metrics server started on port 8000")

    # Имитация обработки запросов
    while True:
        REQUESTS.labels(method='get', endpoint='/api/data').inc()
        time.sleep(1)
        REQUESTS.labels(method='post', endpoint='/api/submit').inc()
        time.sleep(1.5)

Вот и всё, ёпта. Запустил — и у тебя уже готовый эндпоинт, куда Prometheus придёт и всё посчитает. Красота, в рот меня чих-пых!