Aby w pełni zrozumieć wydajność systemu, konieczne jest nie tylko wykonanie testów, ale również budowanie obserwowalności. Integracja narzędzi trzecich staje się nieodzownym krokiem w zapewnieniu pełnej widoczności i analizy danych czasowych. Pozwala na bieżąco monitorować aplikacje, identyfikować potencjalne problemy i podejmować odpowiednie działania w celu doskonalenia wydajności.
W artykule przyjrzymy się temu, jak krytyczne jest budowanie obserwowalności systemów w kontekście testów wydajnościowych oraz jak skutecznie zintegrować narzędzia k6, Grafana i InfluxDB, aby uzyskać kompleksowe i precyzyjne wyniki testów. Zanim jednak przejdziemy do implementacji naszych integracji, musimy poznać fundamentalną teorię.
Czym są Docker oraz Docker Compose?
Docker to platforma o otwartym źródle, która umożliwia wirtualizację na poziomie systemu operacyjnego. Pozwala na pakowanie aplikacji i wszystkich jej zależności w jednostki zwane kontenerami. Każdy kontener działa w izolacji, co oznacza, że może zawierać swoje własne biblioteki, pliki konfiguracyjne i inne zależności, niezależnie od innych kontenerów na tym samym hoście. Dzięki temu aplikacje uruchamiane w kontenerach są przenośne i mogą działać jednolicie w różnych środowiskach – od lokalnych maszyn deweloperskich po serwery produkcyjne.
Docker pozwala deweloperom i administratorom na tworzenie, dostarczanie i uruchamianie aplikacji w sposób zautomatyzowany i powtarzalny. Dzięki temu proces wdrażania aplikacji jest bardziej niezawodny i szybszy, a także eliminuje problemy związane z różnicami w konfiguracji środowiska.
Docker Compose jest narzędziem, które rozszerza funkcjonalność Dockera, umożliwiając zarządzanie wieloma kontenerami jako pojedynczymi aplikacjami. Pozwala na zdefiniowanie całego środowiska aplikacji w jednym pliku konfiguracyjnym, w którym można określić wszystkie kontenery, ich zależności, sieci oraz inne parametry. Dzięki temu w łatwy sposób uruchomimy i zatrzymamy całą aplikację składającą się z wielu kontenerów za pomocą jednego polecenia.
Docker Compose jest szczególnie przydatny w środowiskach developerskich i testowych, gdzie często korzystamy z wielu usług i zależności. Dzięki niemu możemy:
- skrócić czas konfiguracji środowiska,
- zautomatyzować procesy,
- uniknąć problemów związanych z ręcznym zarządzaniem wieloma kontenerami.
Przechowywanie metryk w InfluxDB
InfluxDB to rozproszona baza danych czasowych. Jest specjalnie zaprojektowana do przechowywania, przesyłania zapytań i analizy danych czasowych, takich jak:
- dane telemetryczne,
- logi zdarzeń,
- metryki aplikacji,
- dane pomiarowe.
InfluxDB oferuje wydajne i skalowalne rozwiązanie dla przechowywania dużych ilości danych o zmieniającym się w czasie charakterze. Dzięki swojej specjalizacji, jest często wykorzystywana w aplikacjach IoT, monitoringu systemów, analityce czasu rzeczywistego oraz w innych dziedzinach wymagających precyzyjnego gromadzenia i analizy danych czasowych.
InfluxDB jest idealnym narzędziem do przechowywania metryk z testów wydajnościowych oraz innych zastosowań związanych z analizą danych czasowych. InfluxDB pozwala na precyzyjne zbieranie i archiwizację wyników testów wydajnościowych, takich jak czas odpowiedzi serwera, ilość żądań na sekundę czy obciążenie systemu.
InfluxDB jest popularnym wyborem wśród zespołów zajmujących się testowaniem wydajnościowym oraz monitorowaniem systemów, ponieważ zapewnia nie tylko wydajne i niezawodne przechowywanie danych, ale także łatwą integrację z innymi narzędziami do analizy danych i wizualizacji. Dzięki temu możemy budować zaawansowane i kompleksowe rozwiązania do analizy wydajności aplikacji, co jest kluczowe dla zapewnienia optymalnego działania naszych systemów.
Wizualizacja danych z Grafaną
Grafana to popularne narzędzie open-source do wizualizacji i monitorowania danych z różnych źródeł. Jest używana głównie do tworzenia interaktywnych i estetycznych wykresów, paneli oraz dashboardów, które pozwalają wizualnie analizować i prezentować dane. Grafana współpracuje z wieloma bazami danych i systemami monitorowania, a jednym z najczęściej wykorzystywanych źródeł danych jest InfluxDB.
Narzędzie umożliwia integrację z InfluxDB, co pozwala na łatwe wizualizowanie danych czasowych zgromadzonych w bazie danych InfluxDB. Dzięki tej integracji, możemy tworzyć zaawansowane wykresy liniowe, słupkowe, wykresy kołowe, czy heatmapy na podstawie wyników testów wydajnościowych oraz innych danych czasowych. Wizualizacje te pozwalają zrozumieć zmiany w wydajności aplikacji w czasie, identyfikować trendy oraz wskazywać ewentualne problemy.
Grafana oferuje również zaawansowane funkcje, takie jak dynamiczne filtry, interaktywne przełączanie paneli, możliwość łączenia różnych źródeł danych i wiele innych. Dzięki temu możemy dostosować prezentowane dane do naszych potrzeb i generować spersonalizowane raporty i dashbordy, które pomogą nam skutecznie monitorować i analizować wydajność naszych aplikacji.
W połączeniu z InfluxDB, Grafana tworzy potężne narzędzie do kompleksowego monitorowania i wizualizacji danych czasowych, które jest szczególnie przydatne w przypadku testów wydajnościowych oraz analizy danych związanych z czasem. Pozwala to lepiej zrozumieć i zoptymalizować działania aplikacji, co jest kluczowe dla zapewnienia doskonałej jakości i wydajności systemów.
Podsumowanie przepływu pracy
Podsumowując, w projekcie do tworzenia i konfigurowania kontenerów, które będą wzajemnie się komunikować, wykorzystamy Dockera. Ostatecznie, stworzymy trzy kontenery, które będą miały następujący schemat komunikacji między sobą:
Jest to prosta i raczej standardowa integracja, stanowiąca punkt wyjścia do rozwijania systemu monitorowania.
Zanim przejdziemy do tworzenia pliku docker-compose.yaml, musimy najpierw stworzyć obraz Dockera, który będzie odpowiedzialny za uruchamianie scenariuszy testowych na podstawie poleceń zdefiniowanych w pliku package.json. Oto gotowa konfiguracja pliku Dockerfile:
Powyższy plik Dockerfile opisuje proces budowy obrazu kontenera, który zawiera środowisko do uruchamiania testów k6 oraz instaluje wymagane zależności związane z Node.js i npm. Oto jego wnętrze:
- FROM node:latest – linia ta określa bazowy obraz, na którym będzie oparty obraz kontenera. W tym przypadku wykorzystano obraz „node:latest”, który zawiera środowisko Node.js, co pozwala na uruchamianie skryptów napisanych w języku JavaScript.
- USER root – ustawienie użytkownika na „root”. Ta linia jest opcjonalna i wymagana tylko wtedy, gdy potrzebujemy uprawnień administratora do instalacji i modyfikacji pakietów.
- WORKDIR / – określenie katalogu roboczego wewnątrz kontenera na główny katalog („/”). Wszystkie kolejne polecenia będą wykonywane w tym katalogu.
- ADD … – pobranie archiwum k6 z wydaną wersją (0.45.0) i jego rozpakowanie wewnątrz kontenera.
- RUN … – wykonanie kolejnych poleceń. Rozpakowanie archiwum k6, przeniesienie pliku k6 do katalogu „/usr/bin”, a także zainstalowanie zależności z pliku package.json za pomocą „npm install”.
- ENTRYPOINT [ „npm” ] – określenie punktu wejścia do kontenera. W tym przypadku, kiedy uruchamiamy kontener, zostanie automatycznie uruchomiony npm, co umożliwi uruchomienie skryptów testowych zdefiniowanych w plikach package.json.
Zaimplementujmy i omówmy plik o nazwie docker-compose.yaml, w którym opiszemy strukturę naszych kontenerów.
W powyższej strukturze pliku docker-compose.yaml zdefiniowano trzy usługi, które tworzą kompleksowe środowisko do testów wydajnościowych. Każda usługa jest odpowiedzialna za określone zadania:
- InfluxDB – jest to baza danych czasowych używana do przechowywania danych zebranych podczas testów wydajnościowych. Określono wersję obrazu „influxdb:1.8” oraz związane z nią parametry. Usługa jest podłączona do dwóch sieci: „k6” i „grafana”, co umożliwia komunikację z pozostałymi usługami. Udostępniono port „8086”, aby pozwolić na dostęp do InfluxDB z innych kontenerów. Zdefiniowano także zmienną środowiskową „INFLUXDB_DB”, która określa nazwę bazy danych „k6” w InfluxDB.
- Grafana – ta usługa umożliwia wizualizację i analizę danych czasowych zgromadzonych w InfluxDB. Wykorzystano obraz „grafana/grafana:latest” oraz zdefiniowano odpowiednie parametry. Podłączono usługę do sieci „grafana”. Udostępniono port „3000”, co pozwala na dostęp do interfejsu Grafany z zewnętrznego środowiska. Skonfigurowano również zmienne środowiskowe, które umożliwiają anonimowy dostęp do Grafany.
Dodatkowo, w pliku docker-compose.yaml uwzględniono wolumeny, które umożliwiają dostarczenie plików konfiguracyjnych i dashboardów do kontenera Grafany. Pierwszym z nich jest nowo utworzony przez nas katalog dashboards, w którym znajdować się będą zdefiniowane przez nas panele, automatycznie zaciągane przez kontener Grafany. Przykładowy panel, którego użyjemy, jest dostępny w naszym repozytorium, do którego serdecznie zapraszamy.
Omówmy dwie kolejne konfiguracje zdefiniowane w pliku docker-compose dla serwisów grafany.
- Plik grafana-dashboard.yaml – definiuje dostawcę paneli dla Grafany. Konfiguracja ta określa, że nowe panele będą przypisane do głównego folderu i będą dostarczane z plików znajdujących się w katalogu /var/lib/grafana/dashboards. Dzięki temu podejściu możliwe jest automatyczne dodawanie i zarządzanie panelami w systemie Grafana z wykorzystaniem plików konfiguracyjnych.
- Plik grafana-datasource.yaml – zawiera konfigurację źródła danych dla Grafany, wskazując na bazę danych InfluxDB o nazwie „k6”. Dzięki takiemu ustawieniu, Grafana będzie korzystać z tego źródła danych jako domyślnego, co pozwoli na automatyczne wykorzystanie go w panelach, które nie mają wybranego specyficznego źródła danych. Źródło danych jest dostępne poprzez proxy pod adresem „http://influxdb:8086„.
- k6 – to serwis odpowiedzialny za wykonywanie testów wydajnościowych. Zdefiniowano utworzony chwilę wcześniej przez nas obraz k6-with-npm oraz określono sieć „k6”, w której działa usługa. Udostępniono port „6565”, co umożliwia dostęp do interfejsu k6. Skonfigurowano zmienną środowiskową „K6_OUT”, która wskazuje na bazę danych InfluxDB i jej endpoint „http://influxdb:8086/k6„, gdzie wyniki testów będą zapisywane. Dodatkowo, dzięki wolumenowi, skrypty testowe wraz z katalogami pomocniczymi są dostępne na lokalnym systemie wewnątrz kontenera k6.
Opis pełnego działania docker-compose.yaml oraz samego Dockera wymagałby oddzielnej i szczegółowej serii artykułów. W tym artykule skupiliśmy się na ogólnym przeglądzie tych zagadnień. Planujemy jednak stworzyć oddzielną serię, w której będziemy zgłębiać Dockera od podstaw.
Podsumowując, całe środowisko w docker-compose.yaml jest skonfigurowane w sposób, który umożliwia automatyczne działanie i komunikację między poszczególnymi usługami. InfluxDB gromadzi dane z testów wydajnościowych, które następnie mogą być wizualizowane i analizowane w interfejsie Grafany, a sam proces testowania jest obsługiwany przez k6. Dzięki temu środowisko można łatwo wdrożyć i skalować, co czyni je dobrym początkiem do monitorowania i analizy wydajności aplikacji.
Przygotowanie przed uruchomieniem scenariusza
Aby poprawnie uruchomić środowisko lokalnie, upewnij się, że masz zainstalowany Docker oraz Docker Compose. Następnie, wejdź do katalogu głównego projektu i uruchom poniższe polecenie, aby zbudować obraz Dockera na podstawie pliku o nazwie Dockerfile, który wcześniej stworzyliśmy.
Dopiero teraz jesteśmy gotowi do utworzenia i uruchomienia kontenerów InfluxDB oraz Grafana.
Dzięki zdefiniowaniu dostępu do interfejsu Grafany w pliku docker-compose.yaml, za pomocą adresu 127.0.0.1:3000 możemy zobaczyć dashboard Grafany w dostępnym środowisku.
Ponieważ nie uruchomiliśmy konteneru k6, a co za tym idzie – scenariusza testowego, żadne wyniki nie są jeszcze widoczne.
Ostatnia prosta
Zanim jednak przystąpimy do uruchamiania naszego scenariusza, dokonajmy niewielkich zmian w funkcji pomocniczej assert. Przeróbmy ją tak, aby przyjmowała więcej argumentów, w tym kluczowy dla nas obiekt errors.
Powodem powyższej zmiany jest to, że k6 nie radzi sobie z logowaniem błędów aplikacji w sposób wystarczająco precyzyjny, co utrudnia analizę i wyciąganie wniosków. Dlatego rozbudowaliśmy naszą funkcję, aby przekazywała bardziej szczegółowe dane. Są one agregowane w obiekcie errors, który jest zdefiniowany w każdym scenariuszu testowym tuż po sekcji importów. Wprowadzamy tę logikę w scenariuszu odpowiedzialnym za wyszukiwanie szkoleń.
Pełne zmiany możecie znaleźć w naszym repozytorium.
Po wprowadzeniu odpowiednich zmian wykonajmy poniższe polecenie, aby usunąć istniejące kontenery k6, a następnie uruchomić zdefiniowaną komendę z pliku package.json.
W ten sposób zostanie wykonany jeden przebieg testu na wyszukiwanie artykułu na stronie. Teraz przejdźmy do Grafany, aby sprawdzić, czy rezultaty są wyświetlane poprawnie.
Dodatkowo, w przypadku wykrycia błędu, błąd zostanie wyświetlony w tabeli podzielonej na dwie sekcje umieszczonej na samym dole panelu. Pierwsza sekcja grupuje i podsumowuje wykryte błędy, podczas gdy druga przedstawia te błędy bardziej szczegółowo.
Podsumowanie
W artykule zgłębialiśmy integrację narzędzia k6 z Grafaną i InfluxDB, co stworzyło nowe możliwości w monitorowaniu i wizualizacji wyników testów wydajnościowych. Dzięki Grafanie mogliśmy przygotować interaktywne i estetyczne wykresy na podstawie danych zgromadzonych w InfluxDB, co ułatwiło analizę wyników testów.
Ponadto, dowiedzieliśmy się, że Docker jest doskonałym narzędziem do izolacji i wdrażania kontenerów, umożliwiającym łatwą instalację i uruchamianie potrzebnych narzędzi. Integracja tych technologii pozwoliła nam na zwiększenie obserwowalności naszych testów wydajnościowych, co jest kluczowym elementem w budowie niezawodnych i wydajnych aplikacji.
***
Jeśli jeszcze nie mieliście okazji zapoznać się z artykułami z serii o narzędziu k6, znajdziecie je tutaj:
- Wydajność pod kontrolą – co skłania mnie do wyboru k6?
- Wydajność pod kontrolą z k6 – nagrywanie, parametryzacja i uruchamianie pierwszego scenariusza testowego
- Wydajność pod kontrolą z k6 – metryki, progi jakości, tagowanie
- Wydajność pod kontrolą z k6 – dodatkowe konfiguracje, typy modeli scenariuszy oraz executorów
- Wydajność pod kontrolą z k6 – inicjalizacja frameworka
- Wydajność pod kontrolą z k6 – dobre praktyki, tworzenie zbiorów testów i konfiguracja
Ponadto, zachęcam do zapoznania się z Repozytorium projektu.
Zostaw komentarz