Logi i monitoring w chmurze: co zbierać, jak alertować i nie utonąć w danych

0
120
2.5/5 - (4 votes)

Nawigacja:

Dlaczego logi i monitoring w chmurze to osobna dyscyplina

Chmura vs serwerownia: inne środowisko, inne problemy

Klasyczna serwerownia „on-premise” oznacza zwykle kilka lub kilkanaście stałych serwerów, stosunkowo rzadkie zmiany i infrastrukturę, którą da się ogarnąć „na oko”. W chmurze obraz jest zupełnie inny: instancje powstają i znikają automatycznie, kontenery żyją minuty lub godziny, a jedna aplikacja potrafi działać równolegle na dziesiątkach węzłów w różnych regionach. Logi rozpraszają się po wielu miejscach, a bez centralizacji i przemyślanego monitoringu szybko zmieniają się w chaos.

Przy autoskalowaniu serwery pojawiają się dopiero wtedy, gdy ruch rośnie, a gdy obciążenie spada – są usuwane. To oznacza, że logi zapisane lokalnie na maszynie mogą zniknąć bezpowrotnie, zanim ktokolwiek zdąży je przejrzeć. W świecie chmurowym zakłada się z góry, że infrastruktura jest nietrwała, a jedynym stabilnym punktem odniesienia jest zewnętrzny system logów i metryk.

Dochodzi do tego rozdzielenie odpowiedzialności: infrastrukturą fizyczną zarządza dostawca chmury, a zespoły aplikacyjne skupiają się na kodzie, konfiguracji usług i przepływach danych. Monitoring w chmurze musi więc łączyć informacje z wielu warstw – od usług IaaS (maszyny, dyski, sieć), przez PaaS (bazy danych, kolejki, load balancery), aż po SaaS (gotowe usługi, z których korzysta aplikacja). Prosty odczyt „czy serwer żyje” przestaje wystarczać.

Skutki słabego monitoringu: klient wie pierwszy

Najczęstszy symptom niedojrzałego monitoringu w chmurze jest brutalnie prosty: o awarii informuje klient, nie system. Typowy scenariusz wygląda tak: kampania marketingowa podbija ruch, aplikacja zaczyna zwracać błędy 5xx, ale nikt z zespołu nie dostaje alertu. Pierwszy sygnał przychodzi w postaci maila od handlowca: „Klient X nie może się zalogować”. Zaczyna się ręczne sprawdzanie dashboardów i nerwowe przeklikiwanie logów, podczas gdy problem trwa od 30 minut.

Bez sensownie ustawionych metryk i alertów chmurowe środowisko staje się czarną skrzynką – coś gdzieś działa, aż przestaje. Zespół reaguje dopiero na skutki zamiast na symptomy. Brakuje również informacji do analizy po incydencie: jeśli logi są rozproszone, nieustrukturyzowane lub nadpisane przez kolejne instancje, trudno odpowiedzieć na kluczowe pytanie: „co dokładnie się stało i jak temu zapobiec w przyszłości?”.

Mocny monitoring zmienia dynamikę: zespół dowiaduje się o problemie, zanim skala błędów dotknie większości użytkowników. Alerty ustawione na poziomie SLO (np. „więcej niż 2% błędów 5xx w ciągu 5 minut”) pozwalają reagować, gdy sytuacja dopiero się pogarsza, a nie wtedy, gdy system już „leży”. To nie jest luksus, tylko warunek utrzymania zaufania do usług działających w chmurze.

Trzy filary obserwowalności: logi, metryki, ślady

W nowoczesnym podejściu do systemów rozproszonych mówi się o obserwowalności (observability) opartej na trzech filarach:

  • Logi – szczegółowe zapisy zdarzeń: błędy, działania użytkowników, wewnętrzne komunikaty aplikacji. Odpowiadają na pytanie: „co dokładnie się wydarzyło?”.
  • Metryki – zagregowane liczby mierzone w czasie: liczba żądań, opóźnienia, wykorzystanie CPU, liczba błędów. Odpowiadają na pytanie: „jak system zachowuje się globalnie?”.
  • Traces (ślady) – ujednolicone ścieżki żądania przechodzącego przez wiele usług (distributed tracing). Odpowiadają na pytanie: „którędy szło żądanie i gdzie się wykoleiło?”.

Dobra intuicja to porównanie do medycyny. Metryki są jak tętno, ciśnienie, temperatura – szybkie liczby, które mówią, czy pacjent jest „w normie”. Logi przypominają dokumentację medyczną i notatki lekarzy: konkretne opisy co, kiedy i jak zrobiono. Ślady to z kolei dokładne odwzorowanie drogi leku w organizmie – gdzie trafił, jak długo się utrzymywał, gdzie wystąpiła reakcja.

Te trzy typy danych nie zastępują się, lecz uzupełniają. Próba prowadzenia monitoringu tylko na logach prowadzi do chaosu i „grepowania” bez końca. Samymi metrykami trudno wytłumaczyć konkretne anomalie. Bez śladów trudno debugować mikroserwisy, gdzie jedno żądanie przechodzi przez 10 usług. Monitoring w chmurze to sztuka łączenia tych źródeł w spójny obraz.

Zmiana roli logów w modelach SaaS, PaaS i IaaS

W modelu IaaS (Infrastructure as a Service) zespół ma największą kontrolę: zarządza maszynami wirtualnymi, systemem operacyjnym, agentami zbierającymi logi, konfiguracją sieci. Logi systemowe, logi z aplikacji i metryki maszyn są w pełni pod kontrolą, ale też pełna odpowiedzialność za ich konfigurację i przechowywanie spoczywa na zespole.

W PaaS część warstw znika z pola widzenia. Dostawca chmury zapewnia platformę (np. managed database, usługa kolejki, funkcje serverless), ale nie zawsze daje pełny dostęp do logów wewnętrznych. Zespół dostaje wybrane metryki i logi (np. błędy zapytań, wykorzystanie CPU bazy), ale nie decyduje, co dzieje się głębiej. Monitoring musi więc łączyć dane z udostępnionych paneli chmurowych z logami aplikacji.

W modelu SaaS pole kontroli jest najmniejsze: korzysta się z gotowej aplikacji (np. CRM, narzędzia billingowego) i zwykle dostaje się tylko ograniczone logi audytowe oraz metryki na poziomie konta (liczba requestów, wykorzystanie limitów). Monitoring polega wtedy bardziej na obserwowaniu wpływu SaaS na własne procesy (np. metryki biznesowe) oraz integracji logów aplikacji z webhookami i eksportami z usługi SaaS, niż na klasycznym „tailowaniu” logów serwera.

Zbliżenie cyfrowego licznika samochodu jako metafora monitoringu danych
Źródło: Pexels | Autor: Erik Mclean

Co monitorować w chmurze: mapowanie na warstwy systemu

Model warstwowy: od infrastruktury po biznes

Ustalenie, co monitorować w chmurze, zaczyna się od uporządkowania systemu na kilka prostych warstw. Praktyczny podział może wyglądać tak:

  • Infrastruktura – maszyny wirtualne, kontenery, klastry Kubernetes, load balancery, sieć.
  • Platforma – bazy danych, cache, kolejki wiadomości, funkcje serverless, managed services.
  • Aplikacja – kod, endpointy HTTP, zadania w tle, biblioteki, logika domenowa.
  • Biznes – zachowania użytkowników, transakcje, konwersje, procesy biznesowe.

Dla każdej warstwy warto zdefiniować zestaw kluczowych metryk i logów. Chodzi o to, aby w razie problemu móc zejść „w dół” po warstwach: od sygnału biznesowego (spadek konwersji), przez warstwę aplikacji (wzrost błędów 5xx), aż po infrastrukturę (np. przeciążony węzeł bazy danych).

Taki model pomaga też w rozmowach między zespołami. Administratorzy skupiają się częściej na infrastrukturze i platformie, programiści – na aplikacji, product ownerzy – na biznesie. Wspólny język metryk ułatwia przekładanie problemów technicznych na wpływ na użytkownika i odwrotnie.

Infrastruktura: zasoby, dostępność, przepustowość

Na najniższym poziomie monitoring w chmurze obejmuje typowe metryki zasobów oraz zdrowie węzłów. Kluczowe wskaźniki to między innymi:

  • CPU – średnie wykorzystanie, skoki, czas utrzymywania się wysokiego obciążenia.
  • Pamięć RAM – zużycie, wycieki pamięci, OOM (Out Of Memory) w kontenerach.
  • Dysk – zajętość, IOPS, opóźnienia odczytu/zapisu.
  • Sieć – przepustowość, błędy, pakiety odrzucone, saturacja łączy.
  • Zdrowie instancji – statusy health checków, restarty, rotacja maszyn.

Logi na tym poziomie to przede wszystkim logi systemowe (journal, syslog), logi agenta monitorującego, logi z load balancerów i komponentów sieciowych (firewall, gateway). Przydatne są również logi zdarzeń infrastrukturalnych z panelu chmury: kto stworzył/usunął instancję, kto zmienił security group, kiedy pojawiła się nowa wersja obrazu.

W chmurze szczególnie groźne są problemy sieciowe i „ciche” wyczerpywanie zasobów (np. descriptors, connections). Same logi systemowe ich nie pokażą – potrzebne są też metryki z warstwy sieci oraz z usług PaaS, które raportują własne ograniczenia (np. maksymalna liczba równoległych połączeń do bazy).

Platforma: bazy, kolejki, cache

Usługi platformowe są często wąskim gardłem systemu. Dla bazy danych bardziej niż sama dostępność liczy się czas odpowiedzi i liczba błędów zapytań. Przykładowe metryki platformowe:

  • Dla bazy danych: średni czas wykonania zapytania, liczba otwartych połączeń, liczba zapytań na sekundę, liczba błędów (np. timeout, deadlock).
  • Dla kolejki: długość kolejki, czas przebywania wiadomości w kolejce, liczba odrzuconych wiadomości.
  • Dla cache (Redis, Memcached): hit rate, liczba operacji, czas odpowiedzi, wykorzystanie pamięci.
  • Dla funkcji serverless: liczba wywołań, czas wykonania, liczba błędów i retry.

Logi platformy obejmują m.in. logi zapytań do bazy (z filtrem na długie zapytania), logi błędów, logi audytowe (kto modyfikował strukturę tabel), logi błędów kolejki (wiadomości odrzucone). Z punktu widzenia monitoringu w chmurze kluczowe jest spięcie tych logów z identyfikatorami żądań z aplikacji – tak, aby dla danego requestu z frontendu odnaleźć odpowiadające mu operacje na bazie.

Przeoczenie metryk platformowych prowadzi do sytuacji, w której aplikacja jest „zdrowa” (serwery i kontenery działają), ale rzeczywisty problem leży w bazie albo kolejce. Wtedy liczba błędów 5xx rośnie, a dashboard „infrastruktura OK” uspokaja zespół, zamiast kazać szukać głębiej.

Aplikacja: błędy, czasy odpowiedzi, przepływy

Warstwa aplikacyjna to miejsce, gdzie monitoring w chmurze dotyka bezpośrednio doświadczenia użytkownika. Podstawowe metryki to:

  • Liczba requestów per endpoint / per usługa.
  • Opóźnienia (np. P50, P95, P99 czasu odpowiedzi).
  • Wskaźnik błędów (liczba odpowiedzi 4xx i 5xx, osobno dla kluczowych endpointów).
  • Liczba aktywnych sesji i użytkowników (np. na minutę).
  • Kolejki zadań w tle – liczba zadań oczekujących, czas przetwarzania, błędy jobów.

Logi aplikacyjne są najbogatszym źródłem informacji. To tutaj widać komunikaty biznesowe („nie udało się naliczyć rabatu”), wyjątki w kodzie, problemy z integracjami, ostrzeżenia o niespójnych danych. Jednak przy braku standardu logowania szybko zamieniają się w nieprzeszukiwalny strumień tekstu. W chmurze logi aplikacyjne powinny mieć ustrukturyzowaną formę (np. JSON) i konsekwentnie stosowane pola (request_id, user_id, service, level).

Warto też wystawić metryki techniczne bezpośrednio z aplikacji: osobne liczniki dla kluczowych operacji (np. „liczba utworzonych zamówień”, „liczba nieudanych logowań”). Tego typu dane są pomostem między monitoringiem technicznym a warstwą biznesową.

Biznes: mierzenie tego, co naprawdę boli użytkownika

Metryki biznesowe to miejsce, gdzie monitoring w chmurze zaczyna dotykać celów firmy. Jeśli aplikacja zarabia na płatnych transakcjach, liczba zakończonych transakcji na minutę jest ważniejsza niż średni CPU. Wybrane przykłady metryk biznesowych:

  • Liczba rejestracji / logowań w określonym przedziale czasu.
  • Konwersja na kluczowych ścieżkach (np. od wejścia na stronę do finalizacji zakupu).
  • Liczba błędnych płatności lub odrzuconych koszyków.
  • Liczba zgłoszeń supportowych powiązanych z konkretnym modułem aplikacji.

Logi biznesowe to często logi zdarzeń domenowych: „utworzono zamówienie”, „zmieniono status”, „wykonano zwrot”. W praktyce dobrze się sprawdza rejestrowanie ich w formie zdarzeń (eventów) z jasnymi polami: typ akcji, identyfikator encji, użytkownik, kanał (web, mobile, API partnera). Takie zdarzenia można później agregować i wizualizować na dashboardach biznesowych.

Monitoring od góry oznacza, że punktem wyjścia analizy są metryki biznesowe. Gdy widać nagły spadek liczby udanych logowań lub zamówień, dopiero potem sprawdza się błędy aplikacji, metryki platformy i stan infrastruktury. Ten sposób myślenia minimalizuje ryzyko „tunelowego widzenia” wyłącznie przez pryzmat CPU i RAM.

Jakie logi zbierać: od „loguj wszystko” do „loguj z sensem”

Najpierw scenariusze, potem poziomy logów

Zamiast zaczynać od narzędzi, lepiej zacząć od pytania: w jakich sytuacjach będziemy zaglądać do logów? Typowe scenariusze to:

  • diagnoza incydentu produkcyjnego („użytkownicy zgłaszają błędy, co się dzieje?”),
  • śledzenie pojedynczego requestu lub transakcji („konkretne zamówienie utknęło, gdzie?”),
  • analiza trendów („coraz częściej time-outy do zewnętrznego API”),
  • audyt bezpieczeństwa lub zmian („kto zmienił ustawienia uprawnień?”).

Dla każdego takiego scenariusza logi powinny dostarczać odpowiedzi bez ręcznego składania historii z losowych fragmentów. To oznacza, że projektowanie logowania jest częścią projektowania systemu, a nie sprzątaniem po wdrożeniu.

Struktura zamiast ściany tekstu

W chmurze logi nie żyją na jednym serwerze – są przesyłane, parsowane, filtrowane. W takiej architekturze luźny tekst przestaje wystarczać. Dużo lepiej sprawdza się logowanie w formacie ustrukturyzowanym (np. JSON), z jasno nazwanymi polami.

Minimalny „szkielet” wpisu logu w systemie rozproszonym:

  • timestamp – z precyzją co najmniej do milisekundy i z informacją o strefie / UTC,
  • level – DEBUG, INFO, WARN, ERROR, opcjonalnie FATAL,
  • service / component – nazwa usługi, mikroserwisu, modułu,
  • request_id / trace_id – wspólny identyfikator żądania,
  • user_id / account_id – jeśli dotyczy, najlepiej w zanonimizowanej formie,
  • action / event – co się zadziało (np. order.created, payment.failed),
  • context – parametry, które pomagają zrozumieć zdarzenie (np. metoda HTTP, endpoint, kod błędu z zewnętrznego API).

Takie logi są „z natury” gotowe do filtrowania i agregacji: łatwiej znaleźć wszystkie błędy dla danego klienta albo wyłapać, które endpointy najczęściej zgłaszają wyjątki.

Poziomy logowania z głową

Klasyczne poziomy logowania mają sens tylko wtedy, gdy cały zespół używa ich w podobny sposób. Jedna z prostych, praktycznych konwencji wygląda tak:

  • DEBUG – szczegóły pomocne programiście przy diagnozie problemów; w środowisku produkcyjnym zwykle wyłączone lub mocno ograniczone.
  • INFO – normalny bieg zdarzeń: ważne akcje biznesowe, start/stop komponentu, kluczowe integracje.
  • WARN – sytuacje nienormalne, ale jeszcze niekatastroficzne (np. retry do zewnętrznego API, przekroczony miękki limit).
  • ERROR – operacja się nie udała; użytkownik mógł dostać błąd albo system musiał zrezygnować z jakiejś funkcji.
  • FATAL / CRITICAL – coś fundamentalnie nie działa (np. usługa nie może wystartować, brak połączenia z kluczową bazą danych).

Warto jasno ustalić, że ERROR to coś, co wymaga reakcji, a nie „wygodny poziom na wszystko, co jest trochę podejrzane”. Inaczej każdy dashboard będzie stale „na czerwono”, a alerty przestaną coś znaczyć.

Czego nie logować: prywatność i koszty

„Loguj wszystko” brzmi dobrze tylko do momentu pierwszego rachunku za log storage albo pierwszego audytu bezpieczeństwa. Zbędne logi to nie tylko koszt, ale też potencjalne ryzyko wycieku danych wrażliwych.

Przy projektowaniu logowania warto wprost spisać listę danych, które są zakazane w logach, np.:

  • pełne numery kart płatniczych,
  • hasła, tokeny autoryzacyjne, sekrety konfiguracyjne,
  • pełne adresy e‑mail lub numery telefonu (logujemy skrócone lub zmaskowane),
  • dane zdrowotne albo inne informacje szczególnie wrażliwe według RODO.

Często wystarczy zamiast pełnej wartości zapisać techniczny identyfikator rekordu albo skrócony hash. W razie potrzeby szczegóły można odtworzyć z bazy, ale log nie zawiera „gotowego do nadużyć” pakietu informacji.

Sampling i retencja: nie każda linijka jest wieczna

Nie wszystkie logi są równie ważne. Część ma wartość tylko przez kilka minut (np. szczegółowe DEBUG z ruchu HTTP), inne – przez miesiące (logi audytowe). Dlatego logi powinny mieć różne okresy retencji i czasem też różne poziomy „szczegółowości”.

Przykładowy podział:

  • logi DEBUG – przechowywane krótko, np. 24–72 godziny, często wręcz włączane tylko na czas diagnozy,
  • logi INFO i techniczne – kilka–kilkanaście dni, do analizy trendów i incydentów,
  • logi audytowe i bezpieczeństwa – miesiące lub lata (zgodnie z wymaganiami regulacyjnymi).

Sampling, czyli logowanie tylko części zdarzeń, ma sens przy bardzo dużym wolumenie ruchu. Na przykład: logowanie pełnych szczegółów tylko dla 1% requestów, a dla pozostałych – krótkie, zagregowane wpisy. Klucz w tym, aby sampling był świadomy i dobrze udokumentowany; w przeciwnym razie w trakcie incydentu nagle okaże się, że właśnie brak danych uniemożliwia diagnozę.

Standaryzacja pól i korrelacja między usługami

Gdy system składa się z wielu mikroserwisów, logi przestają być pojedynczym strumieniem; stają się zbiorem równoległych historii. Żeby dało się je połączyć, trzeba konsekwentnie stosować wspólne identyfikatory.

Najważniejsze są:

  • trace_id / correlation_id – jeden identyfikator dla całego żądania przechodzącego przez wiele usług,
  • span_id – identyfikator pojedynczego kroku w ramach trace’a (przydatny, gdy korzystamy z distributed tracing),
  • operation_name – nazwa czynności (np. POST /api/orders, SendInvoiceEmail).

W praktyce oznacza to np. dodawanie nagłówka X-Request-ID lub traceparent w każdym żądaniu HTTP oraz przenoszenie go dalej do wywołań wewnętrznych i zewnętrznych. Dzięki temu w narzędziu do logów łatwo wyszukać wszystkie wpisy powiązane z jednym ruchem użytkownika, nawet jeśli przeskakiwał on między serwisami w różnych chmurach.

Zbliżenie ekranu komputera z interfejsem bezpieczeństwa danych w zieleni
Źródło: Pexels | Autor: Tima Miroshnichenko

Metryki, logi i ślady – jak ze sobą gadają

Trzy perspektywy na ten sam problem

Metryki, logi i ślady (traces) to trzy różne spojrzenia na zachowanie systemu:

  • Metryki – liczby w czasie: ile, jak długo, jak często. Idealne do dashboardów i alertów.
  • Logi – szczegółowe zapisy zdarzeń: co się stało, z jakimi parametrami.
  • Ślady (distributed tracing) – mapa podróży pojedynczego żądania przez system rozproszony.

Największą wartość daje sytuacja, w której da się płynnie przechodzić od jednego rodzaju danych do drugiego. Alert z metryki powinien prowadzić do odpowiedniego zestawu logów, a z logów powinniśmy trafić do konkretnego trace’a pokazującego, gdzie naprawdę ginie czas.

Metryki: mało danych, dużo informacji

Metryki są z natury lekkie – to pojedyncze wartości liczbowe zbierane w równych odstępach czasu. Ten minimalizm jest ich siłą: świetnie nadają się do przechowywania na długo i szybkiego obliczania agregatów (średnie, percentyle, sumy).

Podstawowe typy metryk to:

  • gauge – wartość w danym momencie (np. liczba aktywnych połączeń do bazy),
  • counter – rosnąca liczba (np. łączna liczba requestów lub błędów),
  • histogram – rozkład wartości (np. czasy odpowiedzi w bucketach: 0–100 ms, 100–300 ms itd.).

W praktyce histogramy czasu odpowiedzi i liczników błędów dla kluczowych endpointów odpowiadają na większość pytań „czy użytkownikom działa szybko i poprawnie?”. Gdy te metryki nagle zmieniają się na gorsze, to sygnał, że trzeba sięgnąć głębiej – do logów i śladów.

Logi: szczegóły na żądanie

Jeśli metryki mówią „co” i „kiedy”, to logi odpowiadają na „dlaczego”. Nadają się do:

  • diagnozy pojedynczych błędów („jaki wyjątek poleciał i w jakim kontekście?”),
  • analizy rzadkich, trudnych do uchwycenia sytuacji (np. specyficzne kombinacje parametrów żądania),
  • audytu („kto wykonał tę operację i z jakiego adresu IP?”).

Logi są cięższe od metryk: zajmują więcej miejsca, trudniej je agregować. Z tego powodu na dashboardach i w alertach główną rolę grają metryki, a logi są narzędziem „drugi poziom szczegółowości”. W praktyce sprawdza się zasada: alerty na metrykach, diagnoza w logach.

Ślady: zamiast zgadywać, gdzie ginie czas

Distributed tracing pokazuje przepływ jednego żądania przez system. Ślad (trace) składa się z wielu „kawałków” (spanów), z których każdy reprezentuje np. wywołanie funkcji, zapytanie do bazy czy call do innego mikroserwisu.

W typowym narzędziu do tracingu widać oś czasu z naniesionymi kolejnymi spanami. Z takiej wizualizacji od razu widać, że np.:

  • większość czasu request spędza w zewnętrznym API płatności,
  • zapytanie do bazy w jednym z mikroserwisów zawsze trwa podejrzanie długo,
  • niektóre wywołania są wykonywane sekwencyjnie, choć można by je równoleglić.

W chmurze, gdzie aplikacja potrafi składać się z kilkudziesięciu usług, taki „rentgen” requestu bardzo przyspiesza diagnozę. Zamiast kolektywnie zgadywać, w którym serwisie jest problem, widać go na jednej osi czasu.

Łączenie metryk, logów i śladów jednym identyfikatorem

Kluczem do współpracy trzech rodzajów danych jest wspólny identyfikator, przechodzący przez cały stack. Najczęściej jest to trace_id albo correlation_id, propagowany od wejścia ruchu (np. load balancer, API gateway) aż po najgłębszy worker w tle.

Praktyczny „flow” wygląda wtedy tak:

  1. Alert z metryki mówi: „wzrosło P95 czasu odpowiedzi endpointu /checkout”.
  2. W dashboardzie klikamy w metrykę i przechodzimy do listy najwolniejszych trace’ów dla /checkout.
  3. W jednym z trace’ów widać konkretny span z dużym opóźnieniem (np. zapytanie do bazy). Span ma przypisane trace_id.
  4. To samo trace_id wykorzystujemy w narzędziu do logów, aby zobaczyć wszystkie wpisy logów powiązane z tym requestem – w tym wyjątki albo ostrzeżenia z warstwy aplikacji.

Cały proces diagnozy skraca się z godzin ręcznego grzebania w logach do minut spędzonych na kilku przeklikaniach między narzędziami.

Standardy otwarte: OpenTelemetry i spółka

Żeby metryki, logi i ślady „gadały” między sobą w spójny sposób, nie trzeba wymyślać własnych formatów. Popularny standard to OpenTelemetry – zestaw bibliotek i specyfikacji, który opisuje, jak zbierać i przesyłać dane obserwowalności (obserwowalność to parasolowe pojęcie dla metryk, logów i śladów).

Korzyści z wykorzystania takiego standardu są dwie:

  • łatwiejsza zmiana narzędzia (vendor lock‑in jest mniejszy – ten sam format może iść do różnych backendów),
  • spójne nazewnictwo i struktura danych między językami i usługami.

W praktyce można np. użyć bibliotek OpenTelemetry w aplikacji, wysyłać metryki do Prometheusa, ślady do Jaegera albo Tempo, a logi do OpenSearch czy innego systemu – bez budowania setek własnych adapterów.

Ekran z mapą świata i statystykami globalnych zakażeń COVID-19
Źródło: Pexels | Autor: Atypeek Dgn

Projektowanie alertów: jak nie obudzić całego zespołu o 3 w nocy

Alert to nie dashboard na głośnikach

Dashboard jest po to, aby na niego patrzeć, kiedy chcemy. Alert jest po to, aby przerwać to, co aktualnie robimy. To zasadnicza różnica. Jeśli alertów jest za dużo, przestają być odbierane na poważnie – zespół uczy się je ignorować.

Dobre pytanie przy definiowaniu alertu brzmi: czy byłbym skłonny obudzić kogoś tym sygnałem? Jeśli odpowiedź brzmi „nie”, to taki alert powinien trafić raczej jako informacja na kanał zespołu, a nie jako głośny page o 3 nad ranem.

Alerty symptomowe zamiast „serwer nie odpowiada”

Projektowanie alertów wokół doświadczenia użytkownika

Zamiast reagować na każdy kaszlnięty serwer, lepiej pilnować tego, co widzi i czuje użytkownik. Innymi słowy: monitoring ma śledzić objawy, a nie wyłącznie techniczne przyczyny.

Dobre przykłady alertów symptomowych:

  • wzrost odsetka odpowiedzi z błędem (np. HTTP 5xx) dla kluczowego endpointu,
  • gwałtowny skok P95/P99 czasu odpowiedzi dla ścieżki zakupowej,
  • spadek liczby poprawnie zakończonych transakcji w stosunku do typowego poziomu,
  • nagły wzrost liczby porzuconych koszyków w e‑commerce w krótkim oknie czasowym.

Tego typu sygnały mówią: „użytkownicy realnie mają gorzej”. Dopiero gdy taki alert się pojawi, opłaca się zajrzeć, czy stoi za tym przeciążona baza, wadliwa wersja mikroserwisu, czy problem sieciowy w regionie.

Priorytety i poziomy alertów

Żeby nie traktować każdej anomalii jak końca świata, dobrze jest mieć ustalone poziomy ważności. Prosty, działający w praktyce podział to:

  • P1 – krytyczny: wpływ na większość użytkowników, kluczowa funkcja nie działa lub działa bardzo źle. Budzi zespół niezależnie od godziny.
  • P2 – wysoki: wpływ zauważalny, ale z obejściem (workaround), albo dotyczy części użytkowników. Wymaga reakcji w ciągu godzin, ale niekoniecznie nocnego telefonu.
  • P3 – średni: problem techniczny bez bezpośredniego wpływu na biznes tu i teraz (np. rosnące zużycie dysku). Nadaje się na zadanie w backlogu lub reakcję w godzinach pracy.
  • P4 – niski / informacyjny: ciekawa anomalia, która może zapowiadać problem, ale sama w sobie nie wymaga akcji (np. krótki skok opóźnienia w regionie). Dobra do kanału „#alerts” w komunikatorze.

Przy definiowaniu każdego nowego alertu powinno paść pytanie: jaki ma poziom P1–P4 i jaka ma być rota dyżurowa? Bez tego szybko powstaje szary szum, który zalewa telefon i skrzynkę mailową.

Histereza i „cooldown”, czyli jak nie dostać 50 alertów o tym samym

Systemy w chmurze są z natury szumne: autoscaling, zmiany tras sieciowych, okresowe spadki wydajności zewnętrznych dostawców. Gdy próg alertu ustawimy „na sztywno”, przy każdym krótkim skoku metryki zespół dostaje kolejny sygnał.

Tu przydają się dwa mechanizmy:

  • histereza – warunek wyjścia z alertu jest inny niż warunek wejścia. Przykład: alarm włącza się, gdy błędy 5xx > 5% przez 5 minut, ale wyłącza się dopiero, kiedy spadną poniżej 2% przez kolejne 10 minut. Dzięki temu alert nie „mruga”.
  • cooldown / deduplikacja – po wysłaniu alertu ustalamy, że przez pewien czas (np. 30 minut) kolejne, takie same zdarzenia nie wyślą nowych powiadomień, tylko będą „doklejane” jako aktualizacja. Operator w nocy widzi jeden incydent z rosnącym opisem, a nie dwadzieścia powiadomień.

W praktyce dobrze jest zacząć od łagodniejszych progów i dłuższych okien czasowych, a potem stopniowo je zaostrzać, gdy zespół nabierze zaufania do jakości alertów.

Alerty na trendach zamiast progów absolutnych

Proste progi typu „P95 > 500 ms” działają dopóty, dopóki system ma stabilne obciążenie. Gdy ruch zmienia się sezonowo albo w trakcie dnia, warto wykorzystać analizę trendów.

Przykładowe podejścia:

  • porównanie do typowego zachowania – „jeśli aktualna liczba błędów jest 3× większa niż średnia z ostatnich 7 dni o tej samej porze, wznieś alert”,
  • wykrywanie anomalii – narzędzia APM i platformy chmurowe potrafią same dopasować model „normalnego” ruchu i zgłaszać duże odchylenia,
  • odnoszenie do bazowej linii (baseline) – ręcznie ustalony przedział „komfortowy” na podstawie historii i oczekiwań biznesu.

Takie podejście szczególnie pomaga w systemach, gdzie ruch nocą i w ciągu dnia różni się o rząd wielkości. 2% błędów przy 10 requestach na minutę to co innego niż 2% przy dziesiątkach tysięcy żądań.

Testowanie alertów na sucho

Alerty, których nikt nie sprawdził, często okazują się bezużyteczne w pierwszym większym incydencie. Dlatego przed włączeniem nowego zestawu reguł dobrze jest wykonać kilka kroków:

  • uruchomić alerty w trybie „silent” – generują zdarzenia, ale nie wysyłają powiadomień; zespół ocenia przez tydzień, czy ich liczba i treść mają sens,
  • wywołać kontrolowaną awarię (np. z użyciem chaos engineering) i zobaczyć, które alerty zareagują, jak szybko i czy prowadzą do właściwych dashboardów,
  • sprawdzić, czy z powiadomienia da się w kilka kliknięć przejść do logów, śladów i instrukcji runbooka.

Prosty test: osoba z dyżuru pokazuje na spotkaniu jeden z ostatnich alertów i przechodzi ścieżkę „od powiadomienia do diagnozy”. Jeśli po drodze musi szukać na pamięć nazw dashboardów albo filtrów w logach, to znak, że brakuje integracji lub dokumentacji.

Runbooki i automatyzacja pierwszej reakcji

Sam alert często mówi tylko „co jest źle”. Potrzeba jeszcze jasnej odpowiedzi na pytanie „co zrobić teraz?”. Tu pojawiają się runbooki – krótkie instrukcje krok po kroku.

Dla każdego krytycznego alertu powinien istnieć przynajmniej prosty opis:

  • jakie dashboardy otworzyć w pierwszej kolejności,
  • jakie logi/przekroje danych sprawdzić,
  • jakie szybkie akcje naprawcze są bezpieczne (np. restart konkretnego deploymentu, zwiększenie liczby replik, przełączenie regionu),
  • kiedy trzeba eskalować (np. wołać DBA, zespół sieciowy lub dostawcę zewnętrznego API).

W chmurze część tych kroków można zautomatyzować. Jeśli na przykład alert mówi o zapełniającym się dysku w nodzie Kubernetes, skrypt może automatycznie wyczyścić stare logi i jednocześnie otworzyć ticket z prośbą o długofalowe rozwiązanie (np. zmianę typu storage’u lub polityki retencji).

SLO, SLA i zdrowy poziom wrażliwości monitoringu

Od „niech wszystko działa” do mierzalnych celów

Zamiast abstrakcyjnego „system ma działać dobrze”, dużo wygodniej jest mieć konkretną liczbę, do której można się odnieść. Tym właśnie są SLO – Service Level Objectives, czyli cele jakościowe usługi.

Typowy przykład: „99,5% requestów do API ma kończyć się powodzeniem (HTTP 2xx/3xx) w oknie 30 dni” albo „P95 czasu odpowiedzi strony głównej nie przekracza 800 ms w ciągu doby roboczej”. Taki cel da się zmierzyć metrykami. Jeśli wynik jest poniżej SLO – system „nie dowozi” tego, co obiecano.

SLA kontra SLO – po co dwa skróty

Często oba pojęcia wrzuca się do jednego worka, ale ich rola jest inna:

  • SLO – wewnętrzny cel zespołu, mówiący, jaką jakość chcemy zapewnić.
  • SLA (Service Level Agreement) – zewnętrzna umowa z klientem, w której obiecujemy określony poziom dostępności lub wydajności, zwykle z konsekwencjami biznesowymi (np. rabaty za przekroczenie limitu niedostępności).

Praktyczna zasada: SLO powinno być ambitniejsze niż SLA. Jeśli SLA obiecuje 99,5% dostępności, SLO wewnątrz zespołu może wynosić 99,7% – tak, aby była przestrzeń na reagowanie, zanim złamie się kontrakt.

Budżet błędów – przewrotny sposób myślenia o awariach

Skoro nie da się mieć 100% dostępności, rozsądniej jest przyjąć, że posiadamy pewien „budżet błędów”, który można „wydać”. Jeśli SLO mówi o 99,9% skutecznych requestów, to w miesiącu mamy 0,1% przestrzeni na awarie, wolne działanie, rollouty nowych funkcji.

Takie podejście ma kilka skutków ubocznych, bardzo pożytecznych dla zespołu:

  • zamiast bać się każdej zmiany, zespół widzi, ile budżetu zostało – jeśli wiele dni z rzędu wszystko działa idealnie, można pozwolić sobie na odważniejsze eksperymenty,
  • gdy budżet topnieje zbyt szybko (np. kilka gorszych incydentów pod rząd), priorytety na roadmapie przesuwają się w stronę stabilizacji i poprawy niezawodności,
  • da się obiektywnie rozmawiać z biznesem: „wdrożenie tej funkcji na razie wstrzymujemy, bo naruszyłoby ono SLO, które wspólnie ustaliliśmy”.

Budżet błędów dobrze jest liczyć automatycznie – osobny wykres pokazujący „ile procent budżetu zostało w tym oknie 30 dni” bywa bardziej obrazowy niż sama surowa metryka błędów.

Łączenie SLO z alertami

Alerty można budować wprost na SLO. Zamiast reagować na każdą drobną anomalię, zespół pilnuje, aby wskaźniki nie przekraczały akceptowalnych granic w dłuższym oknie czasu.

Przykład prostego podejścia:

  • Definiujemy metrykę „error_rate” (np. udział HTTP 5xx w całkowitej liczbie requestów).
  • Ustalamy SLO: „w 30‑dniowym oknie kroczącym co najmniej 99% requestów ma kończyć się powodzeniem”.
  • Tworzymy alerty powiązane z tempem „spalania” budżetu:
    • alert ostrzegawczy, gdy w ciągu 6 godzin zużyjemy np. 10% budżetu,
    • alert krytyczny, gdy tempo sugeruje, że budżet skończy się w kilka najbliższych dni.

Taki system przestaje krzyczeć przy każdym pojedynczym błędzie, a zaczyna reagować, gdy realnie zbliżamy się do złamania obietnicy jakościowej.

Dobór poziomu SLO: nie za ostro, nie za miękko

SLO ustawione zbyt agresywnie („99,999% dostępności wszystkiego, zawsze”) skończy się tym, że:

  • budżet błędów będzie łamany przy byle incydencie,
  • zespół zniechęci się, bo cele będą wyglądały na nierealne,
  • każda zmiana w produkcji będzie postrzegana jako ogromne ryzyko.

Z kolei zbyt łagodne SLO nie będą brane na poważnie – biznes i tak będzie oczekiwał wyższej jakości niż sugerują wykresy. Dobrym punktem wyjścia jest analiza historycznych danych: jaką dostępność i jakość faktycznie mieliśmy przez ostatnie miesiące, zanim zaczęliśmy formalnie liczyć SLO?

Można np. wziąć 3–6 miesięcy logów i metryk, policzyć „rzeczywiste” SLO z przeszłości i ustawić cel odrobinę lepszy niż ta wartość. Dopiero po kilku iteracjach, gdy zespół oswoi się z nowym językiem, warto delikatnie zaostrzać kryteria.

Różne SLO dla różnych funkcji

Nie każda część systemu jest równie ważna. Strona statusu, koszyk w sklepie, endpoint do płatności kartą – to funkcje, dla których SLO ma bezpośrednie przełożenie na przychody i zaufanie klientów. Raport miesięczny w panelu administracyjnym może mieć luźniejsze wymagania.

Dlatego sensowne jest utrzymywanie kilku poziomów SLO:

  • „złote ścieżki” (checkout, logowanie, API publiczne) – bardziej rygorystyczne cele i ostrzejsze alerty,
  • obszar „drugi plan” (pobieranie dużych raportów, mniej używane integracje) – wyższe dopuszczalne opóźnienia i niższa częstotliwość reakcji,
  • zadania batchowe i przetwarzanie w tle – SLO bardziej oparte o terminowość („zadanie kończy się w ciągu X minut/godzin”) niż o dostępność w każdej sekundzie.

Taki podział chroni przed sytuacją, w której zespół w środku nocy wstaje, bo spóźnia się niszowy raport używany raz w tygodniu, podczas gdy krytyczne ścieżki są w porządku.

Wykorzystywanie SLO w rozmowie z biznesem i dostawcami

Gdy SLO są jasno zdefiniowane i mierzone, zaczynają pełnić rolę wspólnego języka między technologią a biznesem. Zamiast ogólnego „aplikacja działa wolno”, pojawiają się konkrety: „czas odpowiedzi wyszukiwarki produktu przekracza P95 = 800 ms w godzinach szczytu, co narusza SLO o 0,5 punktu procentowego”.

Podobnie z dostawcami: jeśli zewnętrzne API płatności ma własne SLA, da się policzyć, jak ich niedostępność wpływa na wasze SLO. Przy częstych naruszeniach łatwiej negocjować zmianę warunków, priorytet obsługi lub poszukać zapasowego dostawcy. Liczby z monitoringu są dużo mocniejszym argumentem niż pojedyncze zgłoszenia „nie działało przez chwilę”.

Najczęściej zadawane pytania (FAQ)

Po co w ogóle centralizować logi i monitoring w chmurze?

W środowisku chmurowym serwery i kontenery są nietrwałe – dziś są, za godzinę mogą zniknąć. Jeśli logi zostają tylko na maszynie, znikają razem z nią i nie da się później odtworzyć przebiegu awarii ani zachowania użytkowników.

Centralizacja logów i metryk w jednym systemie (np. stack ELK, Prometheus + Loki, usługi natywne chmury) pozwala spojrzeć na całość: od infrastruktury, przez usługi po aplikację. Dzięki temu da się szybko wykrywać anomalie, korelować zdarzenia i analizować incydenty po fakcie – zamiast błądzić po pojedynczych serwerach.

Jakie logi i metryki monitorować w chmurze w pierwszej kolejności?

Najprościej zacząć od podziału na warstwy: infrastruktura, platforma, aplikacja, biznes. Dla każdej z nich trzeba mieć kilka kluczowych sygnałów. Na dole są zasoby (CPU, RAM, dysk, sieć), wyżej – zdrowie usług (baza, kolejki, cache), jeszcze wyżej – błędy i czasy odpowiedzi aplikacji, a na samej górze – metryki biznesowe, np. liczba logowań czy transakcji.

Dobrym minimum są: liczba i procent błędów 4xx/5xx, opóźnienia odpowiedzi (p95/p99), wykorzystanie CPU i pamięci, stan bazy danych (połączenia, opóźnienia zapytań), kolejki (długość, czas oczekiwania) i kilka wskaźników biznesowych, które bolą użytkownika, gdy spadają.

Czym różni się monitoring w chmurze od monitoringu w serwerowni on‑premise?

W tradycyjnej serwerowni serwery są stałe, a zmiany rzadkie, więc wiele rzeczy da się ogarnąć „na oko” i prostymi narzędziami. W chmurze instancje i kontenery pojawiają się i znikają automatycznie, aplikacja działa równolegle na wielu węzłach i regionach, a logi rozpraszają się po dziesiątkach komponentów.

Monitoring w chmurze musi być zautomatyzowany, oparty na zewnętrznym systemie zbierającym dane oraz na etykietach/tagach (np. nazwa usługi, środowisko, wersja). Dochodzi też konieczność łączenia informacji z wielu warstw usług chmurowych (IaaS, PaaS, SaaS), a nie tylko z pojedynczego serwera.

Co to są logi, metryki i ślady (traces) i po co mi te trzy rodzaje danych?

Logi to szczegółowe zapisy zdarzeń: komunikaty aplikacji, błędy, akcje użytkownika. Pomagają odpowiedzieć na pytanie „co dokładnie się stało w tym konkretnym momencie?”.

Metryki to liczby mierzone w czasie, np. liczba żądań na sekundę, średnie opóźnienie, procent błędów, użycie CPU. Pokazują ogólny stan zdrowia systemu i to, jak zmienia się on w czasie. Ślady (distributed tracing) opisują całą drogę pojedynczego żądania przez wiele usług – widać, w której mikro-usłudze pojawia się wąskie gardło albo błąd.

Te trzy typy danych się uzupełniają: metryki sygnalizują problem, ślad pokazuje, gdzie się „wykoleiło”, a logi pozwalają wejść w szczegóły i znaleźć przyczynę.

Jak ustawiać alerty w chmurze, żeby nie utonąć w powiadomieniach?

Kluczowe jest alertowanie na symptomy, które naprawdę dotykają użytkownika lub łamią ustalone cele (SLO), a nie na każdy pojedynczy błąd. Zamiast „wyślij alert przy każdym 500”, lepiej użyć progów typu: „więcej niż 2% błędów 5xx w ciągu 5 minut” albo „p95 czasu odpowiedzi powyżej 1 sekundy przez 10 minut”.

W praktyce stosuje się kilka poziomów: alerty krytyczne (np. brak odpowiedzi usługi, lawinowy wzrost błędów), ostrzegawcze (rosnące opóźnienia, zbliżanie się do limitów zasobów) i informacyjne (restarty, wdrożenia). Dobry test: jeśli na dany alert typowo nie wykonujesz żadnej akcji, to znaczy, że jest źle zdefiniowany.

Jak inaczej podchodzić do logów i monitoringu w modelach IaaS, PaaS i SaaS?

W IaaS kontrolujesz prawie wszystko: system operacyjny, agentów, konfigurację sieci, więc sam decydujesz, jakie logi zbierać z maszyn i jak długo je trzymać. W PaaS część warstw jest „pod spodem” – dostajesz gotowe metryki i logi z panelu dostawcy (np. statystyki bazy), ale nie masz wglądu w każdy szczegół systemu.

W SaaS kontroli jest najmniej. Otrzymujesz zwykle tylko logi audytowe i kilka wskaźników użycia. Monitoring przenosi się wtedy na poziom integracji: logi własnej aplikacji, webhooki z systemu SaaS, metryki biznesowe pokazujące, czy usługa działa poprawnie z perspektywy Twoich procesów.

Skąd wiem, że mój monitoring w chmurze jest za słaby?

Pierwszy sygnał to sytuacja, w której o problemie regularnie informują klienci lub dział sprzedaży, a nie system alertujący. Typowy wzorzec: ruch rośnie, pojawiają się błędy 5xx, ale nikt nie dostaje powiadomienia; dopiero po kilkudziesięciu minutach ktoś zauważa spadek przychodów albo mail od klienta.

Inne objawy to: ręczne „przeklikiwanie” logów bez jasnego punktu zaczepienia, brak danych do analizy po incydencie (logi zniknęły razem z instancją), brak możliwości prześledzenia ścieżki żądania przez mikroserwisy. Jeśli diagnoza większości awarii zaczyna się od pytania „od czego w ogóle zacząć?”, monitoring jest niedojrzały.

Najważniejsze punkty

  • Monitoring w chmurze to odrębna dyscyplina, bo infrastruktura jest dynamiczna i nietrwała: instancje i kontenery pojawiają się oraz znikają automatycznie, więc logi muszą trafić do zewnętrznego, scentralizowanego systemu, a nie leżeć „na dysku serwera”.
  • Brak dojrzałego monitoringu kończy się tym, że o awarii pierwszy dowiaduje się klient – bez dobrze zdefiniowanych metryk i alertów zespół reaguje dopiero na skutki (np. skargi użytkowników), zamiast wychwycić symptomy pogarszającej się sytuacji.
  • Silny, dobrze ustawiony monitoring oparty o SLO (np. próg procentowy błędów 5xx w krótkim przedziale czasu) pozwala wykrywać problemy wcześnie, ograniczać skalę incydentów i utrzymać zaufanie do usług działających w chmurze.
  • Obserwowalność opiera się na trzech uzupełniających się filarach: logach (co się stało), metrykach (jak system zachowuje się globalnie w czasie) i śladach/traces (którędy przeszło konkretne żądanie i gdzie się „wykoleiło”).
  • Poleganie tylko na jednym typie danych prowadzi do ślepych punktów: same logi kończą się chaotycznym przeszukiwaniem, same metryki nie tłumaczą szczegółów awarii, a brak śladów uniemożliwia skuteczne debugowanie złożonych architektur mikroserwisowych.