Prometheus: működése és szerepe a monitorozásban és riasztásokban

A Prometheus egy nyílt forráskódú eszköz, amely segíti rendszerek és alkalmazások teljesítményének figyelését. Gyűjti az adatokat, elemez, és riasztásokat küld, ha problémát észlel, így gyorsan reagálhatunk a hibákra.
ITSZÓTÁR.hu
37 Min Read

A modern informatikai rendszerek komplexitása soha nem látott méreteket öltött. A monolitikus alkalmazások helyét egyre inkább átveszik a mikroservice architektúrák, a konténerizáció és a felhőalapú megoldások. Ebben a dinamikusan változó környezetben a rendszerek megbízható működésének biztosítása kulcsfontosságúvá vált. Ehhez elengedhetetlen egy robusztus és hatékony monitorozási stratégia, amely képes valós időben gyűjteni, tárolni és elemezni az adatokat, valamint időben figyelmeztetni a lehetséges problémákra. Ebben a kontextusban emelkedik ki a Prometheus, mint az egyik vezető nyílt forráskódú monitorozó és riasztórendszer, amely forradalmasította a megközelítést.

A Prometheus nem csupán egy eszköz, hanem egy teljes ökoszisztéma, amely a Google belső monitorozási rendszeréből, a Borgmonból merített inspirációt. A Cloud Native Computing Foundation (CNCF) második projektjeként a Kubernetes után, a Prometheus gyorsan a felhőalapú infrastruktúrák és alkalmazások monitorozásának de facto szabványává vált. Különösen népszerű a konténerizált környezetekben, mint például a Kubernetes, ahol a dinamikus és efemer erőforrások monitorozása komoly kihívást jelentene hagyományos eszközökkel.

Ennek a cikknek az a célja, hogy részletesen bemutassa a Prometheus működését, architektúráját, kulcskomponenseit és szerepét a modern monitorozási és riasztási stratégiákban. Megvizsgáljuk, hogyan gyűjti az adatokat, hogyan dolgozza fel azokat a PromQL lekérdező nyelv segítségével, és hogyan teszi lehetővé a proaktív riasztások küldését az Alertmanageren keresztül. Emellett kitérünk a vizualizációra, a szolgáltatás felfedezésre és a rendszer skálázhatóságára is, hogy teljes képet kapjunk erről a rendkívül sokoldalú eszközről.

Miért kritikus a monitorozás a modern rendszerekben?

A monitorozás nem luxus, hanem alapvető szükséglet minden olyan szervezet számára, amely digitális szolgáltatásokat nyújt. Anélkül, hogy pontos képet kapnánk rendszereink állapotáról, működéséről és teljesítményéről, vakon navigálnánk. A problémák azonosítása, a teljesítménybeli szűk keresztmetszetek felderítése és a felhasználói élmény optimalizálása mind-mind a hatékony monitorozásra épül. Egy nem monitorozott rendszer olyan, mint egy irányítatlan hajó a viharos tengeren: bármikor zátonyra futhat, anélkül, hogy tudnánk, miért.

A modern alkalmazások gyakran elosztott rendszerek formájában épülnek fel, ahol több tucat, vagy akár több száz mikroservice kommunikál egymással. Ezek a szolgáltatások különböző szervereken, konténerekben vagy virtuális gépeken futhatnak, és a felhőben vagy helyi infrastruktúrán egyaránt elhelyezkedhetnek. Ebben a komplex hálóban egyetlen komponens meghibásodása is dominóeffektust indíthat el, ami a teljes szolgáltatás elérhetetlenségéhez vezethet. A monitorozás révén időben észlelhetjük ezeket a problémákat, mielőtt azok súlyos károkat okoznának.

A monitorozás három fő pilléren nyugszik: a metrikákon, a logokon és a trace-eken. A Prometheus elsősorban a metrikák gyűjtésére és elemzésére specializálódott, amelyek numerikus adatok, rendszeres időközönként gyűjtve, és egy adott rendszerállapotot írnak le. Például CPU kihasználtság, memória fogyasztás, hálózati forgalom, kérések száma másodpercenként, vagy adatbázis lekérdezések latenciája. Ezek az adatok aggregálhatók, trendek vizsgálhatók belőlük, és riasztási küszöbértékek állíthatók be rájuk.

A monitorozás nem csak a problémák észleléséről szól, hanem a proaktív hibaelhárításról, a teljesítmény optimalizálásáról és a rendszerek mélyebb megértéséről is.

A monitorozás célja nem csupán a hibák elhárítása, hanem a rendszerek viselkedésének mélyebb megértése is. A hosszú távú metrikaadatok elemzésével azonosíthatók a szezonális trendek, a terhelésmintázatok, és előre jelezhetők a lehetséges kapacitásproblémák. Ez lehetővé teszi a fejlesztők és üzemeltetők számára, hogy megalapozott döntéseket hozzanak a rendszer tervezésével, skálázásával és optimalizálásával kapcsolatban.

A Prometheus születése és filozófiája

A Prometheus projekt 2012-ben indult a SoundCloudnál, mint egy belső fejlesztésű monitorozási megoldás, amely a Google Borgmonjának elveit követte. A fejlesztők frusztráltak voltak a piacon lévő monitorozási rendszerek korlátaival, különösen a felhőalapú, dinamikus infrastruktúrák és a mikroservice architektúrák kezelésében. A cél egy olyan rendszer létrehozása volt, amely rugalmas, skálázható és könnyen integrálható, miközben valós idejű betekintést nyújt a rendszerek működésébe.

A Prometheus filozófiája több kulcsfontosságú elven alapul:

  • Pull modell: A Prometheus aktívan lekérdezi (scrape-eli) a célpontokról a metrikákat, szemben a hagyományos „push” modellel, ahol a célpontok küldik az adatokat. Ez egyszerűsíti a konfigurációt és a hibaelhárítást, mivel a Prometheus szerver „tudja”, mit monitoroz.
  • Többdimenziós adatmodell: A metrikák kulcs-érték párokkal (label-ekkel) bővíthetők, ami rendkívül rugalmassá teszi az adatok lekérdezését és aggregálását. Például egy HTTP kérés metrikája tartalmazhatja a metódust (GET, POST), az elérési utat és a státuszkódot (200, 404).
  • Rendkívül hatékony lekérdező nyelv (PromQL): A PromQL lehetővé teszi komplex lekérdezések, aggregációk és riasztási szabályok definiálását, amelyekkel mélyen elemezhetők az adatok.
  • Önálló szerver: A Prometheus szerver önállóan működik, nem függ külső tárolótól vagy hálózati erőforrástól a metrikák gyűjtéséhez és tárolásához. Ez robusztussá és megbízhatóvá teszi.
  • Nyílt forráskódú és közösségvezérelt: A Prometheus aktív és nagy közösséggel rendelkezik, ami folyamatos fejlesztést és széles körű integrációt biztosít.

2016-ban a Prometheus a Cloud Native Computing Foundation (CNCF) részévé vált, ami tovább erősítette pozícióját a felhőalapú ökoszisztémában. A projekt éretté vált, és számos nagyvállalat és startup használja világszerte a kritikus rendszereinek monitorozására.

A Prometheus architektúrája és kulcskomponensei

A Prometheus nem egy monolitikus rendszer, hanem több, egymással együttműködő komponensből áll, amelyek mindegyike specifikus feladatot lát el. Ez a moduláris felépítés biztosítja a rugalmasságot és a skálázhatóságot.

A Prometheus szerver

Ez a rendszer központi eleme, amely felelős a metrikák gyűjtéséért, tárolásáért és lekérdezéséért. A Prometheus szerver konfigurációs fájlja (általában prometheus.yml) határozza meg, hogy mely célpontokról gyűjtsön adatokat, milyen gyakorisággal, és milyen riasztási szabályokat alkalmazzon. A szerver egy beépített idősoros adatbázist (TSDB) használ a metrikák tárolására, amely rendkívül hatékony a numerikus adatok kezelésére.

Exporterek

Az exporterek olyan kis alkalmazások, amelyek a monitorozni kívánt rendszerek vagy szolgáltatások metrikáit gyűjtik, és Prometheus-kompatibilis formátumban teszik elérhetővé egy HTTP végponton keresztül. A Prometheus szerver ezután lekérdezi (scrape-eli) ezeket a végpontokat. Számos előre elkészített exporter létezik különböző rendszerekhez:

  • Node Exporter: Operációs rendszer szintű metrikák (CPU, memória, lemez I/O, hálózati forgalom) gyűjtésére.
  • cAdvisor: Konténer metrikák (CPU, memória, hálózat) gyűjtésére, különösen Kubernetes környezetben.
  • Blackbox Exporter: Külső szolgáltatások (HTTP, HTTPS, DNS, TCP) elérhetőségének és válaszidejének monitorozására.
  • Database Exporterek: Adatbázisok (MySQL, PostgreSQL, MongoDB stb.) metrikáinak gyűjtésére.
  • Application-specific Exporterek: Pl. Kafka, Redis, Nginx stb.

Lehetőség van egyedi exporterek írására is, amennyiben egy specifikus alkalmazás vagy szolgáltatás metrikáit szeretnénk monitorozni. Ehhez a Prometheus számos klienskönyvtárat biztosít különböző programozási nyelvekhez (Go, Java, Python, Ruby stb.).

Pushgateway

Bár a Prometheus alapvetően pull alapú, vannak olyan esetek, amikor ez a modell nem alkalmazható hatékonyan. Például rövid életű batch jobok, amelyek futásuk során generálnak metrikákat, de mire a Prometheus lekérdezné őket, már befejeződtek. Ilyen esetekre szolgál a Pushgateway. A batch jobok a Pushgateway-nek küldik (push-olják) a metrikáikat, a Pushgateway pedig tárolja azokat, amíg a Prometheus szerver le nem scrape-eli onnan. Fontos megjegyezni, hogy a Pushgateway-t csak akkor érdemes használni, ha a pull modell valóban nem megoldható, mivel a Pushgateway használata némileg rontja a Prometheus diagnosztikai képességeit.

Alertmanager

Az Alertmanager felelős a Prometheus szerver által generált riasztások kezeléséért. Amikor egy riasztási szabály feltétele teljesül a Prometheusban, a riasztás az Alertmanagerhez kerül. Az Alertmanager ezután kezeli a riasztásokat a konfigurált szabályok alapján:

  • Csoportosítás: Összegyűjti a hasonló riasztásokat, hogy elkerülje a riasztási özönt.
  • Elnyomás (Suppression): Elnyomja az ismétlődő vagy függő riasztásokat.
  • Némítás (Silencing): Lehetővé teszi a riasztások ideiglenes némítását karbantartási időszakok alatt.
  • Útválasztás (Routing): Különböző címzettekhez (e-mail, Slack, PagerDuty, SMS) irányítja a riasztásokat a riasztások labeljei alapján.

Az Alertmanager konfigurációja rendkívül rugalmas, lehetővé téve komplex riasztási útvonalak és értesítési stratégiák definiálását.

Grafana

Bár a Prometheus rendelkezik egy alapvető webes felhasználói felülettel a metrikák lekérdezéséhez és megjelenítéséhez, a legtöbb felhasználó a Grafana-t választja az adatok vizualizálására. A Grafana egy nyílt forráskódú analitikai és monitorozási platform, amely számos adatforrással képes együttműködni, beleértve a Prometheust is. A Grafana segítségével interaktív, testreszabható műszerfalakat (dashboardokat) hozhatunk létre, amelyek valós időben mutatják a rendszer állapotát és teljesítményét. A PromQL lekérdezésekkel a Grafana paneljei rendkívül dinamikusak és informatívak lehetnek.

A Prometheus és a Grafana szinte elválaszthatatlan párost alkot a modern monitorozási ökoszisztémában, ahol a Prometheus a háttérben gyűjti és tárolja az adatokat, míg a Grafana a felhasználóbarát vizualizációt biztosítja.

Ez az architektúra lehetővé teszi a Prometheus számára, hogy rendkívül skálázható és rugalmas legyen, alkalmazkodva a legkülönbözőbb monitorozási igényekhez, a kis projektektől a nagyméretű, elosztott rendszerekig.

Hogyan működik a Prometheus? A „pull” modell mélyrehatóan

A Prometheus
A Prometheus a „pull” modellel folyamatosan lekéri az adatokat, így hatékonyan kezeli a dinamikus környezeteket.

A Prometheus működésének alapja a „pull” modell. Ez azt jelenti, hogy a Prometheus szerver kezdeményezi a kapcsolatot a monitorozott célpontokkal (targetekkel) és azoktól „húzza be” (scrape-eli) a metrikákat. Ez alapvető különbséget jelent számos hagyományos monitorozó rendszerhez képest, amelyek „push” modellt alkalmaznak, ahol az ügynökök küldik az adatokat a központi szervernek.

A scrape folyamat

A scrape folyamat a következőképpen zajlik:

  1. Célpontok felfedezése (Service Discovery): A Prometheus szervernek tudnia kell, mely célpontokról kell metrikákat gyűjtenie. Ezt statikus konfigurációval, fájl alapú felfedezéssel, vagy dinamikus szolgáltatás felfedezési mechanizmusokkal (pl. Kubernetes, Consul, AWS EC2) éri el.
  2. Lekérdezés (Scraping): A Prometheus szerver rendszeres időközönként (ez az úgynevezett scrape_interval, alapértelmezésben 15 másodperc) HTTP kérést küld a célpontok /metrics végpontjára (ez a leggyakoribb, de konfigurálható).
  3. Metrikák fogadása: A célpont (vagy az exporter) válaszként egy szöveges, ember által is olvasható formátumban küldi vissza a metrikákat. Ez a formátum általában a Prometheus text format, amely soronként tartalmazza a metrika nevét, a labeljeit és az aktuális értékét.
  4. Tárolás: A Prometheus szerver elemzi a kapott metrikákat, hozzáadja a saját, automatikusan generált labeljeit (pl. instance, job) és eltárolja azokat a beépített idősoros adatbázisában.

A pull modell számos előnnyel jár:

  • Egyszerű konfiguráció: A Prometheus szerver konfigurációja egyetlen helyen történik, ahol megadjuk a monitorozandó célpontokat. Nem kell minden egyes célponton konfigurálni, hogy hova küldje az adatokat.
  • Hibaelhárítás: Ha a Prometheus szerver nem kap metrikákat egy célpontról, az azonnal jelzi, hogy valószínűleg a célpont vagy az exporter nem elérhető, vagy hibásan működik. Nincs szükség arra, hogy a célpontok logjaiban keressük a problémát.
  • Biztonság: A tűzfalak konfigurációja egyszerűbb, mivel csak a Prometheus szerverről kell engedélyezni a kimenő kapcsolatokat a célpontok felé, nem pedig fordítva.
  • Skálázhatóság: A Prometheus szerverek horizontálisan skálázhatók, és a terhelés elosztható a különböző szerverek között a célpontok felosztásával.

Természetesen vannak hátrányai is, például a belső hálózaton kívüli célpontok monitorozása bonyolultabbá válhat (erre a Pushgateway és a Blackbox Exporter nyújt megoldást), de a legtöbb modern infrastruktúrában a pull modell előnyei felülmúlják a hátrányait.

Metrikák gyűjtése: exporterek és instrumentáció

A Prometheus sikerének egyik kulcsa a rendkívül széles körű exporter ökoszisztéma és a könnyű alkalmazás instrumentáció. Az exporterek, ahogy már említettük, külső rendszerek metrikáit teszik elérhetővé a Prometheus számára.

Az alkalmazás instrumentációja azt jelenti, hogy magába az alkalmazás kódjába építünk be metrikagyűjtő logikát a Prometheus klienskönyvtárak segítségével. Ez lehetővé teszi, hogy az alkalmazás belső működéséről, üzleti logikájáról és specifikus eseményeiről is gyűjtsünk adatokat. Például:

  • A feldolgozott tranzakciók száma.
  • Egy adott API végpont válaszideje.
  • A felhasználói bejelentkezések száma.
  • A belső üzenetsorok hossza.

A klienskönyvtárak négy fő metrika típust támogatnak:

  1. Counter: Egyetlen, monotonikusan növekvő szám. Tipikusan kérések számát, hibák számát méri. Csak növekedhet, vagy resetelhető nullára (pl. újraindításkor).
  2. Gauge: Egyetlen numerikus érték, ami tetszőlegesen növekedhet vagy csökkenhet. Például aktuális memória kihasználtság, CPU hőmérséklet, üzenetsor hossza.
  3. Histogram: Mintavételezett értékeket (pl. kérés latencia, válaszmérte) gyűjt, és lehetővé teszi azok eloszlásának elemzését. Bin-eket (értéktartományokat) definiál, és számolja, hány minta esik az egyes bin-ekbe. Emellett számolja az összes mintát és azok összegét is.
  4. Summary: Hasonló a histogramhoz, de kliens oldalon számítja ki a kvantiliseket (pl. 0.5, 0.9, 0.99 percentilis). Ez memóriaigényesebb lehet, és a histogram a preferált típus a legtöbb esetben.

Az exporterek és az alkalmazás instrumentáció kombinációja rendkívül részletes és pontos képet ad a rendszerek működéséről, lehetővé téve a proaktív hibaelhárítást és a teljesítmény optimalizálását.

A PromQL: a lekérdező nyelv ereje

A Prometheus Query Language (PromQL) a Prometheus szíve és lelke. Ez egy rendkívül hatékony és rugalmas lekérdező nyelv, amellyel a tárolt metrikákat lekérdezhetjük, aggregálhatjuk, transzformálhatjuk és elemezhetjük. A PromQL teszi lehetővé, hogy értelmes információt nyerjünk ki a nyers metrikaadatokból, és ezáltal riasztási szabályokat vagy Grafana műszerfalakat hozzunk létre.

Alapvető PromQL lekérdezések

A PromQL lekérdezések alapja a metrika neve és a hozzá tartozó label-ek. Például:

http_requests_total

Ez lekérdezi az összes http_requests_total nevű metrika összes idősorát, függetlenül a labeljeiktől. Ha szűkíteni szeretnénk a lekérdezést, használhatunk label szelektorokat:

http_requests_total{method="POST", status="200"}

Ez csak azokat a HTTP kéréseket mutatja, amelyek POST metódussal történtek és 200-as státuszkóddal tértek vissza. Reguláris kifejezések is használhatók a label értékek szűrésére:

http_requests_total{instance=~"web-server-.*"}

Ez a „web-server-” kezdetű instance label-lel rendelkező metrikákat szűri.

Időintervallumok és aggregációk

A PromQL lehetővé teszi az adatok időintervallumok szerinti lekérdezését is. A [duration] szintaxissal megadhatunk egy időtartamot, például [5m] 5 percet, [1h] 1 órát. Például, ha az elmúlt 5 percben történt HTTP kérések számát akarjuk látni:

rate(http_requests_total[5m])

A rate() függvény egy számláló (counter) metrika növekedési sebességét számolja ki másodpercenként átlagosan, a megadott időtartam alatt. Ez rendkívül hasznos a percenkénti kérések (RPS – Requests Per Second) vagy a hibaráta (Error Rate) kiszámításához.

Az aggregációs operátorok segítségével csoportosíthatjuk és összesíthetjük az adatokat a label-ek alapján. Például, ha az összes HTTP kérés számát akarjuk látni, metódusonként csoportosítva:

sum by (method) (rate(http_requests_total[5m]))

Ez lekérdezi az összes http_requests_total metrika 5 perces átlagos növekedési sebességét, majd összegzi azokat a method label alapján. Más aggregációs operátorok is rendelkezésre állnak, mint például avg, min, max, count, stddev, stdvar, topk, bottomk.

Összetett lekérdezések és függvények

A PromQL számos beépített függvényt kínál, amelyekkel komplex számításokat végezhetünk. Például:

  • increase(): Egy számláló metrika növekedését számolja ki a megadott időtartam alatt.
  • irate(): Azonnali növekedési sebességet számol ki, a legutóbbi két adatpont alapján, érzékenyebb a hirtelen változásokra.
  • delta(): Két adatpont közötti különbséget számolja ki.
  • histogram_quantile(): Histogram metrikákból kvantiliseket számol ki (pl. P99 latencia).
  • absent(): Ellenőrzi, hogy egy metrika hiányzik-e a megadott időintervallumban, ami hasznos lehet a szolgáltatás leállásának detektálására.

A PromQL támogatja az aritmetikai operátorokat (+, -, *, /, %), logikai operátorokat (and, or, unless), valamint összehasonlító operátorokat (==, !=, >, <, >=, <=) is, amelyek segítségével összetett feltételeket hozhatunk létre riasztásokhoz vagy szűrésekhez.

A PromQL elsajátítása kulcsfontosságú a Prometheus hatékony használatához. Lehetővé teszi, hogy nem csupán adatokat gyűjtsünk, hanem mélyen elemezzük azokat, és valós idejű, releváns információkat nyerjünk ki a rendszereink működéséről.

Riasztások konfigurálása az Alertmanagerrel

A monitorozás célja nem csupán az adatok gyűjtése, hanem az is, hogy időben értesüljünk a problémákról. Itt jön képbe az Alertmanager, amely a Prometheus riasztáskezelő komponense. Az Alertmanager feladata, hogy a Prometheus által generált riasztásokat fogadja, feldolgozza és a megfelelő csatornákon keresztül eljuttassa a felelős személyekhez.

Riasztási szabályok a Prometheusban

Mielőtt az Alertmanager működésbe lépne, a Prometheus szerveren kell definiálni a riasztási szabályokat. Ezek a szabályok PromQL lekérdezésekből állnak, amelyek egy adott feltétel teljesülése esetén riasztást generálnak. A szabályokat általában külön YAML fájlokban tárolják (pl. alert.rules.yml), amelyeket a Prometheus konfigurációjában include-olnak.

Egy tipikus riasztási szabály a következőképpen néz ki:

groups:
  - name: application_alerts
    rules:
    - alert: HighRequestLatency
      expr: histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m])) > 0.5
      for: 2m
      labels:
        severity: critical
      annotations:
        summary: "Magas HTTP kérés latencia (P99 > 500ms)"
        description: "Az alkalmazás '{{ $labels.job }}' példánya '{{ $labels.instance }}' magas latenciát mutat az elmúlt 2 percben."

Ebben a példában:

  • alert: A riasztás neve.
  • expr: A PromQL kifejezés, amely a riasztás feltételét definiálja. Itt a 99. percentilis (P99) HTTP kérés latenciáját ellenőrzi, és riaszt, ha az meghaladja az 500 milliszekundumot (0.5 másodperc).
  • for: Az az időtartam, ameddig a feltételnek igaznak kell lennie, mielőtt a riasztás aktívvá válna. Ez segít elkerülni a rövid ideig tartó, átmeneti hibák miatti felesleges riasztásokat.
  • labels: Egyedi label-ek, amelyek további információkat szolgáltatnak a riasztásról, és az Alertmanager ezek alapján csoportosíthatja vagy útválasztja a riasztásokat.
  • annotations: Emberi olvasásra szánt információk, mint például egy összefoglaló vagy részletes leírás a riasztásról.

Amikor egy riasztás aktívvá válik (az expr feltétel igaz, és a for időtartam is eltelt), a Prometheus elküldi azt az Alertmanagernek.

Az Alertmanager konfigurációja

Az Alertmanager konfigurációs fájlja (alertmanager.yml) határozza meg, hogyan kezelje a bejövő riasztásokat. A legfontosabb szekciók:

  • route: Ez a gyökér útválasztási szabály, amely meghatározza, hogyan legyenek csoportosítva a riasztások, és milyen címzettekhez kerüljenek. A szabályok hierarchikusak, azaz al-útvonalak is definiálhatók.
  • receivers: Meghatározza, hogy milyen értesítési csatornákat használjon az Alertmanager (pl. e-mail, Slack, PagerDuty, Webhook). Minden receivernek van egy neve és a specifikus konfigurációja.
  • inhibit_rules: Lehetővé teszi, hogy bizonyos riasztások elnyomjanak más riasztásokat. Például, ha egy szerver leáll, nem akarunk riasztást kapni az összes rajta futó szolgáltatásról is. A szerver leállása elnyomja a szolgáltatásokkal kapcsolatos riasztásokat.
  • silences: Ideiglenesen elnémítja a riasztásokat egy adott időtartamra. Ez különösen hasznos karbantartási időszakok alatt, hogy elkerüljük a felesleges riasztási özönt.

Egy példa útválasztási szabályra:

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default-receiver'
  routes:
  - match:
      severity: 'critical'
    receiver: 'pagerduty-receiver'
    group_wait: 10s
    repeat_interval: 1h
  - match:
      team: 'devops'
    receiver: 'devops-slack'

Ez a konfiguráció a riasztásokat az alertname, cluster és service label-ek alapján csoportosítja. A „critical” súlyosságú riasztások a pagerduty-receiver-hez kerülnek, míg a team: devops label-lel rendelkezők a devops-slack receiverhez.

Az Alertmanager konfigurációja kulcsfontosságú a riasztási stratégia hatékonyságában. A jól átgondolt csoportosítás, elnyomás és útválasztás minimalizálja a riasztási fáradtságot és biztosítja, hogy a megfelelő személyek a megfelelő időben értesüljenek a releváns problémákról.

Adatok megjelenítése: Prometheus és Grafana

A metrikák gyűjtése és a riasztások konfigurálása mellett az adatok vizuális megjelenítése is elengedhetetlen a rendszerek állapotának megértéséhez és a problémák diagnosztizálásához. Bár a Prometheus rendelkezik egy alapvető webes felülettel, a legtöbb felhasználó a Grafana-t választja a vizualizációhoz, amely sokkal gazdagabb és rugalmasabb lehetőségeket kínál.

A Grafana integrációja Prometheusszal

A Grafana és a Prometheus integrációja rendkívül egyszerű. A Grafana felületén hozzá kell adni egy új adatforrást, kiválasztva a „Prometheus” típust, majd megadva a Prometheus szerver URL-jét. Ezután a Grafana képes lesz lekérdezni a metrikákat közvetlenül a Prometheusból.

Műszerfalak (dashboards) létrehozása

A Grafana ereje a testreszabható és interaktív műszerfalak létrehozásában rejlik. Egy műszerfal több panelből állhat, amelyek mindegyike egy-egy metrikát vagy adatkészletet jelenít meg különböző vizualizációs formákban (vonaldiagram, oszlopdiagram, kördiagram, táblázat, singlestat stb.).

Egy tipikus Grafana panel létrehozásának lépései:

  1. Hozzon létre egy új panelt a műszerfalon.
  2. Válassza ki a Prometheus adatforrást.
  3. Írja be a PromQL lekérdezést, amely a megjeleníteni kívánt adatokat szolgáltatja. Például: rate(node_cpu_seconds_total{mode="idle"}[5m]) * 100 a CPU kihasználtság megjelenítéséhez.
  4. Válassza ki a megfelelő vizualizációs típust (pl. Graph a vonaldiagramhoz).
  5. Konfigurálja a panel beállításait, mint például a cím, az egységek, a tengelyek, a színek és a küszöbértékek.

A Grafana számos funkciót kínál a műszerfalak fejlesztéséhez:

  • Változók (Variables): Lehetővé teszik a dinamikus műszerfalak létrehozását. Például egy legördülő menüből választhatunk szervert vagy szolgáltatást, és a műszerfal paneljei automatikusan frissülnek a kiválasztott entitás adatival. Ez elkerüli, hogy minden egyes szerverhez külön műszerfalat kelljen létrehozni.
  • Templating: A változók felhasználásával generálhatók a PromQL lekérdezések, ami rendkívül rugalmassá teszi a műszerfalakat.
  • Row és Panel ismétlés (Repeat Rows and Panels): A változók értékinek megfelelően ismételhetőek a sorok és panelek, ami nagyban egyszerűsíti a konfigurációt nagyszámú hasonló entitás (pl. konténerek, mikroservice-ek) esetén.
  • Alerting a Grafanából: Bár a Prometheus és az Alertmanager felelős az elsődleges riasztásokért, a Grafana is képes riasztásokat generálni a paneljein megjelenített adatok alapján. Ez hasznos lehet, ha a vizuális küszöbértékeket szeretnénk riasztásokká alakítani.
  • Annotation-ök: Lehetővé teszi, hogy eseményeket (pl. deployment, karbantartás) jelöljünk meg a diagramokon, segítve az adatok kontextualizálását.

A Grafana közösség hatalmas, és számos előre elkészített műszerfalat (Grafana Dashboards) tölthetünk le és importálhatunk, amelyek különböző rendszerekhez (Kubernetes, Node Exporter, MySQL stb.) készültek. Ez jelentősen felgyorsítja a bevezetést és a monitorozás beállítását.

A jól megtervezett Grafana műszerfalak nem csak a problémák diagnosztizálásában segítenek, hanem a rendszerek működésének mélyebb megértésében és a teljesítmény trendjeinek azonosításában is kulcsszerepet játszanak.

A vizuális megjelenítés lehetővé teszi a fejlesztők és üzemeltetők számára, hogy gyorsan áttekintsék a rendszerek állapotát, azonosítsák a rendellenességeket és nyomon kövessék a változásokat. A Prometheus és a Grafana együtt egy rendkívül hatékony és felhasználóbarát monitorozási megoldást biztosít.

Szolgáltatás felfedezés (Service Discovery) a Prometheusban

A Prometheus dinamikusan fedezi fel monitorozandó szolgáltatásokat.
A Prometheus szolgáltatás felfedezése automatikusan azonosítja az új erőforrásokat, így valós idejű monitorozást biztosít.

A modern, dinamikus infrastruktúrákban, ahol a szerverek, konténerek és szolgáltatások folyamatosan indulnak és állnak le, a monitorozandó célpontok manuális konfigurálása nem fenntartható. Itt jön képbe a szolgáltatás felfedezés (Service Discovery), amely lehetővé teszi a Prometheus számára, hogy automatikusan megtalálja és elkezdje monitorozni az új célpontokat, és abbahagyja a nem létezőek lekérdezését.

A Prometheus számos beépített szolgáltatás felfedezési mechanizmust támogat:

Statikus konfiguráció

Ez a legegyszerűbb módszer, ahol manuálisan listázzuk a célpontokat a Prometheus konfigurációs fájljában. Ez csak nagyon kis, statikus környezetekben javasolt:

scrape_configs:
  - job_name: 'static_servers'
    static_configs:
      - targets: ['localhost:9090', '192.168.1.10:9100']
        labels:
          env: 'production'

Fájl alapú szolgáltatás felfedezés

Ez a módszer egy vagy több fájl tartalmát figyeli (JSON vagy YAML formátumban), amelyek a célpontok listáját tartalmazzák. Amikor a fájl tartalma megváltozik, a Prometheus automatikusan frissíti a célpontok listáját. Ez hasznos lehet, ha egy külső szkript generálja a célpontok listáját.

scrape_configs:
  - job_name: 'file_sd'
    file_sd_configs:
      - files:
          - '/etc/prometheus/targets/*.yml'

Felhő alapú szolgáltatás felfedezés

A Prometheus közvetlenül integrálható különböző felhő szolgáltatókkal (AWS EC2, Azure, Google Cloud, OpenStack) és konténer orchestrátorokkal (Kubernetes, Mesos). Ez a leggyakoribb és legrugalmasabb megoldás a dinamikus felhőalapú környezetekben.

  • Kubernetes Service Discovery: Ez az egyik legnépszerűbb integráció. A Prometheus közvetlenül lekérdezi a Kubernetes API-t, hogy megtalálja a podokat, service-eket, endpointokat és node-okat, amelyeket monitoroznia kell. Képes automatikusan label-eket is hozzárendelni a Kubernetes metaadatok alapján.
  • Consul Service Discovery: A Consul egy népszerű szolgáltatás regisztrációs és felfedezési eszköz. A Prometheus integrálható a Consul-lal, hogy onnan vegye át a monitorozandó szolgáltatások listáját.
  • AWS EC2 Service Discovery: Az AWS EC2 példányokat automatikusan felfedezheti a Prometheus a megfelelő IAM jogosultságokkal.

Relabeling és relabel_configs

A szolgáltatás felfedezés során a Prometheus számos metaadatot gyűjt a célpontokról, amelyeket ideiglenes label-ekként kezel (általában __meta_ előtaggal). A relabeling mechanizmus lehetővé teszi ezen metaadatok manipulálását: szűrhetjük, átnevezhetjük, hozzáadhatjuk vagy eltávolíthatjuk a label-eket, mielőtt azok véglegesen a metrikákhoz kerülnének. Ez rendkívül hatékony a célpontok szűrésére, csoportosítására és a metrikák kontextusának gazdagítására.

Például, ha csak azokat a Kubernetes podokat akarjuk monitorozni, amelyeknek van egy specifikus annotációja, vagy ha a Kubernetes label-jeit szeretnénk Prometheus label-ekké alakítani, a relabeling szabályokat használjuk.

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
      - source_labels: [__meta_kubernetes_pod_label_app]
        target_label: app_name

Ez a példa csak azokat a podokat tartja meg, amelyek rendelkeznek a prometheus.io/scrape: "true" annotációval, és a Kubernetes app label-jét app_name néven adja hozzá a Prometheus metrikákhoz.

A szolgáltatás felfedezés és a relabeling kulcsfontosságú a Prometheus rugalmasságában és skálázhatóságában, lehetővé téve a rendszerek automatikus monitorozását a dinamikusan változó környezetekben.

Magas rendelkezésre állás és skálázhatóság a Prometheusban

A Prometheus alapvetően egy önálló szerver, amely egy példányban futva is rendkívül stabil. Azonban nagyméretű, kritikus fontosságú rendszerek esetén felmerül a magas rendelkezésre állás (High Availability – HA) és a horizontális skálázhatóság igénye. A Prometheus ökoszisztéma erre is kínál megoldásokat.

Magas rendelkezésre állás

A Prometheus HA megoldása általában két vagy több Prometheus szerver párhuzamos futtatásával valósul meg, amelyek ugyanazokat a célpontokat monitorozzák. Mindegyik szerver függetlenül gyűjti és tárolja a metrikákat. Ha az egyik szerver meghibásodik, a másik továbbra is gyűjti az adatokat és generálja a riasztásokat.

Az Alertmanager oldalon is megvalósítható a HA. Több Alertmanager példány futtatható cluster módban, ahol egymással kommunikálnak, hogy elkerüljék a duplikált riasztások küldését és biztosítsák a riasztások kézbesítését egy példány meghibásodása esetén is.

Horizontális skálázhatóság: Federation és Remote Storage

A Prometheus szerverek önmagukban nem skálázhatók horizontálisan egyetlen adatbázisként. Minden szerver a saját adatait tárolja. Ha a metrikaforgalom túl nagy egyetlen szerver számára, vagy ha több régióból/adatközpontból szeretnénk adatokat gyűjteni egy központi helyre, akkor más megoldásokra van szükség.

  • Federation: A Prometheus Federation lehetővé teszi, hogy egy „upstream” Prometheus szerver lekérdezze a metrikákat több „downstream” Prometheus szerverről. Ez a hierarchikus felépítés hasznos lehet, ha több adatközpontot vagy csapatot monitorozunk, és egy központi nézetre van szükségünk. Azonban a Federation elsősorban a riasztások és a dashboardok központosítására szolgál, nem pedig a nyers metrikaadatok skálázására.
  • Remote Storage Integráció: A Prometheus rendelkezik egy remote storage API-val, amely lehetővé teszi, hogy a metrikákat külső, hosszú távú tárolási megoldásokba írja (write) és azokból olvassa (read). Ez a kulcs a Prometheus horizontális skálázásához és a hosszú távú adattároláshoz. Népszerű remote storage megoldások:
    • Thanos: Egy nyílt forráskódú projekt, amely a Prometheus köré épül, hogy magas rendelkezésre állást, globális lekérdezést és hosszú távú adattárolást biztosítson. A Thanos „sidecar” komponensekkel működik, amelyek a Prometheus szerverek mellett futnak, és az adatokat objektumtárolóba (pl. S3, GCS) archiválják. Egy Thanos Query komponens képes lekérdezéseket futtatni több Prometheus szerver és a hosszú távú tároló felett, egyesítve az eredményeket.
    • Mimir/Cortex: Ezek a projektek hasonló céllal jöttek létre, mint a Thanos, azaz a Prometheus skálázhatóságának és HA képességeinek növelésére. A Mimir a Grafana Labs által fejlesztett, rendkívül skálázható, nyílt forráskódú idősoros adatbázis, amely kompatibilis a Prometheus API-val.

Ezek a kiegészítő eszközök lehetővé teszik a Prometheus számára, hogy a legigényesebb, nagyméretű, elosztott rendszerek monitorozási kihívásainak is megfeleljen, miközben megtartja alapvető előnyeit, mint a rugalmasság és a PromQL ereje.

Prometheus a konténerizált és mikroservice környezetekben

A Prometheus különösen népszerű a konténerizált és mikroservice architektúrákban, mint amilyen a Kubernetes. Ezek a környezetek dinamikusak, efemerek (rövid életűek), és nagy számú, gyorsan változó komponensből állnak. A Prometheus „pull” modellje és a szolgáltatás felfedezési képességei ideális választássá teszik ezekhez a kihívásokhoz.

Kubernetes monitorozása Prometheusszal

A Kubernetes és a Prometheus közötti integráció rendkívül szoros és hatékony. A Prometheus képes közvetlenül a Kubernetes API-val kommunikálni, hogy felfedezze a clusterben futó komponenseket (node-ok, podok, service-ek, endpointok, Ingress-ek) és automatikusan elkezdje monitorozni azokat.

A Kubernetes Service Discovery konfigurációval a Prometheus automatikusan lekérdezi a Kubernetes metaadatait, és ezek alapján generálja a célpontok listáját. A relabeling szabályok segítségével ezeket a metaadatokat hasznos Prometheus label-ekké alakíthatjuk, vagy szűrhetjük a monitorozandó komponenseket.

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_container_port_name]
        action: keep
        regex: 'http-metrics' # Csak azokat a podokat monitorozza, amelyek 'http-metrics' nevű portot tesznek közzé
      - source_labels: [__meta_kubernetes_namespace]
        target_label: namespace
      - source_labels: [__meta_kubernetes_pod_name]
        target_label: pod_name

Ez a konfiguráció biztosítja, hogy a Prometheus automatikusan felfedezze az új podokat, és monitorozza csak azokat, amelyek a megfelelő portot teszik közzé. Emellett a Kubernetes namespace és pod nevét is hozzáadja a metrikákhoz label-ként, ami nagyban megkönnyíti a lekérdezéseket és a vizualizációt.

A „Sidecar” minta

A konténerizált környezetben gyakori minta a „sidecar” konténer használata. Ez azt jelenti, hogy egy alkalmazás konténerje mellé egy másik, speciális feladatot ellátó konténert helyezünk el ugyanabban a podban. A monitorozás szempontjából ez azt jelenti, hogy az alkalmazás konténerje mellé egy exporter konténert tehetünk, amely az alkalmazás metrikáit gyűjti és teszi elérhetővé a Prometheus számára.

Például, ha egy adatbázis konténert monitorozunk, amely nem rendelkezik beépített Prometheus exporterrel, akkor egy MySQL exporter konténert helyezhetünk mellé. Az exporter ugyanabban a podban fut, és hozzáfér az adatbázishoz localhost-on keresztül, majd a metrikáit közzéteszi egy saját porton, amit a Prometheus lekérdezhet.

Ez a minta segít elkülöníteni a monitorozási logikát az alkalmazás logikájától, és egyszerűsíti a deploymentet, mivel az alkalmazás és az exporter együtt skálázódik és kerül menedzselésre a Kubernetes által.

Instrumentáció mikroservice-ekben

A mikroservice architektúrákban az egyes szolgáltatások belső metrikáinak gyűjtése kulcsfontosságú. A Prometheus klienskönyvtárak lehetővé teszik a fejlesztők számára, hogy könnyedén instrumentálják a mikroservice-eiket, és exportálják a releváns metrikákat. Ez a megközelítés lehetővé teszi a szolgáltatás-specifikus teljesítménybeli szűk keresztmetszetek, hibák és üzleti metrikák nyomon követését.

Például egy e-commerce mikroservice architektúrában:

  • A termék katalógus szolgáltatás exportálhatja a termék lekérdezések számát és latenciáját.
  • A kosár szolgáltatás exportálhatja az aktív kosarak számát és a kosárba helyezett elemek számát.
  • A fizetési szolgáltatás exportálhatja a sikeres és sikertelen tranzakciók számát.

Ezek a részletes metrikák lehetővé teszik a fejlesztők és az üzemeltetők számára, hogy gyorsan azonosítsák a problémás szolgáltatásokat, optimalizálják a teljesítményt és biztosítsák a felhasználói élményt.

A Prometheus és a konténerizált, mikroservice környezetek szinergiája vitathatatlan. A rugalmas architektúra, a hatékony szolgáltatás felfedezés és az egyszerű instrumentáció révén a Prometheus ideális választás a modern, felhőalapú rendszerek monitorozására.

Gyakorlati tippek és bevált gyakorlatok a Prometheus használatához

A Prometheus hatékony használata túlmutat az alapvető beállításokon. Számos bevált gyakorlat és tipp létezik, amelyek segítenek a rendszer optimalizálásában, a metrikaadatok értelmezésében és a riasztások kezelésében.

Metrika elnevezési konvenciók

A konzisztens és értelmes metrika elnevezés kulcsfontosságú a PromQL lekérdezések egyszerűsítéséhez és a metrikák érthetőségéhez. A Prometheus közösség ajánlásai szerint a metrika neveknek tartalmazniuk kell:

  • A mért dolgot: pl. http_requests, node_cpu.
  • A mért egységet (ha van): pl. _total (számláló), _seconds (idő), _bytes (méret).
  • A metrika típusát (ha nem egyértelmű): pl. _count, _sum.

Például: http_requests_total, process_cpu_seconds_total, node_memory_usage_bytes. Kerüljük a túl általános neveket, és használjunk label-eket a dimenziókhoz, ne a metrika nevében kódoljuk azokat (pl. http_requests_by_method helyett http_requests_total{method="GET"}).

Label-ek okos használata

A label-ek a Prometheus adatmodelljének alapkövei. Segítségükkel többdimenziós adatokat tárolhatunk és lekérdezhetünk. Azonban a label-ek túlzott vagy helytelen használata problémákhoz vezethet:

  • Magas kardinalitás: Túl sok egyedi label érték kombináció (pl. egyedi felhasználói ID-k, timestamp-ek label-ként) exponenciálisan növelheti az idősorok számát, ami memória- és CPU-problémákat okozhat a Prometheus szerveren. Kerüljük azokat a label-eket, amelyeknek potenciálisan végtelen számú egyedi értéke lehet.
  • Konzisztencia: Használjunk konzisztens label neveket és értékeket a különböző szolgáltatások között.
  • Relevancia: Csak olyan label-eket használjunk, amelyek relevánsak a lekérdezésekhez és a riasztásokhoz.

Riasztási higiénia

A riasztási fáradtság elkerülése érdekében fontos a riasztási szabályok gondos karbantartása:

  • for kulcsszó használata: Mindig használjunk for kulcsszót a riasztásokban, hogy elkerüljük az átmeneti hibák miatti riasztásokat.
  • Súlyossági szintek: Használjunk különböző súlyossági szinteket (pl. info, warning, critical) a riasztásokhoz, és ezek alapján irányítsuk a riasztásokat a megfelelő csatornákra.
  • Clear leírások és Playbook linkek: A riasztások annotations szekciójában adjunk meg egyértelmű leírást a problémáról és, ha lehetséges, egy linket egy playbook-hoz, amely útmutatást ad a probléma megoldásához.
  • Elnyomási szabályok: Használjuk az Alertmanager elnyomási szabályait, hogy elkerüljük a kaszkád riasztásokat (pl. egy host leállása ne generáljon riasztást az összes rajta futó szolgáltatásról).
  • Rendszeres felülvizsgálat: Rendszeresen vizsgáljuk felül a riasztási szabályokat, és távolítsuk el azokat, amelyek már nem relevánsak, vagy amelyek túl sok téves riasztást generálnak.

Kapacitástervezés és erőforrás-gazdálkodás

A Prometheus szerver erőforrásigénye (CPU, memória, lemez I/O) a monitorozott célpontok számától, a metrikák számától, a scrape intervallumtól és az adatmegőrzési időtől függ. Fontos a megfelelő kapacitástervezés:

  • Lemez I/O: A Prometheus TSDB-je rendkívül lemez I/O intenzív, ezért gyors SSD-k használata javasolt.
  • Memória: A Prometheus jelentős memóriát igényel, különösen sok idősor esetén. Figyeljük a memória fogyasztást és méretezzük megfelelően.
  • Adatmegőrzési idő: Az alapértelmezett adatmegőrzési idő 15 nap. Ha hosszabb ideig szeretnénk tárolni az adatokat, fontoljuk meg a remote storage megoldásokat (Thanos, Mimir).

A Prometheus ökoszisztéma kihasználása

A Prometheus nem egy elszigetelt eszköz, hanem egy gazdag ökoszisztéma része:

  • Grafana: Használjuk a Grafana-t a vizuális megjelenítéshez és a dashboardokhoz.
  • Thanos/Mimir: Nagyobb rendszerekhez fontoljuk meg a Thanos vagy Mimir bevezetését a skálázhatóság és hosszú távú tárolás érdekében.
  • Exporterek: Használjuk ki a széles körű exporter könyvtárat, vagy írjunk saját exportereket a specifikus igényekhez.

Ezen tippek és bevált gyakorlatok alkalmazásával a Prometheus monitorozási rendszer a lehető leghatékonyabban és legmegbízhatóbban működik, támogatva a modern, komplex informatikai környezeteket.

Share This Article
Leave a comment

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük