URL: https://linuxfr.org/news/loki-centralisation-de-logs-a-la-sauce-prometheus Title: Loki, centralisation de logs Ă la sauce Prometheus Authors: yannig ZeroHeure, BAud, palm123, Davy Defaud, Nils Ratusznik, tisaac, Ysabeau đ§¶ et BenoĂźt Sibaud Date: 2019ćčŽ08æ06æ„T12:09:16+02:00 License: CC By-SA Tags: elasticsearch, supervision, kubernetes, loki, grafana et prometheus Score: 31 Cet article est une rapide introduction Ă Loki. Ce projet est [soutenu par Grafana](https://grafana.com/oss/loki/) et a pour but de centraliser des journaux dâactivitĂ©s (serveurs ou conteneurs).  La source principale dâinspiration de Loki vient de Prometheus, avec lâidĂ©e de lâappliquer Ă la gestion des logs, le but Ă©tant de disposer du mĂȘme mĂ©canisme : - utilisation dâĂ©tiquettes (_labels_) pour le stockage des donnĂ©es ; - rĂ©clamer trĂšs peu de ressources pour son exĂ©cution. Dans ce qui va suivre, nous allons revenir sur le principe de fonctionnement de Prometheus et donner quelques exemples dâutilisation dans le cadre dâun dĂ©ploiement sous Kubernetes. ---- [DĂ©couverte de lâoutil de supervision Prometheus](https://linuxfr.org/news/decouverte-de-l-outil-de-supervision-prometheus) [Loki: Prometheusâinspired logging for cloud natives](https://grafana.com/oss/loki) [Loki: Prometheusâinspired, open source logging for cloud natives](https://grafana.com/blog/2018/12/12/loki-prometheus-inspired-open-source-logging-for-cloud-natives/) [FOSDEM 2019 â Loki: Prometheus for logs](https://archive.fosdem.org/2019/schedule/event/loki_prometheus_for_logs/) ---- Un mot sur Prometheus ===================== Afin de bien comprendre le fonctionnement de Loki, il est important de comprendre celui de Prometheus. Le lecteur est invitĂ© Ă lire une publication prĂ©cĂ©dente dans ces colonnes : « [DĂ©couverte de lâoutil de supervision Prometheus](https://linuxfr.org/news/decouverte-de-l-outil-de-supervision-prometheus) ». MĂȘme si le produit a Ă©voluĂ© entretemps (la version 2.0.0 venait de sortir), ce qui est Ă©crit reste tout Ă fait valable avec la derniĂšre version (2.14). La caractĂ©ristique de ce produit est de rĂ©cupĂ©rer des mĂ©triques en provenance de points de collecte (on parle dâexportateur) et de les stocker dans une base de donnĂ©es de type [_Time Series_](https://en.wikipedia.org/wiki/Time_series_database) en y ajoutant des mĂ©tadonnĂ©es sous forme dâĂ©tiquettes (_labels_). Origine du besoin ================= Ces derniers temps, Prometheus est devenu un standard de fait dans le monde de Kubernetes : son installation est trĂšs simple Ă rĂ©aliser et lâensemble des briques dâune grappe de serveurs Kube dispose nativement dâun _endâpoint_ Prometheus. Le moteur Prometheus est Ă©galement en mesure de rĂ©cupĂ©rer des mĂ©triques en provenance des applications dĂ©ployĂ©es dans ce type de grappe de serveurs tout en reprenant les Ă©tiquettes dĂ©finies. La surveillance des consommations applicatives est donc trĂšs simple Ă mettre en Ćuvre. Malheureusement, du cĂŽtĂ© des journaux, il nây a pas encore de mĂ©thode clĂ© en main et lâutilisateur doit trouver sa propre solution : - un service gĂ©rĂ© de centralisation des journaux dans le _cloud_ (AWS, Azure ou Google) ; - un service de supervision « _monitoring as a service_ » (type Datadog) ; - la mise en place dâun service de centralisation. Au niveau de la troisiĂšme solution, votre serviteur avait traditionnellement lâhabitude de mettre en place Elasticsearch, avec de nombreuses rĂ©serves Ă propos de ce produit, notamment sur sa lourdeur et la difficultĂ© de sa mise en place. Loki a justement Ă©tĂ© conçu dans le but de simplifier cette mise en place en rĂ©pondant aux critĂšres suivants : - ĂȘtre un produit simple Ă dĂ©marrer ; - consommer peu de ressources ; - fonctionner tout seul sans intervention de maintenance particuliĂšre ; - servir de support Ă lâinvestigation en complĂ©ment de Prometheus en cas de pĂ©pin. En revanche, cette lĂ©gĂšretĂ© se fait au prix de certains compromis. Lâun dâeux est de ne faire aucune indexation du contenu. La recherche de texte nâest donc de ce point de vue pas trĂšs performante ni trĂšs riche et ne permet pas de faire des statistiques sur le contenu du texte. Mais comme Loki se veut ĂȘtre un Ă©quivalent de `grep` et doit servir de complĂ©ment Ă Prometheus, ce dĂ©faut nâen est pas un. MĂ©thode de rĂ©solution dâincidents ================================= Pour mieux comprendre en quoi Loki nâa pas besoin dâindexation, nous allons revenir sur la mĂ©thode utilisĂ©e par les concepteurs de Loki avec le schĂ©ma suivant : _1 Alert â 2 Dashboard â 3 Adhoc Query â 4 Log Aggregation â 5 Distributed Tracing â 6 Fix!_  LâidĂ©e est de partir dâune source dâalerte (notification Slack, SMS, etc.). La personne en charge du suivi fait alors la dĂ©marche suivante : - consultation des tableaux de bord Grafana ; - consultation des mĂ©triques brutes (dans Prometheus, par exemple) ; - consultation des journaux (Elasticsearch, par exemple) ; - Ă©ventuellement, consultation des traces distribuĂ©es (Jaeger, Zipkin, etc.) ; - enfin, correction du dysfonctionnement. Ici, dans le cas dâun empilement (_stack_) Grafana + Prometheus + Elasticsearch + Zipkin, lâutilisateur devra changer quatre fois dâoutils. Afin de rĂ©duire les temps dâintervention, lâidĂ©e est de tout faire avec un seul outil : Grafana. Ă noter que Grafana propose cette notion dâexploration depuis la version 6. Il devient ainsi possible de consulter les donnĂ©es brutes de Prometheus directement depuis Grafana. Depuis cet Ă©cran, il est possible de consulter les journaux de Loki associĂ©s aux mĂ©triques de Prometheus, notamment en faisant appel Ă la notion de dĂ©coupage de lâĂ©cran. On imagine trĂšs bien quâune fois que Loki aura Ă©tĂ© correctement intĂ©grĂ© dans Grafana, la suite des travaux se fera sĂ»rement sur lâintĂ©gration de Grafana et des outils de traçage distribuĂ©s. Test de Loki en local ===================== Le plus simple pour tester Loki en local est de passer par Docker et lâoutil docker-compose. Le fichier docker-compose se trouve sur le dĂ©pĂŽt de Loki. La rĂ©cupĂ©ration du contenu de ce dĂ©pĂŽt se fait Ă lâaide de la commande _git_ suivante : ```sh git clone https://github.com/grafana/loki.git ``` Reste ensuite Ă se rendre dans le rĂ©pertoire production : ```sh cd production ``` De lĂ , il est possible de rĂ©cupĂ©rer la derniĂšre version des images Docker : ```sh docker-compose pull ``` Enfin, la pile de Loki se lance Ă lâaide de la commande suivante : ```sh docker-compose up ``` Architecture de Loki ==================== Un petit dessin valant toujours mieux quâun long discours, ciâdessous un petit schĂ©ma de principe de Loki :  _Un client Web fait tourner des applications sur le serveur, Promtail en collecte les journaux quâil envoie Ă Loki, le client Web envoie aussi des mĂ©tadonnĂ©es Ă Loki. Loki agrĂšge le tout et transmet Ă Grafana._ Loki est dĂ©marrĂ©. Afin de consulter les composants prĂ©sents, lancez la commande suivante : ```sh docker ps ``` Dans le cas dâun dĂ©mon Docker fraĂźchement installĂ©, la commande doit alors renvoyer la sortie suivante : ``` ... 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->3100/tcp production_loki_1 ``` On retrouve les briques suivantes : - Promtail : un agent qui prend en charge la centralisation des journaux (Promtail, pour _Tailing logs in Prometheus format_) ; - Grafana : le cĂ©lĂšbre outil de mise en page des donnĂ©es ; - Loki : le dĂ©mon de centralisation des donnĂ©es. Dans le cadre dâune installation sur infrastructure classique (Ă base de machines virtuelles par exemple), lâagent Promtail devra ĂȘtre dĂ©ployĂ© sur chaque machine. Grafana et Loki pourront ĂȘtre Ă©ventuellement installĂ©s sur la mĂȘme machine. DĂ©ploiement dans Kubernetes =========================== Lâinstallation des briques de Loki dans Kubernetes va sâappuyer sur les Ă©lĂ©ments suivants : - un gestionnaire de dĂ©mons (DaemonSet) pour dĂ©ployer lâagent Promtail sur chacune des machines de la grappe de serveurs ; - un dĂ©ploiement (Deployment) pour dĂ©ployer la partie Loki ; - et un dernier dĂ©ploiement pour Grafana. Par chance, Loki est disponible sous forme de paquet Helm afin de simplifier son dĂ©ploiement. Installation de Helm -------------------- Pour la suite, lâutilisateur devra disposer de la commande `helm`. Cette derniĂšre se rĂ©cupĂšre sur le [dĂ©pĂŽt GitHub](https://github.com/helm/helm/releases/tag/v2.16.1) du projet. Charge Ă lâutilisateur de dĂ©compresser lâarchive correspondant Ă lâarchitecture du poste de lâutilisateur et de placer la commande `helm` dans `$PATH`. N. B. : La version 3.0.0 de Helm vient juste de sortir. Ătant donnĂ© quâelle change beaucoup de choses, il est conseillĂ© au lecteur dâattendre un peu avant de sây mettre. Ajout de la source Helm ----------------------- La premiĂšre Ă©tape va consister Ă ajouter le dĂ©pĂŽt « loki » Ă lâaide de la commande suivante : helm repo add loki https://grafana.github.io/loki/charts Une fois cette commande lancĂ©e, il devient possible de chercher les paquets portant le nom « loki » : helm search loki Ciâdessous un exemple de rĂ©sultat renvoyĂ© : 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 gathering logs and sen... loki/promtail 0.13.1 v0.4.0 Responsible for gathering logs and sending them to Loki Ces paquets ont diffĂ©rentes fonctions : - le paquet _loki/loki_ correspond au serveur Loki seul ; - le paquet _loki/fluent-bit_ permet de dĂ©ployer un DaemonSet sâappuyant sur _fluentâbin_ pour centraliser les journaux Ă la place de Promtail ; - le paquet _loki/promtail_ contenant lâagent de centralisation des journaux dâactivitĂ©s ; - le paquet _loki/loki-stack_ permettant de dĂ©ployer Loki et Promtail en une seule fois. DĂ©ploiement de Loki ------------------- Afin de dĂ©ployer Loki dans Kubernetes, dans lâespace de noms « _monitoring_ », lancez la commande suivante : helm upgrade --install loki loki/loki-stack --namespace monitoring Pour disposer dâun espace disque persistant, ajoutez lâoption ``--set loki.persistence.enabled=true`` : helm upgrade --install loki loki/loki-stack --namespace monitoring --set loki.persistence.enabled=true Remarque : dans le cas oĂč vous souhaiteriez dĂ©ployer Grafana en mĂȘme temps, ajouter lâoption ``--set grafana.enabled=true``. Au lancement de cette commande, lâutilisateur devrait obtenir la sortie suivante : 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 http://docs.grafana.org/features/datasources/loki/ for more detail. Un coup dâĆil sur lâĂ©tat des _pods_ de lâespace de noms « _monitoring_ » achĂšvera de nous indiquer que tout est dĂ©ployĂ© : kubectl -n monitoring get pods -l release=loki Ciâdessous un exemple de rĂ©sultat renvoyĂ© : 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 Tous les _pods_ sont dĂ©marrĂ©s. Il est maintenant temps de faire quelques tests ! Connexion Ă Grafana =================== Sous Kubernetes, afin de pouvoir se connecter Ă Grafana, il est nĂ©cessaire dâouvrir un tunnel vers son pod. Ciâdessous la commande permettant dâouvrir le port 3 000 vers le _pod_ de Grafana : kubectl -n monitoring port-forward svc/loki-grafana 3000:80 Autre point important, la nĂ©cessitĂ© de rĂ©cupĂ©rer le mot de passe de lâadministrateur de Grafana. Ce dernier est stockĂ© dans le **secret** **loki-grafana** dans le champ `.data.admin-user` au format [[base64]]. Afin de le rĂ©cupĂ©rer, lancez la commande suivante : kubectl -n monitoring get secret loki-grafana --template '{{index .data "admin-password"|base64decode}}' ; echo Utilisez ce mot de passe conjointement avec le compte dâadministration par dĂ©faut (admin). DĂ©finition de la source de donnĂ©es Loki depuis Grafana ====================================================== PremiĂšre chose Ă faire, sâassurer que la source de donnĂ©es (_datasource_) de Loki est bien prĂ©sente (se rendre Ă lâemplacement suivant : _Configuration / Datasource_). Voici un exemple de dĂ©finition valide :  Un clic sur le bouton Test permettra de sâassurer que la communication avec Loki se passe bien. Interrogation du moteur Loki ============================ Rendezâvous maintenant dans le champ « Explorer » de Grafana. Au moment de lâingestion des journaux des conteneurs, Loki se charge dâajouter les annotations en provenance de Kubernetes. Il devient ainsi possible de sâen servir pour rĂ©cupĂ©rer les journaux dâun conteneur spĂ©cifique. Ainsi, pour sĂ©lectionner les journaux des conteneurs promtail, la requĂȘte Ă rentrer sera la suivante : `{container_name="promtail"}`. Pensez Ă©galement Ă bien sĂ©lectionner la source de donnĂ©es de Loki. Cette requĂȘte renverra alors lâactivitĂ© de ces conteneurs sous la forme suivante :  Inclusion dans un tableau de bord ================================= Depuis la version 6.4 de Grafana, il est possible dâinclure un extrait des journaux dans un tableau de bord Grafana. Lâutilisateur peut alors rapidement mettre en parallĂšle les courbes de frĂ©quentation de son site avec les traces renvoyĂ©es par son application. Ciâdessous un exemple de tableau de bord rĂ©alisant ce mĂ©lange :  Futur de Loki ============== Lorsque jâai commencĂ© Ă Ă©crire cet article en aoĂ»t, la version 0.3 de Loki venait Ă peine de sortir. La sortie de la version 1.0 est en quelque sorte la raison qui mâa poussĂ© Ă finir mon travail. :) Jâai commencĂ© Ă lâutiliser Ă partir de la version 0.1 et il faut bien avouer quâĂ lâĂ©poque la stabilitĂ© nâĂ©tait pas encore au rendezâvous. Globalement, la version 0.3 a apportĂ© de vrais signes de maturitĂ© et les versions suivantes (0.4, puis 1.0) nâont fait que conforter cette impression. DorĂ©navant, avec la version 1.0.0, plus personne ne devrait avoir dâexcuse pour ne pas utiliser cet excellent outil. Les travaux les plus intĂ©ressants ne devraient plus avoir lieu sur Loki mais plus sur lâintĂ©gration avec lâexcellent Grafana. En effet, la version 6.4 de Grafana a apportĂ© une bonne intĂ©gration avec les tableaux de bord. La version 6.5 qui vient juste de sortir amĂ©liore encore cette intĂ©gration en permettant de convertir automatiquement le contenu de la ligne de journal lorsquâelle est au format JSON. Ciâdessous une petite vidĂ©o prĂ©sentant ce mĂ©canisme :  Il devient aussi possible dâutiliser un des champs de la structure JSON pour par exemple : - pointer vers un outil externe ; - filtrer le contenu des journaux. On peut alors cliquer sur le champ _traceId_ afin de pointer vers un tableau de bord de Zipkin ou Jaeger.