Alloy
Promtail, l'agent qui pousse les logs vers Loki, est en fin de vie depuis le 2 mars 2026 : il ne reçoit plus de correctifs. Un cluster qui collecte ses logs avec lui doit changer d'agent, et la migration ne doit casser ni les dashboards ni les requêtes qui reposent sur ses labels. Le même cluster lance souvent un agent par signal : Promtail pour les logs, des exporters pour les métriques, un OpenTelemetry Collector dès que des traces apparaissent. Grafana Alloy, le remplaçant désigné de Promtail, est une distribution de l'OpenTelemetry Collector qui collecte métriques, logs, traces et profils dans un seul processus. Cet article décrit son modèle de configuration, la collecte des logs des pods et des événements Kubernetes, et ce qu'il faut reprendre de Promtail pour une bascule sans rupture.
Un collecteur, plusieurs signaux
Alloy succède à Grafana Agent et à Promtail. Il embarque les pipelines Prometheus (découverte de cibles, relabeling, scrape, remote write) et ceux d'OpenTelemetry (récepteurs OTLP, processeurs, exportateurs) dans un même binaire. Un seul DaemonSet peut ainsi lire les fichiers de logs, scraper des métriques et recevoir les traces des applications en OTLP. Installé d'abord pour remplacer Promtail, il peut ensuite recevoir la télémétrie OpenTelemetry sans qu'un autre agent soit déployé.
Des composants reliés
La configuration s'écrit dans la syntaxe propre d'Alloy, proche de HCL. Elle déclare des composants, chacun identifié par un type et un label (loki.write "default"), avec des arguments en entrée et des exports en sortie. Un composant en référence un autre par ses exports : forward_to = [loki.write.default.receiver] branche la sortie d'un composant sur l'entrée d'un autre.
loki.source.file "pods" {
targets = local.file_match.pods.targets
forward_to = [loki.process.pods.receiver]
}
L'ensemble forme un graphe orienté, comparable à une installation de plomberie : des sources, des traitements, des sorties, reliés par des tuyaux nommés. Alloy évalue ce graphe en continu. Quand la découverte Kubernetes trouve un nouveau pod, l'export targets change et les composants qui en dépendent se mettent à jour, sans rechargement de la configuration.
Pour une configuration Promtail existante, alloy convert --source-format=promtail produit l'équivalent dans cette syntaxe. Le résultat sert de point de départ et reste à relire : il reproduit toutes les règles de l'original, y compris celles qui méritaient d'être revues.
Logs des pods : un DaemonSet
Le schéma reprend celui de Promtail : un pod Alloy par nœud lit les fichiers /var/log/pods/<namespace>_<pod>_<uid>/<conteneur>/*.log des pods de ce nœud. La chaîne compte cinq composants.
discovery.kubernetesliste les pods. Un sélecteur de champspec.nodeNameégal au nom du nœud, injecté par le chart dans la variableHOSTNAME, limite la liste aux pods locaux. Sans ce filtre, chaque instance surveillerait tous les pods du cluster et l'API server servirait autant de listes complètes qu'il y a de nœuds.discovery.relabelconstruit les labels (namespace,pod,container,app…) à partir des métadonnées__meta_kubernetes_*, et calcule le chemin__path__du fichier à partir de l'UID du pod et du nom du conteneur.local.file_matchrésout ce motif de chemin en fichiers réels.loki.source.filelit les fichiers et retient la position atteinte dans chacun.loki.processappliquestage.cri, qui décode le format écrit par containerd (horodatage, flux stdout ou stderr, lignes longues découpées en plusieurs morceaux), puisloki.writepousse vers Loki.
Une alternative, loki.source.kubernetes, lit les logs par l'API Kubernetes au lieu des fichiers. Elle évite de monter un répertoire de l'hôte, mais fait transiter tout le volume de logs par l'API server et le kubelet ; la lecture des fichiers reste la méthode la moins coûteuse pour un cluster entier.