{"id":20829,"date":"2023-04-06T09:25:17","date_gmt":"2023-04-06T07:25:17","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=20829"},"modified":"2023-04-06T09:25:20","modified_gmt":"2023-04-06T07:25:20","slug":"observability-w-gcp-czyli-jak-sprawdzic-dlaczego-moja-chmurowa-aplikacja-nie-dziala-od-perspektywy-dewelopera-do-perspektywy-organizacji","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/observability-w-gcp-czyli-jak-sprawdzic-dlaczego-moja-chmurowa-aplikacja-nie-dziala-od-perspektywy-dewelopera-do-perspektywy-organizacji\/","title":{"rendered":"Observability w GCP, czyli jak sprawdzi\u0107, dlaczego moja chmurowa aplikacja nie dzia\u0142a.\u00a0Od perspektywy dewelopera do perspektywy organizacji"},"content":{"rendered":"\n<p>Zagadnienie monitoringu aplikacji oraz&nbsp;jej utrzymania w ca\u0142ym cyklu \u017cycia jest bardzo obszerne. Dotyczy nie tylko perspektywy technicznej czy narz\u0119dziowej, od kt\u00f3rej warto zacz\u0105\u0107 omawia\u0107 ten temat, a o&nbsp;kt\u00f3rej b\u0119dzie w dalszej cz\u0119\u015bci artyku\u0142u, lecz tak\u017ce perspektywy <strong>zarz\u0105dzania portfolio aplikacji<\/strong> z poziomu ca\u0142ej organizacji.<\/p>\n\n\n\n<p>Mowa tu przede wszystkim o konieczno\u015bci zachowania odpowiedniego poziomu us\u0142ug (SLA, SLI), optymalizacji nak\u0142ad\u00f3w na utrzymanie oraz bezproblemowym wdra\u017caniu nowych funkcjonalno\u015bci bez negatywnego wp\u0142ywu na istniej\u0105ce systemy. Sprawdzamy tym samym,&nbsp;jak wdra\u017cana funkcjonalno\u015b\u0107 wp\u0142ywa na to, co ju\u017c mamy.<\/p>\n\n\n\n<p>Bez kluczowych narz\u0119dzi, kt\u00f3re oferuje nam Google Cloud Platform, zarz\u0105dzanie aplikacj\u0105, bior\u0105c pod uwag\u0119 wszystkie te czynniki, nie by\u0142oby tak proste. Przyjrzyjmy si\u0119 wi\u0119c na wst\u0119pie <strong>zagadnieniu z poziomu dewelopera i om\u00f3wmy, jakie narz\u0119dzia oferuje nam Google <\/strong>oraz <strong>w jaki spos\u00f3b optymalnie je wykorzysta\u0107 p\u00f3\u017aniej na wy\u017cszych poziomach.&nbsp;<\/strong><\/p>\n\n\n\n<p>Jako developerzy doskonale radzimy sobie z szukaniem b\u0142\u0119d\u00f3w w programach uruchomionych lokalnie. IDE s\u0105 wyposa\u017cone w debuggery, dzi\u0119ki kt\u00f3rym mo\u017cemy zatrzymywa\u0107 dzia\u0142anie kodu w dowolnym miejscu lub pod ustalonym warunkiem i szczeg\u00f3\u0142owo prze\u015bledzi\u0107 wykonywane instrukcje. Zawsze mo\u017cemy te\u017c skorzysta\u0107 ze starego, dobrego pisania po konsoli.<\/p>\n\n\n\n<p>Co jednak w przypadku, gdy nasza aplikacja znajduje si\u0119 w \u015brodowisku takim jak chmura, nad kt\u00f3rym nie mamy pe\u0142nej kontroli? Gdy okazuje si\u0119, \u017ce zachowuje si\u0119 dziwnie lub zwraca nieprawid\u0142owe wyniki? Google Cloud Platform (GCP) daje nam kilka rozwi\u0105za\u0144, kt\u00f3re w\u0142a\u015bciwie u\u017cyte pozwol\u0105 nam <strong>w prosty spos\u00f3b znale\u017a\u0107 usterk\u0119<\/strong>, zmierzy\u0107 wydajno\u015b\u0107 ca\u0142ego systemu, a tak\u017ce reagowa\u0107 automatycznie na krytyczne&nbsp;b\u0142\u0119dy, powiadamiaj\u0105c zesp\u00f3\u0142 utrzymaniowy.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Surowe dane, czyli&nbsp;logowanie zachowania aplikacji u \u017ar\u00f3d\u0142a<\/strong><\/h2>\n\n\n\n<p>Obecnie projekty wykorzystuj\u0105ce dziesi\u0105tki zale\u017cno\u015bci nie s\u0105 niczym nadzwyczajnym. Posiadanie setek kontener\u00f3w czy wirtualnych maszyn, kt\u00f3re komunikuj\u0105 si\u0119 mi\u0119dzy sob\u0105, nie jest problemem, bior\u0105c pod uwag\u0119 popularn\u0105 architektur\u0119 mikroserwis\u00f3w. Ale <strong>w jaki spos\u00f3b odnale\u017a\u0107 b\u0142\u0105d w aplikacji<\/strong>, je\u015bli u\u017cytkownik zg\u0142asza problem z otrzymaniem prawid\u0142owego wyniku? Jak odnale\u017a\u0107 si\u0119 w ca\u0142ym tym systemie, skoro przetwarzamy tysi\u0105ce transakcji w ci\u0105gu sekundy? Z pomoc\u0105 przychodzi nam <strong>GCP Cloud Logging<\/strong>.<\/p>\n\n\n\n<p>GCP Cloud Logging to us\u0142uga oferowana przez Google Cloud Platform, kt\u00f3ra umo\u017cliwia:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>zbieranie,<\/li><li>przechowywanie,<\/li><li>przegl\u0105danie i analizowanie log\u00f3w aplikacji oraz systemu.<\/li><\/ul>\n\n\n\n<p>Tworz\u0105c aplikacj\u0119, warto zadba\u0107 o <strong>prawid\u0142owe u\u017cycie mechanizmu logowania<\/strong>. Nie jest \u0142atwo w\u0142a\u015bciwie wychwyci\u0107 tylko te najwa\u017cniejsze, newralgiczne informacje. Jednak p\u00f3\u017aniej takie post\u0119powanie odwdzi\u0119czy si\u0119 nam i w jednoznaczny spos\u00f3b wska\u017ce nam miejsce b\u0142\u0119du w naszym kodzie.<\/p>\n\n\n\n<p>W aplikacji <strong>warto zadba\u0107<\/strong> o prawid\u0142owy poziom logowania. Nale\u017cy unika\u0107 logowania du\u017cych obiekt\u00f3w, logowa\u0107&nbsp;wyj\u0105tki, dane krytyczne z punktu dzia\u0142ania aplikacji,&nbsp;operacje na zbiorach danych (np.: modyfikacje bazy danych, przesy\u0142anie obiekt\u00f3w&nbsp;do storage itp.), czy informacje wa\u017cne z punktu widzenia biznesu.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Wyszukiwanie i filtrowanie dziennik\u00f3w<\/strong><\/h3>\n\n\n\n<p>Cloud Logging udost\u0119pnia <strong>narz\u0119dzia do wyszukiwania i filtrowania dziennik\u00f3w<\/strong>. Mo\u017cna to zrobi\u0107 na dwa sposoby:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>poprzez przyjazny dla u\u017cytkownika interfejs graficzny, dzi\u0119ki kt\u00f3remu mo\u017cemy \u201ewyklika\u0107\u201d interesuj\u0105ce nas filtry, np.: zaw\u0119\u017cenie do konkretnego kontenera, adresu IP, daty i godziny czy s\u0142owa kluczowego u\u017cytego w logu,<\/li><li>poprzez tworzenie zapyta\u0144 w j\u0119zyku Log Query Language, kt\u00f3ry umo\u017cliwia filtrowanie i agregowanie dziennik\u00f3w. Log Query Language jest oparty na j\u0119zyku SQL i umo\u017cliwia m.in.: wybieranie konkretnych p\u00f3l dziennika, por\u00f3wnywanie ich warto\u015bci czy grupowanie wpis\u00f3w.&nbsp;&nbsp;<\/li><\/ul>\n\n\n\n<p>\u202f&nbsp;W GCP Cloud Logging dzienniki s\u0105 zapisywane w formacie JSON. Ka\u017cdy wpis w dzienniku sk\u0142ada si\u0119 z kilku p\u00f3l, takich jak:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u201etimestamp\u201d \u2013 data i godzina zdarzenia,<\/li><li>\u201eseverity\u201d \u2013 stopie\u0144 powa\u017cno\u015bci zdarzenia (np. &#8222;ERROR&#8221;, &#8222;WARNING&#8221;, &#8222;INFO&#8221;),<\/li><li>\u201emessage\u201d \u2013 tre\u015b\u0107 dziennika,<\/li><li>\u201elogName\u201d \u2013 nazwa dziennika, do kt\u00f3rego zosta\u0142o dodane zdarzenie,<\/li><li>\u201eresource&#8221; \u2013 zas\u00f3b, kt\u00f3ry jest powi\u0105zany z zdarzeniem (np. adres IP maszyny wirtualnej lub nazwa kontenera).&nbsp;<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Dodatkowe pola<\/strong><\/h3>\n\n\n\n<p>Opr\u00f3cz powy\u017cszych p\u00f3l, dzienniki w GCP Cloud Logging mog\u0105 zawiera\u0107 dodatkowe pola, takie jak nag\u0142\u00f3wki HTTP, identyfikator \u017c\u0105dania (X-Request-ID) i informacje o aplikacji.&nbsp;<\/p>\n\n\n\n<p><strong>X-Request-ID<\/strong> to opcjonalny, nieoficjalny nag\u0142\u00f3wek HTTP, kt\u00f3ry wykorzystywany jest do identyfikacji pojedynczego \u017c\u0105dania HTTP. Warto zadba\u0107, aby taki identyfikator by\u0142&nbsp;prawid\u0142owo przesy\u0142any do dziennik\u00f3w zdarze\u0144. G\u0142\u00f3wnym celem u\u017cycia tego nag\u0142\u00f3wka jest umo\u017cliwienie \u0142atwiejszego \u015bledzenia i rozwi\u0105zywania problem\u00f3w z \u017c\u0105daniami HTTP.<\/p>\n\n\n\n<p>Dzi\u0119ki niemu mo\u017cliwe jest \u0142atwe grupowanie (agregacja) wpis\u00f3w dziennika zwi\u0105zanych z pojedynczym \u017c\u0105daniem HTTP, co u\u0142atwia ich przegl\u0105danie i analizowanie. Wystarczy, \u017ce operacja, kt\u00f3ra zako\u0144czy\u0142a si\u0119 b\u0142\u0119dem, zwr\u00f3ci u\u017cytkownikowi warto\u015b\u0107 w\/w nag\u0142\u00f3wka, a my w \u0142atwy spos\u00f3b b\u0119dziemy w stanie odfiltrowa\u0107 dane dotycz\u0105ce tylko tego konkretnego \u017c\u0105dania. W po\u0142\u0105czeniu z umiej\u0119tnym logowaniem newralgicznych danych z serwisu b\u0119dziemy mogli jednoznacznie okre\u015bli\u0107, w kt\u00f3rym miejscu pojawi\u0142 si\u0119 b\u0142\u0105d.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Cloud Logging jako zaawansowane narz\u0119dzie<\/strong><\/h3>\n\n\n\n<p>Cloud Logging to rozbudowane narz\u0119dzie, kt\u00f3re posiada wiele zaawansowanych mechanizm\u00f3w. Mo\u017ce by\u0107 integrowane z r\u00f3\u017cnymi \u017ar\u00f3d\u0142ami danych, takimi jak: aplikacje, us\u0142ugi GCP, maszyny wirtualne i kontenery. Posiada rozwini\u0119te narz\u0119dzia do analityki np.: BigQuery czy Data Studio, dzi\u0119ki kt\u00f3rym mo\u017cliwe jest tworzenie z\u0142o\u017conych zapyta\u0144 i raport\u00f3w z dziennik\u00f3w. Us\u0142uga oferuje r\u00f3wnie\u017c rozwi\u0105zania do powiadamiania odpowiednich u\u017cytkownik\u00f3w oraz us\u0142ug o okre\u015blonych zdarzeniach, u\u017cywaj\u0105c wcze\u015bniej zdefiniowanych regu\u0142 oraz wzorc\u00f3w, co pozwala na szybsze reagowanie w przypadku wyst\u0105pienia b\u0142\u0119d\u00f3w. <br><br>Znajomo\u015b\u0107 GCP Cloud Logging oraz umiej\u0119tno\u015b\u0107 poruszania si\u0119 po podstawowych jego funkcjonalno\u015bciach nie raz odwdzi\u0119czy si\u0119 nam <strong>szybkim znalezieniem b\u0142\u0119du<\/strong>. W mojej opinii powinno by\u0107 u\u017cywane jako jedno z pierwszych w przypadku rozpoczynania \u015bledztwa dotycz\u0105cego b\u0142\u0119d\u00f3w czy niestabilno\u015bci w dzia\u0142aniu aplikacji.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Definiowanie prog\u00f3w kluczowych parametr\u00f3w, czyli metryki <\/strong>&nbsp;<\/h2>\n\n\n\n<p>Je\u015bli chodzi o metryki, podstawowym pytaniem nie jest to, jak je stworzy\u0107, lecz to, <strong>co te metryki powinny zawiera\u0107, tak aby pozwoli\u0142y na rzetelny monitoring<\/strong> naszej aplikacji.<\/p>\n\n\n\n<p>GCP dostarcza wiele narz\u0119dzi, kt\u00f3re to s\u0105 dobrze opisane i naprawd\u0119 bardzo \u0142atwo mo\u017cna si\u0119 ich nauczy\u0107, aczkolwiek nie to jest celem naszych rozwa\u017ca\u0144. Przychodzi taki czas, kiedy dostajemy informacje o tym, i\u017c co\u015b dzia\u0142a zbyt wolno lub b\u0142\u0119dnie. Chcemy w\u00f3wczas, <strong>aby metryki pozwoli\u0142y nam szybko znale\u017a\u0107 \u017ar\u00f3d\u0142o tego problemu<\/strong>, \u017ceby nast\u0119pnie sprawnie go poprawi\u0107, nie generuj\u0105c przy tych skomplikowanych rozwi\u0105za\u0144, kt\u00f3re mog\u0142yby w dalszej cz\u0119\u015bci prowadzi\u0107 do powstania kolejnych b\u0142\u0119d\u00f3w.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Metryki i monitoring<\/strong><\/h3>\n\n\n\n<p>Generalnie, ka\u017cda definicja metryki ma jaki\u015b wp\u0142yw na wydajno\u015b\u0107 aplikacji. Nie nale\u017cy wi\u0119c przesadza\u0107 z dodawaniem metryk, kt\u00f3re nic nie wnios\u0105 do przysz\u0142ego monitoringu. Na pocz\u0105tku musimy spojrze\u0107 na aplikacj\u0119 i zastanowi\u0107 si\u0119, co chcemy monitorowa\u0107, co pozwoli nam na szybkie wykrycie problemu oraz okre\u015blenie miejsca jego wyst\u0119powania.<\/p>\n\n\n\n<p>Na pewno <strong>warto monitorowa\u0107<\/strong> zale\u017cno\u015bci zewn\u0119trzne aplikacji, je\u015bli takie istniej\u0105, oraz pule po\u0142\u0105cze\u0144 do nich zdefiniowane tak, aby jednoznacznie stwierdzi\u0107, czy dany zas\u00f3b dzia\u0142a oraz czy nasza aplikacja w pe\u0142ni go wykorzystuje. <strong>Nie ma jednego uniwersalnego sposobu, co nale\u017cy monitorowa\u0107<\/strong>. Ka\u017cda aplikacja jest inna, u\u017cywa czego\u015b innego oraz inne elementy b\u0119d\u0105 dla niej krytyczne oraz mog\u0105 by\u0107 potencjalnym miejscem, na kt\u00f3re nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 podczas produkcyjnego dzia\u0142ania.&nbsp;<\/p>\n\n\n\n<p>Narz\u0119dzie <strong>Metric Explorer<\/strong> dostarczone przez Google Cloud Platform pozwala na <strong>szybkie i \u0142atwe wizualizowanie dodanych wcze\u015bniej do aplikacji metryk<\/strong>. Mo\u017cemy wybra\u0107 zdefiniowan\u0119 metryk\u0119, zrobi\u0107 jej wizualizacj\u0119, doda\u0107 odpowiednie filtry oraz grupowania tak, aby przedstawi\u0107 dana metryk\u0119 w czasie. Dzi\u0119ki temu p\u00f3\u017aniej mo\u017cemy obserwowa\u0107, jak dana metryka zachowuje si\u0119 podczas dzia\u0142ania aplikacji. Cz\u0119sto pozwala to okre\u015bli\u0107, \u017ce z nasz\u0105 aplikacj\u0105 dzieje si\u0119 co\u015b niedobrego. Przyk\u0142adowo \u2013 gdy zwi\u0119ksza si\u0119 nasze u\u017cycie pami\u0119ci, a pami\u0119\u0107 nie jest odpowiednio czyszczona. <\/p>\n\n\n\n<p>Operations Suite dostarcza narz\u0119dzia pozwalaj\u0105ce na pe\u0142en monitoring aplikacji oraz integracj\u0119 z nim. Jednym z narz\u0119dzi jest <strong>Cloud Logging<\/strong>, b\u0119d\u0105cy serwisem pozwalaj\u0105cym na zbieranie log\u00f3w z aplikacji oraz zapisywanie ich przy pomocy Cloud Storage. GCP dostarcza r\u00f3wnie\u017c GUI pozwalaj\u0105ce na przeszukiwanie wcze\u015bniej zebranych z aplikacji log\u00f3w w celu pozyskania informacji takich jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>stan aplikacji,<\/li><li>wyst\u0119puj\u0105ce b\u0142\u0119dy,<\/li><li>weryfikacje czas\u00f3w przetwarzania poszczeg\u00f3lnych request\u00f3w.&nbsp;<\/li><\/ul>\n\n\n\n<p>Integracja ze stackdriverem dostarcza kilkunastu gotowych metryk opisuj\u0105cych stan naszego \u015brodowiska zdeployowanego w GCP. W zale\u017cno\u015bci od wybranej platformy dostajemy w pe\u0142ni dzia\u0142aj\u0105c\u0105 integracj\u0119 z monitoringiem lub musimy ja r\u0119cznie zainstalowa\u0107.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wizualizacja zachowania aplikacji poprzez dashboardy<\/strong><\/h2>\n\n\n\n<p>W GCP dashboardy s\u0105 w pe\u0142ni konfigurowalnym narz\u0119dziem, daj\u0105cym mo\u017cliwo\u015b\u0107 tworzenia i grupowania wykres\u00f3w. Wykresy te mog\u0105 dotyczy\u0107 zar\u00f3wno podstawowych informacji (zu\u017cycie procesora lub pami\u0119ci), jak i wizualizowa\u0107 specyficzne dla aplikacji metryki, np. po to, aby zidentyfikowa\u0107 \u017ar\u00f3d\u0142o problem\u00f3w z wydajno\u015bci\u0105. Przyk\u0142adowo \u2013 mo\u017ce dochodzi\u0107 do sytuacji, w kt\u00f3rej aplikacja wystawiaj\u0105ca REST-owe API zwraca timeouty dla request\u00f3w.<\/p>\n\n\n\n<p>Aplikacja ta komunikuje si\u0119 z kilkoma systemami zewn\u0119trznymi oraz baz\u0105 danych. Analizowanie log\u00f3w w celu identyfikacji problemu jest w tym przypadku trudne i nieskuteczne. Je\u015bli jednak zbudujemy dashboard z wykresami czasu odpowiedzi z poszczeg\u00f3lnych komponent\u00f3w dla jednego requestu, szybko mo\u017cemy zaobserwowa\u0107, \u017ce np. najwi\u0119cej czasu zajmuje zapytanie do bazy danych. W ten spos\u00f3b <strong>zaw\u0119zimy obszar poszukiwa\u0144 problemu<\/strong> do konkretnego momentu przetwarzania i mo\u017cemy skupi\u0107 si\u0119 np. na optymalizacji naszych zapyta\u0144 SQL.<\/p>\n\n\n\n<p>Te same dashboardy mo\u017cna wykorzystywa\u0107 w r\u00f3\u017cnych \u015brodowiskach (deweloperskim, testowym, produkcyjnym itp.). Takie podej\u015bcie pozwala na identyfikacj\u0119 i popraw\u0119 b\u0142\u0119d\u00f3w przed wdro\u017ceniem systemu na produkcj\u0119, a tak\u017ce na \u0142atw\u0105 replikacj\u0119 bug\u00f3w zaobserwowanych u klient\u00f3w do \u015brodowiska deweloperskiego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Tworzenie dashboard\u00f3w<\/strong><\/h3>\n\n\n\n<p>Dashboardy mo\u017cemy utworzy\u0107 na 2 sposoby:<\/p>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li>u\u017cywaj\u0105c istniej\u0105cego w GCP kreatora,<\/li><li>napisa\u0107 plik JSON z szablonem.<\/li><\/ol>\n\n\n\n<p>W kreatorze mo\u017cemy \u0142atwo \u201ewyklika\u0107\u201d potrzebny nam wykres. Wybieramy metryk\u0119, spos\u00f3b grupowania (np. po rodzaju zapytania HTTP, przez co otrzymamy osobne wizualizacje dla GET-\u00f3w, POST-\u00f3w) oraz spos\u00f3b agregacji danych w zdefiniowanym okienku czasowo (np. chcieliby\u015bmy u\u015bredni\u0107 czas odpowiedzi serwisu w 5-minutowym przedziale).<\/p>\n\n\n\n<p>Je\u015bli potrzebujemy przetwarza\u0107 dane w bardziej skomplikowany spos\u00f3b ni\u017c sumuj\u0105c, u\u015bredniaj\u0105c itp., mo\u017cemy sami napisa\u0107 kod funkcji w j\u0119zyku MQL (Monitoring Query Language). Kreator ma jednak pewne ograniczenia, np. nie pozwala na wizualizacj\u0119 kilku rodzaj\u00f3w danych na tym samym wykresie, je\u015bli u\u017cywamy MQL. W takim przypadku musimy wybra\u0107 podej\u015bcie z konfiguracj\u0105 w JSON-ie. <\/p>\n\n\n\n<p>Dobr\u0105 praktyk\u0105 jest trzymanie pliku z szablonem w repozytorium przy kodzie aplikacji. Spraw\u0119 u\u0142atwia fakt, \u017ce stworzony dashboard mo\u017cemy wyeksportowa\u0107 z poziomu konsoli GCP w\u0142a\u015bnie w wymaganym JSON-owym formacie.<\/p>\n\n\n\n<p>Wykresy s\u0105 bardzo przyjazne dla u\u017cytkownika, dzi\u0119ki temu, \u017ce mo\u017cna zmieni\u0107 zakres czasowy (1h, 6h etc.) lub uzyska\u0107 warto\u015b\u0107 dla okre\u015blonego okresu bez konieczno\u015bci zmian konfiguracji. Mo\u017cna je r\u00f3wnie\u017c grupowa\u0107 w rozwijalne i zatytu\u0142owane sekcje, co bardzo poprawia czytelno\u015b\u0107 dashborad\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Powiadamianie zespo\u0142u utrzymaniowego, czyli alerty<\/strong>&nbsp;<\/h2>\n\n\n\n<p>Cz\u0119sto w aplikacjach produkcyjnych w wyniku u\u017cycia systemu przez u\u017cytkownik\u00f3w dowiadujemy si\u0119 o problemie na \u015brodowisku. Po zg\u0142oszeniu b\u0142\u0119du musimy przeprowadzi\u0107 analiz\u0119, \u201egrzeba\u0107\u201d w logach aplikacji i samemu pr\u00f3bowa\u0107 odkry\u0107 \u017ar\u00f3d\u0142o problemu.<\/p>\n\n\n\n<p><strong>Alerty wychodz\u0105 naprzeciw takim problemom<\/strong> oraz pozwalaj\u0105 na optymalne skr\u00f3cenie potencjalnego czasu naprawy i wdro\u017cenia na \u015brodowisko. Poprzez zapi\u0119cie alert\u00f3w na logach lub odpowiednich metrykach, kt\u00f3re s\u0105 eksportowane z aplikacji, \u015brodowisko jest w stanie zasygnalizowa\u0107 problemy z aplikacj\u0105 (np. brak po\u0142\u0105czenia z baz\u0105 danych, aplikacja rzuca same b\u0142\u0119du danego typu etc.).&nbsp;<\/p>\n\n\n\n<p>Jak wspomnia\u0142em wy\u017cej, <strong>alert mo\u017cna zdefiniowa\u0107 na podstawie log\u00f3w lub metryk<\/strong>. Alerty na podstawie log\u00f3w tworzy si\u0119 bardzo prosto z poziomu eksploratora log\u00f3w, klikaj\u0105c przycisk \u201eCreate Alert\u201d. U\u017cywaj\u0105c generatora tworzenia alert\u00f3w,&nbsp;mo\u017cemy wyfiltrowa\u0107 interesuj\u0105cy nasz log, podpi\u0105\u0107 pod alert i gotowe.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Tworzenie alert\u00f3w<\/strong><\/h3>\n\n\n\n<p>Natomiast procedura przygotowania alert\u00f3w na podstawie metryk wygl\u0105da troch\u0119 inaczej.&nbsp;Z poziomu okna Cloud Monitoring w sekcji Alerting tworzymy Alerting Policy i konfigurujemy metryk\u0119, na kt\u00f3rej b\u0119dzie bazowa\u0107 alert. W tym celu mo\u017cna u\u017cy\u0107 metryk&nbsp;zdefiniowanych domy\u015blnie \u2013 przyk\u0142adowo metryki wysy\u0142ane przez aplikacj\u0119 z kontenera lub metryki, kt\u00f3re zdefiniowali\u015bmy sami. W tym miejscu mo\u017cna wyklika\u0107 konfiguracj\u0119 takiej metryki (np. zu\u017cycie CPU powy\u017cej 80% przez 5 minut), u\u017cywaj\u0105c interfejsu u\u017cytkownika dostarczonego nam przez Google. Pozwala on na generowanie prostych warunk\u00f3w lub u\u017cy\u0107 tzw. MQL, kt\u00f3ry umo\u017cliwi nam tworzenie bardziej z\u0142o\u017conych warunk\u00f3w dla naszego alertu.<\/p>\n\n\n\n<p>Dla ka\u017cdego warunku wymagane jest r\u00f3wnie\u017c <strong>zdefiniowanie triggera<\/strong>, kt\u00f3ry b\u0119dzie wyzwala\u0142 alert. Mamy tutaj kilka opcji do wyboru m.in wyzwalanie za ka\u017cdym razem, gdy warunek zostanie spe\u0142niony, warunek zostanie spe\u0142niony procentowo lub ilo\u015bciowo w danych przedziale czasowy. Tak zdefiniowany trigger jest ju\u017c gotowy do dzia\u0142ania. Mo\u017cemy go jeszcze rozbudowa\u0107 o okna ponownego przetestowania warunku (u\u017cyteczne, gdy alert ma sk\u0142onno\u015bci do bycia fa\u0142szywie pozytywny) oraz informacje o tym, jak warunek powinien reagowa\u0107 na braki w danych (brakuj\u0105ce dane powinny by\u0107 traktowane jako spe\u0142niaj\u0105ce lub nie warunek zdefiniowany dla alertu).<\/p>\n\n\n\n<p>Na sam koniec zosta\u0142o nam pod\u0142\u0105czenie naszego alertu do dowolnego kana\u0142u notyfikacji udost\u0119pnionego nam przez Google. S\u0105 to podstawowe jak e-mail, SMS, Slack lub bardziej wyszukane typu Pub\/Sub, WebHook lub PagerDuty Services.&nbsp;<\/p>\n\n\n\n<p>Tak utworzony alert na platformie GCP u\u0142atwi zadanie zespo\u0142owi utrzymuj\u0105cemu produkcj\u0119. Dzi\u0119ki informacji prosto z platformy, kt\u00f3ra wystawia wst\u0119pn\u0105 diagnostyk\u0119 i informacj\u0119 o tym, \u017ce co\u015b niedobrego dziej\u0119 si\u0119 z nasz\u0105 aplikacj\u0105. Pozwala to w znacznym stopniu zredukowa\u0107 czas niezb\u0119dny do naprawy problemu wyst\u0119puj\u0105cego na \u015brodowisku.&nbsp;&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Observability, czyli wieloaspektowy i wielowymiarowy pogl\u0105d na zachowanie i stan aplikacji oraz \u015brodowiska, stanowi nieod\u0142\u0105czny element ekosystem\u00f3w chmurowych, u\u0142atwiaj\u0105c krojenie rozwi\u0105za\u0144 szytych na miar\u0119, przynosz\u0105c korzy\u015bci zar\u00f3wno zespo\u0142owi deweloperskiemu jak i ca\u0142ej organizacji. Pomaga szybko, w jednym miejscu, diagnozowa\u0107 problemy i r\u00f3wnie szybko reagowa\u0107 na ich pojawienie si\u0119. U\u0142atwia utrzymanie odpowiednich wska\u017anik\u00f3w poziomu jako\u015bci us\u0142ug produkt\u00f3w krytycznych biznesowo w nowoczesnym, szybko zmieniaj\u0105cym si\u0119 \u015bwiecie.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuj\u0105 Ci\u0119 <a href=\"https:\/\/sii.pl\/blog\/wyszukiwarka\/cloud\/\" target=\"_blank\" aria-label=\"zagadnienia chmury, to polecamy te\u017c inne artyku\u0142y (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">zagadnienia chmury, to polecamy te\u017c inne artyku\u0142y<\/a> naszych ekspert\u00f3w z tego obszaru.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;20829&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;9&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 9)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Observability w GCP, czyli jak sprawdzi\u0107, dlaczego moja chmurowa aplikacja nie dzia\u0142a.\u00a0Od perspektywy dewelopera do perspektywy organizacji&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 9)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Zagadnienie monitoringu aplikacji oraz&nbsp;jej utrzymania w ca\u0142ym cyklu \u017cycia jest bardzo obszerne. Dotyczy nie tylko perspektywy technicznej czy narz\u0119dziowej, od &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/observability-w-gcp-czyli-jak-sprawdzic-dlaczego-moja-chmurowa-aplikacja-nie-dziala-od-perspektywy-dewelopera-do-perspektywy-organizacji\/\">Continued<\/a><\/p>\n","protected":false},"author":497,"featured_media":20831,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":7,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[1672,1670,1671,1546],"class_list":["post-20829","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-aplikacja-chmurowa","tag-google-cloud-platform","tag-gcp","tag-przeglad-narzedzi"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/04\/Observability-w-GCP.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20829"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/497"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=20829"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20829\/revisions"}],"predecessor-version":[{"id":20834,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/20829\/revisions\/20834"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/20831"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=20829"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=20829"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=20829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}