Loki - cullezzione di logs cù l'approcciu Prometheus

Salute, Khabrovites! In anticipazione di l'iniziu di una nova iscrizzione per u corsu "Pratiche è strumenti DevOps" preparatu una traduzzione di materiale interessante per voi.

Questu articulu hè una breve introduzione à Loki. Prughjettu Loki soutenu par Grafana è hè destinatu à a cullezzione centralizata di logs (da servitori o cuntenituri).

L'ispirazione principale per Loki era Prometheus cù l'idea di applicà i so approcci à a gestione di log:

  • usendu etichette per almacenà dati
  • bassu cunsumu di risorse

Riturnaremu à i principii di Prometheus è dà alcuni esempi di u so usu in u cuntestu di Kubernetes.

Un pocu di parolle nantu à Prometheus

Per capisce cumplettamente cumu funziona Loki, hè impurtante di fà un passu in daretu è rivisite un pocu Prometheus.

Una di e caratteristiche distintive di Prometheus hè l'estrazione di metriche da i punti di cullizzioni (via l'esportatori) è l'almacenà in una TSDB (Time Series Data Base, basa di dati di serie temporale) cù l'aghjunzione di metadata in forma di etichette.

Perchè avete bisognu

Ricertamenti, Prometheus hè diventatu u standard de facto in u mondu di cuntenituri è Kubernetes: a so installazione hè assai simplice, è un cluster Kubernetes hà inizialmente un endpoint per Prometheus. Prometheus pò ancu estrae metriche da l'applicazioni implementate in un containeru mantenendu etichette specifiche. Dunque, u monitoraghju di l'applicazione hè assai faciule da implementà.

Sfurtunatamente, ùn ci hè ancu una soluzione chiavi in ​​mano per a gestione di log, è avete da truvà una suluzione per sè stessu:

  • serviziu cloud gestitu per centralizà i log (AWS, Azure o Google)
  • serviziu di surviglianza "surveglianza cum'è serviziu" (per esempiu, Datadog)
  • criendu u vostru propiu serviziu di cullizzioni di log.

Per a terza opzione, aghju tradizionalmente utilizatu Elasticsearch, malgradu u fattu chì ùn era micca sempre felice cun ellu (in particulare a so pesanza è a cumplessità di a stallazione).

Loki hè statu cuncepitu per esse faciule da implementà secondu i seguenti principii:

  • esse faciuli di principià
  • cunsuma pocu risorse
  • travaglià indipindente senza nisun mantenimentu speciale
  • serve cum'è un add-on à Prometheus per aiutà cù investigazioni di bug

Tuttavia, sta simplicità vene à a spesa di certi cumprumessi. Unu di elli ùn hè micca di indexà u cuntenutu. Dunque, a ricerca di testu ùn hè micca assai efficace o ricca è ùn vi permette micca di mantene statistiche nantu à u cuntenutu di u testu. Ma postu chì Loki vole esse l'equivalente di grep è cumplementu di Prometheus, questu ùn hè micca un svantaghju.

Investigazione di incidente

Per capisce megliu perchè Loki ùn hà micca bisognu di indexazione, vultemu à u metudu di investigazione di incidenti utilizatu da i sviluppatori di Loki:

Loki - cullezzione di logs cù l'approcciu Prometheus
1 Alert → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fix!
(1 Avvisu → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fix!)

L'idea hè chì avemu un tipu d'alerta (Slack Notification, SMS, etc.) è dopu:

  • fighjate à i dashboards di Grafana
  • fighjate à e metriche di serviziu (per esempiu, in Prometheus)
  • fighjate à e voci di log (per esempiu, in Elasticsearch)
  • forse fighjate à e tracce distribuite (Jaeger, Zipkin, etc.)
  • è infine risolve u prublema originale.

Quì, in u casu di a pila Grafana + Prometheus + Elasticsearch + Zipkin, vi tuccherà à aduprà quattru strumenti diffirenti. Per risparmià tempu, saria bellu di pudè fà tutti issi passi cù un strumentu: Grafana. Hè nutate chì stu approcciu di ricerca hè statu implementatu in Grafana da a versione 6. Cusì, diventa pussibule accede à e dati Prometheus direttamente da Grafana.

Loki - cullezzione di logs cù l'approcciu Prometheus
A schermu di l'Explorer hè spartutu trà Prometheus è Loki

Da questa schermu, pudete vede logs in Loki ligati à e metriche di Prometheus utilizendu u cuncettu di split screen. Dapoi a versione 6.5, Grafana vi permette di analizà l'identificatore di traccia in l'entrate di log Loki per seguità i ligami à i vostri strumenti di traccia distribuiti preferiti (Jaeger).

Test locale Loki

U modu più faciule per pruvà Loki in u locu hè di utilizà docker-compose. U schedariu docker-compose hè situatu in u repository Loki. Pudete ottene u repository cù u cumandimu seguitu git:

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

Allora avete bisognu di cambià à u cartulare di produzzione:

$ cd production

Dopu quì, pudete uttene l'ultime imagine Docker:

$ docker-compose pull

Infine, a pila Loki hè iniziata cù u cumandimu seguente:

$ docker-compose up

L'architettura di Loki

Eccu un picculu diagramma cù l'architettura Loki:

Loki - cullezzione di logs cù l'approcciu Prometheus
Principi di l'architettura di Loki

U cliente web gestisce l'applicazioni nantu à u servitore, Promtail recullà logs è li manda à Loki, u cliente web manda ancu metadata à Loki. Loki aggrega tuttu è passa à Grafana.
Loki corre. Per vede i cumpunenti dispunibili, eseguite u cumandimu seguente:

$ docker ps

In u casu di un Docker di novu stallatu, u cumandamentu deve rinvià u risultatu seguente:

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

Avemu vistu i seguenti cumpunenti:

  • Promtail: agente rispunsevuli di centralizà i logs
  • Grafana: u famosu strumentu dashboard
  • Loki: daemon di centralizazione di dati

Cum'è parte di una infrastruttura classica (per esempiu, basatu nantu à e macchine virtuali), l'agente Promtail deve esse implementatu in ogni macchina. Grafana è Loki ponu esse stallati nantu à a stessa macchina.

Implementazione in Kubernetes

L'installazione di cumpunenti di Loki in Kubernetes serà a seguente:

  • daemonSet per implementà l'agente Promtail in ognuna di e macchine in u cluster di u servitore
  • Implementazione di Loki
  • è l'ultimu hè u dispiegamentu di Grafana.

Per furtuna, Loki hè dispunibule cum'è un pacchettu Helm, facendu faciule da implementà.

Installazione via Heml

Avete digià installatu Heml. Pò esse scaricatu da u repository GitHub di u prugettu. Hè stallatu estrattendu l'archiviu adattatu per a vostra architettura è aghjunghjendu u timone $PATH.

Nutate bè: A versione 3.0.0 di Helm hè stata liberata recentemente. Siccomu ci sò stati assai cambiamenti in questu, u lettore hè cunsigliatu d'aspittà un pocu prima di cumincià à aduprà..

Aghjunghjendu a fonte per Helm

U primu passu hè di aghjunghje u repository "loki" cù u cumandimu seguente:

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

Dopu quì, pudete cercà i pacchetti chjamati "loki":

$ helm search loki

Risultatu:

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

Questi pacchetti anu e seguenti caratteristiche:

  • u pacchettu loki/loki currisponde solu à u servitore Loki
  • u pacchettu loki/fluent-bit permette di implementà DaemonSet utilizendu fluent-bin per cullà logs invece di Promtail
  • u pacchettu loki/promtail cuntene un agente di cullizzioni di log
  • u pacchettu loki/loki-stack, permette di implementà immediatamente Loki inseme cù Promtail.

Installazione di Loki

Per implementà Loki à Kubernetes, eseguite u cumandimu seguitu in u spaziu di nomi "monitoring":

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

Per salvà à u discu, aghjunghje l'opzione --set loki.persistence.enabled = true:

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

Nutate bè: se vulete implementà Grafana à u stessu tempu, aghjunghje u paràmetru --set grafana.enabled = true

Quandu eseguite stu cumandamentu, duvete ottene u seguente output:

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.

Fighjendu u statu di i baccelli in u spaziu di nomi di "surveglianza", pudemu vede chì tuttu hè implementatu:

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

Risultatu:

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

Tutti i podi sò in esecuzione. Avà hè ora di fà qualchi teste!

Cunnessione à Grafana

Per cunnette à Grafana sottu Kubernetes, avete bisognu di apre un tunnel à u so pod. Eccu u cumandimu per apre u portu 3000 per un pod Grafana:

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

Un altru puntu impurtante hè a necessità di ricuperà a password di l'amministratore Grafana. A password hè tenuta secreta loki-grafana in campu .data.admin-user in formatu base64.

Per restaurà, avete bisognu di eseguisce u cumandimu seguente:

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

Aduprate sta password in cunghjunzione cù u contu amministratore predeterminatu (admin).

Definizione di a fonte di dati Loki in Grafana

Prima di tuttu, assicuratevi chì a fonte di dati Loki (Configurazione / Datasource) hè creata.
Eccu un esempiu:

Loki - cullezzione di logs cù l'approcciu Prometheus
Un esempiu di creazione di una fonte di dati per Loki

Cliccà nant'à "Test" pudete pruvà a cunnessione cù Loki.

Fendu dumande à Loki

Avà vai à Grafana è vai à a sezione "Esplora". Quandu riceve logs da cuntenituri, Loki aghjunghje metadata da Kubernetes. Cusì, diventa pussibule di vede i logs di un containeru specificu.

Per esempiu, per selezziunà i logs di cuntainer promtail, pudete aduprà a seguente dumanda: {container_name = "promtail"}.
Ùn vi scurdate di selezziunà a fonte di dati Loki ancu quì.

Questa dumanda restituverà l'attività di u containeru cusì:

Loki - cullezzione di logs cù l'approcciu Prometheus
Query result in Grafana

Aghjunghjendu à u dashboard

Partendu cù Grafana 6.4, hè pussibule di mette l'infurmazioni di log direttamente nantu à u dashboard. Dopu à quessa, l'utilizatore hà da pudè passà rapidamente trà u numeru di dumande nantu à u so situ à e tracce di l'applicazione.

Quì sottu hè un esempiu di dashboard chì implementa sta interazzione:

Loki - cullezzione di logs cù l'approcciu Prometheus
Dashboard di mostra cù metriche Prometheus è logs Loki

U futuru di Loki

Aghju cuminciatu à aduprà Loki in maghju / ghjugnu cù a versione 0.1. A versione 1 hè digià stata liberata oghje, è ancu 1.1 è 1.2.

Ci vole à ricunnosce chì a versione 0.1 ùn era micca abbastanza stabile. Ma 0.3 hà digià dimustratu veri segni di maturità, è e versioni prossime (0.4, poi 1.0) anu rinfurzatu solu sta impressione.

Dopu à 1.0.0, nimu pò avè una scusa per ùn aduprà stu strumentu maravigghiusu.

Ulteriori migliure ùn deve esse micca nantu à Loki, ma piuttostu a so integrazione cù l'eccellente Grafana. In fatti, Grafana 6.4 hà digià una bona integrazione cù dashboards.

Grafana 6.5, chì hè stata liberata pocu tempu, migliurà ancu più sta integrazione ricunnosce automaticamente u cuntenutu di i logs in formatu JSON.

U video sottu mostra un picculu esempiu di stu mecanismu:

Loki - cullezzione di logs cù l'approcciu Prometheus
Utilizà e stringhe Loki resi in Grafana

Diventa pussibule di utilizà unu di i campi JSON, per esempiu, per:

  • ligami à un strumentu esternu
  • filtru di cuntenutu log

Per esempiu, pudete cliccà nantu à traceId per andà in Zipkin o Jaeger.

Cum'è di solitu, aspittemu i vostri cumenti è vi invitamu webinar apertu, induve parleremu di cumu si sviluppau l'industria DevOps durante u 2019 è discuteremu pussibuli percorsi di sviluppu per 2020.

Source: www.habr.com