Grafana Loki
Mise à jour :
Loki est un outil open-source développé par Grafana Labs pour la gestion et l’agrégation des logs. Loki se distingue par son approche innovante qui simplifie le traitement des logs tout en réduisant les coûts et la complexité. Contrairement à d’autres solutions de gestion des logs, Loki n’indexe pas complètement le contenu des logs, ce qui le rend plus léger et plus rapide à déployer.
Ce guide est conçu pour vous aider à comprendre les concepts fondamentaux de Loki, à installer et configurer l’outil et à optimiser son utilisation dans vos environnements. Que vous soyez un administrateur système, un développeur ou un ingénieur DevOps, vous trouverez ici des informations précieuses pour améliorer la gestion des logs dans vos systèmes.
Historique de Loki
Loki a été développé par Grafana Labs et lancé pour la première fois en 2018. À cette époque, le besoin d’un système de gestion des logs léger et bien intégré aux outils de monitoring existants se faisait de plus en plus sentir. De nombreuses organisations utilisaient déjà Prometheus pour la surveillance des métriques, mais il n’existait pas de solution de logs qui soit aussi simple, économique et bien intégrée avec cet écosystème.
Loki a été directement inspiré par Prometheus, un système de monitoring et d’alerting très populaire dans la communauté DevOps. Prometheus a révolutionné la manière dont les métriques sont collectées et analysées grâce à son approche centrée sur les labels. Grafana Labs a donc décidé d’adopter une approche similaire pour la gestion des logs, en se concentrant sur les labels plutôt que sur l’indexation complète des logs.
Depuis son lancement, Loki a connu une adoption rapide grâce à sa simplicité d’utilisation et à ses coûts réduits. Les développeurs et les administrateurs système ont rapidement compris les avantages de Loki par rapport aux solutions traditionnelles de gestion des logs, comme Elasticsearch.
Fonctionnalités de Loki
Loki se distingue par une série de fonctionnalités qui le rendent particulièrement adapté à la gestion des logs dans les environnements DevOps.
Indexation des Logs Limitée
L’une des caractéristiques les plus distinctives de Loki est son approche d’indexation limitée. Contrairement aux systèmes de gestion des logs traditionnels qui indexent chaque champ des logs, Loki n’indexe que certains éléments spécifiques comme les labels. Cette méthode permet de réduire considérablement les besoins en stockage et d’améliorer les performances. Au lieu d’indexer chaque message de log, Loki utilise des labels pour organiser et rechercher les logs. Cela rend le système plus léger et rapide.
Support de Multiples Sources
Loki peut ingérer des logs provenant de multiples sources, ce qui le rend très flexible. Parmi les sources de logs supportées, on trouve :
- Kubernetes : Collecte des logs des pods Kubernetes en utilisant des outils comme Promtail ou Fluentd.
- Docker : Envoi des logs des conteneurs Docker à Loki via des drivers de log Docker.
- Fichiers Journaux Traditionnels : Ingestion des logs provenant de fichiers journaux traditionnels sur des systèmes Linux ou Windows.
- Syslog : Ingestion des messages syslog, facilitant la centralisation des logs système.
Intégration avec Grafana
Loki est parfaitement intégré à Grafana, un outil de visualisation et de surveillance bien connu. Cette intégration permet de créer des tableaux de bord interactifs pour visualiser les logs aux côtés des métriques et des traces. Les utilisateurs peuvent ajouter Loki comme source de données dans Grafana et utiliser le langage de requête LogQL pour rechercher et analyser les logs directement depuis les tableaux de bord Grafana.
Stockage Évolutif
Loki est conçu pour être évolutif et peut gérer de grandes quantités de données de logs. Il utilise des chunks pour stocker les logs, ce qui permet de réduire les coûts de stockage et d’améliorer les performances de requête. Les chunks peuvent être stockés sur différents backend de stockage, comme le système de fichiers local, AWS S3, ou Google Cloud Storage.
Sécurité et Authentification
Loki offre des options de sécurité et d’authentification pour protéger l’accès aux données de logs. Vous pouvez configurer des mécanismes d’authentification et d’autorisation pour restreindre l’accès aux logs sensibles. De plus, Loki peut être configuré pour fonctionner dans des environnements sécurisés, en utilisant des protocoles comme HTTPS pour sécuriser les communications.
Performance et Scalabilité
L’architecture de Loki est conçue pour être performante et évolutive. La séparation des logs en chunks compressés permet de gérer de grandes quantités de données sans compromettre les performances. De plus, la capacité de Loki à s’intégrer avec des systèmes de stockage évolutifs permet de répondre aux besoins croissants des environnements de production.
Concepts de Base
Avant de plonger dans l’utilisation de Loki, il est essentiel de comprendre quelques concepts clés qui forment la base de son fonctionnement. Ces concepts incluent les labels, les streams, les chunks et le processus d’ingestion et de requêtes. Chacun de ces éléments joue un rôle important dans la manière dont Loki gère et organise les logs.
Labels
Les labels sont au cœur de l’organisation des logs dans Loki. Un label
est une paire clé-valeur qui est associée à chaque flux de logs (stream).
Par exemple, un flux de logs peut avoir des labels tels que {job="app", instance="server1"}
. Les labels permettent de regrouper et de filtrer les logs
de manière efficace, facilitant ainsi les recherches et l’analyse. Les labels
doivent être définis de manière judicieuse pour maximiser l’efficacité des
requêtes.
Streams
Un stream dans Loki est une collection de logs qui partagent les mêmes
labels. En d’autres termes, un stream est défini par un ensemble unique de
labels. Par exemple, tous les logs d’une application spécifique sur un serveur
particulier peuvent être regroupés dans un stream avec des labels tels que
{job="app", instance="server1"}
. Cette organisation permet de gérer et de
requêter les logs de manière structurée et ordonnée.
Chunks
Les logs dans Loki sont stockés en chunks. Un chunk est un bloc de données compressé qui contient une série de logs. Cette méthode de stockage permet de réduire la consommation d’espace disque et d’améliorer les performances de lecture et d’écriture. Les chunks sont stockés sur différents backend de stockage, comme le système de fichiers local, AWS S3, ou Google Cloud Storage, en fonction de la configuration.
Ingestion des Logs
L’ingestion des logs dans Loki peut se faire de plusieurs manières. Les logs peuvent provenir de différentes sources comme Promtail, Fluentd, ou Logstash.
Requêtes et LogQL
Loki utilise le langage de requête LogQL pour interroger les logs. LogQL est similaire à PromQL (le langage de requête de Prometheus) et permet de filtrer et d’analyser les logs de manière efficace. Voici un exemple de requête LogQL pour rechercher des logs contenant le mot “error”:
Installation de Loki
Pour commencer à utiliser Loki, vous devez l’installer sur votre infrastructure. Loki offre plusieurs méthodes d’installation adaptées à différents environnements. Que vous utilisiez Docker, Kubernetes, ou que vous préfériez une installation classique, Loki peut s’intégrer facilement dans votre workflow.
Installation avec Docker
L’installation de Loki avec Docker est rapide et simple. Voici les étapes pour lancer Loki en tant que conteneur Docker :
-
Téléchargez et exécutez l’image Docker officielle de Loki :
-
Vous pouvez personnaliser la configuration en montant un fichier de configuration dans le conteneur. Créez un fichier
loki-config.yaml
avec votre configuration souhaitée et lancez le conteneur avec le montage du fichier de configuration :
Installation avec Kubernetes
Pour déployer Loki sur un cluster Kubernetes, vous pouvez utiliser Helm, un outil de gestion des packages Kubernetes. Voici comment procéder :
-
Ajoutez le dépôt Helm de Grafana :
-
Mettez à jour votre dépôt Helm local pour vous assurer d’avoir les dernières versions des charts :
-
Installez Loki en utilisant le chart
loki
: -
Vous pouvez personnaliser l’installation en fournissant un fichier de valeurs YAML :
Installation Classique
Pour ceux qui préfèrent une installation classique, Loki peut être téléchargé et configuré directement sur votre machine. Voici les étapes pour une installation manuelle :
-
Téléchargez le binaire de Loki depuis le site officiel ↗ et extrayez-le dans un répertoire de votre choix.
-
Créez un fichier de configuration
loki-config.yaml
. -
Lancez Loki en utilisant le fichier de configuration :
Vérification de l’installation
Après avoir installé Loki, vous pouvez vérifier qu’il fonctionne
correctement en accédant à son interface web. Ouvrez votre navigateur et allez à
l’adresse http://localhost:3100/metrics
. Vous devriez voir une page avec
diverses métriques exposées par Loki, confirmant que le service est
opérationnel.
Configuration de Loki
Configurer Loki correctement est essentiel pour tirer le meilleur parti de ses capacités de gestion des logs. Voici quelques exemples de configurations basées sur la version 2.9.8, fournies par la documentation officielle.
Voici un exemple de configuration simple permettant d’installer localement
loki
:
Section server
- http_listen_port: 3100 : Le port sur lequel Loki écoute les requêtes HTTP. Ceci permet aux utilisateurs d’interagir avec Loki via des requêtes HTTP sur le port 3100.
Section common
Le bloc common
contient des configurations partagées par plusieurs composants
de Loki :
- ring : Utilisé pour la gestion des anneaux de distribution, indispensable
pour le clustering et la répartition des données.
- instance_addr: 127.0.0.1 : Adresse de l’instance actuelle de Loki. Cela permet à Loki de savoir où il se trouve dans le réseau.
- kvstore : Type de stockage des informations d’anneau.
- store: inmemory : Utilise la mémoire pour stocker les informations de l’anneau. Cela est simple et rapide pour les petites configurations, mais ne doit pas être utilisé en production sans une solution de stockage persistante.
- replication_factor: 1 : Nombre de répliques pour chaque donnée, important pour la redondance et la résilience. Un facteur de réplication de 1 signifie qu’il n’y a pas de réplication des données.
- path_prefix: /tmp/loki : Chemin de base pour le stockage des données de Loki. Tous les fichiers de données seront stockés sous ce chemin.
Section schema_config
La configuration des schémas définit comment les logs sont indexés et stockés dans Loki.
- from: 2020-05-15 : Date à partir de laquelle cette configuration de schéma est applicable.
- store: tsdb : Type de stockage utilisé (Time Series Database).
- object_store: filesystem : Type de stockage d’objet utilisé, ici le système de fichiers.
- schema: v13 : Version du schéma utilisé.
- index :
- prefix: index_ : Préfixe utilisé pour les index.
- period: 24h : Période d’indexation, ici définie à 24 heures. Cela signifie que les index sont créés pour chaque période de 24 heures.
Section storage_config
La configuration du stockage détermine où et comment les données de logs sont stockées.
- filesystem :
- directory: /tmp/loki/chunks : Répertoire où les chunks de données de logs sont stockés. En utilisant le système de fichiers local, cela facilite les tests et les petits déploiements, mais pour des environnements de production, il est recommandé d’utiliser des solutions de stockage plus robustes comme des buckets S3.
Pour des configurations supplémentaires et des exemples détaillés, veuillez consulter la documentation officielle de Loki ↗.
Ingestion des Logs
Loki supporte plusieurs méthodes pour ingérer des logs provenant de différentes sources, telles que Promtail, Fluentd et Logstash. Dans ce guide, nous aborderons principalement l’utilisation de Promtail pour l’ingestion des logs.
Promtail est l’agent d’ingestion de logs pour Loki, similaire à ce que Prometheus est pour les métriques. Il est utilisé pour collecter les logs, les étiqueter avec les labels appropriés et les envoyer à Loki.
Installation de Promtail
Promtail peut être installé de différentes manières, y compris via Docker, Kubernetes, ou en téléchargeant le binaire directement. Voici un exemple d’installation avec Docker :
Configuration de Promtail
La configuration de Promtail se fait via un fichier YAML. Voici un exemple de configuration simpliste pour collecter des logs de conteneurs Docker et des fichiers journaux traditionnels :
- server : Configure le serveur HTTP et gRPC pour Promtail.
- http_listen_port: 9080 : Le port HTTP sur lequel Promtail écoute.
- grpc_listen_port: 0 : Le port gRPC, désactivé ici.
- positions : Fichier où Promtail stocke les positions des logs déjà
lus.
- filename: /tmp/positions.yaml : Chemin du fichier de positions.
- clients : Configuration des clients pour envoyer les logs à Loki.
- url: http://localhost:3100/loki/api/v1/push ↗ : URL de Loki où les logs sont envoyés.
- scrape_configs : Configuration de la collecte des logs.
- job_name: system : Nom du job de collecte.
- static_configs : Configuration statique pour les cibles de collecte.
- targets : Cibles de collecte, ici
localhost
. - labels : Labels appliqués aux logs collectés.
- job: varlogs : Label indiquant le job de collecte.
- path: /var/log//*.log** : Chemin des fichiers journaux à collecter.
- targets : Cibles de collecte, ici
- static_configs : Configuration statique pour les cibles de collecte.
- job_name: docker : Nom du job pour la collecte des logs Docker.
- docker_sd_configs : Configuration de la découverte automatique des
conteneurs Docker.
- host: unix:///var/run/docker.sock : Socket Docker pour la découverte des conteneurs.
- relabel_configs : Configuration pour réétiqueter les logs.
- source_labels: [__meta_docker_container_name] : Utilise le nom du conteneur Docker comme label.
- target_label: container : Applique le label
container
avec la valeur du nom du conteneur.
- docker_sd_configs : Configuration de la découverte automatique des
conteneurs Docker.
- job_name: system : Nom du job de collecte.
Vérification de l’Ingestion
Après avoir configuré et lancé votre agent d’ingestion, vous pouvez vérifier que les logs sont correctement ingérés par Loki en consultant l’interface de Grafana et en utilisant le langage de requête LogQL pour rechercher et analyser les logs.
- Ajouter Loki comme Source de Données :
- Dans le panneau de gauche, cliquez sur l’icône Gear (Configuration) puis sur Data Sources.
- Cliquez sur le bouton Add data source.
- Recherchez et sélectionnez Loki.
- Configurez les paramètres de la source de données :
- URL :
http://ip:3100
- Access :
Server
- URL :
- Cliquez sur Save & Test pour valider la configuration.
Une fois Loki ajouté comme source de données, vous pouvez créer des tableaux de bord pour visualiser les logs.
-
Créer un Nouveau Tableau de Bord :
- Cliquez sur l’icône Plus (Add) dans le panneau de gauche puis sur Dashboard.
- Cliquez sur Add new panel pour ajouter un nouveau panneau de visualisation.
-
Configurer le Panneau :
- Dans le champ Query, sélectionnez Loki comme source de données.
- Utilisez le langage de requête LogQL pour interroger les logs. Par exemple,
pour afficher tous les logs du job
varlogs
: - Vous pouvez affiner la requête en ajoutant des filtres. Par exemple, pour afficher uniquement les logs contenant le mot “error” :
- Configurez le panneau de visualisation selon vos besoins (type de graphique, intervalle de temps, etc.).
-
Enregistrer le Tableau de Bord :
- Une fois le panneau configuré, cliquez sur Apply pour enregistrer le panneau.
- Cliquez sur Save dashboard pour enregistrer le tableau de bord entier. Donnez-lui un nom et cliquez sur Save.
Langage LogQL
LogQL est le langage de requête de Loki, inspiré par PromQL de Prometheus. Il permet de filtrer, d’analyser et de manipuler les logs de manière flexible et puissante. Voici une explication détaillée de LogQL basée sur la documentation officielle.
LogQL se divise en deux types principaux de requêtes : les requêtes de log et les requêtes de métriques dérivées des logs.
Requêtes de Log
Les requêtes de log récupèrent les entrées de log brutes :
- Sélection de Labels : Les logs sont filtrés par labels, encapsulés entre
accolades
{}
. Les labels sont des paires clé-valeur.
-
Filtrage par Mot-Clé : Pour filtrer les logs contenant un certain mot ou phrase, utilisez
|=
. -
Exclusion de Mot-Clé : Pour exclure les logs contenant un certain mot ou phrase, utilisez
!=
. -
Expressions Régulières : Utilisez
|~
pour filtrer avec des expressions régulières et!~
pour exclure.
Requêtes de Métriques
Les requêtes de métriques sont utilisées pour calculer des statistiques à partir des logs :
-
Compter les Occurrences :
count_over_time
compte les entrées de log sur une période spécifiée. -
Taux de Logs :
rate
calcule le taux de logs par seconde. -
Somme, Moyenne, Min, Max : Vous pouvez utiliser
sum_over_time
,avg_over_time
,min_over_time
etmax_over_time
pour obtenir des statistiques sur les logs.
Opérateurs
Les opérateurs permettent de combiner plusieurs expressions LogQL :
-
Addition, Soustraction :
-
Division, Multiplication :
Fonctions Utiles
-
Histogramme :
histogram_over_time
crée un histogramme des valeurs sur une période. -
TopK :
topk
sélectionne les k meilleurs résultats.
Exemples Combinés
Voici quelques exemples combinant plusieurs concepts :
-
Taux d’Erreurs par Instance :
-
Comptage d’Erreurs par Instance et par Application :
-
Taux de Logs Multipliés par un Facteur :
Utilisation de logcli
logcli est un outil en ligne de commande pour interagir avec Loki. Il permet d’exécuter des requêtes LogQL et de gérer les logs directement depuis le terminal.
Installation de logcli
Pour installer logcli, vous pouvez télécharger le binaire précompilé depuis le site officiel de Loki ↗. Voici comment l’installer sur un système Unix :
Configuration de logcli
Avant d’utiliser logcli, configurez-le pour pointer vers votre instance Loki. Vous pouvez le faire en utilisant des variables d’environnement ou en fournissant les paramètres de connexion directement dans les commandes.
Exemple de configuration via des variables d’environnement :
Utilisation de base de logcli
Voici quelques commandes de base pour utiliser logcli :
Pour exécuter une requête LogQL simple et afficher les résultats dans le terminal :
Vous pouvez spécifier une plage de temps pour la requête en utilisant les
options --since
et --until
:
Pour exporter les logs dans un fichier :
Pour suivre les logs en temps réel, utilisez l’option --tail
:
logcli supporte différents formats de sortie comme json
, raw
et logfmt
:
Pour limiter le nombre de lignes de logs retournées :
Bonnes Pratiques pour Utiliser Loki et LogQL
Pour tirer le meilleur parti de Loki, il est important de suivre certaines bonnes pratiques. Voici des recommandations pour optimiser l’utilisation de Loki et assurer une gestion efficace des logs.
Utilisation des Labels
- Définissez des labels pertinents : Utilisez des labels significatifs pour organiser vos logs. Les labels doivent refléter des attributs importants comme le nom de l’application, l’environnement (prod, dev) et le niveau de journalisation (error, info).
- Évitez les labels à haute cardinalité : Des labels avec trop de valeurs uniques (comme des identifiants de requêtes) peuvent ralentir les performances. Utilisez-les avec parcimonie.
Configuration de Loki
- Optimisez la rétention des logs : Configurez une rétention des logs
appropriée pour éviter d’accumuler trop de données inutiles. Utilisez la
section
limits_config
pour définir des politiques de rétention claires. - Surveillez les ressources : Loki peut consommer beaucoup de ressources, surtout dans des environnements à haute charge. Utilisez des outils de monitoring pour surveiller l’utilisation de la mémoire et du CPU.
Sécurité
- Restreignez l’accès : Utilisez des mécanismes d’authentification et d’autorisation pour protéger l’accès à vos logs. Loki doit être configuré pour n’accepter les requêtes que des sources de confiance.
- Chiffrez les communications : Utilisez HTTPS pour sécuriser les communications entre les clients (comme Promtail) et Loki, ainsi qu’entre Loki et Grafana.
Maintenance
- Planifiez des sauvegardes régulières : Assurez-vous de sauvegarder régulièrement vos configurations et vos données de logs importantes pour prévenir la perte de données.
- Mettez à jour régulièrement : Maintenez Loki et Grafana à jour pour bénéficier des dernières fonctionnalités et corrections de bugs. Suivez les notes de version pour connaître les changements importants.
Conclusion
Loki est donc une solution puissante et flexible pour la gestion des logs, particulièrement bien adaptée aux environnements DevOps modernes. Grâce à son intégration avec Prometheus et Grafana, Loki permet de centraliser, analyser et visualiser les logs de manière efficace. En suivant les bonnes pratiques et en utilisant LogQL pour interroger les logs, vous pouvez extraire des informations précieuses et optimiser la performance de vos systèmes.