Jak monitorować aplikacje w Pythonie z wykorzystaniem OpenTelemetry i Dynatrace?

18 January, 2023 12:00 5 min Administrator

OpenTelemetry dostarcza nam gotowe rozwiązanie do monitorowania kodu aplikacyjnego. Wykorzystuje dynamiczną podmianę klasy lub funkcji – tzw. Monkey Patching.  Powoduje to, że zmiany po stronie kodu aplikacyjnego są jedynie kosmetyczne lub nie ma ich wcale. Jeżeli zależy nam na tym, aby nie wprowadzać zmian w kodzie możemy zmienić sposób uruchamiania kodu i OpenTelemetry wykona instrumentację za nas.

Instrumentacja aplikacji może odbyć się na dwa sposoby - ręczny i automatyczny.

W tym artykule przedstawię w jaki sposób przeprowadzić instrumentację ręczną. Jest ona niezależna od środowiska uruchomieniowego i wymaga zmian na poziomie developerskim. Pozwala ona również lepiej zrozumieć co tak naprawdę robimy, dlatego zostanie ona pokazana w pierwszej kolejności.

Instrumentacja - co to takiego?

Instrumentacja polega na dodaniu do kodu aplikacji, w miejscu które jest dla nas „interesujące” dodatkowego kodu który będzie go monitorował.  Na przykład wszelkiego rodzaju zapytania HTTP są zazwyczaj „interesujące” z punktu widzenia monitoringu. 

Co daje nam OpenTelemetry dla Pythona?

OpenTelemetry przynosi nam predefiniowaną grupę paczek instrumentujących różne Framework’i. Powoduje to, że instrumentacja jest bardzo prosta i wymaga zmiany jedynie kilku linijek kodu. Aktualnie OpenTelemetry daje nam z pudełka gotową instrumentację dla ponad 40 technologii Python’owych. Między innymi:

- requests,urllib,urllib3,wsgi

- flask,Django,fastapi,

- elasticsearch,mysql,sqlite3

I wiele więcej, aktualną listę można znaleźć tutaj i tutaj:

OpenTelemetry-Python-Contrib — OpenTelemetry Python Contrib documentation

opentelemetry-python-contrib/instrumentation at main · open-telemetry/opentelemetry-python-contrib (github.com)

Uwaga!!!

Instrumentacja wymaga stałego podłączenia do środowiska monitorującego. W przypadku, gdy komunikacja z takim środowiskiem zostanie przerwana, aplikacja nie jest w stanie wysłać danych, co może prowadzić do nieprzewidywalnych skutków. Dlatego instrumentację przedstawianą tutaj można przeprowadzić tylko na środowiskach developerskich. Jeżeli chcemy wykorzystać ten mechanizm produkcyjnie wymagana jest instalacja kolektora OpenTelemetry, który stanowi warstwę pośrednią i odpowiada za zbieranie danych, agregowanie, wysyłkę i inne. Instalacja kolektora zostanie pokazana w kolejnych artykułach.

Przedstawię teraz w jaki sposób można wykonać instrumentację aplikacji opartej na FastApi oraz jak przesłać dane do Dynatrace.

Do naszej aplikacji musimy dodać paczkę instrumentującą wybraną technologię dla fast api jest to:

opentelemetry-instrumentation-fastapi

Generalnie każda paczka posiada nawę według szablonu:

opentelemetry-instrumentation-<USED_FRAMEWORK>

Jeżeli uruchamiamy aplikację bezpośrednio z konsoli możemy zwyczajnie wykonać polecenie instalujące paczkę:

pip3 install opentelemetry-instrumentation-fastapi

Jeżeli chcemy uruchomić aplikacje na Dockerze dodajemy paczki do requirements.txt

Nasza przykładowa aplikacja FastApi potrzebuje takie paczki do działania:

fastapi>=0.68.0,<0.69.0
uvicorn>=0.15.0,<0.16.0
opentelemetry-instrumentation-fastapi==0.33b0
opentelemetry-exporter-otlp==1.12.0
opentelemetry-sdk==1.12.0
opentelemetry-exporter-otlp-proto-http==1.12.0

Kod aplikacji przed instrumentacją:

Zwykły hello world z jednym endpointem „/”

Opentelemetry code1

Do kodu naszej aplikacji należy dodać kilka elementów poniżej kompletny kod wraz z komentarzami:

Opentelemetry code2

Wyjaśnienie kodu:

3-8 – niezbędne importy potrzebne do monitorowania z wykorzystaniem OpenTelemetry, w przypadku, gdy będziemy wykorzystywać inną technologię niż FastApi lub będziemy wykonywać jakieś zmiany lista importów może się zmienić

11 – stworzenie Słownika z nazwą aplikacji jaka jest widoczna w Dynatrace

12 – stworzenie obiektu OpenTelemetry ze wskazaniem na słownik jako konstruktor

13 – Ustawienie tracer’a OpenTelemetry

16-25 – ustawienie adresu środowiska Dynatrace oraz Tokenu (OpenTelemetry Ingest) potrzebnego do wysyłania trace. W przypadku instancji SaaS URI wygląda trochę inaczej.

28 – Instrumentacja – tak, tym jednym poleceniem „FastAPIInstrumentor.instrument_app(app)” wykonaliśmy instrumentację!!! Cała otoczka, która jest przed tym służy jedynie ustawieniu komunikacji ze środowiskiem monitorującym.

Musimy uruchomić nasz zainstrumentowany kod na jakimś serwerze aplikacyjnym:

Ja wykorzystuję uvicorn dla Pythona (pip install uvicorn)

uvicorn main:app --port 8000

Gdy wykonamy reqest http na endpoint „/” np:

curl localhost:8000/

Na poziomie Dynatrace zobaczymy Trace:

Opentelemetry1

Opentelemetry2

Podsumowanie

Wykonanie instrumentacji ogranicza się do pewnych zmian na poziomie kodu aplikacji. Zmiany te są bardziej konfiguracją niż kodem aplikacji i w następnych artykułach pokażę, jak można tę konfiguracje częściowo lub w całości wypchnąć poza kod aplikacyjny. Jeżeli chcemy wykorzystać OpenTelemetry do monitoringu na produkcji musimy zainstalować kolektor – czynnością tą (jak również konfiguracją) zajmiemy się w kolejnej części.

Sprawdź także

Zadzwoń +48 22 657 0438

lub wypełnij formularz, a skontaktujemy się z Tobą!

Nazywam się
i jestem zainteresowany
Proszę o kontakt pod adresem
lub numerem tel.