Prometheus — Monitoring a Metriky
Prometheus je open-source monitoring systém a databáza časových radov (time-series), pôvodne vyvinutý v SoundCloud. Dnes je súčasťou Cloud Native Computing Foundation (CNCF) a de facto štandard pre monitoring v Kubernetes a cloud-native prostredí.
Prečo Prometheus?
- Pull model — Prometheus si sám sťahuje metriky z cieľov (targets), čo zjednodušuje konfiguráciu
- Výkonný dotazovací jazyk — PromQL umožňuje flexibilné analýzy a agregácie
- Nezávislosť — nevyžaduje externú databázu ani distribuovaný storage
- Service discovery — automaticky objavuje nové služby
- Bohatý ekosystém — stovky exporterov pre rôzne technológie
- Natívna integrácia — Grafana, Alertmanager, Kubernetes
Architektúra
Prometheus funguje na pull modeli — periodicky scrapuje HTTP endpointy (/metrics) svojich cieľov.
Hlavné komponenty:
- Prometheus Server — jadro systému, scrapuje a ukladá metriky
- TSDB (Time Series Database) — efektívne lokálne úložisko optimalizované na časové rady
- Alertmanager — spracovanie a routovanie alertov (email, Slack, PagerDuty)
- Pushgateway — pre krátkodobé joby, ktoré nemôžu byť scrapované
- Exporters — zbierajú metriky z tretích strán a vystavujú ich v Prometheus formáte
┌──────────────┐ scrape ┌──────────────┐
│ Targets │ ◄────────────── │ Prometheus │
│ /metrics │ │ Server │
└──────────────┘ │ ┌─────────┐ │
│ │ TSDB │ │
┌──────────────┐ push │ └─────────┘ │
│ Pushgateway │ ◄────────────── │ │
└──────────────┘ └───────┬───────┘
│
alerts│ queries
│
┌──────────┴──────────┐
│ │
┌──────▼──────┐ ┌───────▼──────┐
│ Alertmanager│ │ Grafana │
└─────────────┘ └──────────────┘
Typy metrík
Prometheus pozná štyri základné typy metrík:
- Counter — monotónne rastúca hodnota (napr. počet requestov) —
http_requests_total - Gauge — hodnota, ktorá môže rásť aj klesať (napr. teplota, pamäť) —
node_memory_available_bytes - Histogram — distribúcia hodnôt v bucketoch (napr. latencia) —
http_request_duration_seconds - Summary — podobné histogramu, ale počíta quantily na strane klienta
PromQL — Basics
PromQL (Prometheus Query Language) je výkonný jazyk na dotazovanie time-series dát.
Základné dotazy:
# Aktuálna hodnota metriky
up
# Filtruj podľa labelov
http_requests_total{method="GET", status="200"}
# Rate — priemerná rýchlosť zmeny za posledných 5 minút
rate(http_requests_total[5m])
# Agregácie
sum(rate(http_requests_total[5m])) by (service)
# Top 5 služieb podľa CPU
topk(5, rate(container_cpu_usage_seconds_total[5m]))
Užitočné funkcie:
rate()— priemerná rýchlosť zmeny countera za intervalincrease()— absolútny nárast countera za intervalhistogram_quantile()— výpočet percentilov z histogramuavg_over_time()— priemer za časové oknoabsent()— detekcia chýbajúcich metrík (ideálne pre alerty)
Exporters
Exportery zbierajú metriky z existujúcich systémov a vystavujú ich vo formáte Prometheus.
Najpoužívanejšie:
- node_exporter — systémové metriky (CPU, RAM, disk, sieť) pre Linux servery
- cAdvisor — metriky Docker/Kubernetes kontajnerov (CPU, pamäť, I/O)
- blackbox_exporter — probing externých endpointov (HTTP, DNS, TCP, ICMP)
- mysqld_exporter — MySQL/MariaDB metriky
- postgres_exporter — PostgreSQL metriky
- redis_exporter — Redis metriky
Príklad konfigurácie node_exporter v prometheus.yml:
scrape_configs:
- job_name: "node"
static_configs:
- targets: ["server1:9100", "server2:9100"]
Integrácia s Grafana a Alertmanager
Grafana
Grafana je štandardný vizualizačný nástroj pre Prometheus. Pripojenie:
- V Grafane pridaj Data Source → Prometheus
- URL:
http://prometheus:9090 - Vytváraj dashboardy s PromQL dotazmi
Tip: Komunita ponúka hotové dashboardy na grafana.com/grafana/dashboards — napr. Node Exporter Full (ID: 1860).
Alertmanager
Alerty sa definujú v Prometheus pravidlách a posielajú do Alertmanagera:
# alert_rules.yml
groups:
- name: instance
rules:
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Inštancia {{ $labels.instance }} je nedostupná"
Alertmanager potom routuje notifikácie podľa severity, tímu alebo služby do Slacku, emailu, PagerDuty atď.
Service Discovery
Prometheus podporuje automatické objavovanie cieľov — nemusíš manuálne udržiavať zoznam serverov.
Podporované mechanizmy:
- kubernetes_sd — automaticky objavuje Pody, Service, Endpoints v K8s
- consul_sd — integrácia s HashiCorp Consul
- dns_sd — DNS-based discovery (SRV záznamy)
- file_sd — JSON/YAML súbory s cieľmi (jednoduché, ale flexibilné)
- ec2_sd / gce_sd — AWS EC2 a GCP inštancie
Príklad Kubernetes SD:
scrape_configs:
- job_name: "kubernetes-pods"
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
Best Practices
- Používaj labels konzistentne —
service,env,regionna každej metrike - Nepoužívaj vysokú kardinalitu — vyhýbaj sa labelom s tisíckami unikátnych hodnôt (user ID, request ID)
- Rate pred sum — vždy
sum(rate(...)), nikdyrate(sum(...)) - Recording rules — predpočítaj drahé dotazy pre dashboardy
- Retention — default 15 dní; pre dlhodobé úložisko použi Thanos alebo Cortex
- Relabeling — filtruj a transformuj labels pri scrape, nie v PromQL
- Federation — pre veľké prostredia použi hierarchickú federáciu
- Monitoruj Prometheus samotný —
prometheus_tsdb_*metriky
Quick Reference
| Čo | Príkaz / Konfigurácia |
|---|---|
| Spustenie Prometheus | docker run -p 9090:9090 -v ./prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus |
| Spustenie node_exporter | docker run -p 9100:9100 --pid=host --net=host prom/node-exporter |
| Scrape interval | global: { scrape_interval: 15s } |
| Status cieľov | http://prometheus:9090/targets |
| Všetky UP inštancie | up == 1 |
| Request rate | rate(http_requests_total[5m]) |
| 99. percentil latencie | histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) |
| Alert na výpadok | up == 0 pre for: 5m |
| Veľkosť TSDB | prometheus_tsdb_storage_size_bytes |
| Reload konfigurácie | curl -X POST http://prometheus:9090/-/reload |
Prometheus je základ observability stacku. V kombinácii s Grafanou a Alertmanagerom poskytuje kompletný monitoring pre akúkoľvek infraštruktúru.