Každá služba v rámci AWS provádí záznamy svého fungování do souborů, které jsou uspořádány do takzvaných skupin protokolů CloudWatch. Pro snadnější orientaci jsou tyto skupiny obvykle pojmenovány shodně se samotnou službou. Do těchto protokolů se standardně zapisují systémové zprávy dané služby nebo informace o jejím celkovém stavu.
Kromě výchozích záznamů je možné přidávat i vlastní, specifické informace. Pokud jsou tyto logy vytvářeny s rozmyslem, mohou se stát základem pro tvorbu efektivních přehledových panelů v CloudWatch, které zobrazují relevantní metriky.
S pomocí metrik a strukturovaných informací lze získat podrobnější vhled do zpracování úloh. Tyto protokoly nemusí obsahovat jen standardní systémové údaje, ale je možné je rozšířit o vlastní data, která se agregují do uživatelských widgetů nebo metrik.
Dotazování na protokoly
Zdroj: aws.amazon.com
Služba AWS CloudWatch Log Insights umožňuje v reálném čase prohledávat a analyzovat data z protokolů vašich AWS zdrojů. Lze na ni nahlížet jako na databázový pohled. Dotaz se definuje na řídicím panelu a ten ho spustí při každé návštěvě nebo v časovém úseku definovaném uživatelem.
Pro vyhledávání a analýzu dat se používá dotazovací jazyk CloudWatch Logs Insights, který je založen na podmnožině jazyka SQL. Tento jazyk umožňuje vyhledávat a filtrovat data, a to jak specifické události, tak i texty v logu nebo klíčová slova. Data lze filtrovat i na základě konkrétních polí. A co je nejdůležitější, umožňuje agregaci dat z jednoho či více souborů protokolů za účelem generování souhrnných metrik a vizualizací.
Po spuštění dotazu prohledá CloudWatch Log Insights data ve vybrané skupině protokolů a vrátí texty z těch záznamů, které splňují definovaná kritéria.
Příklad dotazu na protokol
Podívejme se na několik základních dotazů, abychom lépe pochopili princip fungování.
Každá služba standardně zaznamenává klíčové chyby. I když pro tyto chybové události nevytvoříte specifický vlastní protokol, jednoduchým dotazem můžete zjistit počet chyb v protokolech vaší aplikace za poslední hodinu:
fields @timestamp, @message | filter @message like /ERROR/ | stats count() by bin(1h)
Další příklad ukazuje, jak sledovat průměrnou dobu odezvy API za poslední den:
fields @timestamp, @message | filter @message like /API response time/ | stats avg(response_time) by bin(1d)
Vzhledem k tomu, že vytížení CPU je standardně zaznamenáváno do CloudWatch, můžete tímto způsobem získat i tuto metriku:
fields @timestamp, @message | filter @message like /CPUUtilization/ | stats avg(value) by bin(1h)
Tyto dotazy lze upravit podle konkrétních potřeb a použít k tvorbě vlastních metrik a vizualizací na CloudWatch Dashboards. V praxi to znamená umístit widget na řídicí panel a do něj vložit kód, který definuje, jaká data se mají vybrat.
Mezi widgety, které lze použít v CloudWatch Dashboards a naplnit daty z Log Insights, patří:
- Textové widgety – Zobrazují textové informace, například výstup dotazu z CloudWatch Insights.
- Widgety s dotazy na protokoly – Zobrazují výsledky dotazu CloudWatch Insights, jako je počet chyb v logech vaší aplikace.
Jak vytvářet užitečné informace v protokolech pro Dashboard
Zdroj: aws.amazon.com
Pro efektivní využití dotazů CloudWatch Insights v CloudWatch Dashboards je vhodné dodržovat některé osvědčené postupy při vytváření protokolů CloudWatch pro jednotlivé služby. Zde je několik tipů:
#1. Používejte strukturované protokolování
Používejte formát protokolování, který využívá předdefinované schéma pro zápis dat ve strukturovaném formátu. To usnadňuje vyhledávání a filtrování dat pomocí dotazů CloudWatch Insights.
V podstatě se jedná o standardizaci protokolů v rámci celé vaší architektury. Definováním standardů v rámci vývojového procesu se značně usnadní práce.
Můžete například stanovit, že každý problém související s konkrétní databázovou tabulkou bude protokolován se zprávou začínající „[TABLE_NAME] Upozornění / Chyba:
Podobně lze odlišit full data joby od delta data jobů použitím předpon jako „[FULL/DELTA]“ pro výběr pouze zpráv, které se týkají konkrétního datového procesu.
Pokud zpracováváte data z určitého zdrojového systému, můžete u každého záznamu logu použít předponu s názvem systému. Díky tomu je mnohem snazší filtrovat zprávy a vytvářet z nich metriky.
Zdroj: aws.amazon.com
#2. Používejte konzistentní formáty protokolů
Používejte konzistentní formáty protokolů ve všech zdrojích AWS. Usnadníte si tím vyhledávání a filtrování dat pomocí dotazů CloudWatch Insights.
Tento bod navazuje na předchozí, ale platí, že čím standardizovanější formát logů, tím snadnější je jejich používání. Vývojáři se mohou na tento formát spolehnout a používat ho intuitivně.
Bohužel, mnoho projektů se standardy logování vůbec nezabývá a mnoho z nich nevytváří ani vlastní protokoly. Je to překvapivé, ale zároveň velmi běžné.
Častokrát jsem se sám sebe ptal, jak je možné pracovat bez jakéhokoliv přístupu k informacím o chybách. A když už někdo řešení chyb zkoušel, často to bylo provedeno nesprávně.
Konzistentní formát logů je tedy značnou výhodou, kterou však jen málo projektů využívá.
#3. Zahrňte relevantní metadata
Zahrňte do logů metadata jako jsou časová razítka, ID prostředků a kódy chyb, což usnadní jejich vyhledávání a filtrování pomocí CloudWatch Insights.
#4. Povolte rotaci protokolů
Povolte rotaci logů, abyste předešli příliš velkému objemu dat a usnadnili vyhledávání a filtrování dat pomocí CloudWatch Insights.
Nemít žádná data v logu je problém, ale mít jich příliš mnoho a bez struktury je neméně frustrující. Pokud nemůžete data používat, je to, jako byste je neměli.
#5. Použijte CloudWatch Logs Agenty
Pokud nemáte možnost vytvořit vlastní systém logování, použijte alespoň agenty CloudWatch Logs. Ty automaticky odesílají data protokolů z vašich zdrojů do CloudWatch Logs, což opět usnadňuje vyhledávání a filtrování dat.
Složitější příklady dotazů Insights
Dotazy CloudWatch Insights mohou být i složitější než jednoduché dvouřádkové příkazy.
fields @timestamp, @message | filter @message like /ERROR/ | filter @message not like /404/ | parse @message /.*[(?<timestamp>[^]]+)].*"(?<method>[^s]+)s+(?<path>[^s]+).*" (?<status>d+) (?<response_time>d+)/ | stats avg(response_time) as avg_response_time, count() as count by bin(1h), method, path, status | sort count desc | limit 20
Tento dotaz provede následující:
Tento dotaz pomůže identifikovat nejčastější chyby ve vaší aplikaci a sledovat průměrnou dobu odezvy pro různé kombinace HTTP metod, cest a stavových kódů. Výsledky lze využít pro tvorbu vlastních metrik a vizualizací v CloudWatch Dashboards pro monitoring výkonu a odstraňování problémů.
Další příklad dotazu na zprávy Amazon S3:
fields @timestamp, @message | filter @message like /REST.API.REQUEST/ | parse @message /.*"(?<method>[^s]+)s+(?<path>[^s]+).*" (?<status>d+) (?<response_time>d+)/ | stats avg(response_time) as avg_response_time, count() as count by bin(1h), method, path, status | sort count desc | limit 20
- Dotaz vybere události z logu, které obsahují řetězec „REST.API.REQUEST“.
- Následně analyzuje zprávu a extrahuje HTTP metodu, cestu, stavový kód a dobu odezvy.
- Vypočítá průměrnou dobu odezvy a počet událostí pro každou kombinaci HTTP metody, cesty a stavového kódu. Výsledky seřadí podle počtu v sestupném pořadí.
- Výstup je omezen na 20 nejlepších výsledků.
Výsledky dotazu lze použít pro vytvoření spojnicového grafu v CloudWatch Dashboard, který zobrazuje průměrnou dobu odezvy v čase pro různé kombinace HTTP metod, cest a stavových kódů.
Sestavení Dashboardu
Pro zobrazení metrik a vizualizací v CloudWatch Dashboards z výstupu dotazů CloudWatch Insights, můžete použít konzoli CloudWatch a průvodce pro tvorbu Dashboardu.
Kód pro CloudWatch Dashboard, který obsahuje metriky naplněné daty z CloudWatch Insights Query, pak může vypadat takto:
{ "widgets": [ { "type": "metric", "x": 0, "y": 0, "width": 12, "height": 6, "properties": { "metrics": [ [ "AWS/EC2", "CPUUtilization", "InstanceId", "i-0123456789abcdef0", { "label": "CPU Utilization", "stat": "Average", "period": 300 } ] ], "view": "timeSeries", "stacked": false, "region": "us-east-1", "title": "EC2 CPU Utilization" } }, { "type": "log", "x": 0, "y": 6, "width": 12, "height": 6, "properties": { "query": "fields @timestamp, @message | filter @message like /ERROR/ | stats count() by bin(1h) ", "region": "us-east-1", "title": "Application Errors" } } ] }
Tento CloudWatch Dashboard obsahuje dva widgety:
Jedná se o soubor ve formátu JSON, který definuje dashboard a obsahuje samotné insight dotazy.
Tento kód lze nasadit na jakýkoli AWS účet. Pokud jsou služby a protokoly konzistentní na všech vašich účtech a fázích, bude dashboard fungovat bez nutnosti měnit jeho zdrojový kód.
Závěrečná slova
Vybudování solidní logovací struktury se vždy ukázalo jako dobrá investice do budoucí spolehlivosti systému. Nyní může sloužit ještě k dalším účelům. Vedlejším efektem může být vytvoření užitečných dashboardů s metrikami a vizualizacemi.
Vývojový tým, testovací tým i produkční uživatelé mohou těžit ze stejného řešení. Stačí jej implementovat jednou a s trochou práce navíc získat velkou přidanou hodnotu.
Pro další informace se podívejte na nejlepší monitorovací nástroje AWS.