Grafana Alloy est un collecteur de télémétrie open source qui rassemble logs, métriques et traces dans un seul agent. Bâti sur l'OpenTelemetry Collector, il remplace Promtail et le Grafana Agent, tous deux dépréciés depuis 2025. On le configure en assemblant des composants qui lisent, transforment et exportent les données.
Ce guide s'adresse aux profils débutants et intermédiaires qui veulent centraliser leur collecte, notamment vers Loki. Vous allez comprendre le modèle en composants d'Alloy, l'installer, puis collecter des fichiers de logs et les logs de conteneurs Docker vers Loki, avec des configurations testées.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre ce qu'est Alloy et ce qu'il remplace.
- Lire le modèle en composants (source, relabel, write).
- Installer Alloy avec Docker.
- Collecter des fichiers de logs vers Loki.
- Collecter les logs de conteneurs Docker en toute sécurité.
Qu'est-ce que Grafana Alloy ?
Section intitulée « Qu'est-ce que Grafana Alloy ? »Alloy est l'agent unique de collecte de l'écosystème Grafana. Auparavant, il fallait un outil par signal : Promtail pour les logs, l'exporter Prometheus pour les métriques, un agent séparé pour les traces. Alloy unifie tout cela dans un seul binaire, ce qui réduit le nombre d'agents à déployer et à maintenir.
Techniquement, Alloy est une distribution de l'OpenTelemetry Collector enrichie de composants propres à Grafana. Il parle donc OTLP nativement, tout en offrant des briques taillées pour Loki, Mimir et Tempo. C'est ce double héritage qui explique son positionnement.
Le modèle en composants
Section intitulée « Le modèle en composants »Une configuration Alloy est un graphe de composants reliés entre eux. Chaque composant fait une chose : découvrir des cibles, lire une source, transformer des labels, exporter vers un backend. On les connecte en passant la sortie de l'un à l'entrée de l'autre.
| Type de composant | Rôle | Exemples |
|---|---|---|
| discovery | Découvrir des cibles à collecter | discovery.docker, discovery.kubernetes |
| source | Lire les données | loki.source.file, loki.source.docker |
| relabel | Réécrire les labels | discovery.relabel |
| write / export | Envoyer vers un backend | loki.write, prometheus.remote_write |
Le fil conducteur est le champ forward_to : il indique à un composant vers quel récepteur envoyer ses données. C'est cette chaîne de références qui forme le pipeline, de la source jusqu'à l'export.
Installer Alloy
Section intitulée « Installer Alloy »Alloy se lance en conteneur en une commande. On lui passe un fichier de configuration via la sous-commande run, et on épingle la version pour rester reproductible.
docker run -d --name alloy \ -v "$(pwd)/config.alloy:/etc/alloy/config.alloy" \ grafana/alloy:v1.17.1 \ run /etc/alloy/config.alloyAlloy expose aussi une interface web de diagnostic sur le port 12345, pratique pour visualiser le graphe de composants et repérer un maillon en erreur. Sur une machine, un paquet .deb ou .rpm officiel installe Alloy en service systemd ; en conteneur, l'image ci-dessus suffit.
Collecter des fichiers de logs vers Loki
Section intitulée « Collecter des fichiers de logs vers Loki »Le cas le plus simple : lire des fichiers de logs et les pousser vers Loki. La configuration enchaîne trois composants, une découverte de fichiers, une source qui les lit, et une destination loki.write.
local.file_match "app" { path_targets = [{"__path__" = "/logs/*.log", "app" = "demo"}]}
loki.source.file "app" { targets = local.file_match.app.targets forward_to = [loki.write.default.receiver]}
loki.write "default" { endpoint { url = "http://loki:3100/loki/api/v1/push" }}On lance Alloy en montant la configuration et le dossier de logs à surveiller :
docker run -d --name alloy \ -v "$(pwd)/config.alloy:/etc/alloy/config.alloy" \ -v "$(pwd)/logs:/logs" \ grafana/alloy:v1.17.1 \ run /etc/alloy/config.alloyVérification : ajoutez une ligne dans un fichier .log du dossier, puis interrogez Loki. La requête {app="demo"} doit retourner votre ligne, avec le label app déclaré dans path_targets. Chaque cible peut porter ses propres labels, c'est ainsi qu'on distingue les sources dans Loki.
Collecter les logs de conteneurs Docker
Section intitulée « Collecter les logs de conteneurs Docker »En environnement conteneurisé, on ne surveille pas des fichiers mais les logs des conteneurs eux-mêmes. Alloy les découvre via le socket Docker, réécrit le nom du conteneur en label lisible, puis les lit.
discovery.docker "containers" { host = "unix:///var/run/docker.sock"}
discovery.relabel "containers" { targets = discovery.docker.containers.targets rule { source_labels = ["__meta_docker_container_name"] regex = "/(.*)" target_label = "container" }}
loki.source.docker "default" { host = "unix:///var/run/docker.sock" targets = discovery.relabel.containers.output forward_to = [loki.write.default.receiver]}
loki.write "default" { endpoint { url = "http://loki:3100/loki/api/v1/push" }}Le composant discovery.relabel est indispensable : sans lui, Alloy connaît les conteneurs mais ne pose pas le nom comme label, et vos requêtes n'ont rien à cibler. La règle transforme le méta-label __meta_docker_container_name (de la forme /mon-conteneur) en label container propre. La requête {container="mon-conteneur"} retrouve alors les logs.
Au-delà des logs : métriques et traces
Section intitulée « Au-delà des logs : métriques et traces »Alloy ne se limite pas aux logs, c'est tout son intérêt. Pour les métriques, le composant prometheus.scrape collecte des endpoints /metrics et prometheus.remote_write les envoie vers Prometheus ou Mimir. Pour les traces, un récepteur otelcol.receiver.otlp accepte l'OTLP et route vers Tempo.
Le principe reste identique : des composants source, éventuellement du relabel, puis un composant d'export, reliés par forward_to. Un même Alloy peut ainsi porter les trois signaux sur une seule configuration, ce qui en fait un remplaçant naturel de plusieurs agents.
Dépannage
Section intitulée « Dépannage »La plupart des problèmes viennent d'un composant mal relié ou d'un label manquant. L'interface web sur :12345 affiche l'état de chaque composant.
| Symptôme | Cause probable | Solution |
|---|---|---|
| Aucun log dans Loki | forward_to mal branché | Vérifier la chaîne source vers loki.write |
| Logs sans label utile | Pas de discovery.relabel | Ajouter une règle de relabel |
permission denied sur le socket | Accès Docker refusé | Passer par un socket-proxy |
| Composant en erreur | Référence inexistante | Contrôler les noms dans l'UI :12345 |
FAQ : questions fréquentes
Section intitulée « FAQ : questions fréquentes »loki.source, prometheus.scrape, loki.write). On choisit Alloy pour une intégration native à l'écosystème Grafana (Loki, Mimir, Tempo), et l'OpenTelemetry Collector amont pour rester strictement vendor-neutral.discovery.docker liste les conteneurs via le socket Docker, discovery.relabel expose le nom du conteneur comme label, et loki.source.docker lit les logs et les transmet à loki.write, qui les pousse vers Loki. Sécurisez l'accès au socket avec un socket-proxy.À retenir
Section intitulée « À retenir »- Alloy est le collecteur unifié de Grafana : logs, métriques et traces dans un seul agent.
- Il remplace Promtail et le Grafana Agent, dépréciés depuis 2025.
- La configuration est un graphe de composants reliés par
forward_to. - Pour les conteneurs Docker,
discovery.relabelest indispensable pour exposer le nom en label. - Sécurisez l'accès au socket Docker avec un socket-proxy, jamais le socket brut en production.