Nagios nám sloužil roky. Pak přišly kontejnery, mikroslužby a dynamická infrastruktura — a Nagios se začal dusit. Přechod na Prometheus s Grafanou nebyl jen výměna nástroje. Byl to úplně jiný způsob myšlení o monitoringu.
Proč Prometheus¶
Nagios, Zabbix, Icinga — všechny fungují na principu push modelu. Agent na serveru posílá metriky do centrální instance. To funguje skvěle, dokud máte statickou infrastrukturu s pojmenovanými servery. Jakmile přijdou kontejnery, které žijí minuty a nemají stabilní hostname, push model se hroutí.
Prometheus funguje obráceně — pull model. Prometheus sám chodí na HTTP endpointy aplikací a sbírá metriky. Díky service discovery automaticky najde nové instance v Kubernetes, Consul nebo EC2. Kontejner nastartuje, Prometheus ho objeví, začne scrapovat. Kontejner zmizí, Prometheus přestane. Žádná konfigurace, žádné agenty.
Instrumentace — metriky z první ruky¶
Klíčový koncept Promethea je, že aplikace samy exportují metriky.
Žádný externí agent, který parsuje logy nebo monitoruje porty. Aplikace
vystavuje /metrics endpoint s aktuálními hodnotami — request
count, latence, error rate, velikost queue.
# HELP http_requests_total Total HTTP requests
# TYPE http_requests_total counter
http_requests_total{method="GET",path="/api/users",status="200"} 48293
http_requests_total{method="POST",path="/api/orders",status="201"} 7841
http_requests_total{method="GET",path="/api/users",status="500"} 23
# HELP http_request_duration_seconds Request latency
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.1"} 41209
http_request_duration_seconds_bucket{le="0.5"} 47891
http_request_duration_seconds_bucket{le="1.0"} 48102
Klientské knihovny existují pro Go, Java, Python, Node.js, .NET — prakticky cokoliv. Instrumentace jedné služby zabere hodinu. A od té chvíle máte metriky, které opravdu odpovídají tomu, co se v aplikaci děje.
PromQL — jazyk, který změní váš monitoring¶
Většina monitorovacích systémů umí zobrazit „CPU je na 87 %”. Prometheus umí odpovědět na otázky jako „jaký je 95. percentil latence za posledních 5 minut pro službu X, filtrovaný podle HTTP metody”.
# Error rate za posledních 5 minut
rate(http_requests_total{status=~"5.."}[5m])
/ rate(http_requests_total[5m]) * 100
# 95. percentil latence
histogram_quantile(0.95,
rate(http_request_duration_seconds_bucket[5m])
)
# Top 5 nejpomalejších endpointů
topk(5,
avg by (path) (rate(http_request_duration_seconds_sum[5m])
/ rate(http_request_duration_seconds_count[5m]))
)
PromQL má křivku učení. Ale jakmile ho pochopíte, nebudete chtít nic jiného. Agregace, filtry, rate výpočty — všechno v jednom dotazu. A ten samý dotaz použijete v dashboardu i v alert pravidle.
Grafana — vizualizace, která dává smysl¶
Prometheus má vlastní UI, ale je spartánské. Grafana je vizualizační vrstva, která z Prometheus dat dělá čitelné dashboardy. Grafy, heatmapy, tabulky, single-stat panely — všechno konfigurovatelné, všechno sdílitelné.
Náš setup: jeden dashboard per služba (RED metriky — Rate, Errors, Duration), jeden infrastructure dashboard (CPU, memory, disk, network) a jeden „war room” dashboard pro on-call inženýra s přehledem celého systému. Dashboardy verzujeme v Gitu jako JSON — provisioning přes Grafana API při deployi.
Alerting — Alertmanager v praxi¶
Alert pravidla definujeme v Prometheus configu. Když podmínka platí déle než stanovenou dobu, Prometheus pošle alert do Alertmanageru. Ten se stará o deduplikaci, groupování, silencing a routing — alert jde do Slacku, PagerDuty nebo e-mailu podle severity.
groups:
- name: sla
rules:
- alert: HighErrorRate
expr: |
rate(http_requests_total{status=~"5.."}[5m])
/ rate(http_requests_total[5m]) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "Error rate > 5 % na {{ $labels.instance }}"
Klíčové poučení: alertujte na symptomy, ne na příčiny. Nealertujte „CPU > 90 %”. Alertujte „latence p99 > 2 s” nebo „error rate > 5 %”. CPU může být na 90 % a všechno funguje. Ale když uživatelé čekají 5 sekund na odpověď, to je problém.
Kubernetes service discovery¶
V Kubernetes prostředí Prometheus automaticky objevuje pody přes Kubernetes API. Stačí přidat anotace na pod a Prometheus začne scrapovat. Žádná ruční konfigurace, žádné udržování seznamu targetů.
Node Exporter na každém nodu sbírá systémové metriky. cAdvisor (integrovaný v kubelet) poskytuje kontejnerové metriky. kube-state-metrics exportuje stav Kubernetes objektů — deploymenty, replica sety, pody. Dohromady máte kompletní obraz celého clusteru.
Co nás překvapilo¶
Retention — Prometheus není long-term storage. Defaultně drží data 15 dní. Pro dlouhodobé trendy potřebujete remote storage (Thanos, Cortex, VictoriaMetrics). My jsme začali s 30denní retencí a pro kapacitní plánování posíláme agregovaná data do InfluxDB.
High availability — Prometheus nemá nativní clustering. Řešení: dvě nezávislé instance scrapují stejné targety. Alertmanager má vlastní clustering pro deduplikaci. Funguje to, ale je to jiný model než „jeden cluster, který se stará o všechno”.
Cardinality — příliš mnoho unikátních label kombinací zabije Prometheus. Jeden tým přidal user_id jako label na HTTP metriky. 50 000 unikátních uživatelů × 10 metrik × 3 HTTP metody = exploze paměti. Label values musí být nízko-kardinalitní.
Monitoring jako kultura¶
Prometheus + Grafana nejsou jen nástroje — jsou to katalyzátory kulturní změny. Vývojáři přidávají metriky do kódu, protože chtějí vidět, jak se jejich služba chová v produkci. Ops tým má dashboardy místo ručního SSH. On-call inženýr vidí problém dřív, než zavolá zákazník. Začněte s jednou službou, instrumentujte ji, vytvořte dashboard. Zbytek přijde sám.
Brauchen Sie Hilfe bei der Implementierung?
Unsere Experten helfen Ihnen bei Design, Implementierung und Betrieb. Von der Architektur bis zur Produktion.
Kontaktieren Sie uns