Loki - prikupljanje trupaca korištenjem Prometheus pristupa

Pozdrav, stanovnici Khabrovsk! Uoči početka novih upisa na tečaj "DevOps prakse i alati" Za vas smo pripremili prijevod zanimljivog materijala.

Ovaj je članak kratki uvod u Lokija. Projekt Loki koju podržava Grafana a usmjeren je na centralizirano prikupljanje logova (s poslužitelja ili kontejnera).

Glavna inspiracija za Lokija bila je Prometej s idejom primjene njegovih pristupa upravljanju zapisima:

  • korištenje oznaka za pohranu podataka
  • potrošnja malo resursa

Vratit ćemo se na to kako Prometheus radi i dati ćemo neke primjere njegove upotrebe u kontekstu Kubernetesa.

Nekoliko riječi o Prometeju

Da biste u potpunosti razumjeli kako Loki radi, važno je napraviti korak unatrag i prisjetiti se malo o Prometeju.

Jedna od karakterističnih značajki Prometheusa je izdvajanje metrike iz sabirnih točaka (putem izvoznika) i njihovo pohranjivanje u TSDB (Baza podataka vremenskih serija), uz dodavanje metapodataka u obliku oznaka.

Zašto ti treba

Nedavno je Prometheus postao de facto standard u svijetu kontejnera i Kubernetesa: njegova je instalacija vrlo jednostavna, a Kubernetes klaster dolazi s izvornom krajnjom točkom za Prometheus. Prometheus također može izvući metriku iz aplikacija raspoređenih u spremniku dok pohranjuje određene oznake. Stoga je praćenje aplikacija vrlo jednostavno implementirati.

Nažalost, još uvijek ne postoji rješenje "ključ u ruke" za upravljanje zapisima, a vi morate pronaći rješenje za sebe:

  • upravljana usluga u oblaku za centraliziranje zapisa (AWS, Azure ili Google)
  • usluga nadzora “nadzor kao usluga” (na primjer, Datadog)
  • stvaranje vlastite usluge prikupljanja dnevnika.

Za treću opciju tradicionalno sam koristio Elasticsearch, unatoč činjenici da nisam uvijek bio zadovoljan njime (osobito njegovom težinom i složenošću konfiguracije).

Loki je osmišljen kako bi pojednostavio implementaciju prema sljedećim načelima:

  • biti jednostavan za početak
  • troše malo resursa
  • raditi samostalno bez posebnog održavanja
  • služe kao dodatak Prometheusu za pomoć u istraživanju grešaka

Međutim, ova jednostavnost dolazi nauštrb nekih kompromisa. Jedan od njih je ne indeksirati sadržaj. Stoga pretraživanje teksta nije vrlo učinkovito ili bogato i ne dopušta statistiku o sadržaju teksta. Ali budući da Loki želi biti ekvivalent grepu i nadopuna Prometeju, to nije nedostatak.

Istraga incidenta

Kako bismo bolje razumjeli zašto Loki ne treba indeksiranje, vratimo se na metodu istraživanja incidenta koju su Loki programeri koristili:

Loki - prikupljanje trupaca korištenjem Prometheus pristupa
1 Upozorenje → 2 Nadzorna ploča → 3 Adhoc upit → 4 Agregacija dnevnika → 5 Distribuirano praćenje → 6 Popravi!
(1 Upozorenje → 2 Nadzorna ploča → 3 Adhoc upit → 4 Agregacija dnevnika → 5 Distribuirano praćenje → 6 Popravljanje!)

Ideja je da primimo neku vrstu upozorenja (Slack Notification, SMS itd.) i nakon toga:

  • pogledajte Grafana nadzorne ploče
  • pogledajte metriku usluge (na primjer, u Prometeju)
  • pogledajte unose dnevnika (na primjer, u Elasticsearch)
  • možda pogledaj distribuirane tragove (Jaeger, Zipkin, itd.)
  • i konačno rješavanje izvornog problema.

Ovdje, u slučaju Grafana + Prometheus + Elasticsearch + Zipkin stack, morat ćete koristiti četiri različita alata. Kako biste skratili vrijeme, bilo bi lijepo moći izvesti sve ove korake pomoću jednog alata: Grafana. Vrijedno je napomenuti da je ovaj pristup istraživanju implementiran u Grafani od verzije 6. Time postaje moguće pristupiti podacima Prometheusa izravno iz Grafane.

Loki - prikupljanje trupaca korištenjem Prometheus pristupa
Zaslon Explorera podijeljen između Prometeja i Lokija

S ovog zaslona možete vidjeti Lokijeve zapisnike povezane s metrikom Prometheusa koristeći koncept podijeljenog zaslona. Od verzije 6.5, Grafana vam omogućuje raščlanjivanje id-a praćenja u unosima dnevnika Loki kako biste pratili veze na svoje omiljene alate za distribuirano praćenje (Jaeger).

Loki Loki test

Najlakši način za lokalno testiranje Lokija je korištenje docker-compose. Docker-compose datoteka nalazi se u Loki repozitoriju. Repozitorij možete dobiti pomoću sljedeće naredbe git:

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

Zatim morate otići u proizvodni direktorij:

$ cd production

Nakon ovoga možete dobiti najnoviju verziju Docker slika:

$ docker-compose pull

Konačno, Loki stog se pokreće sljedećom naredbom:

$ docker-compose up

Lokijeva arhitektura

Evo malog dijagrama s Lokijevom arhitekturom:

Loki - prikupljanje trupaca korištenjem Prometheus pristupa
Principi Lokijeve arhitekture

Web klijent pokreće aplikacije na poslužitelju, Promtail prikuplja zapise i šalje ih Lokiju, web klijent također šalje metapodatke Lokiju. Loki sve skuplja i prenosi Grafani.
Loki je lansiran. Za pregled dostupnih komponenti pokrenite sljedeću naredbu:

$ docker ps

U slučaju svježe instaliranog Dockera, naredba bi trebala vratiti sljedeći rezultat:

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

Vidimo sljedeće komponente:

  • Promtail: agent odgovoran za centralizaciju zapisa
  • Grafana: poznati alat za nadzornu ploču
  • Loki: Demon za centralizaciju podataka

Kao dio klasične infrastrukture (na primjer, temeljene na virtualnim strojevima), Promtail agent mora biti postavljen na svakom računalu. Grafana i Loki se mogu instalirati na isti stroj.

Implementacija u Kubernetes

Instaliranje Loki komponenti na Kubernetes bit će kako slijedi:

  • daemonSet za postavljanje Promtail agenta na svaki od strojeva u klasteru poslužitelja
  • Raspoređivanje Loki
  • a posljednja je implementacija Grafana.

Srećom, Loki je dostupan kao paket Helm, što ga čini jednostavnim za implementaciju.

Instalacija preko Hemla

Već ste trebali imati instaliran Heml. Može se preuzeti s GitHub repozitorija projekta. Instalira se raspakiranjem arhive koja odgovara vašoj arhitekturi i dodavanjem helma $PATH.

Napomena: nedavno je objavljena verzija 3.0.0 Helma. Budući da je bilo mnogo izmjena, čitatelju se savjetuje da pričeka malo prije nego što ga upotrijebi..

Dodavanje izvora za Helm

Prvi korak je dodavanje repozitorija "loki" pomoću sljedeće naredbe:

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

Nakon ovoga, možete pretraživati ​​pakete pod nazivom “loki”:

$ helm search loki

Rezultat:

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...

Ovi paketi imaju sljedeće značajke:

  • paket loki/loki odgovara samo Loki poslužitelju
  • paket loki/fluent-bit omogućuje vam da postavite DaemonSet koristeći fluent-bin za prikupljanje zapisa umjesto Promtail-a
  • paket loki/promtail sadrži agenta za prikupljanje datoteka dnevnika
  • paket loki/loki-stog, omogućuje vam da odmah postavite Loki zajedno s Promtailom.

Instaliranje Lokija

Za implementaciju Lokija u Kubernetes, pokrenite sljedeću naredbu u prostoru imena "monitoring":

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

Za spremanje na disk dodajte parametar --set loki.persistence.enabled = true:

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

Napomena: ako želite implementirati Grafanu u isto vrijeme, dodajte parametar --set grafana.enabled = true

Kada pokrenete ovu naredbu trebali biste dobiti sljedeći izlaz:

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.

Gledajući stanje podova u prostoru imena "monitoring", možemo vidjeti da je sve raspoređeno:

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

Rezultat:

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

Sve mahune rade. Sada je vrijeme za neke testove!

Spajanje na Grafanu

Da biste se povezali s Grafanom pod Kubernetesom, trebate otvoriti tunel do njezine jedinice. Ispod je naredba za otvaranje porta 3000 za Grafana pod:

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

Još jedna važna točka je potreba za oporavkom Grafana administratorske lozinke. Lozinka se drži u tajnosti loki-grafana na terenu .data.admin-user u formatu base64.

Da biste ga vratili, morate pokrenuti sljedeću naredbu:

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

Koristite ovu lozinku u kombinaciji sa zadanim administratorskim računom (admin).

Definiranje Loki izvora podataka u Grafani

Prije svega, provjerite je li Loki izvor podataka kreiran (Configuration/Datasource).
Evo primjera:

Loki - prikupljanje trupaca korištenjem Prometheus pristupa
Primjer postavljanja izvora podataka za Loki

Klikom na “Test” možete provjeriti vezu s Lokijem.

Upućivanje zahtjeva Lokiju

Sada idite na Grafanu u odjeljak "Istražite". Kada prima zapise iz spremnika, Loki dodaje metapodatke iz Kubernetesa. Tako je moguće vidjeti zapisnike određenog spremnika.

Na primjer, za odabir zapisnika spremnika promtaila možete upotrijebiti sljedeći upit: {container_name = "promtail"}.
Ovdje također ne zaboravite odabrati izvor podataka Loki.

Ovaj će upit vratiti aktivnost spremnika na sljedeći način:

Loki - prikupljanje trupaca korištenjem Prometheus pristupa
Rezultat upita u Grafanu

Dodaj na nadzornu ploču

Počevši od Grafane 6.4, podatke o dnevniku možete postaviti izravno na nadzornu ploču. Nakon toga, korisnik će se moći brzo prebacivati ​​između broja zahtjeva na svojoj stranici i tragova aplikacije.

Ispod je primjer nadzorne ploče koja implementira ovu interakciju:

Loki - prikupljanje trupaca korištenjem Prometheus pristupa
Primjer nadzorne ploče s Prometheusovim mjernim podacima i Loki zapisima

Budućnost Lokija

Loki sam počeo koristiti u svibnju/lipnju s verzijom 0.1. Danas je već objavljena verzija 1, pa čak i 1.1 i 1.2.

Mora se priznati da verzija 0.1 nije bila dovoljno stabilna. Ali 0.3 je već pokazao stvarne znakove zrelosti, a sljedeće verzije (0.4, zatim 1.0) samo su pojačale ovaj dojam.

Nakon 1.0.0 nitko više ne može imati izgovor da ne koristi ovaj prekrasan alat.

Daljnja poboljšanja ne bi se trebala odnositi na Loki, već njegovu integraciju s izvrsnom Grafanom. Zapravo, Grafana 6.4 već ima dobru integraciju s nadzornim pločama.

Grafana 6.5, koja je nedavno objavljena, dodatno poboljšava ovu integraciju automatskim prepoznavanjem sadržaja dnevnika u JSON formatu.

Video ispod prikazuje mali primjer ovog mehanizma:

Loki - prikupljanje trupaca korištenjem Prometheus pristupa
Korištenje Lokijevih žica izloženih u Grafani

Postaje moguće koristiti jedno od JSON polja, na primjer, za:

  • veze na vanjski alat
  • filtriranje sadržaja dnevnika

Na primjer, možete kliknuti na traceId da biste otišli na Zipkin ili Jaeger.

Kao i obično, veselimo se vašim komentarima i pozivamo vas na njih otvoreni webinar, gdje ćemo govoriti o tome kako se DevOps industrija razvijala tijekom 2019. godine i razgovarati o mogućim razvojnim putovima za 2020. godinu.

Izvor: www.habr.com