Loki - zbieranie logów metodą Prometheusa

Salutujcie, mieszkańcy Chabrowska! W przeddzień rozpoczęcia nowych zapisów na kurs „Praktyki i narzędzia DevOps” Przygotowaliśmy dla Ciebie tłumaczenie ciekawych materiałów.

Ten artykuł jest krótkim wprowadzeniem do Lokiego. Projekt Loki wspierany przez Grafanę i ma na celu scentralizowane gromadzenie logów (z serwerów lub kontenerów).

Główną inspiracją dla Lokiego było Prometheus z pomysłem zastosowania jego podejścia do zarządzania logami:

  • używanie etykiet do przechowywania danych
  • zużycie niewielkiej ilości zasobów

Powrócimy do działania Prometheusa i podamy kilka przykładów jego użycia w kontekście Kubernetesa.

Kilka słów o Prometeuszu

Aby w pełni zrozumieć, jak działa Loki, ważne jest, aby cofnąć się o krok i przypomnieć sobie trochę o Prometeuszu.

Jedną z charakterystycznych cech Prometheusa jest ekstrakcja metryk z punktów poboru (za pośrednictwem eksporterów) i przechowywanie ich w TSDB (Baza Danych Szeregów Czasowych) z dodatkiem metadanych w postaci etykiet.

Dlaczego tego potrzebujesz

Ostatnio Prometheus stał się de facto standardem w świecie kontenerów i Kubernetesa: jego instalacja jest bardzo prosta, a klaster Kubernetes posiada natywny punkt końcowy dla Prometheusa. Prometheus może także wyodrębniać metryki z aplikacji wdrożonych w kontenerze, przechowując jednocześnie określone etykiety. Dlatego monitorowanie aplikacji jest bardzo łatwe do wdrożenia.

Niestety nadal nie ma gotowego rozwiązania do zarządzania logami i musisz znaleźć rozwiązanie dla siebie:

  • zarządzana usługa chmurowa do centralizacji logów (AWS, Azure lub Google)
  • usługa monitorowania „monitorowanie jako usługa” (na przykład Datadog)
  • utworzenie własnej usługi gromadzenia logów.

W przypadku trzeciej opcji tradycyjnie korzystałem z Elasticsearch, mimo że nie zawsze byłem z niego zadowolony (zwłaszcza jego ciężkość i złożoność konfiguracji).

Loki został zaprojektowany tak, aby uprościć wdrożenie zgodnie z następującymi zasadami:

  • być proste na początek
  • zużywają niewiele zasobów
  • pracować niezależnie, bez specjalnej konserwacji
  • służyć jako dodatek do Prometheusa, aby pomóc w badaniu błędów

Prostota ta odbywa się jednak kosztem pewnych kompromisów. Jednym z nich jest brak indeksowania treści. Dlatego wyszukiwanie tekstu nie jest zbyt wydajne ani bogate i nie pozwala na prowadzenie statystyk dotyczących zawartości tekstu. Ale skoro Loki chce być odpowiednikiem grepa i uzupełnieniem Prometeusza, nie jest to wada.

Śledztwo w sprawie wypadku

Aby lepiej zrozumieć, dlaczego Loki nie potrzebuje indeksowania, wróćmy do metody badania incydentów, którą zastosowali twórcy Lokiego:

Loki - zbieranie logów metodą Prometheusa
1 Alert → 2 Panel → 3 Zapytanie Adhoc → 4 Agregacja logów → 5 Rozproszone śledzenie → 6 Napraw!
(1 Ostrzeżenie → 2 Pulpit nawigacyjny → 3 Zapytanie Adhoc → 4 Agregacja logów → 5 Rozproszone śledzenie → 6 Naprawianie!)

Pomysł jest taki, że otrzymujemy pewnego rodzaju alert (powiadomienie o Slacku, SMS itp.), a następnie:

  • spójrz na dashboardy Grafana
  • spójrz na metryki usług (na przykład w Prometheusie)
  • spójrz na wpisy w dzienniku (na przykład w Elasticsearch)
  • może spójrz na rozproszone ślady (Jaeger, Zipkin itp.)
  • i wreszcie naprawienie pierwotnego problemu.

Tutaj w przypadku stosu Grafana + Prometheus + Elasticsearch + Zipkin będziesz musiał skorzystać z czterech różnych narzędzi. Aby skrócić czas, dobrze byłoby móc wykonać wszystkie te kroki za pomocą jednego narzędzia: Grafany. Warto zaznaczyć, że takie podejście do badań zostało zaimplementowane w Grafanie od wersji 6. Tym samym możliwy staje się dostęp do danych Prometheusa bezpośrednio z Grafany.

Loki - zbieranie logów metodą Prometheusa
Ekran Eksploratora podzielony pomiędzy Prometeusza i Lokiego

Na tym ekranie możesz przeglądać logi Lokiego powiązane z metrykami Prometheusa, korzystając z koncepcji podzielonego ekranu. Od wersji 6.5 Grafana umożliwia analizowanie identyfikatora śledzenia we wpisach dziennika Lokiego w celu podążania za łączami do ulubionych narzędzi do śledzenia rozproszonego (Jaeger).

Lokalny test Lokiego

Najłatwiejszym sposobem lokalnego przetestowania Lokiego jest użycie funkcji docker-compose. Plik docker-compose znajduje się w repozytorium Loki. Możesz pobrać repozytorium za pomocą następującego polecenia git:

$ git clone https://github.com/grafana/loki.git

Następnie musisz przejść do katalogu produkcyjnego:

$ cd production

Następnie możesz uzyskać najnowszą wersję obrazów Docker:

$ docker-compose pull

Na koniec stos Loki jest uruchamiany za pomocą następującego polecenia:

$ docker-compose up

Architektura Lokiego

Oto mały diagram z architekturą Lokiego:

Loki - zbieranie logów metodą Prometheusa
Zasady architektury Lokiego

Klient WWW uruchamia aplikacje na serwerze, Promtail zbiera logi i wysyła je do Lokiego, klient WWW wysyła także metadane do Lokiego. Loki agreguje wszystko i przekazuje Grafanie.
Loki zostaje uruchomiony. Aby wyświetlić dostępne komponenty, uruchom następującą komendę:

$ docker ps

W przypadku świeżo zainstalowanego Dockera polecenie powinno zwrócić następujący wynik:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Widzimy następujące komponenty:

  • Promtail: agent odpowiedzialny za centralizację logów
  • Grafana: słynne narzędzie do pulpitu nawigacyjnego
  • Loki: Demon centralizacji danych

W ramach klasycznej infrastruktury (np. opartej na maszynach wirtualnych) na każdej maszynie musi być wdrożony agent Promtail. Grafana i Loki mogą być zainstalowane na tej samej maszynie.

Wdrożenie na Kubernetesie

Instalacja komponentów Loki na Kubernetesie będzie następująca:

  • daemonSet do wdrażania agenta Promtail na każdym komputerze w klastrze serwerów
  • Wdrożenie Lokiego
  • a ostatnim jest wdrożenie Grafany.

Na szczęście Loki jest dostępny jako pakiet Helm, co ułatwia jego wdrożenie.

Instalacja przez Heml

Powinieneś już mieć zainstalowany Heml. Można go pobrać z repozytorium projektu GitHub. Instaluje się go poprzez rozpakowanie archiwum odpowiadającego Twojej architekturze i dodanie do niego steru $PATH.

Uwaga: Niedawno wydano wersję 3.0.0 Helma. Ponieważ wprowadzono w nim wiele zmian, zaleca się czytelnikowi chwilę poczekać przed jego użyciem..

Dodanie źródła Helma

Pierwszym krokiem jest dodanie repozytorium „loki” za pomocą następującego polecenia:

$ helm add loki https://grafana.github.io/loki/charts

Następnie możesz wyszukać pakiety o nazwie „loki”:

$ helm search loki

Wynik:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Pakiety te mają następujące funkcje:

  • pakiet Loki/Loki pasuje tylko do serwera Lokiego
  • pakiet loki/fluent-bit umożliwia wdrożenie DaemonSet przy użyciu Fluent-bin do zbierania dzienników zamiast Promtail
  • pakiet Loki/Protail zawiera agenta zbierającego pliki dziennika
  • pakiet loki/loki-stack, pozwala na natychmiastowe wdrożenie Lokiego wraz z Promtail.

Instalowanie Lokiego

Aby wdrożyć Lokiego w Kubernetes, uruchom następującą komendę w przestrzeni nazw „monitorowanie”:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

Aby zapisać na dysku, dodaj parametr --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

Uwaga: jeśli chcesz jednocześnie wdrożyć Grafanę, dodaj parametr --set grafana.enabled = true

Po uruchomieniu tego polecenia powinieneś otrzymać następujące dane wyjściowe:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Patrząc na stan podów w przestrzeni nazw „monitorowanie”, widzimy, że wszystko jest wdrożone:

$ kubectl -n monitoring get pods -l release=loki

Wynik:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

Wszystkie kapsuły działają. Teraz czas na kilka testów!

Łączenie z Grafaną

Aby połączyć się z Grafaną pod Kubernetesem, musisz otworzyć tunel do jej kapsuły. Poniżej znajduje się polecenie otwarcia portu 3000 dla kapsuły Grafana:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Kolejnym ważnym punktem jest konieczność odzyskania hasła administratora Grafana. Hasło jest utrzymywane w tajemnicy loki-grafana w terenie .data.admin-user w formacie base64.

Aby go przywrócić, musisz uruchomić następujące polecenie:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

Użyj tego hasła w połączeniu z domyślnym kontem administratora (admin).

Definiowanie źródła danych Lokiego w Grafanie

Przede wszystkim upewnij się, że zostało utworzone źródło danych Loki (Konfiguracja/Źródło danych).
Oto przykład:

Loki - zbieranie logów metodą Prometheusa
Przykład konfiguracji źródła danych dla Lokiego

Klikając „Testuj” możesz sprawdzić połączenie z Lokim.

Wysyłanie próśb do Lokiego

Teraz przejdź do Grafany, do sekcji „Eksploruj”. Odbierając logi z kontenerów, Loki dodaje metadane z Kubernetes. Dzięki temu możliwe staje się przeglądanie logów konkretnego kontenera.

Na przykład, aby wybrać dzienniki kontenera Promtail, możesz użyć następującego zapytania: {container_name = "promtail"}.
Tutaj również pamiętaj o wybraniu źródła danych Loki.

To zapytanie zwróci aktywność kontenera w następujący sposób:

Loki - zbieranie logów metodą Prometheusa
Wynik zapytania w Grafanie

Dodaj do panelu

Począwszy od Grafany 6.4, możesz umieszczać informacje z logów bezpośrednio na pulpicie nawigacyjnym. Następnie użytkownik będzie mógł szybko przełączać się pomiędzy liczbą żądań na swojej stronie a śladami aplikacji.

Poniżej znajduje się przykład dashboardu, który implementuje tę interakcję:

Loki - zbieranie logów metodą Prometheusa
Przykładowy pulpit nawigacyjny z metrykami Prometheus i dziennikami Lokiego

Przyszłość Lokiego

Zacząłem używać Lokiego w maju/czerwcu z wersją 0.1. Dziś ukazała się już wersja 1, a nawet 1.1 i 1.2.

Trzeba przyznać, że wersja 0.1 nie była wystarczająco stabilna. Jednak 0.3 wykazywał już prawdziwe oznaki dojrzałości, a kolejne wersje (0.4, potem 1.0) tylko potęgowały to wrażenie.

Po wersji 1.0.0 nikt nie będzie miał wymówki, aby nie używać tego wspaniałego narzędzia.

Dalsze ulepszenia nie powinny dotyczyć Lokiego, ale raczej jego integracji ze znakomitą Grafaną. Tak naprawdę Grafana 6.4 ma już dobrą integrację z dashboardami.

Niedawno wydana Grafana 6.5 jeszcze bardziej usprawnia tę integrację, automatycznie rozpoznając zawartość dziennika w formacie JSON.

Poniższy film pokazuje mały przykład tego mechanizmu:

Loki - zbieranie logów metodą Prometheusa
Używanie strun Lokiego ujawnionych w Grafanie

Możliwe staje się wykorzystanie jednego z pól JSON np. do:

  • linki do narzędzia zewnętrznego
  • filtrowanie zawartości dziennika

Na przykład możesz kliknąć traceId, aby przejść do Zipkin lub Jaeger.

Tradycyjnie czekamy na Wasze uwagi i zapraszamy otwarte webinarium, gdzie porozmawiamy o tym, jak rozwinęła się branża DevOps w 2019 roku i omówimy możliwe ścieżki rozwoju na rok 2020.

Źródło: www.habr.com