13.11.20234 min
Krzysztof Przyluski
Intellias

Krzysztof PrzyluskiSenior .NET DeveloperIntellias

Jak zbierać metryki w .NET z użyciem Prometheusa

Poznaj rodzaje metryk statystycznych w .NET, klasy do ich tworzenia oraz jak wykorzystać do zbierania danych statystycznych Prometheusa.

Jak zbierać metryki w .NET z użyciem Prometheusa

Dane statystyczne. A komu to potrzebne?

W obecnym trendzie rozwoju oprogramowania w kulturze pracy DevOps jednym z filarów, w zależności od źródła i nazewnictwa, jest zbieranie informacji zwrotnej o systemie m.in. w celu lepszego zrozumienia potrzeb użytkowników, klientów, monitorowania niezawodności systemu, optymalizacji czy określenia kierunku rozwoju.

Aby możliwe było wyciągnięcie trafnych wniosków, niezbędne są do tego właściwe dane, które można analizować. W takiej sytuacji z pomocą przychodzą właśnie dane statystyczne, czyli wg. książkowej definicji: dane w systemach informatycznych to zestawienia liczb, faktów, wskaźników pochodzących z różnych źródeł w celu analizy i prezentacji informacji o wydajności, użytkowaniu lub innym zjawisku związanym z danym systemem informatycznym.

W interesie większości firm jest zbieranie danych, które później mogą zostać wykorzystywane przez osoby rozwijające system i osoby decyzyjne do podejmowania odpowiednich kroków prowadzących do sukcesu projektu na konkurencyjnym rynku.

Wprowadzenie do narzędzia Prometheus

Na rynku istnieje wiele rozwiązań służących do zbierania i analizy danych m.in. InfluxDB, ElasticSearch lub Prometheus. W tym tekście skupimy się na projekcie Prometheus, które jest rozwiązaniem typu open-source,  oferującym zestaw narzędzi do monitorowania i powiadomień.

Prometheus zbiera i przechowuje metryki jako serie danych w funkcji czasu, tzn. zebrane dane przechowywane są razem ze znacznikiem czasu (timestamp), w którym zostały zarejestrowane wraz z opcjonalnymi etykietami klucz-wartość. A więc jakie rodzaje metryk oferuje Prometheus?

Licznik (counter)

Jest to rodzaj skumulowanej metryki reprezentującej pojedynczą wartość, która może jedynie wzrosnąć lub zostać zresetowana do zera. Typowe przykłady użycia to zbieranie informacji o liczbie zrealizowanych żądań lub zarejestrowanych błędów.


Wskaźnik (gauge)

To metryka reprezentująca pojedynczą wartość liczbową, która może dowolnie rosnąć lub spadać. Wskaźnik zazwyczaj używany jest do pomiaru wartości takich jak zużycie procesora lub pamięci, czy liczby żądań w danej jednostce czasu.

Histogram

Przedstawia wiele wartości, które zostały podzielone na grupy (tzw. buckets) oraz całkowitą liczbę zarejestrowanych wartości. Histogramy znajdują zastosowanie w analizie danych podlegających rozkładowi na poszczególne grupy np. rozkład czasu odpowiedzi, rozkład typu żądania.


Podsumowanie (summary)

Podobnie do histogramu przedstawia wiele wartości. Dane zarejestrowane są w poszczególnych kwantylach (kwantyl – w uproszczeniu to wartość określająca punkt w zbiorze danych, poniżej którego znajdują się określone wartości.

Przykład: kwantyl 25% oznacza, że 25% wartości w próbie jest mniejszych lub równych danej wartości), które obliczane są w funkcji czasu oraz liczbę wszystkich zarejestrowanych wartości. Zastosowanie np. do monitorowania rozkładu czasu odpowiedzi na żądania w danej jednostce czasu.

Zbieranie metryk w .NET

Aby rozpocząć zbieranie danych statystycznych, potrzebujemy odpowiedniego narzędzia. Jeżeli nasz wybór padnie na zestaw narzędzi Prometheus, mamy do wyboru kilka paczek Nuget w zależności od projektu i potrzeb:

  • prometheus-net – uniwersalna paczka do eksportowania metryk przez HttpListener lub Pushgateway
  • prometheus-net.AspNetCore – paczka do integracji metryk z serwerem Kestrel lub middlewarem
  • prometheus-net.AspNetCore.HealthChecks – paczki do monitorowania stanu aplikacji, usług lub serwisów
  • prometheus-net.AspNetCore.Grpc – paczki do eksportowania metryk z użyciem frameworku gRPC
  • prometheus-net.NetFramework.AspNet – ta sama paczki co prometheus-net.AspNetCore z obsługą starszych wersji .NET framework

Poniżej znajdują się fragmenty kodu przedstawiające poszczególne rodzaje metryk z paczki prometheus-net. Każdy rodzaj metryki tworzony jest poprzez klasę Metrics z przestrzeni nazw Prometheus, a każda metoda przyjmuję dwa parametry obowiązkowe name i help odpowiedzialne za nazwę metryki oraz komentarz.

Następnie w zależności od sygnatury metody możemy przekazać dodatkowe parametry dotyczące konfiguracji i etykiet (labels) grupująych powiązanych ze sobą danych.


Metryka typu Counter. Dostępną mamy metodę Inc() , która inkrementuję wartość o przekazaną liczbę. Domyślnie jest to liczba 1.



Metryka typu Gauge. Metoda Set() pozwala na ustawienie wartości początkowej, a metody Inc() oraz Dec() odpowiednio zwiększają lub zmniejszają wartość. Podobnie jak w przypadku Counter obydwie metody przyjmują parametr typu double określający, o ile zwiększyć lub zmniejszyć wartość.



Metryka typu Histogram. W przykładzie do metody CreateHistogram została przekaza konfiguracja dla czterech bucketów, zaczynając od 0 i zwiększając się o 25. Do opublikowania wartości służy metoda Observe() , przyjmująca konkretną wartość.


Metryka typu Summary. Tutaj dodatkowa konfiguracja dotyczy kwantyli dzielących zbiór na grupy. W przykładzie pierwsza wartość odpowiada za wartość graniczną grupy, a druga (epsilon) za akceptowalny błąd związany z obliczeniami, do jakiej grupy powinna należeć wartość. Związane jest to z wydajnością obliczeń, posortowaniem wartości i odnalezieniem punktu w próbce. Im mniejsza wartośc parametru epsilon, tym dokładniejsze obliczenia.

Podsumowanie

Uzbrojeni w powyższą wiedzę na temat powodów, dla których warto zbierać i analizować dane oraz rodzajów metryk, które zostały opatrzone przykładami, powinniśmy być gotowi do użycia ich w praktyce. Potencjalnie przyniesie to profity w postaci lepszej świadomości tego, co dzieje się z naszym systemem oraz wzbogacenia zasobu narzędzi, jakimi operujemy.


O autorze

Krzysztof Przyluski to Senior .NET Developer w Intellias. Posiada doświadczenie w branżach FinTech, AdTech, e-commerce oraz entertainment. Interesują go zagadnienia związane z nowymi technologiami w szczególności w obszarze DevOps, Angular i .NET. W projektach Intellias pracuje z klientami, wspólnie zamieniając wymagania w biznesowe w wysokiej klasy oprogramowanie.

<p>Loading...</p>