Ответ
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 придёт и всё посчитает. Красота, в рот меня чих-пых!