Rate this post

Nawigacja:

Po co ci obserwowalność wydajności, zanim zaczniesz instalować narzędzia

Od gaszenia pożarów do przewidywania problemów

Co się dzieje u ciebie, gdy ktoś zgłasza: „system wolno działa”? Kto pierwszy odbiera telefon – developer, admin, czy support? I ile czasu mija, zanim ktokolwiek powie coś konkretniejszego niż „u mnie działa”? To właśnie miejsce, w którym zaczyna się prawdziwa obserwowalność systemów.

Tradycyjny monitoring zwykle skupia się na odpowiedzi na pytanie: „czy coś jest czerwone?” – czy serwer żyje, czy proces działa, czy CPU nie jest na 100%. Obserwowalność wydajności idzie krok dalej: ma umożliwić odpowiedź na pytanie „dlaczego jest czerwone?” bez konieczności zmiany kodu i dodawania nowych logów za każdym razem, gdy pojawia się problem.

Monitoring jest najczęściej reaktywny. Ktoś zgłasza problem, ty sprawdzasz wykresy, logi, próbujesz złożyć historię zdarzeń. Obserwowalność buduje możliwości takie jak:

  • wczesne wykrywanie degradacji (np. wzrost mediany czasu odpowiedzi, zanim użytkownicy zaczną narzekać),
  • dostrzeżenie trendów (np. coraz częstsze time-outy bazy przed szczytem sezonu),
  • zrozumienie zależności między komponentami (który mikroserwis naprawdę jest „sprawcą” problemu).

Pytanie kontrolne: jak często u ciebie „analiza wydajności” oznacza przeklikiwanie się po kilkunastu dashboardach i ręczne porównywanie wykresów? Jeśli odpowiedź brzmi „ciągle”, to oznaka, że masz monitoring, ale nie pełną obserwowalność.

Jak zdefiniować własny „poziom bólu” wydajności

Bez jasnej definicji, co jest akceptowalne, a co nie, zespół jest skazany na dyskusje typu „przecież jest OK” vs „dla klienta to jest tragedia”. Zamiast tego warto ustalić konkretny „poziom bólu” wydajności – czyli moment, od którego system obiektywnie wymaga reakcji.

Co naprawdę zaboli biznes? Zwykle są to trzy kategorie:

  • Opóźnienie – np. czas odpowiedzi kluczowych API, czas ładowania kluczowej strony, czas finalizacji zamówienia.
  • Błędy – procent nieudanych żądań (5xx, 4xx w określonych przypadkach), odrzucone transakcje, nieudane logowania.
  • Dostępność – procent czasu, w którym kluczowa funkcja nie działa lub działa skrajnie wolno.

Zamiast straszyć biznes SLA i skomplikowaną terminologią, można zadać proste pytania:

  • „Od jakiego czasu ładowania koszyka użytkownik zaczyna rezygnować z zakupu?”
  • „Jaki procent błędnych transakcji jest jeszcze do przełknięcia, a od jakiego momentu reputacja firmy jest zagrożona?”
  • „Przez ile minut dziennie strona może być realnie niedostępna, żeby nie psuło to sprzedaży?”

Na tej podstawie da się wyznaczyć SLI i SLO w praktyce (Service Level Indicator / Objective), ale w języku zrozumiałym dla biznesu. Przykłady:

  • „95% żądań do endpointu /checkout kończy się w czasie krótszym niż 800 ms w ciągu tygodnia.”
  • „Liczba błędnych płatności nie przekracza 0,5% wszystkich prób w ruchu produkcyjnym.”

Dopiero gdy takie cele istnieją, dashboardy i alerty zaczynają mieć sens. Inaczej każde piknięcie systemu monitoringowego jest albo ignorowane („znowu coś brzęczy”), albo powoduje panikę („może to już awaria?”).

Zastanów się: czy dziś potrafisz jednym zdaniem powiedzieć, kiedy system wydajnościowo jest „niedopuszczalny” z punktu widzenia biznesu? Jeśli nie, zacznij od rozmowy o poziomie bólu, a dopiero potem przechodź do technologii.

Futurystyczne centrum dowodzenia z podświetlonymi ekranami systemów
Źródło: Pexels | Autor: Keysi Estrada

Fundamenty obserwowalności: logi, metryki, trace’y i zdarzenia

Trzy filary i czwarty element – co naprawdę jest potrzebne

Obserwowalność systemów technicznie opiera się na trzech klasycznych filarach: logi, metryki, trace’y. Do tego dochodzi czwarty, często pomijany element: zdarzenia biznesowe, które nadają sens temu, co się dzieje pod spodem.

Logi – szczegółowe fakty, ale bez obrazu całości

Logi odpowiadają na pytanie: „co dokładnie się stało?”. Są świetne, gdy trzeba zrozumieć konkretny błąd, wyjątek, nietypowy scenariusz. Problem zaczyna się, gdy:

  • logi są niestrukturalne (czysty tekst bez pól),
  • nie ma korelacji między logami różnych usług,
  • logi generują ogromny strumień szumu, którego nikt nie czyta.

Same logi nie dają szybkiego podglądu trendów ani odpowiedzi typu „czy jest gorzej niż wczoraj”. Przydają się do diagnozy konkretnego przypadku, ale słabo nadają się do szybkiego monitoringu wydajności aplikacji.

Metryki – liczby, które dobrze pokazują trendy

Metryki odpowiadają na pytania: „jak często?”, „jak dużo?”, „jak szybko?”. To zagregowane dane liczbowe, np.:

  • średni czas odpowiedzi konkretnego endpointu,
  • liczba błędów na minutę,
  • użycie CPU, RAM, IO, przepustowość sieci.

Metryki są świetne do budowania dashboardów i alertów, bo:

  • są lekkie (mało danych w porównaniu z logami),
  • łatwo je agregować w czasie,
  • dają prosty obraz trendów (rosną, maleją, skaczą).

Przy dobrze dobranych metrykach wydajności systemów często da się od razu stwierdzić, czy problem dotyczy aplikacji, bazy, czy może infrastruktury.

Trace’y – przepływ żądania w systemie rozproszonym

Trace (tracing rozproszonego systemu) odpowiada na pytanie: „jak dokładnie to żądanie przeszło przez system?”. Przy architekturze mikroserwisowej jedno żądanie użytkownika może dotknąć kilkunastu usług, kilku baz danych, kolejki, zewnętrznego API.

Trace’y pokazują:

  • które usługi brały udział w obsłudze żądania,
  • jak długo trwał każdy krok (span),
  • gdzie wystąpiły błędy lub opóźnienia.

Dzięki temu, zamiast zgadywać, da się odpowiedzieć precyzyjnie: „80% czasu żądania spędzamy na oczekiwaniu na odpowiedź z usługi płatności”. Trace’y łączą się naturalnie z logami i metrykami, jeśli mają wspólne identyfikatory korelacji.

Zdarzenia biznesowe – łącznik między IT a biznesem

Czwarty element to zdarzenia biznesowe – informacje typu:

  • „użytkownik złożył zamówienie”,
  • „płatność została odrzucona”,
  • „konto zostało utworzone”.

Jeżeli da się powiązać takie zdarzenia z trace’ami i metrykami, zaczynają padać pytania wprost powiązane z biznesem:

  • „który etap procesu zamówienia jest najwolniejszy?”
  • „czy wzrost czasów odpowiedzi wpływa na liczbę porzuceń koszyka?”
  • „czy zmiana w konfiguracji bazy nie obniżyła konwersji logowania?”

Pytanie do ciebie: czy dziś jesteś w stanie jednym kliknięciem zobaczyć, jak konkretny użytkownik przeszedł ścieżkę zakupu i gdzie utknął technicznie? Jeśli nie, brakuje spójnego połączenia filarów obserwowalności z wydarzeniami biznesowymi.

Jak myśleć o danych obserwowalności

Dane surowe vs zagregowane: koszt kontra szczegółowość

Dane obserwowalności można z grubsza podzielić na:

  • surowe – pełne logi, pełne trace’y, szczegółowe próbki metryk w wysokiej rozdzielczości,
  • zagregowane – zsumowane, uśrednione, zredukowane do histogramów, percentyli itp.

Surowe dane są fantastyczne do analizy przyczyn źródłowych, ale drogie w przechowywaniu i przetwarzaniu. Zagregowane są tanie i idealne do ciągłego monitoringu, ale tracą szczegóły pojedynczych przypadków.

Praktyczne podejście zwykle wygląda tak:

  • dane surowe przechowywane krótko (godziny – dni),
  • dane zagregowane przechowywane długo (tygodnie – miesiące),
  • dla krytycznych przypadków (incydenty) – selektywne przechowywanie pełnych trace’ów i logów dłużej.

Czas jako główny wymiar analizy

Większość pytań o wydajność systemów ma wymiar czasowy:

  • „kiedy to się zaczęło?”
  • „czy jest gorzej niż wczoraj / w zeszłym tygodniu?”
  • „czy po wdrożeniu wersji X nastąpiła poprawa?”

Dlatego trzeba świadomie dobrać:

  • okno analizy – np. 5 minut vs 1 godzina zmienia obraz fluktuacji,
  • retencję – jak długo trzymasz metryki w wysokiej rozdzielczości (np. co 10 s),
  • granularność – czy potrzebujesz danych co sekundę, czy wystarczy co minutę.

Za wysoka rozdzielczość na wszystko generuje ogromne koszty. Z drugiej strony zbyt agresywna agregacja może wygładzić piki, które były kluczowe w powstawaniu awarii. Dlatego nie ma jednej „magicznej” wartości – trzeba ją dopasować do tempa zmian w systemie i typów incydentów, które chcesz wykrywać.

Korelacja danych: dlaczego same logi nie wystarczą

Bez wspólnego klucza korelacji dane obserwowalności są jak puzzle z różnych pudełek: coś czasem pasuje, ale nie ma pewności. Dlatego tak ważne są:

  • identyfikatory żądań (request ID, trace ID),
  • identyfikatory użytkowników / sesji (z zachowaniem zasad RODO),
  • identyfikatory biznesowe (np. numer zamówienia, numer transakcji).

Gdy te same identyfikatory pojawiają się w logach, metrykach (jako etykiety / tagi) i trace’ach, można:

  • szybko skakać od metryki „czas odpowiedzi checkout” do konkretnego trace’a,
  • od trace’a przejść do logów konkretnego requestu,
  • powiązać to wszystko z konkretnym zdarzeniem biznesowym (np. porzucone zamówienie).

Zadaj sobie pytanie: czy dziś jesteś w stanie wziąć jeden błąd z logów i w kilka kliknięć zobaczyć, jak wyglądała cała ścieżka tego żądania w systemie? Jeśli nie, brak spójnej korelacji jest jednym z pierwszych obszarów do poprawy.

Podświetlony panel sterowania w kokpicie samolotu z licznymi ekranami
Źródło: Pexels | Autor: Anastasios Nastoulis

Od logów do metryk: jak zbudować sensowną bazę startową

Uporządkowane logowanie zamiast „log everything”

Strukturalne logi: JSON, pola kluczowe, korelacja requestów

Chaos w logach to pewna droga do tego, żeby nikt ich nie używał do diagnostyki. Kluczem jest logowanie strukturalne, czyli logi w formacie takim jak JSON, z jasno nazwanymi polami:

  • timestamp,
  • level,
  • service,
  • request_id / trace_id,
  • user_id (jeśli to bezpieczne),
  • event_type,
  • message,
  • dodatkowe pola kontekstowe (np. product_id, order_id).

Takie logi można łatwo filtrować, agregować, zamieniać na metryki. Parser nie musi zgadywać, co jest czym. Na przykład zamiast:

2026-07-02 10:01:23,123 INFO Order created for user 123, id=456, total=99.99

lepiej mieć:

{„timestamp”:”2026-07-02T10:01:23.123Z”,”level”:”INFO”,”service”:”order-service”,”event_type”:”order_created”,”user_id”:”123″,”order_id”:”456″,”total”:99.99}

Wtedy możesz łatwo policzyć: „ile zamówień na minutę powstaje w order-service” bez skomplikowanego parsowania tekstu.

Poziomy logów a środowiska

Dobrze przemyślane poziomy logów (DEBUG/INFO/WARN/ERROR) chronią przed zalewem bezużytecznych informacji. Kilka zasad, które się sprawdzają w praktyce:

  • DEBUG – szczegółowe informacje dla developera, zwykle włączone tylko na dev/test,
  • INFO – normalny przebieg działania, kluczowe zdarzenia biznesowe,
  • WARN – sytuacje niepożądane, ale jeszcze nie krytyczne (np. retry do zewnętrznego API),
  • ERROR – faktyczne błędy, brak możliwości realizacji żądania.

Poziomy logów powinny być też świadomie ustawione per środowisko. Na produkcji debug zwykle nie jest potrzebny (poza krótkimi, celowanymi sesjami diagnostycznymi), za to INFO/WARN/ERROR muszą być na tyle zwięzłe, żeby nie topić się w szumie. Zapytaj siebie: czy na podstawie samych logów z produkcji jesteś w stanie z grubsza odtworzyć, co się działo w systemie w ciągu ostatniej godziny, czy raczej widzisz ścianę powtarzalnych komunikatów bez kontekstu?

Dobrym ćwiczeniem jest okresowy przegląd logów z ostatniego incydentu. Przejrzyj je z zespołem i zadaj kilka prostych pytań: których wpisów nigdy nie użyliście do diagnozy? których wam zabrakło? co by się stało, gdybyście wyłączyli dany typ logów? Na tej podstawie możesz wyłączyć zbędne komunikaty, a w kluczowych miejscach dodać bardziej informacyjne zdarzenia (np. z identyfikatorami biznesowymi).

Drugi krok to spójne formatowanie komunikatów – zwłaszcza na poziomie WARN/ERROR. Jeżeli każdy zespół loguje inaczej, narzędzia SIEM i alerting mają utrudnione zadanie. Ustal minimalny zestaw pól wymaganych dla błędów (np. kod błędu, kategoria, endpoint, request_id) i egzekwuj go w przeglądach kodu. Zastanów się: czy dzisiaj potrafisz szybko zgrupować błędy po typie, bez ręcznego „grep & hope”?

Na produkcji przydaje się też „bezpiecznik” w postaci limitów wolumenu logów na usługę. Gdy któraś zacznie spamować błędami, nie zapełni całego klastra logów. Warunek: ważne błędy muszą być wtedy zamienione na metryki i alerty, żeby nic nie umknęło. Dobrze zrobione logowanie to nie tylko tekst na dysku, ale także świadoma polityka: co, gdzie, jak długo i w jakim natężeniu zapisujesz.

Jeśli podejdziesz do obserwowalności jak do produktu – z jasnym celem, świadomymi kompromisami i regularnym przeglądem „czy to nadal ma sens?” – logi, metryki, trace’y i zdarzenia biznesowe zaczną układać się w spójną całość. Wtedy pytanie nie brzmi już „jakim narzędziem to podejrzeć?”, tylko „jakie decyzje podejmiemy na podstawie danych, które mamy”.

Jak zamieniać logi w metryki, które da się monitorować

Wzorce zdarzeń zamiast liczenia „na oko”

Skoro masz już strukturalne logi, kolejnym krokiem jest przejście od „czytania” ich oczami do liczenia ich automatycznie. Kluczowe pytanie: jakie zdarzenia w logach chcesz widzieć jako wykres w narzędziu do metryk?

Zwykle będą to:

  • zdarzenia biznesowe – order_created, payment_failed, login_success,
  • zdarzenia techniczne – cache_miss, db_query_timeout, external_api_retry,
  • zdarzenia operacyjne – deployment_started, deployment_finished, feature_flag_changed.

Jeśli nadajesz im spójne typy (np. pole event_type), możesz w prosty sposób:

  • zliczać wystąpienia danego typu zdarzenia w czasie,
  • filtrować po atrybutach (np. payment_failed z podziałem na payment_provider),
  • tworzyć metryki typu „ilość X na minutę” albo „procent nieudanych Y”.

Zapytaj siebie: czy dziś jesteś w stanie odpowiedzieć w 2–3 minuty, jak zmieniła się liczba nieudanych płatności w ciągu ostatnich 24 godzin? Jeśli nie, brakuje warstwy, która zamienia zdarzenia z logów na policzalne metryki.

Ekstrakcja metryk z logów: kiedy ma sens

Nie wszystko warto mierzyć bezpośrednio z kodu aplikacji. Czasem szybciej i taniej jest wyciągnąć metryki z istniejących logów. To dobre podejście, gdy:

  • nie możesz szybko zmienić aplikacji (legacy, brak zespołu),
  • chcesz najpierw zweryfikować, czy dana metryka ma sens biznesowy,
  • masz narzędzie logowe, które łatwo buduje metryki z zapytań (np. „count by” po polu).

Typowe przykłady:

  • metryka orders_created_total – liczba logów z event_type=order_created,
  • metryka payment_failure_ratio – procent logów z event_type=payment_failed do wszystkich payment_*,
  • metryka external_api_errors – liczba logów ERROR z service=payment-provider.

Minusem takiego podejścia jest opóźnienie i koszt zapytań. Silnik logowy musi przeskalować się do roli „time series database”, co nie zawsze się udaje. Dlatego traktuj to jako etap przejściowy: jeśli jakaś metryka staje się krytyczna, przenieś ją do bezpośredniej instrumentacji (np. Prometheus, OTEL Metrics, StatsD).

Pytanie kontrolne: które trzy zapytania do systemu logów odpalasz najczęściej przy incydentach? To naturalni kandydaci na metryki.

Odliczanie, mierzenie czasu, liczenie błędów

Większość użytecznych metryk z logów można sprowadzić do kilku prostych kategorii. Dobrze jest świadomie nazwać, co chcesz z nich wyciągnąć:

  • liczniki (countery) – np. liczba żądań, liczba błędów, liczba rejestracji,
  • mierniki czasu (timery) – czas trwania operacji, np. od order_created do payment_confirmed,
  • wskaźniki jakości – procent sukcesów, odsetek błędów v/s wszystkie żądania.

Przykład z życia: zespół miał w logach dwa wyraźne zdarzenia – checkout_started i checkout_completed – ale nikt nie liczył, jak długo trwa ten proces. Dopiero po dodaniu prostego timera (różnica timestampów + histogram) okazało się, że w jednej ze stref czasowych proces notorycznie przekraczał kilka sekund. Bez metryki, tylko patrząc na pojedyncze logi, ciężko było ten wzorzec zauważyć.

Zastanów się, czy w twoich logach są pary zdarzeń, których różnica czasu mówi wprost o doświadczeniu użytkownika. To często najszybsza droga do urealnienia rozmów o wydajności.

Minimalny zestaw metryk dla zdrowia systemu

Klasyka: RED, USE i „cztery złote sygnały”

Żeby nie gubić się w gąszczu liczb, warto oprzeć się na jednym z wypróbowanych zestawów:

  • RED (Rate, Errors, Duration) – skupia się na perspektywie żądań:
    • Rate – ile żądań na sekundę/minutę przyjmujesz,
    • Errors – ile z nich kończy się błędem,
    • Duration – jak długo trwa obsługa żądania.
  • USE (Utilization, Saturation, Errors) – patrzy na zasoby:
    • Utilization – jak bardzo wykorzystujesz CPU, pamięć, dysk,
    • Saturation – kolejki, backlog, długość kolejek w systemach I/O,
    • Errors – błędy na poziomie zasobu (np. I/O errors).
  • cztery złote sygnały (latency, traffic, errors, saturation) – kombinacja obu podejść.

Co z tego wybierasz? Zależy od odpowiedzi na pytanie: czy dziś bardziej boli cię „ile” (pojemność), czy „jak szybko” (wydajność)? Jeśli masz sporo incydentów pod obciążeniem, zacznij od RED + sygnały nasycenia (kolejki, CPU). Jeżeli dopiero stabilizujesz infrastrukturę, USE może pokazać pierwsze wąskie gardła.

SLO, SLI i progi akceptowalnej degradacji

Same metryki to tylko dane. Żeby stały się narzędziem do podejmowania decyzji, trzeba zdecydować: co jest „w normie”, a co już jest problemem? Tu wchodzą:

  • SLI (Service Level Indicator) – konkretny wskaźnik, np.:
    • „odsetek żądań HTTP 2xx w ciągu 5 minut”,
    • „czas odpowiedzi P95 dla endpointu /checkout”.
  • SLO (Service Level Objective) – cel, np.:
    • „99,5% żądań HTTP w ciągu 30 dni musi mieć status 2xx”,
    • „P95 dla /checkout < 1,5 s przez 99% czasu”.

Dopiero po zdefiniowaniu SLO możesz sensownie ustawić alerty. Inaczej skończysz z klasycznym scenariuszem: albo wieczna cisza (alerty zbyt luźne), albo ciągłe „false positive” (alerty zbyt ciasne).

Zapytaj siebie: czy masz choć jedno formalne SLO dla kluczowego scenariusza biznesowego? Jeśli nie, wybierz jedną ścieżkę (np. logowanie, płatność, wyszukiwanie) i na początek ustal nieidealne, ale realistyczne SLO. Później je doprecyzujesz.

Co mierzyć na start, gdy nie masz nic

Jeśli startujesz z „gołej ziemi”, przyda się bardzo krótka lista „must have”. W praktyce dobrze działają:

  1. Dla frontowych API / usług HTTP:
    • liczba żądań na endpoint,
    • rozbicie statusów (2xx, 4xx, 5xx),
    • czas odpowiedzi (P50, P95, czasem P99) per endpoint,
    • „in flight requests” – ile żądań jest aktualnie obsługiwanych.
  2. Dla baz danych:
    • czas wykonywania zapytań (histogram),
    • liczba zapytań na sekundę,
    • liczba timeoutów, locków, deadlocków,
    • użycie połączeń (connection pool usage).
  3. Dla kolejek / systemów asynchronicznych:
    • głębokość kolejki,
    • czas przetwarzania wiadomości (od pojawienia się do obsłużenia),
    • liczba retry / liczba wiadomości „poison”.

Zadaj sobie pytanie: czy byłbyś w stanie narysować jeden dashboard, który powie „system jest zdrowy” dla twojej głównej aplikacji? Jeśli nie, przejrzyj powyższą listę i zaznacz brakujące elementy.

Architektura przepływu danych obserwowalności

Warstwa zbierania: agenty, sidecary, eksportery

Zanim dane trafią do narzędzi analitycznych, muszą zostać zebrane z aplikacji i infrastruktury. Do wyboru masz kilka typów komponentów:

  • agenty hostowe – działają na poziomie maszyny/VM/poda, zbierają:
    • metryki systemowe (CPU, pamięć, dysk, sieć),
    • logi z plików i journala,
    • czasem trace’y z bibliotek systemowych.
  • sidecary w Kubernetesie – dodatkowe kontenery w podzie, które:
    • odbierają logi/metyki od aplikacji po localhost,
    • wysyłają je dalej (np. OTEL Collector, Fluent Bit),
    • potrafią robić wstępną filtrację i wzbogacanie (tagi, identyfikatory środowiska).
  • eksporterzy – osobne procesy eksponujące metryki innych systemów:
    • eksporter bazy danych,
    • eksporter load balancera,
    • eksporter kolejek, cache’y, serwerów aplikacyjnych.

Pytanie praktyczne: gdzie dziś „giną” twoje dane – na maszynie, w kontenerze, w sieci? Jeśli nie masz spójnego sposobu na zbieranie logów i metryk z każdego komponentu, zacznij od warstwy collectora/sidecara, która działa tak samo dla wszystkich usług.

Warstwa przetwarzania: kolektory i pipeline’y

Im większy system, tym mniej sensu ma wysyłanie wszystkiego „na pałę” prosto do jednego narzędzia. Pojawia się potrzeba pośredniej warstwy przetwarzania, która:

  • normalizuje dane (wspólne nazwy pól, tagów),
  • filtruje szum (wycina zbędne logi, zmniejsza sampling trace’ów),
  • wzbogaca o kontekst (nazwa środowiska, wersja aplikacji, region),
  • rozsyła dane do kilku backendów (np. do systemu metryk i osobno do SIEM).

Przykładem takiej warstwy jest OpenTelemetry Collector albo stack typu Fluent Bit → Kafka → backend. Dobrze zaprojektowany pipeline umożliwia:

  • dodanie nowego narzędzia analitycznego bez zmiany aplikacji,
  • szybkie wprowadzenie nowej polityki (np. anonimizacja pól, nowe etykiety),
  • skalowanie przetwarzania niezależnie od aplikacji.

Zastanów się: czy dziś, chcąc zmienić docelowe narzędzie do logów, musiałbyś ruszać kod każdej usługi? Jeśli tak, brakuje warstwy abstrakcji w przepływie danych.

Warstwa przechowywania i analizy: TSDB, silnik logowy, APM

Gdy dane są już zebrane i wstępnie przetworzone, trafiają do docelowych systemów. Zazwyczaj są to co najmniej trzy klasy narzędzi:

  • baza szeregów czasowych (TSDB) – Prometheus, Mimir, VictoriaMetrics, InfluxDB:
    • przechowuje metryki,
    • obsługuje agregacje, percentyle, funkcje okienkowe,
    • jest podstawą dashboardów i alertów opartych o metryki.
  • silnik logowy – Elasticsearch, OpenSearch, Loki, Splunk:
    • indeksuje logi (czas, pola, pełnotekstowo),
    • umożliwia szybkie wyszukiwanie po atrybutach,
    • dobrze nadaje się do analizy incydentów i forensyki.
  • narzędzie APM / traces – Jaeger, Tempo, Zipkin, narzędzia SaaS:
    • przechowuje trace’y i span’y,
    • wizualizuje przepływ żądań przez mikroserwisy,
    • pozwala drążyć pojedyncze przypadki.

Jeśli wszystko próbujesz upchnąć w jednym narzędziu (np. tylko w systemie logów), prędzej czy później zaczniesz przeklinać koszty i wydajność. Zwykle rozsądne jest rozdzielenie:

  • metryki – do TSDB,
  • logi – do dedykowanego silnika logowego,
  • trace’y – do narzędzia APM / traces, z korelacją do logów.

Dobrą praktyką jest też ograniczenie liczby miejsc, w których końcowi użytkownicy wchodzą w interakcję z danymi obserwowalności. Inny interfejs do głębokiej analizy logów, inny do przeglądania trace’y, ale jeden główny punkt wejścia dla dyżurujących i developerów – np. wspólny zestaw dashboardów z linkami w głąb narzędzi. Zapytaj siebie: czy nowa osoba w zespole wie, gdzie kliknąć, gdy „coś jest wolne”, czy musi dopytywać na Slacku?

W małych i średnich organizacjach często sprawdza się połączenie: TSDB + lekki silnik logowy + open-source’owe narzędzie do trace’y, spięte jednym narzędziem wizualizacyjnym. W większych środowiskach pojawiają się hybrydy – część danych ląduje w chmurowym APM, część w on-premowym klastrze logowym ze względu na compliance. Kluczowe pytanie brzmi wtedy: czy mimo tej mieszanki potrafisz w kilka kliknięć przejść od alertu metrycznego do konkretnego trace’a i logów?

Jeżeli dopiero układasz architekturę obserwowalności, zacznij od narysowania prostego diagramu: skąd biorą się dane, przez jakie kolektory przechodzą, gdzie lądują i kto z nich korzysta. Dopiero potem dobieraj konkretne technologie. Łatwiej wymienić jeden silnik logowy, gdy rozumiesz, że jest tylko „klockiem” w układance, niż gdy wszystko – od agentów po dashboardy – jest z nim twardo sklejone.

Docelowo chcesz dojść do miejsca, w którym podczas incydentu nie zastanawiasz się: „gdzie to zobaczę?”, tylko: „jakie pytanie zadam systemowi obserwowalności, żeby znaleźć przyczynę?”. Jeśli na większość pytań z tego tekstu odpowiedziałeś „jeszcze nie”, wybierz jedno: uproszczenie logów, dodanie podstawowych metryk, wprowadzenie jednego SLO albo uporządkowanie przepływu danych. Zrób mały krok, zmierz efekt, a potem dopiero dokładamy kolejne elementy – od logów, przez metryki, po pełną, świadomą obserwowalność wydajności.

Najczęściej zadawane pytania (FAQ)

Czym różni się obserwowalność od tradycyjnego monitoringu?

Monitoring zwykle odpowiada tylko na pytanie „czy coś działa?” – patrzysz, czy serwer żyje, CPU nie jest na 100%, a liczba błędów nie skacze do góry. Obserwowalność ma dać ci odpowiedź „dlaczego nie działa?” bez konieczności dorzucania nowych logów za każdym razem, gdy pojawia się problem.

Jeśli twoja „analiza wydajności” to przeklikiwanie kilkunastu dashboardów i ręczne porównywanie wykresów, to masz monitoring, ale nie pełną obserwowalność. Zadaj sobie pytanie: czy jesteś w stanie prześledzić pojedyncze żądanie przez cały system i wskazać, gdzie dokładnie traci czas?

Po co mi obserwowalność wydajności, skoro mam już monitoring serwerów?

Monitoring serwerów pokaże ci, że CPU skoczyło, RAM jest na granicy, a dysk ma wysokie IO. Nie odpowie jednak na pytanie, który endpoint spowolnił, od kiedy użytkownicy mają gorsze doświadczenie ani który mikroserwis jest rzeczywistym „sprawcą” problemu.

Obserwowalność pozwala wykrywać degradacje zanim zadzwoni klient (np. wzrost mediany czasu odpowiedzi), zauważać trendy (narastające time-outy bazy przed sezonem) i rozumieć zależności między komponentami. Zastanów się: chcesz gasić pożary, czy raczej przewidywać, gdzie ogień pojawi się za tydzień?

Jak zdefiniować akceptowalny „poziom bólu” wydajności systemu?

Najpierw ustal z biznesem, co ich realnie boli. Zamiast dyskutować „jest OK” vs „to tragedia”, zapytaj: od jakiego czasu ładowania koszyka użytkownik rezygnuje z zakupu, jaki procent błędnych transakcji jest jeszcze do przyjęcia albo ile minut dziennie kluczowa funkcja może być niedostępna bez wpływu na sprzedaż.

Na tej podstawie przełóż biznesowe oczekiwania na SLI/SLO, np.: „95% żądań do /checkout kończy się w mniej niż 800 ms w tygodniu” albo „błędne płatności to maksymalnie 0,5% prób”. Zrób krótką pauzę i zapytaj siebie: czy dziś potrafisz jednym zdaniem powiedzieć, kiedy z punktu widzenia biznesu wydajność jest nieakceptowalna?

Jakie metryki wydajności systemu są kluczowe na start?

Jeśli dopiero porządkujesz obserwowalność, zacznij od kilku prostych grup metryk: opóźnienia (czasy odpowiedzi kluczowych endpointów lub stron), błędów (odsetek 5xx i istotnych 4xx) oraz dostępności (np. odsetek udanych żądań do krytycznych funkcji). Lepiej mieć kilka dobrze przemyślanych metryk niż dziesiątki losowych wykresów.

Drugie pytanie, które warto sobie zadać: które metryki od razu mówią ci, czy użytkownik ma problem? Jeśli musisz zaglądać do 3–4 systemów, żeby odpowiedzieć na to pytanie, to znak, że metryki nie są jeszcze dobrze dobrane do twojego „poziomu bólu”.

Jak połączyć logi, metryki i trace’y w spójny system obserwowalności?

Traktuj te trzy elementy jak różne ujęcia tego samego wydarzenia. Metryki pokazują trendy (czy jest gorzej niż wczoraj), logi opisują szczegółowo konkretne błędy, a trace’y pokazują przepływ pojedynczego żądania przez mikroserwisy. Kluczem jest wspólny identyfikator korelacji, który pozwala przejść z metryki do konkretnego trace’a i logów.

Zadaj sobie dwa pytania: czy z alertu na metryce potrafisz w kilka kliknięć przejść do konkretnego trace’a i logów? I odwrotnie – mając problem w logach, czy potrafisz zobaczyć, czy to zjawisko jest jednostkowe, czy trend? Jeśli odpowiedź brzmi „nie”, brakuje ci jeszcze spójnego wątku łączącego dane.

Dlaczego zdarzenia biznesowe są ważne w obserwowalności wydajności?

Same metryki techniczne nie powiedzą ci, czy spadła konwersja koszyka, czy klienci porzucają rejestrację. Zdarzenia biznesowe, takie jak „zamówienie złożone”, „płatność odrzucona” czy „konto utworzone”, pozwalają zobaczyć wpływ problemów technicznych na realne wyniki firmy.

Sprawdź, co jest dla ciebie ważniejsze: liczba błędów 500, czy liczba nieudanych zamówień? Gdy połączysz zdarzenia biznesowe z trace’ami i metrykami, możesz zadawać pytania wprost: „który etap procesu zamówienia jest najwolniejszy?” albo „czy zmiana w bazie nie obniżyła liczby udanych logowań?”.

Jak długo przechowywać logi, metryki i trace’y, żeby nie zbankrutować?

Surowe dane (pełne logi, pełne trace’y, wysokorozdzielcze metryki) są drogie, ale niezbędne do głębokiej analizy incydentów. Rozsądnym podejściem jest przechowywanie ich krótko – od kilku godzin do kilku dni – oraz dłuższe trzymanie zagregowanych danych (histogramy, percentyle, zsumowane liczniki) przez tygodnie lub miesiące.

Zastanów się: kiedy ostatnio naprawdę potrzebowałeś pełnych logów sprzed trzech miesięcy, a kiedy wystarczył ci wykres trendu? Odpowiedź na to pytanie pomoże podzielić dane na krótkotrwałe, szczegółowe (do analizy przyczyn) oraz długotrwałe, zagregowane (do trendów, raportowania i planowania pojemności).

Bibliografia i źródła

  • Site Reliability Engineering: How Google Runs Production Systems. O'Reilly Media (2016) – SLO, SLI, error budget, praktyki niezawodności i wydajności
  • Seeking SRE: Conversations About Running Production Systems at Scale. O'Reilly Media (2018) – Praktyczne studia przypadków SLO, monitoringu i obserwowalności
  • The Google SRE Workbook. Google (2018) – Przykłady definiowania SLI/SLO, poziom bólu, projektowanie alertów
  • OpenTelemetry Specification. Cloud Native Computing Foundation – Standard zbierania logów, metryk i trace’y w systemach rozproszonych