🔥 Prometheus

Метрики, scrape-конфиг, PromQL, правила оповещений, exporters и Alertmanager.

Шпаргалки · Администрирование · #prometheus #monitoring #metrics #promql

Идея

Prometheus сам опрашивает (scrape) цели по HTTP и хранит временные ряды имя{метки} значение. Язык запросов: PromQL. Графики: Grafana. Оповещения: Alertmanager. Интерфейс :9090.

Типы метрик

Тип Смысл Пример
Counter только растёт http_requests_total
Gauge растёт и падает memory_usage_bytes
Histogram распределение по корзинам http_request_duration_seconds_bucket
Summary квантили на клиенте

prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files: [alerts.yml]
alerting:
  alertmanagers: [{ static_configs: [{ targets: ['alertmanager:9093'] }] }]

scrape_configs:
  - job_name: prometheus
    static_configs: [{ targets: ['localhost:9090'] }]
  - job_name: node
    static_configs: [{ targets: ['10.0.0.11:9100', '10.0.0.12:9100'] }]
  - job_name: k8s-pods
    kubernetes_sd_configs: [{ role: pod }]

Проверка: promtool check config prometheus.yml.

PromQL

up                                              # доступность целей (1 / 0)
http_requests_total{job="api", status=~"5.."}   # фильтр по меткам
rate(http_requests_total[5m])                   # скорость в секунду (для counter)
sum by (job) (rate(http_requests_total[5m]))
histogram_quantile(0.95, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
(1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100        # загрузка CPU, %
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes
increase(errors_total[1h])
topk(5, sum by (instance) (rate(x[5m])))

Операторы меток: =, !=, =~, !~. Функции: rate, irate, increase, avg_over_time, delta, predict_linear.

Правила оповещений

groups:
  - name: basics
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 5m
        labels: { severity: critical }
        annotations:
          summary: "{{ $labels.instance }} недоступен"
      - alert: HighErrorRate
        expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05
        for: 10m
        labels: { severity: warning }

Alertmanager

Группировка, подавление дублей, тихие часы, маршрутизация: Telegram, Slack, email, PagerDuty.

route:
  receiver: team
  group_by: [alertname]
receivers:
  - name: team
    telegram_configs: [{ bot_token: "...", chat_id: 123 }]

Exporters

Источник Exporter
Сервер Linux node_exporter (:9100)
Windows windows_exporter
Контейнеры cAdvisor
PostgreSQL, MySQL, Redis postgres_exporter, mysqld_exporter, redis_exporter
Nginx nginx-prometheus-exporter
«Чёрный ящик» (HTTP, ping) blackbox_exporter
Kubernetes kube-state-metrics

Приёмы

  • Метки с малым числом значений (не user_id): иначе взрывается кардинальность.
  • Хранение: --storage.tsdb.retention.time=15d; долгое хранение через remote_write (Mimir, Thanos, VictoriaMetrics).
  • Для коротких заданий используйте Pushgateway.