Loki - collecte de journaux Ă  l'aide de l'approche Prometheus

Salut, Khabrovites! En prévision du début d'un nouvel ensemble pour le cours DevOps Practices and Tools, nous avons préparé pour vous une traduction de matériel intéressant.





Cet article est une brÚve introduction à Loki. Le projet Loki est soutenu par Grafana et vise à collecter de maniÚre centralisée les journaux (à partir de serveurs ou de conteneurs).

La principale source d'inspiration pour Loki était Prometheus avec l'idée d'appliquer ses approches de gestion des journaux:

  • utilisation d'Ă©tiquettes (Ă©tiquettes) pour le stockage des donnĂ©es
  • faible consommation de ressources

Nous reviendrons sur les principes de Prométhée et donnerons quelques exemples de son utilisation dans le cadre de Kubernetes.

Quelques mots sur Prométhée


Pour bien comprendre comment fonctionne Loki, il est important de prendre du recul et de rappeler un peu Prometheus.

L'une des caractéristiques distinctives de Prometheus est l'extraction des métriques des points de collecte (via les exportateurs) et leur stockage dans TSDB (Time Series Data Base, base de données des séries chronologiques) avec l'ajout de métadonnées sous forme d'étiquettes.

Pourquoi est-ce nécessaire


RĂ©cemment, Prometheus est devenu la norme de facto dans le monde des conteneurs et de Kubernetes: son installation est trĂšs simple et le cluster Kubernetes a initialement un point de terminaison pour Prometheus. Prometheus peut Ă©galement rĂ©cupĂ©rer des mĂ©triques Ă  partir d'applications dĂ©ployĂ©es dans un conteneur, tout en conservant certaines balises. Par consĂ©quent, la surveillance des applications est trĂšs facile Ă  mettre en Ɠuvre.

Malheureusement, il n'y a toujours pas de solution clĂ© en main pour la gestion des journaux, et vous devez trouver une solution pour vous-mĂȘme:

  • service cloud gĂ©rĂ© pour centraliser les journaux (AWS, Azure ou Google)
  • surveillance en tant que service de surveillance de service (par exemple, Datadog)
  • crĂ©er votre propre service de collecte de journaux.

Pour la troisiÚme option, j'utilisais traditionnellement Elasticsearch, malgré le fait que je n'étais pas toujours satisfait de cela (en particulier sa gravité et la complexité des paramÚtres).

Loki a Ă©tĂ© conçu pour simplifier la mise en Ɠuvre conformĂ©ment aux principes suivants:

  • ĂȘtre facile Ă  dĂ©marrer
  • consommer peu de ressources
  • travailler indĂ©pendamment sans aucun entretien particulier
  • complĂ©ter Prometheus pour aider Ă  enquĂȘter sur les bugs

Cependant, cette simplicitĂ© est obtenue grĂące Ă  certains compromis. L'un d'eux n'est pas d'indexer le contenu. Par consĂ©quent, la recherche de texte n'est pas trĂšs efficace ou riche et ne permet pas de statistiques sur le contenu du texte. Mais puisque Loki veut ĂȘtre l'Ă©quivalent de grep et complĂ©ter le PromĂ©thĂ©e, ce n'est pas un dĂ©faut.

EnquĂȘte d'incident


Pour mieux comprendre pourquoi Loki n'a pas besoin d'indexation, revenons Ă  la mĂ©thode d'enquĂȘte d'incident utilisĂ©e par les dĂ©veloppeurs Loki:


1 alerte → 2 tableau de bord → 3 requĂȘte ad hoc → 4 agrĂ©gation de journaux → 5 suivi distribuĂ© → 6 correctif!
(1 avertissement → 2 tableaux de bord → 3 requĂȘtes ad hoc → 4 agrĂ©gation de journaux → 5 suivi distribuĂ© → 6 correction!)


L'idée est que nous recevions une alerte (Slack Notification, SMS, etc.) et aprÚs cela:

  • Grafana
  • (, Prometheus)
  • (, Elasticsearch)
  • , (Jaeger, Zipkin .)
  • , , .

Ici, dans le cas de la pile Grafana + Prometheus + Elasticsearch + Zipkin, vous devrez utiliser quatre outils différents. Pour réduire le temps, ce serait bien de pouvoir effectuer toutes ces étapes avec un seul outil: Grafana. Il est à noter que cette approche de la recherche est implémentée dans Grafana depuis la version 6. Ainsi, il devient possible d'accéder aux données Prometheus directement depuis Grafana.


Écran Explorateur divisĂ© entre Prometheus et Loki

Sur cet Ă©cran, vous pouvez afficher les journaux Loki liĂ©s aux mĂ©triques Prometheus en utilisant le concept d'Ă©cran partagĂ©. À partir de la version 6.5, Grafana vous permet de traiter l'identifiant de trace dans les entrĂ©es du journal Loki pour suivre les liens vers vos outils de suivi distribuĂ©s prĂ©fĂ©rĂ©s (Jaeger).

Test local de Loki


La façon la plus simple de tester Loki localement consiste à utiliser Docker-compose. Le fichier docker-compose se trouve dans le référentiel Loki. Vous pouvez obtenir le référentiel à l'aide de la commande suivante git:

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


Ensuite, vous devez aller dans le répertoire de production:

$ cd production

AprĂšs cela, vous pouvez obtenir la derniĂšre version des images Docker:

$ docker-compose pull

Enfin, la pile Loki est lancée avec la commande suivante:

$ docker-compose up

Architecture de Loki


Voici un petit diagramme avec l'architecture Loki:


Principes de l'architecture Loki Le

client Web lance des applications sur le serveur, Promtail collecte les journaux et les envoie à Loki, le client Web envoie également des métadonnées à Loki. Loki agrÚge tout et le transfÚre à Grafana.
Loki est opérationnel. Pour afficher les composants disponibles, exécutez la commande suivante:

$ docker ps


Dans le cas d'un Docker fraßchement installé, la commande doit renvoyer le résultat suivant:

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

Nous voyons les composants suivants:

  • Promtail: agent de centralisation des journaux
  • Grafana: un cĂ©lĂšbre outil de tableau de bord
  • Loki: un dĂ©mon de centralisation des donnĂ©es

Dans le cadre d'une infrastructure classique (basĂ©e par exemple sur des machines virtuelles), un agent Promtail doit ĂȘtre dĂ©ployĂ© sur chaque machine. Grafana et Loki peuvent ĂȘtre installĂ©s sur la mĂȘme machine.

DĂ©ploiement de Kubernetes


L'installation des composants Loki sur Kubernetes se fera comme suit:

  • daemonSet pour dĂ©ployer l'agent Promtail sur chaque machine d'un cluster de serveurs
  • DĂ©ploiement Loki
  • et enfin, le dĂ©ploiement de Grafana.

Heureusement, Loki est disponible sous forme de package Helm, ce qui facilite son déploiement.

Installation via Helm


Helm doit dĂ©jĂ  ĂȘtre installĂ©. Il peut ĂȘtre tĂ©lĂ©chargĂ© Ă  partir du rĂ©fĂ©rentiel GitHub du projet. Il est installĂ© en dĂ©compressant l'archive qui correspond Ă  votre architecture et en ajoutant Helm $PATH.

Remarque: Helm version 3.0.0 a été récemment publiée. Comme il y avait beaucoup de changements, il est conseillé au lecteur d'attendre un peu avant de l'utiliser en premier .


Ajout d'une source pour Helm


La premiÚre étape consiste à ajouter le référentiel «loki» avec la commande suivante:

$ helm add loki https://grafana.imtqy.com/loki/charts

AprÚs cela, vous pouvez rechercher des packages nommés «loki»:

$ helm search loki

RĂ©sultat:

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

Ces packages ont les fonctionnalités suivantes:

  • Le package loki / loki ne correspond qu'au serveur Loki
  • Le package loki / fluent-bit vous permet de dĂ©ployer DaemonSet Ă  l'aide de fluent-bin pour collecter les journaux au lieu de Promtail
  • le package loki / promtail contient les fichiers journaux d'un agent de collecte
  • Le package loki / loki-stack vous permet de dĂ©ployer immĂ©diatement Loki avec Promtail.

Installation de Loki


Pour déployer Loki sur Kubernetes, exécutez la commande suivante dans l'espace de noms «monitoring»:

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

Pour enregistrer sur le disque, ajoutez l'option --set loki.persistence.enabled = true:

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

Remarque: si vous souhaitez dĂ©ployer Grafana en mĂȘme temps, ajoutez le paramĂštre--set grafana.enabled = true

Lorsque vous exécutez cette commande, vous devez 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 <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

En regardant l'état des foyers dans l'espace de noms «monitoring», nous verrons que tout est étendu:

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

RĂ©sultat:

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 fonctionnent. Il est maintenant temps de faire quelques tests!

Connectez-vous Ă  Grafana


Pour vous connecter Ă  Grafana sous Kubernetes, vous devez ouvrir un tunnel vers le bas. Voici la commande pour ouvrir le port 3000 pour le foyer Grafana:

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

Un autre point important est la nécessité de récupérer le mot de passe administrateur Grafana. Le mot de passe est gardé secret loki-grafanadans un champ .data.admin-userau format base64.

Pour le restaurer, vous devez exécuter la commande suivante:

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

Utilisez ce mot de passe avec le compte administrateur par défaut (admin).

Définition d'une source de données Loki dans Grafana


Tout d'abord, assurez-vous que la source de données Loki (Configuration / Datasource) est créée.
Voici un exemple:


Exemple de configuration d'une source de données pour Loki

En cliquant sur «Test», vous pouvez vérifier la connexion avec Loki.

Faire des demandes Ă  Loki


Allez maintenant à la section «Explore» de Grafana. Lors de la réception de journaux de conteneurs, Loki ajoute des métadonnées de Kubernetes. Ainsi, il devient possible d'afficher les journaux d'un conteneur spécifique.

: Par exemple, la promtail de requĂȘte suivante doit ĂȘtre utilisĂ©e pour sĂ©lectionner les journaux de conteneur {container_name = "promtail"}.
Assurez-vous également de sélectionner votre source de données Loki ici.

Cette demande renverra l'activité des conteneurs comme suit:


Le résultat de la demande à Grafana

Ajout au tableau de bord


À partir de Grafana 6.4, vous pouvez mettre des informations sur les journaux directement sur le tableau de bord. AprĂšs cela, l'utilisateur pourra basculer rapidement entre le nombre de requĂȘtes sur son site et les traces de l'application.

Voici un exemple de tableau de bord qui implémente cette interaction: Un


exemple de tableau de bord avec les métriques Prometheus et les journaux Loki

Future loki


J'ai commencĂ© Ă  utiliser Loki en mai / juin avec la version 0.1. Aujourd'hui, la version 1 est dĂ©jĂ  sortie, et mĂȘme 1.1 et 1.2.

Certes, la version 0.1 n'était pas assez stable. Mais 0,3 montre déjà de réels signes de maturité, et les prochaines versions (0,4, puis 1,0) ne font que renforcer cette impression.

AprĂšs 1.0.0, personne ne peut avoir aucune excuse pour ne pas utiliser ce merveilleux outil.

De nouvelles améliorations ne devraient pas concerner Loki, mais plutÎt son intégration avec l'excellent Grafana. En fait, Grafana 6.4 a déjà une bonne intégration avec les tableaux de bord.

Grafana 6.5, qui a été publié récemment, améliore encore cette intégration en reconnaissant automatiquement le contenu des journaux au format JSON.

La vidéo suivante montre un petit exemple de ce mécanisme:


Utilisation des chaßnes Loki affichées dans Grafana

Il devient possible d'utiliser l'un des champs JSON, par exemple, pour:

  • liens d'outils externes
  • filtrage du contenu du journal

Par exemple, vous pouvez cliquer sur traceId pour accéder à Zipkin ou Jaeger.

Traditionnellement, nous attendons vos commentaires et nous vous invitons Ă  un webinaire ouvert , oĂč nous parlerons de l'Ă©volution de l'industrie DevOps en 2019 et discuterons des pistes de dĂ©veloppement possibles pour 2020.

Source: https://habr.com/ru/post/undefined/


All Articles