Na začátku byla poněkud zvláštní chyba, která se vyskytovala náhodně na různých serverech našeho aplikačního clusteru (cca 10 strojů) v různých časech. Na konci byla funkční instalace Graphite a jednoduchý nástroj pro nahrávání historických dat do Graphite napsaný v Groovy.
Chyba při práci s DB session, která nás trápila delší dobu. V našem clusteru běží cca 10 strojů, logováni je pěkně po staru do souborů s denní rotací - jediný pokrok proti pravěku je fakt, že jsou logy ze všech strojů dostupné z jednoho adresáře. Věděli jsme, že se chyba vyskytuje na různých strojích v různém čase. Chtěl jsem pochopit, kde se chyba projevuje, ideálně v grafické podobě. Vzpomněl jsem si na Graphite, o kterém jsem slyšel spoustu pěkných věcí na GeeCONu.
Graphite je výkonný a škálovatelný nástroj pro sběr metrik (resp. libovolných čísel) v realném čase. Kromě samotného sběru metrik je umí šikovně analyzovat a zobrazovat. Sestává se z několika komponent, které není vždy snadné nainstalovat. Naštěstí existuje několik Vagrant souborů, které instalaci podstatně zjednoduší. Vybral jsem si Synthesize, protože měl nejdelší readme :) Instalace se mi z počátku nedařila, ale po mnoha úderech hlavou o stůl jsem zjistil, že stačí na Vagrant kuchařku poštvat dos2unix
příkaz, protože běžím na Windows (tento problém je už nyní popsaný v readme Synthesize). Instalace vypada takto:
|
|
Graphite běží a carbon
démon je připraven konzumovat data. Jenže data jsou zatím na dalekém sereru v souborech.
Povolal jsem starý dobrý grep:
|
|
Grep projde všechny logy na všech serverech v červnu a naháže je do jednoho souboru. Přepínač -n
zařídí, že každý řádek bude obsahovat identifikaci souboru, ve kterém byla chyba nalezena. Řádek s chybou pak vypadá takto:
|
|
carbonu
.Mám velký soubor, potřebuju ho projít a každý záznam nahrát do Graphite. Jelikož jsem z JVM světa, zvolil jsem Groovy, které je méně ukecané než Java.
Carbon očekává data v jednoduchém formátu: nejaka.moje.data hodnota timestamp\n
, například database.error.log.www02 1437928247\n
. Jelikož jsem přehlédl konec řádku v definici formátu, stálo mě nahrávání dat opět několik úderů hlavou o stůl. Název metriky je důležitý, protože Graphite vám pozdějí umožní pracovat se skupinou metrik pomocí hvězdičkové notace (database.error.log.*
) a pro zajímavost také data ukládá do adresářové struktury, která odpovídá jménu metriky (database/error/log/www02
).
|
|
|
|
|
|
Spustíme, počkáme a data jsou v Graphite.
Pokud data rovnou zobrazíme, nebude toho moc vidět, protože jsem je nahrál jako body s hodnotou jedna. Přinejlepším z toho bude plot ze samých tenkých čárek. Pro lepší viditelnost jsem hodnoty sečetl po hodinách s pomocí funkce summarize
. Přehled podporovaných funkcí je zde : http://graphite.readthedocs.org/en/latest/functions.html. Výsledný příkaz je pak
|
|
Graphite po expanzi hvězdičky přiřadí jednotlivým serverům barvu a výsledný graf vypadá takto:
Výše uvedený příklad není ani zdaleka typické použití Graphite. Potěšilo mě, že s pomocí Vagrantu a Groovy bylo možné realizovat nápad v řádu hodin.
http://matt.aimonetti.net/posts/2013/06/26/practical-guide-to-graphite-monitoring/