Difference between revisions of "Metrics and Monitoring in swarm"

From berki WIKI
Jump to: navigation, search
(Metrika a Prometheus-ban)
(Mi az a metrika)
Line 8: Line 8:
  
  
A metrikákat úgynevezett '''time-series''' (idősor) adatbázisban kell letárolni, vagyis megy adott metrikához nyilván van tartva minden lekérdezéshez a lekérdezéshez kapott érték. Ez a speciális struktúra ugyan letárolható lenne hagyományos adatbázis kezelőkben is, de nagyon nem lenne hatékony a bennük való keresés. Léteznek direkt erre a speciális adatmodellre készült adatbáziskezelők, amik rettentő hatékonyan tudnak keresni a time-series adatokban. Egy adott metrika tárolását egy listaként lehet elképzelni, ahol a lista elemek az időbélyegekkel vannak indexelve, és a listaelem tárolja az adott időpillanathoz (amikor a lekérdezés történt) a metrika értékét. A főbb '''time-series db'''-k:   
+
A metrikákat úgynevezett '''time-series''' (idősor) adatbázisban kell letárolni ('''TSDB'''), vagyis megy adott metrikához nyilván van tartva minden lekérdezéshez a lekérdezéshez kapott érték. Ez a speciális struktúra ugyan letárolható lenne hagyományos adatbázis kezelőkben is, de nagyon nem lenne hatékony a bennük való keresés. Léteznek direkt erre a speciális adatmodellre készült adatbáziskezelők, amik rettentő hatékonyan tudnak keresni a time-series adatokban. Egy adott metrika tárolását egy listaként lehet elképzelni, ahol a lista elemek az időbélyegekkel vannak indexelve, és a listaelem tárolja az adott időpillanathoz (amikor a lekérdezés történt) a metrika értékét. A főbb '''time-series db'''-k:   
 
* InfluxDB:
 
* InfluxDB:
 
* Prometheus
 
* Prometheus
Line 15: Line 15:
 
* KairosDB
 
* KairosDB
 
...
 
...
 +
 +
A time-series adatbáziskezelő (TSDB) folyamatosan gyűjteni fogja a különböző komponensek metrikáit, és minden egyes begyűjtés után ki fogja értékelni a különböző metrikákra felírt logikai műveleteket, amik általában abból állnak, hogy egy time-series lekérdezés eredményét összeveti egy értékkel vagy logika változóval, és a végeredmény vagy igaz vagy hamis. Ha a végeredmény igaz, akkor a time-series adatbáziskezelő riasztást fog generálni, ha a kiértékelés hamis, akkor meg nem fog semmit csinálni. A riasztás hatására küldhetünk emial-t, végrehajthatunk egy bash script-et... stb.
 +
 +
 +
Ezzel a módszerrel lehet a swarm cluster egészségét automatizált módon monitorozni vagy akár orkesztrálni is. Pl felírhatunk különböző szabályokat a node-ok leterheltségére. Ha a node-ok valamilyen metrika mentén túlságosan leterheltek, akkor újabb node-okat állítunk automatikusan üzembe, ha meg a terhelés túl alacsony ugyan ezen metrika alapján, akkor meg bizonyos node-okat megszüntetünk. 
 +
  
 
Mi innentől kezdve csak a Prometheus-ra fogunk fókuszálni.
 
Mi innentől kezdve csak a Prometheus-ra fogunk fókuszálni.

Revision as of 20:09, 7 August 2018

<< Back to Orchestration main


Bevezető

Mi az a metrika

A metrika egy fajta speciális loggolás, amit a metrikát szolgáltató rendszer nem egy log fájlba ír, hanem biztosít egy HTTP API-t, amin keresztül a metrikát feldolgozó szolgáltatás le tudja azt periodikusan kérdezni. A metrika név-érték párok listája, aminek a jelentése bármi lehet ami időben változik. A metrika listában minden egyes metrika jelentését a metrikát szolgáltató rendszernek kell definiálnia. Pl egy node-on lévő elérhető maradék memóriát jelképezheti a következő metrika:

node_memory_MemAvailable 210


A metrikákat úgynevezett time-series (idősor) adatbázisban kell letárolni (TSDB), vagyis megy adott metrikához nyilván van tartva minden lekérdezéshez a lekérdezéshez kapott érték. Ez a speciális struktúra ugyan letárolható lenne hagyományos adatbázis kezelőkben is, de nagyon nem lenne hatékony a bennük való keresés. Léteznek direkt erre a speciális adatmodellre készült adatbáziskezelők, amik rettentő hatékonyan tudnak keresni a time-series adatokban. Egy adott metrika tárolását egy listaként lehet elképzelni, ahol a lista elemek az időbélyegekkel vannak indexelve, és a listaelem tárolja az adott időpillanathoz (amikor a lekérdezés történt) a metrika értékét. A főbb time-series db-k:

  • InfluxDB:
  • Prometheus
  • Graphite
  • OpenTSDB
  • KairosDB

...

A time-series adatbáziskezelő (TSDB) folyamatosan gyűjteni fogja a különböző komponensek metrikáit, és minden egyes begyűjtés után ki fogja értékelni a különböző metrikákra felírt logikai műveleteket, amik általában abból állnak, hogy egy time-series lekérdezés eredményét összeveti egy értékkel vagy logika változóval, és a végeredmény vagy igaz vagy hamis. Ha a végeredmény igaz, akkor a time-series adatbáziskezelő riasztást fog generálni, ha a kiértékelés hamis, akkor meg nem fog semmit csinálni. A riasztás hatására küldhetünk emial-t, végrehajthatunk egy bash script-et... stb.


Ezzel a módszerrel lehet a swarm cluster egészségét automatizált módon monitorozni vagy akár orkesztrálni is. Pl felírhatunk különböző szabályokat a node-ok leterheltségére. Ha a node-ok valamilyen metrika mentén túlságosan leterheltek, akkor újabb node-okat állítunk automatikusan üzembe, ha meg a terhelés túl alacsony ugyan ezen metrika alapján, akkor meg bizonyos node-okat megszüntetünk.


Mi innentől kezdve csak a Prometheus-ra fogunk fókuszálni.

Metrika a Prometheus-ban

A Prometheus szabványú metrikában további dimenziókat lehet bevezetni egy metrikához úgynevezett metrika címkékkel, amiket a metrikát szolgáltató rendszer (pl egy apache) kapcsos zárójelek között adhat meg. A címkék tehát tovább specializálnak egy metrikát, pl egy http proxy a proxy_http_request_total nevű metrikával mondhatja meg, hogy a lekérdezési időpontjáig hány kérés érkezett a proxy-hoz. De ezt tovább specializálhatja címkék bevezetésével. Az alábbi példában a method és a status címéket használta a proxy a proxy_http_request_total metrika finomításához. Az alábbi példában tehát a metrika értéke nem az összes request-re vonatkozik, csak azokra amiket GET-el kértek le, és amiknek 200-as volt a státusza.

proxy_http_request_total{method="GET", status="200"} 13


A valóságban ez úgy nézne ki a lekérdezett metrika listában, hogy sorba jönne az összes variáció egymás után a listában, pl:

...
proxy_http_request_total{method="GET", status="200"} 13
proxy_http_request_total{method="GET", status="500"} 12
proxy_http_request_total{method="POST", status="200"} 30
proxy_http_request_total{method="POST", status="300"} 20
...


Fontos, hogy a címkének is a címkét szolgáltató rendszer ad jelentést, a time-series adatbázis kezelő számra (a mi esetünkben Prometheus) a metrika és a benne lévő címkék is csak név érték párok. Azonban a címke és annak az értéke is részei a metrika nevének. Tehát a metrikát az összes címéjével együtt felfoghatjuk egy string-nek, aminek van egy értéke. A time-series adatbázisokban a címkék segítségével nagyon trükkös lekérdezéseket lehet felírni, amiket a time-series adatbázis nagyon hatékonyan meg tud keresni.


...
# HELP builder_builds_failed_total Number of failed image builds
# TYPE builder_builds_failed_total counter
builder_builds_failed_total{reason="build_canceled"} 0
builder_builds_failed_total{reason="build_target_not_reachable_error"} 0
builder_builds_failed_total{reason="command_not_supported_error"} 0
builder_builds_failed_total{reason="dockerfile_empty_error"} 0
builder_builds_failed_total{reason="dockerfile_syntax_error"} 0

A metrika bármi lehet, egy név=érték pár. Van egy string, aminek van egy értéke. Pl: builder_builds_failed_total{reason="build_canceled"} 0

Hol a builder_builds_failed_total{reason="build_canceled"} a név, és az értéke 0.

Ami a {} között van az a metrika címéje vagy címkéji, ha több is van. A címkéket vesszővel kell elválasztani, ha több is van. A címke finomhangolja a metrika jelentését, úgymond sepcifikálja. Vagy inább egy plusz dimenzió a metrikában. Ezen a metrikán a reason címke van rajta, aminek az értéke "build_cancell". Ez is bármi lehet, szintén név érték párok. Azt hiszem hogy van két beépetett címke: