{"id":26364,"date":"2024-01-10T05:00:00","date_gmt":"2024-01-10T04:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=26364"},"modified":"2024-11-08T11:21:56","modified_gmt":"2024-11-08T10:21:56","slug":"wydajnosc-pod-kontrola-z-k6-docker-oraz-integracja-z-influxdb-oraz-grafana","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-z-k6-docker-oraz-integracja-z-influxdb-oraz-grafana\/","title":{"rendered":"Wydajno\u015b\u0107 pod kontrol\u0105 z k6 \u2013 Docker oraz integracja z InfluxDB oraz Grafan\u0105"},"content":{"rendered":"\n<p>Aby w pe\u0142ni zrozumie\u0107 wydajno\u015b\u0107 systemu, konieczne jest nie tylko wykonanie test\u00f3w, ale r\u00f3wnie\u017c budowanie obserwowalno\u015bci. Integracja narz\u0119dzi trzecich staje si\u0119 nieodzownym krokiem w zapewnieniu pe\u0142nej widoczno\u015bci i analizy danych czasowych. Pozwala na bie\u017c\u0105co monitorowa\u0107 aplikacje, identyfikowa\u0107 potencjalne problemy i podejmowa\u0107 odpowiednie dzia\u0142ania w celu doskonalenia wydajno\u015bci.<\/p>\n\n\n\n<p>W artykule przyjrzymy si\u0119 temu, jak krytyczne jest budowanie obserwowalno\u015bci system\u00f3w w kontek\u015bcie test\u00f3w wydajno\u015bciowych oraz jak skutecznie zintegrowa\u0107 narz\u0119dzia k6, Grafana i InfluxDB, aby uzyska\u0107 kompleksowe i precyzyjne wyniki test\u00f3w. Zanim jednak przejdziemy do implementacji naszych integracji, musimy pozna\u0107 fundamentaln\u0105 teori\u0119.<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Testy wydajno\u015bciowe z k6: Docker oraz integracja z InfluxDB i Grafan\u0105 | cz\u0119\u015b\u0107 7\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/fU2G-jkw8Js?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Czym s\u0105 Docker oraz Docker Compose?<\/strong><\/h2>\n\n\n\n<p><a href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-co-to-jest\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Docker to platforma o otwartym \u017ar\u00f3dle<\/a>, kt\u00f3ra umo\u017cliwia wirtualizacj\u0119 na poziomie systemu operacyjnego. Pozwala na pakowanie aplikacji i wszystkich jej zale\u017cno\u015bci w jednostki zwane kontenerami. Ka\u017cdy kontener dzia\u0142a w izolacji, co oznacza, \u017ce mo\u017ce zawiera\u0107 swoje w\u0142asne biblioteki, pliki konfiguracyjne i inne zale\u017cno\u015bci, niezale\u017cnie od innych kontener\u00f3w na tym samym ho\u015bcie. Dzi\u0119ki temu aplikacje uruchamiane w kontenerach s\u0105 przeno\u015bne i mog\u0105 dzia\u0142a\u0107 jednolicie w r\u00f3\u017cnych \u015brodowiskach \u2013 od lokalnych maszyn deweloperskich po serwery produkcyjne.<\/p>\n\n\n\n<p>Docker pozwala deweloperom i administratorom na tworzenie, <strong>dostarczanie i uruchamianie aplikacji w spos\u00f3b zautomatyzowany i powtarzalny<\/strong>. Dzi\u0119ki temu proces wdra\u017cania aplikacji jest bardziej niezawodny i szybszy, a tak\u017ce eliminuje problemy zwi\u0105zane z r\u00f3\u017cnicami w konfiguracji \u015brodowiska.<\/p>\n\n\n\n<p>Docker Compose jest narz\u0119dziem, kt\u00f3re <strong>rozszerza funkcjonalno\u015b\u0107 Dockera<\/strong>, umo\u017cliwiaj\u0105c zarz\u0105dzanie wieloma kontenerami jako pojedynczymi aplikacjami. Pozwala na zdefiniowanie ca\u0142ego \u015brodowiska aplikacji w jednym pliku konfiguracyjnym, w kt\u00f3rym mo\u017cna okre\u015bli\u0107 wszystkie kontenery, ich zale\u017cno\u015bci, sieci oraz inne parametry. Dzi\u0119ki temu w \u0142atwy spos\u00f3b uruchomimy i zatrzymamy ca\u0142\u0105 aplikacj\u0119 sk\u0142adaj\u0105c\u0105 si\u0119 z wielu kontener\u00f3w za pomoc\u0105 jednego polecenia.<\/p>\n\n\n\n<p>Docker Compose jest szczeg\u00f3lnie przydatny w \u015brodowiskach developerskich i testowych, gdzie cz\u0119sto korzystamy z wielu us\u0142ug i zale\u017cno\u015bci. Dzi\u0119ki niemu mo\u017cemy:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>skr\u00f3ci\u0107 czas konfiguracji \u015brodowiska,<\/li>\n\n\n\n<li>zautomatyzowa\u0107 procesy,<\/li>\n\n\n\n<li>unikn\u0105\u0107 problem\u00f3w zwi\u0105zanych z r\u0119cznym zarz\u0105dzaniem wieloma kontenerami.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przechowywanie metryk w InfluxDB<\/strong><\/h2>\n\n\n\n<p>InfluxDB to rozproszona baza danych czasowych. Jest specjalnie zaprojektowana do przechowywania, przesy\u0142ania zapyta\u0144 i analizy danych czasowych, takich jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dane telemetryczne,<\/li>\n\n\n\n<li>logi zdarze\u0144,<\/li>\n\n\n\n<li>metryki aplikacji,<\/li>\n\n\n\n<li>dane pomiarowe.<\/li>\n<\/ul>\n\n\n\n<p>InfluxDB oferuje wydajne i skalowalne rozwi\u0105zanie dla przechowywania du\u017cych ilo\u015bci danych o zmieniaj\u0105cym si\u0119 w czasie charakterze. Dzi\u0119ki swojej specjalizacji, jest cz\u0119sto wykorzystywana w aplikacjach IoT, monitoringu system\u00f3w, analityce czasu rzeczywistego oraz w innych <strong>dziedzinach wymagaj\u0105cych precyzyjnego gromadzenia i analizy danych czasowych<\/strong>.<\/p>\n\n\n\n<p>InfluxDB jest <strong>idealnym narz\u0119dziem do przechowywania metryk z test\u00f3w wydajno\u015bciowych<\/strong> oraz innych zastosowa\u0144 zwi\u0105zanych z analiz\u0105 danych czasowych. InfluxDB pozwala na precyzyjne zbieranie i archiwizacj\u0119 wynik\u00f3w test\u00f3w wydajno\u015bciowych, takich jak czas odpowiedzi serwera, ilo\u015b\u0107 \u017c\u0105da\u0144 na sekund\u0119 czy obci\u0105\u017cenie systemu.<\/p>\n\n\n\n<p>InfluxDB jest <strong>popularnym wyborem<\/strong> w\u015br\u00f3d zespo\u0142\u00f3w zajmuj\u0105cych si\u0119 testowaniem wydajno\u015bciowym oraz monitorowaniem system\u00f3w, poniewa\u017c zapewnia nie tylko wydajne i niezawodne przechowywanie danych, ale tak\u017ce \u0142atw\u0105 integracj\u0119 z innymi narz\u0119dziami do analizy danych i wizualizacji. Dzi\u0119ki temu mo\u017cemy budowa\u0107 zaawansowane i kompleksowe rozwi\u0105zania do analizy wydajno\u015bci aplikacji, co jest kluczowe dla zapewnienia optymalnego dzia\u0142ania naszych system\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wizualizacja danych z Grafan\u0105<\/strong><\/h2>\n\n\n\n<p>Grafana to popularne narz\u0119dzie open-source do wizualizacji i monitorowania danych z r\u00f3\u017cnych \u017ar\u00f3de\u0142. Jest u\u017cywana g\u0142\u00f3wnie do tworzenia interaktywnych i estetycznych wykres\u00f3w, paneli oraz dashboard\u00f3w, kt\u00f3re pozwalaj\u0105 wizualnie analizowa\u0107 i prezentowa\u0107 dane. Grafana wsp\u00f3\u0142pracuje z wieloma bazami danych i systemami monitorowania, a jednym z najcz\u0119\u015bciej wykorzystywanych \u017ar\u00f3de\u0142 danych jest InfluxDB.<\/p>\n\n\n\n<p>Narz\u0119dzie umo\u017cliwia integracj\u0119 z InfluxDB, co pozwala na \u0142atwe wizualizowanie danych czasowych zgromadzonych w bazie danych InfluxDB. Dzi\u0119ki tej integracji, mo\u017cemy tworzy\u0107 zaawansowane wykresy liniowe, s\u0142upkowe, wykresy ko\u0142owe, czy heatmapy na podstawie wynik\u00f3w test\u00f3w wydajno\u015bciowych oraz innych danych czasowych. Wizualizacje te pozwalaj\u0105 zrozumie\u0107 zmiany w wydajno\u015bci aplikacji w czasie, identyfikowa\u0107 trendy oraz wskazywa\u0107 ewentualne problemy.<\/p>\n\n\n\n<p>Grafana oferuje r\u00f3wnie\u017c zaawansowane funkcje, takie jak dynamiczne filtry, interaktywne prze\u0142\u0105czanie paneli, mo\u017cliwo\u015b\u0107 \u0142\u0105czenia r\u00f3\u017cnych \u017ar\u00f3de\u0142 danych i wiele innych. Dzi\u0119ki temu mo\u017cemy dostosowa\u0107 prezentowane dane do naszych potrzeb i generowa\u0107 spersonalizowane raporty i dashbordy, kt\u00f3re pomog\u0105 nam skutecznie monitorowa\u0107 i analizowa\u0107 wydajno\u015b\u0107 naszych aplikacji.<\/p>\n\n\n\n<p>W po\u0142\u0105czeniu z InfluxDB, Grafana tworzy pot\u0119\u017cne narz\u0119dzie do kompleksowego monitorowania i wizualizacji danych czasowych, kt\u00f3re jest szczeg\u00f3lnie przydatne w przypadku test\u00f3w wydajno\u015bciowych oraz analizy danych zwi\u0105zanych z czasem. Pozwala to lepiej zrozumie\u0107 i zoptymalizowa\u0107 dzia\u0142ania aplikacji, co jest kluczowe dla zapewnienia doskona\u0142ej jako\u015bci i wydajno\u015bci system\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie przep\u0142ywu pracy<\/strong><\/h2>\n\n\n\n<p>Podsumowuj\u0105c, w projekcie do tworzenia i konfigurowania kontener\u00f3w, kt\u00f3re b\u0119d\u0105 wzajemnie si\u0119 komunikowa\u0107, wykorzystamy Dockera. Ostatecznie, stworzymy trzy kontenery, kt\u00f3re b\u0119d\u0105 mia\u0142y nast\u0119puj\u0105cy schemat komunikacji mi\u0119dzy sob\u0105:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-01.png\"><img decoding=\"async\" width=\"1024\" height=\"644\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-01-1024x644.png\" alt=\"Schemat komunikacji mi\u0119dzy kontenerami\" class=\"wp-image-26367\" style=\"width:617px;height:388px\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-01-1024x644.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-01-300x189.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-01-768x483.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-01-1536x966.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-01.png 1563w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 Schemat komunikacji mi\u0119dzy kontenerami<\/figcaption><\/figure>\n\n\n\n<p>Jest to prosta i raczej standardowa integracja, stanowi\u0105ca punkt wyj\u015bcia do rozwijania systemu monitorowania.<\/p>\n\n\n\n<p>Zanim przejdziemy do tworzenia pliku docker-compose.yaml, musimy najpierw stworzy\u0107 obraz Dockera, kt\u00f3ry b\u0119dzie odpowiedzialny za uruchamianie scenariuszy testowych na podstawie polece\u0144 zdefiniowanych w pliku package.json. Oto gotowa konfiguracja pliku Dockerfile:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-02.png\"><img decoding=\"async\" width=\"1024\" height=\"531\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-02-1024x531.png\" alt=\"Gotowa konfiguracja pliku Dockerfile\" class=\"wp-image-26369\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-02-1024x531.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-02-300x156.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-02-768x398.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-02-1536x797.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-02.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 Gotowa konfiguracja pliku Dockerfile<\/figcaption><\/figure>\n\n\n\n<p>Powy\u017cszy plik Dockerfile opisuje proces budowy obrazu kontenera, kt\u00f3ry zawiera \u015brodowisko do uruchamiania test\u00f3w k6 oraz instaluje wymagane zale\u017cno\u015bci zwi\u0105zane z Node.js i npm. Oto jego wn\u0119trze:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FROM node:latest \u2013 linia ta okre\u015bla bazowy obraz, na kt\u00f3rym b\u0119dzie oparty obraz kontenera. W tym przypadku wykorzystano obraz &#8222;node:latest&#8221;, kt\u00f3ry zawiera \u015brodowisko Node.js, co pozwala na uruchamianie skrypt\u00f3w napisanych w j\u0119zyku JavaScript.<\/li>\n\n\n\n<li>USER root \u2013 ustawienie u\u017cytkownika na &#8222;root&#8221;. Ta linia jest opcjonalna i wymagana tylko wtedy, gdy potrzebujemy uprawnie\u0144 administratora do instalacji i modyfikacji pakiet\u00f3w.<\/li>\n\n\n\n<li>WORKDIR \/ \u2013 okre\u015blenie katalogu roboczego wewn\u0105trz kontenera na g\u0142\u00f3wny katalog (&#8222;\/&#8221;). Wszystkie kolejne polecenia b\u0119d\u0105 wykonywane w tym katalogu.<\/li>\n\n\n\n<li>ADD &#8230; \u2013 pobranie archiwum k6 z wydan\u0105 wersj\u0105 (0.45.0) i jego rozpakowanie wewn\u0105trz kontenera.<\/li>\n\n\n\n<li>RUN &#8230; \u2013 wykonanie kolejnych polece\u0144. Rozpakowanie archiwum k6, przeniesienie pliku k6 do katalogu &#8222;\/usr\/bin&#8221;, a tak\u017ce zainstalowanie zale\u017cno\u015bci z pliku package.json za pomoc\u0105 &#8222;npm install&#8221;.<\/li>\n\n\n\n<li>ENTRYPOINT [ &#8222;npm&#8221; ] \u2013 okre\u015blenie punktu wej\u015bcia do kontenera. W tym przypadku, kiedy uruchamiamy kontener, zostanie automatycznie uruchomiony npm, co umo\u017cliwi uruchomienie skrypt\u00f3w testowych zdefiniowanych w plikach package.json.<\/li>\n<\/ul>\n\n\n\n<p>Zaimplementujmy i om\u00f3wmy plik o nazwie docker-compose.yaml, w kt\u00f3rym opiszemy struktur\u0119 naszych kontener\u00f3w.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03.png\"><img decoding=\"async\" width=\"751\" height=\"1024\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03-751x1024.png\" alt=\"Implementacja pliku docker-compose.yaml\" class=\"wp-image-26372\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03-751x1024.png 751w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03-220x300.png 220w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03-768x1048.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03-1126x1536.png 1126w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03-1502x2048.png 1502w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-03.png 1808w\" sizes=\"(max-width: 751px) 100vw, 751px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 Implementacja pliku docker-compose.yaml<\/figcaption><\/figure>\n\n\n\n<p>W powy\u017cszej strukturze pliku docker-compose.yaml zdefiniowano trzy us\u0142ugi, kt\u00f3re tworz\u0105 kompleksowe \u015brodowisko do test\u00f3w wydajno\u015bciowych. Ka\u017cda us\u0142uga jest odpowiedzialna za okre\u015blone zadania:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>InfluxDB<\/strong> \u2013 jest to baza danych czasowych u\u017cywana do przechowywania danych zebranych podczas test\u00f3w wydajno\u015bciowych. Okre\u015blono wersj\u0119 obrazu &#8222;influxdb:1.8&#8221; oraz zwi\u0105zane z ni\u0105 parametry. Us\u0142uga jest pod\u0142\u0105czona do dw\u00f3ch sieci: &#8222;k6&#8221; i &#8222;grafana&#8221;, co umo\u017cliwia komunikacj\u0119 z pozosta\u0142ymi us\u0142ugami. Udost\u0119pniono port &#8222;8086&#8221;, aby pozwoli\u0107 na dost\u0119p do InfluxDB z innych kontener\u00f3w. Zdefiniowano tak\u017ce zmienn\u0105 \u015brodowiskow\u0105 &#8222;INFLUXDB_DB&#8221;, kt\u00f3ra okre\u015bla nazw\u0119 bazy danych &#8222;k6&#8221; w InfluxDB.<\/li>\n\n\n\n<li><strong>Grafana<\/strong> \u2013 ta us\u0142uga umo\u017cliwia wizualizacj\u0119 i analiz\u0119 danych czasowych zgromadzonych w InfluxDB. Wykorzystano obraz &#8222;grafana\/grafana:latest&#8221; oraz zdefiniowano odpowiednie parametry. Pod\u0142\u0105czono us\u0142ug\u0119 do sieci &#8222;grafana&#8221;. Udost\u0119pniono port &#8222;3000&#8221;, co pozwala na dost\u0119p do interfejsu Grafany z zewn\u0119trznego \u015brodowiska. Skonfigurowano r\u00f3wnie\u017c zmienne \u015brodowiskowe, kt\u00f3re umo\u017cliwiaj\u0105 anonimowy dost\u0119p do Grafany.<\/li>\n<\/ul>\n\n\n\n<p>Dodatkowo, w pliku docker-compose.yaml uwzgl\u0119dniono wolumeny, kt\u00f3re umo\u017cliwiaj\u0105 dostarczenie plik\u00f3w konfiguracyjnych i dashboard\u00f3w do kontenera Grafany. Pierwszym z nich jest nowo utworzony przez nas katalog dashboards, w kt\u00f3rym znajdowa\u0107 si\u0119 b\u0119d\u0105 zdefiniowane przez nas panele, automatycznie zaci\u0105gane przez kontener Grafany. Przyk\u0142adowy panel, kt\u00f3rego u\u017cyjemy, <a href=\"https:\/\/github.com\/gpiechnik2\/k6-boilerplate\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >jest dost\u0119pny w naszym repozytorium<\/a>, do kt\u00f3rego serdecznie zapraszamy.<\/p>\n\n\n\n<p>Om\u00f3wmy dwie kolejne konfiguracje zdefiniowane w pliku docker-compose dla serwis\u00f3w grafany.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Plik grafana-dashboard.yaml \u2013 definiuje dostawc\u0119 paneli dla Grafany. Konfiguracja ta okre\u015bla, \u017ce nowe panele b\u0119d\u0105 przypisane do g\u0142\u00f3wnego folderu i b\u0119d\u0105 dostarczane z plik\u00f3w znajduj\u0105cych si\u0119 w katalogu \/var\/lib\/grafana\/dashboards. Dzi\u0119ki temu podej\u015bciu mo\u017cliwe jest automatyczne dodawanie i zarz\u0105dzanie panelami w systemie Grafana z wykorzystaniem plik\u00f3w konfiguracyjnych.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-04.png\"><img decoding=\"async\" width=\"1024\" height=\"722\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-04-1024x722.png\" alt=\"Plik grafana-dashboard.yaml\" class=\"wp-image-26374\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-04-1024x722.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-04-300x211.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-04-768x541.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-04.png 1084w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 4 Plik grafana-dashboard.yaml<\/figcaption><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Plik grafana-datasource.yaml \u2013 zawiera konfiguracj\u0119 \u017ar\u00f3d\u0142a danych dla Grafany, wskazuj\u0105c na baz\u0119 danych InfluxDB o nazwie &#8222;k6&#8221;. Dzi\u0119ki takiemu ustawieniu, Grafana b\u0119dzie korzysta\u0107 z tego \u017ar\u00f3d\u0142a danych jako domy\u015blnego, co pozwoli na automatyczne wykorzystanie go w panelach, kt\u00f3re nie maj\u0105 wybranego specyficznego \u017ar\u00f3d\u0142a danych. \u0179r\u00f3d\u0142o danych jest dost\u0119pne poprzez proxy pod adresem &#8222;<a href=\"http:\/\/influxdb:8086\/\" rel=\"nofollow\" >http:\/\/influxdb:8086<\/a>&#8222;.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-05.png\"><img decoding=\"async\" width=\"876\" height=\"764\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-05.png\" alt=\"Plik grafana-datasource.yaml\" class=\"wp-image-26376\" style=\"object-fit:cover\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-05.png 876w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-05-300x262.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-05-768x670.png 768w\" sizes=\"(max-width: 876px) 100vw, 876px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 5 Plik grafana-datasource.yaml<\/figcaption><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>k6 \u2013 to serwis odpowiedzialny za wykonywanie test\u00f3w wydajno\u015bciowych. Zdefiniowano utworzony chwil\u0119 wcze\u015bniej przez nas obraz k6-with-npm oraz okre\u015blono sie\u0107 &#8222;k6&#8221;, w kt\u00f3rej dzia\u0142a us\u0142uga. Udost\u0119pniono port &#8222;6565&#8221;, co umo\u017cliwia dost\u0119p do interfejsu k6. Skonfigurowano zmienn\u0105 \u015brodowiskow\u0105 &#8222;K6_OUT&#8221;, kt\u00f3ra wskazuje na baz\u0119 danych InfluxDB i jej endpoint &#8222;<a href=\"http:\/\/influxdb:8086\/k6\" rel=\"nofollow\" >http:\/\/influxdb:8086\/k6<\/a>&#8222;, gdzie wyniki test\u00f3w b\u0119d\u0105 zapisywane. Dodatkowo, dzi\u0119ki wolumenowi, skrypty testowe wraz z katalogami pomocniczymi s\u0105 dost\u0119pne na lokalnym systemie wewn\u0105trz kontenera k6.<\/li>\n<\/ul>\n\n\n\n<p>Opis pe\u0142nego dzia\u0142ania docker-compose.yaml oraz samego Dockera wymaga\u0142by oddzielnej i szczeg\u00f3\u0142owej serii artyku\u0142\u00f3w. W tym artykule <strong>skupili\u015bmy si\u0119 na og\u00f3lnym przegl\u0105dzie tych zagadnie\u0144<\/strong>. Planujemy jednak stworzy\u0107 oddzieln\u0105 seri\u0119, w kt\u00f3rej b\u0119dziemy zg\u0142\u0119bia\u0107 Dockera od podstaw.<\/p>\n\n\n\n<p>Podsumowuj\u0105c, ca\u0142e \u015brodowisko w docker-compose.yaml jest skonfigurowane w spos\u00f3b, kt\u00f3ry umo\u017cliwia automatyczne dzia\u0142anie i komunikacj\u0119 mi\u0119dzy poszczeg\u00f3lnymi us\u0142ugami. InfluxDB gromadzi dane z test\u00f3w wydajno\u015bciowych, kt\u00f3re nast\u0119pnie mog\u0105 by\u0107 wizualizowane i analizowane w interfejsie Grafany, a sam proces testowania jest obs\u0142ugiwany przez k6. <strong>Dzi\u0119ki temu \u015brodowisko mo\u017cna \u0142atwo wdro\u017cy\u0107 i skalowa\u0107, co czyni je dobrym pocz\u0105tkiem do monitorowania i analizy wydajno\u015bci aplikacji.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przygotowanie przed uruchomieniem scenariusza<\/strong><\/h2>\n\n\n\n<p>Aby poprawnie uruchomi\u0107 \u015brodowisko lokalnie, upewnij si\u0119, \u017ce masz zainstalowany <a href=\"https:\/\/docs.docker.com\/doc\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Docker<\/a> oraz <a href=\"https:\/\/docs.docker.com\/compose\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Docker Compose<\/a>. Nast\u0119pnie, wejd\u017a do katalogu g\u0142\u00f3wnego projektu i uruchom poni\u017csze polecenie, aby zbudowa\u0107 obraz Dockera na podstawie pliku o nazwie Dockerfile, kt\u00f3ry wcze\u015bniej stworzyli\u015bmy.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-06.png\"><img decoding=\"async\" width=\"808\" height=\"428\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-06.png\" alt=\"Budowanie obrazu Dockera\" class=\"wp-image-26379\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-06.png 808w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-06-300x159.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-06-768x407.png 768w\" sizes=\"(max-width: 808px) 100vw, 808px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 6 Budowanie obrazu Dockera<\/figcaption><\/figure>\n\n\n\n<p>Dopiero teraz jeste\u015bmy gotowi do utworzenia i uruchomienia kontener\u00f3w InfluxDB oraz Grafana.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-07.png\"><img decoding=\"async\" width=\"946\" height=\"422\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-07.png\" alt=\"Utworzenie i uruchomienie kontener\u00f3w InfluxDB i Grafana\" class=\"wp-image-26383\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-07.png 946w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-07-300x134.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-07-768x343.png 768w\" sizes=\"(max-width: 946px) 100vw, 946px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 7 Utworzenie i uruchomienie kontener\u00f3w InfluxDB i Grafana<\/figcaption><\/figure>\n\n\n\n<p>Dzi\u0119ki zdefiniowaniu dost\u0119pu do interfejsu Grafany w pliku docker-compose.yaml, za pomoc\u0105 adresu 127.0.0.1:3000 mo\u017cemy zobaczy\u0107 dashboard Grafany w dost\u0119pnym \u015brodowisku.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-08-1.png\"><img decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-08-1-1024x545.png\" alt=\"Dashboard Grafany\" class=\"wp-image-26385\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-08-1-1024x545.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-08-1-300x160.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-08-1-768x409.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-08-1-1536x818.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-08-1-2048x1090.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 8 Dashboard Grafany<\/figcaption><\/figure>\n\n\n\n<p>Poniewa\u017c nie uruchomili\u015bmy konteneru k6, a co za tym idzie \u2013 scenariusza testowego, <strong>\u017cadne wyniki nie s\u0105 jeszcze widoczne.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Ostatnia prosta<\/strong><\/h2>\n\n\n\n<p>Zanim jednak przyst\u0105pimy do uruchamiania naszego scenariusza, dokonajmy niewielkich zmian w funkcji pomocniczej assert. Przer\u00f3bmy j\u0105 tak, aby przyjmowa\u0142a wi\u0119cej argument\u00f3w, w tym kluczowy dla nas obiekt errors.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-09.png\"><img decoding=\"async\" width=\"1024\" height=\"637\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-09-1024x637.png\" alt=\"Zmiany w funkcji pomocnicznej assert\" class=\"wp-image-26388\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-09-1024x637.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-09-300x187.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-09-768x478.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-09-1536x956.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-09.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 9 Zmiany w funkcji pomocnicznej assert<\/figcaption><\/figure>\n\n\n\n<p>Powodem powy\u017cszej zmiany jest to, \u017ce <strong>k6 nie radzi sobie z logowaniem b\u0142\u0119d\u00f3w aplikacji w spos\u00f3b wystarczaj\u0105co precyzyjny<\/strong>, co utrudnia analiz\u0119 i wyci\u0105ganie wniosk\u00f3w. Dlatego rozbudowali\u015bmy nasz\u0105 funkcj\u0119, aby przekazywa\u0142a bardziej szczeg\u00f3\u0142owe dane. S\u0105 one agregowane w obiekcie errors, kt\u00f3ry jest zdefiniowany w ka\u017cdym scenariuszu testowym tu\u017c po sekcji import\u00f3w. Wprowadzamy t\u0119 logik\u0119 w scenariuszu odpowiedzialnym za wyszukiwanie szkole\u0144.<\/p>\n\n\n\n<p>Pe\u0142ne zmiany mo\u017cecie znale\u017a\u0107 <a href=\"https:\/\/github.com\/gpiechnik2\/k6-boilerplate\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >w naszym repozytorium<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-10.png\"><img decoding=\"async\" width=\"1024\" height=\"743\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-10-1024x743.png\" alt=\"Wprowadzenie logiki \" class=\"wp-image-26392\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-10-1024x743.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-10-300x218.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-10-768x557.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-10-1536x1115.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-10.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 10 Wprowadzenie logiki<\/figcaption><\/figure>\n\n\n\n<p>Po wprowadzeniu odpowiednich zmian wykonajmy poni\u017csze polecenie, aby usun\u0105\u0107 istniej\u0105ce kontenery k6, a nast\u0119pnie uruchomi\u0107 zdefiniowan\u0105 komend\u0119 z pliku package.json.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-11.png\"><img decoding=\"async\" width=\"1024\" height=\"364\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-11-1024x364.png\" alt=\"Uruchomienie zdefiniowanej komendy z pliku package.json\" class=\"wp-image-26394\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-11-1024x364.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-11-300x107.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-11-768x273.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-11.png 1186w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 11 Uruchomienie zdefiniowanej komendy z pliku package.json<\/figcaption><\/figure>\n\n\n\n<p>W ten spos\u00f3b zostanie wykonany jeden przebieg testu na wyszukiwanie artyku\u0142u na stronie. Teraz przejd\u017amy do Grafany, aby sprawdzi\u0107, czy rezultaty s\u0105 wy\u015bwietlane poprawnie.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-12.png\"><img decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-12-1024x545.png\" alt=\"Weryfikacja poprawno\u015bci wy\u015bwietle\u0144\" class=\"wp-image-26396\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-12-1024x545.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-12-300x160.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-12-768x409.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-12-1536x818.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-12-2048x1090.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 12 Weryfikacja poprawno\u015bci wy\u015bwietle\u0144<\/figcaption><\/figure>\n\n\n\n<p>Dodatkowo, w przypadku wykrycia b\u0142\u0119du, b\u0142\u0105d zostanie wy\u015bwietlony w tabeli podzielonej na dwie sekcje umieszczonej na samym dole panelu. Pierwsza sekcja grupuje i podsumowuje wykryte b\u0142\u0119dy, podczas gdy druga przedstawia te b\u0142\u0119dy bardziej szczeg\u00f3\u0142owo.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-13.png\"><img decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-13-1024x545.png\" alt=\"Wykrycie b\u0142\u0119du\" class=\"wp-image-26398\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-13-1024x545.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-13-300x160.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-13-768x409.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-13-1536x818.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/p7-attachment-13-2048x1090.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 13 Wykrycie b\u0142\u0119du<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>W artykule zg\u0142\u0119biali\u015bmy integracj\u0119 narz\u0119dzia k6 z Grafan\u0105 i InfluxDB, co <strong>stworzy\u0142o nowe mo\u017cliwo\u015bci w monitorowaniu i wizualizacji wynik\u00f3w test\u00f3w wydajno\u015bciowych<\/strong>. Dzi\u0119ki Grafanie mogli\u015bmy przygotowa\u0107 interaktywne i estetyczne wykresy na podstawie danych zgromadzonych w InfluxDB, co u\u0142atwi\u0142o analiz\u0119 wynik\u00f3w test\u00f3w.<\/p>\n\n\n\n<p>Ponadto, dowiedzieli\u015bmy si\u0119, \u017ce Docker jest doskona\u0142ym narz\u0119dziem do izolacji i wdra\u017cania kontener\u00f3w, umo\u017cliwiaj\u0105cym \u0142atw\u0105 instalacj\u0119 i uruchamianie potrzebnych narz\u0119dzi. Integracja tych technologii pozwoli\u0142a nam na zwi\u0119kszenie obserwowalno\u015bci naszych test\u00f3w wydajno\u015bciowych, co jest kluczowym elementem w budowie niezawodnych i wydajnych aplikacji.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli jeszcze nie mieli\u015bcie okazji zapozna\u0107 si\u0119 z artyku\u0142ami z serii o narz\u0119dziu k6, znajdziecie je tutaj:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-co-sklania-mnie-do-wyboru-k6\/\" target=\"_blank\" rel=\"noreferrer noopener\" class=\"ek-link\">Wydajno\u015b\u0107 pod kontrol\u0105 \u2013 co sk\u0142ania mnie do wyboru k6?<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-z-k6-nagrywanie-parametryzacja-i-uruchamianie-pierwszego-scenariusza-testowego\/\" target=\"_blank\" rel=\"noreferrer noopener\">Wydajno\u015b\u0107 pod kontrol\u0105 z k6 \u2013 nagrywanie, parametryzacja i uruchamianie pierwszego scenariusza testowego<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-z-k6-metryki-progi-jakosci-tagowanie\/\" target=\"_blank\" rel=\"noreferrer noopener\">Wydajno\u015b\u0107 pod kontrol\u0105 z k6 \u2013 metryki, progi jako\u015bci, tagowanie<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-z-k6-dodatkowe-konfiguracje-typy-modeli-scenariuszy-oraz-executorow\/\" target=\"_blank\" rel=\"noreferrer noopener\">Wydajno\u015b\u0107 pod kontrol\u0105 z k6 \u2013 dodatkowe konfiguracje, typy modeli scenariuszy oraz executor\u00f3w<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-z-k6-inicjalizacja-frameworka\/\" target=\"_blank\" rel=\"noreferrer noopener\">Wydajno\u015b\u0107 pod kontrol\u0105 z k6 \u2013 inicjalizacja frameworka<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-z-k6-dobre-praktyki-tworzenie-zbiorow-testow-i-konfiguracja\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Wydajno\u015b\u0107 pod kontrol\u0105 z k6 \u2013 dobre praktyki, tworzenie zbior\u00f3w test\u00f3w i konfiguracja<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ponadto, zach\u0119cam do zapoznania si\u0119 z&nbsp;<a href=\"https:\/\/github.com\/gpiechnik2\/k6-boilerplate\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Repozytorium projektu<\/a>.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;26364&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;2&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 2)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Wydajno\u015b\u0107 pod kontrol\u0105 z k6 \u2013 Docker oraz integracja z InfluxDB oraz Grafan\u0105&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 2)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aby w pe\u0142ni zrozumie\u0107 wydajno\u015b\u0107 systemu, konieczne jest nie tylko wykonanie test\u00f3w, ale r\u00f3wnie\u017c budowanie obserwowalno\u015bci. Integracja narz\u0119dzi trzecich staje &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/wydajnosc-pod-kontrola-z-k6-docker-oraz-integracja-z-influxdb-oraz-grafana\/\">Continued<\/a><\/p>\n","protected":false},"author":517,"featured_media":26401,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1317],"tags":[928,1701,1546,1257,1570],"class_list":["post-26364","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-testowanie","tag-grafana","tag-k6","tag-przeglad-narzedzi","tag-testy-wydajnosci","tag-tosca"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/12\/Wydajnosc-pod-kontrola-\u2013-co-sklania-mnie-do-wyboru-k6.jpg","category_names":["Testowanie"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26364"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/517"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=26364"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26364\/revisions"}],"predecessor-version":[{"id":29492,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/26364\/revisions\/29492"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/26401"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=26364"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=26364"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=26364"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}