1. Introduction aux Composants Alloy #
Les composants sont les briques de base de tout pipeline Grafana Alloy. Chaque bloc de configuration dans un fichier `.river` définit un composant. Ces composants sont interconnectés pour former un graphe de traitement de données (DAG), où la sortie (export) d'un composant sert d'entrée (argument) à un autre.
2. Composants `loki` #
Composants dédiés à la collecte, au traitement et à l'envoi de logs vers Grafana Loki.
loki.source.file #
Lit les nouvelles lignes (tail) de fichiers locaux. C'est l'équivalent de Promtail.
Exemple de configuration :
loki.source.file "default" {
targets = local.file_match.logs.targets
forward_to = [loki.write.local.receiver]
}loki.source.journal #
Lit les logs directement depuis le journal systemd (journald) sur les systèmes Linux.
Exemple de configuration :
loki.source.journal "default" {
forward_to = [loki.write.local.receiver]
}loki.source.docker #
Lit les logs directement depuis le daemon Docker.
Exemple de configuration :
loki.source.docker "default" {
host = "unix:///var/run/docker.sock"
targets = discovery.docker.local.targets
forward_to = [loki.write.local.receiver]
}loki.source.kubernetes #
Lit les logs des pods d'un cluster Kubernetes.
Exemple de configuration :
loki.source.kubernetes "default" {
targets = discovery.kubernetes.pods.targets
forward_to = [loki.write.local.receiver]
}loki.source.syslog #
Agit comme un serveur Syslog pour recevoir des logs envoyés sur le réseau.
Exemple de configuration :
loki.source.syslog "default" {
listener {
address = "0.0.0.0:514"
protocol = "tcp"
}
forward_to = [loki.write.local.receiver]
}loki.source.windowsevent #
Collecte les événements du journal d'événements Windows.
Exemple de configuration :
loki.source.windowsevent "default" {
eventlog_name = "Application"
forward_to = [loki.write.local.receiver]
}loki.source.kafka #
Consomme des messages depuis un ou plusieurs topics Kafka.
Exemple de configuration :
loki.source.kafka "default" {
brokers = ["kafka:9092"]
topics = ["logs"]
forward_to = [loki.write.local.receiver]
}loki.source.gcplog #
Récupère les logs depuis Google Cloud Logging.
Exemple de configuration :
loki.source.gcplog "default" {
project_id = "my-project"
subscription = "my-sub"
forward_to = [loki.write.local.receiver]
}loki.source.podlogs #
Collecte les logs des pods Kubernetes en utilisant l'API native kubelet podLogs (alternative moderne à `loki.source.kubernetes`).
Exemple de configuration :
loki.source.podlogs "default" {
targets = discovery.kubernetes.pods.targets
forward_to = [loki.write.local.receiver]
}loki.source.api #
Reçoit des logs directement via une API HTTP basique.
Exemple de configuration :
loki.source.api "default" {
http {
listen_address = "0.0.0.0:9999"
}
forward_to = [loki.write.local.receiver]
}loki.source.cloudflare #
Agit comme un serveur HTTP pour recevoir les logs envoyés par Cloudflare Logpush.
Exemple de configuration :
loki.source.cloudflare "default" {
listen_address = "0.0.0.0:8080"
forward_to = [loki.write.local.receiver]
}loki.source.awsfirehose #
Reçoit les logs poussés par AWS Kinesis Data Firehose.
Exemple de configuration :
loki.source.awsfirehose "default" {
http {
listen_address = "0.0.0.0:8080"
}
forward_to = [loki.write.local.receiver]
}loki.source.azure_event_hubs #
Consomme des logs depuis un Azure Event Hub.
Exemple de configuration :
loki.source.azure_event_hubs "default" {
fully_qualified_namespace = "my-namespace.servicebus.windows.net"
event_hub = "my-hub"
forward_to = [loki.write.local.receiver]
}loki.process #
Applique une série d'étapes de traitement (stages) pour parser, transformer ou filtrer les logs (ex: parser du JSON, extraire des labels avec une regex).
Exemple de configuration :
loki.process "default" {
forward_to = [loki.write.local.receiver]
stage.json {
expressions = { "level" = "level" }
}
}loki.relabel #
Modifie les labels d'un flux de logs avant de l'envoyer à Loki.
Exemple de configuration :
loki.relabel "default" {
forward_to = [loki.write.local.receiver]
rule {
action = "keep"
source_labels = ["app"]
regex = "myapp"
}
}loki.write #
Envoie les logs traités vers une instance Grafana Loki.
Exemple de configuration :
loki.write "local" {
endpoint {
url = "http://loki:3100/loki/api/v1/push"
}
}3. Composants `prometheus` #
Composants pour le scraping, le traitement et l'envoi de métriques au format Prometheus.
prometheus.scrape #
Scrape (collecte) les métriques d'un ou plusieurs endpoints HTTP au format Prometheus.
Exemple de configuration :
// Scrape une cible statique toutes les 15 secondes
prometheus.scrape "default" {
targets = [{"__address__" = "localhost:9090"}]
forward_to = [prometheus.remote_write.mimir.receiver]
scrape_interval = "15s"
}prometheus.relabel #
Ré-étiquette (relabel) les métriques avant leur ingestion.
Exemple de configuration :
prometheus.relabel "default" {
forward_to = [prometheus.remote_write.local.receiver]
rule {
action = "drop"
source_labels = ["__name__"]
regex = "up"
}
}prometheus.remote_write #
Envoie les métriques collectées vers un backend compatible Prometheus Remote Write (comme Mimir, Thanos ou VictoriaMetrics).
Exemple de configuration :
prometheus.remote_write "local" {
endpoint {
url = "http://mimir:9009/api/v1/push"
}
}prometheus.receive_http #
Agit comme un endpoint qui accepte les requêtes `remote_write` d'autres agents Prometheus.
Exemple de configuration :
prometheus.receive_http "default" {
forward_to = [prometheus.remote_write.local.receiver]
}prometheus.rule #
Évalue des règles d'enregistrement (recording rules) ou d'alerting Prometheus.
Exemple de configuration :
prometheus.rule "default" {
rule_path = "/etc/alloy/rules"
forward_to = [prometheus.alertmanager.local.receiver]
}prometheus.alertmanager #
Gère le cycle de vie des alertes (groupage, inhibition, routage) générées par `prometheus.rule`.
Exemple de configuration :
prometheus.alertmanager "local" {
endpoints = ["http://alertmanager:9093"]
}prometheus.exporter.unix #
Collecte les métriques d'un système Linux ou Unix (équivalent de `node_exporter`).
Exemple de configuration avec le module textfile :
// Active l'exportateur unix avec des collecteurs spécifiques
prometheus.exporter.unix "default" {
enable_collectors = ["cpu", "meminfo", "textfile"]
// Configure le dossier pour le module textfile
textfile {
directory = "/var/lib/node_exporter/textfile_collector"
}
}prometheus.exporter.windows #
Collecte les métriques d'un système Windows (équivalent de `windows_exporter`).
Exemple de configuration :
prometheus.exporter.windows "default" {
enable_collectors = ["cpu", "cs", "logical_disk"]
}prometheus.exporter.blackbox #
Sonde des endpoints (HTTP, TCP, ICMP) pour des tests de disponibilité.
Exemple de configuration :
prometheus.exporter.blackbox "default" {
config_file = "/etc/blackbox.yml"
targets = [{
name = "example.com",
address = "https://example.com"
}]
}prometheus.exporter.consul #
Expose les métriques de santé d'un cluster Consul.
Exemple de configuration :
prometheus.exporter.consul "default" {
server = "http://localhost:8500"
}prometheus.exporter.postgres #
Collecte les métriques d'une base de données PostgreSQL.
Exemple de configuration :
prometheus.exporter.postgres "default" {
data_source_names = ["postgresql://user:pass@localhost:5432/db?sslmode=disable"]
}prometheus.exporter.mysql #
Collecte les métriques d'une base de données MySQL ou MariaDB.
Exemple de configuration :
prometheus.exporter.mysql "default" {
data_source_name = "user:pass@(localhost:3306)/"
}prometheus.exporter.self #
Expose les métriques de santé et de performance internes de Grafana Alloy lui-même.
Exemple de configuration :
// Active l'exportateur interne d'Alloy
prometheus.exporter.self "default" {}
// Scrape les métriques générées par l'exportateur interne
prometheus.scrape "scrape_alloy" {
targets = prometheus.exporter.self.default.targets
forward_to = [prometheus.remote_write.mimir.receiver]
}prometheus.exporter.redis #
Collecte les métriques d'une instance Redis.
Exemple de configuration :
prometheus.exporter.redis "default" {
redis_addr = "redis:6379"
}prometheus.exporter.elasticsearch #
Collecte les métriques d'un cluster Elasticsearch.
Exemple de configuration :
prometheus.exporter.elasticsearch "default" {
address = "http://elasticsearch:9200"
}prometheus.exporter.mongodb #
Collecte les métriques d'un serveur MongoDB.
Exemple de configuration :
prometheus.exporter.mongodb "default" {
mongodb_uri = "mongodb://user:pass@mongodb:27017"
}prometheus.exporter.kafka #
Collecte les métriques d'un cluster Apache Kafka.
Exemple de configuration :
prometheus.exporter.kafka "default" {
kafka_uris = ["kafka:9092"]
}prometheus.exporter.memcached #
Collecte les métriques d'un serveur Memcached.
Exemple de configuration :
prometheus.exporter.memcached "default" {
address = "memcached:11211"
}prometheus.exporter.snmp #
Collecte des métriques depuis des équipements réseau en utilisant le protocole SNMP.
Exemple de configuration :
prometheus.exporter.snmp "default" {
targets = [{
name = "router",
address = "192.168.1.1",
module = "if_mib"
}]
}prometheus.exporter.cadvisor #
Expose des métriques sur les conteneurs en cours d'exécution (utilisation CPU, mémoire, cgroups).
Exemple de configuration :
prometheus.exporter.cadvisor "default" {
docker_host = "unix:///var/run/docker.sock"
}prometheus.exporter.github #
Collecte les métriques de dépôts et d'actions GitHub.
Exemple de configuration :
prometheus.exporter.github "default" {
api_token = sys.env("GITHUB_TOKEN")
repositories = ["grafana/alloy"]
}4. Composants `prometheus.operator` #
Composants permettant d'interagir nativement avec les Custom Resources (CRDs) du Prometheus Operator dans Kubernetes.
prometheus.operator.podmonitors #
Découvre et scrape automatiquement les cibles définies via la Custom Resource (CRD) PodMonitor de Kubernetes.
Exemple de configuration :
prometheus.operator.podmonitors "default" {
forward_to = [prometheus.remote_write.mimir.receiver]
}prometheus.operator.servicemonitors #
Découvre et scrape les cibles définies via la Custom Resource ServiceMonitor.
Exemple de configuration :
prometheus.operator.servicemonitors "default" {
forward_to = [prometheus.remote_write.mimir.receiver]
}prometheus.operator.probes #
Découvre et exécute les vérifications Blackbox définies via la Custom Resource Probe.
Exemple de configuration :
prometheus.operator.probes "default" {
forward_to = [prometheus.remote_write.mimir.receiver]
}5. Composants `otelcol` (OpenTelemetry) #
Composants issus de l'OpenTelemetry Collector, permettant une interopérabilité totale avec l'écosystème OTLP.
otelcol.receiver.otlp #
Accepte des métriques, logs et traces via le protocole natif OpenTelemetry (gRPC ou HTTP).
Exemple de configuration :
otelcol.receiver.otlp "default" {
grpc { endpoint = "0.0.0.0:4317" }
http { endpoint = "0.0.0.0:4318" }
output {
metrics = [otelcol.processor.batch.default.input]
}
}otelcol.receiver.jaeger #
Accepte des traces au format Jaeger.
Exemple de configuration :
otelcol.receiver.jaeger "default" {
protocols {
grpc { endpoint = "0.0.0.0:14250" }
}
output {
traces = [otelcol.processor.batch.default.input]
}
}otelcol.receiver.zipkin #
Accepte des traces au format Zipkin.
Exemple de configuration :
otelcol.receiver.zipkin "default" {
endpoint = "0.0.0.0:9411"
output {
traces = [otelcol.processor.batch.default.input]
}
}otelcol.receiver.kafka #
Consomme des données de télémétrie depuis un topic Kafka.
Exemple de configuration :
otelcol.receiver.kafka "default" {
brokers = ["kafka:9092"]
protocol_version = "2.0.0"
output {
logs = [otelcol.processor.batch.default.input]
}
}otelcol.receiver.filelog #
Lit des logs depuis des fichiers locaux (similaire à `loki.source.file` mais au format OTLP).
Exemple de configuration :
otelcol.receiver.filelog "default" {
include = ["/var/log/*.log"]
output {
logs = [otelcol.processor.batch.default.input]
}
}otelcol.receiver.prometheus #
Accepte des requêtes `remote_write` au format Prometheus.
Exemple de configuration :
otelcol.receiver.prometheus "default" {
output {
metrics = [otelcol.processor.batch.default.input]
}
}otelcol.processor.attributes #
Ajoute, modifie ou supprime des attributs sur les données de télémétrie.
Exemple de configuration :
otelcol.processor.attributes "default" {
action {
action = "insert"
key = "env"
value = "prod"
}
output {
traces = [otelcol.exporter.otlp.default.input]
}
}otelcol.processor.batch #
Regroupe les données en lots (batches) avant de les envoyer, pour optimiser le débit réseau.
Exemple de configuration :
otelcol.processor.batch "default" {
timeout = "1s"
send_batch_size = 1000
output {
metrics = [otelcol.exporter.otlp.default.input]
}
}otelcol.processor.memory_limiter #
Empêche Alloy de consommer trop de mémoire en cas de surcharge.
Exemple de configuration :
otelcol.processor.memory_limiter "default" {
check_interval = "1s"
limit_mib = 1000
output {
metrics = [otelcol.processor.batch.default.input]
}
}otelcol.processor.tail_sampling #
Échantillonne les traces en se basant sur des politiques (ex: ne garder que les traces en erreur).
Exemple de configuration :
otelcol.processor.tail_sampling "default" {
policy {
name = "errors"
type = "status_code"
status_code { status_codes = ["ERROR"] }
}
output {
traces = [otelcol.exporter.otlp.default.input]
}
}otelcol.processor.transform #
Applique des transformations puissantes aux données de télémétrie en utilisant le langage OTTL (OpenTelemetry Transform Language).
Exemple de configuration :
otelcol.processor.transform "default" {
error_mode = "ignore"
trace_statements = [
"set(resource.attributes[\"env\"], \"prod\")"
]
output {
traces = [otelcol.exporter.otlp.default.input]
}
}otelcol.processor.resourcedetection #
Détecte automatiquement les informations sur l'environnement d'exécution (Cloud provider, OS, Kubernetes) et les ajoute comme attributs.
Exemple de configuration :
otelcol.processor.resourcedetection "default" {
detectors = ["env", "system"]
output {
traces = [otelcol.exporter.otlp.default.input]
}
}otelcol.processor.probabilistic_sampler #
Échantillonne les traces avec une probabilité fixe, utile pour réduire le volume de données à grande échelle.
Exemple de configuration :
otelcol.processor.probabilistic_sampler "default" {
sampling_percentage = 10
output {
traces = [otelcol.exporter.otlp.default.input]
}
}otelcol.exporter.otlp #
Envoie des données de télémétrie à un backend compatible OTLP over gRPC (Port par défaut : 4317).
Exemple de configuration :
otelcol.exporter.otlp "default" {
client {
endpoint = "tempo:4317"
}
}otelcol.exporter.otlphttp #
Envoie des données de télémétrie à un backend compatible OTLP over HTTP (Port par défaut : 4318).
Exemple de configuration :
otelcol.exporter.otlphttp "default" {
client {
endpoint = "http://mimir:8080/otlp"
}
}otelcol.exporter.loki #
Convertit et envoie des logs OTLP vers Grafana Loki.
Exemple de configuration :
otelcol.exporter.loki "default" {
forward_to = [loki.write.local.receiver]
}otelcol.exporter.prometheus #
Expose des métriques OTLP sur un endpoint scrapable par Prometheus.
Exemple de configuration :
otelcol.exporter.prometheus "default" {
forward_to = [prometheus.remote_write.local.receiver]
}otelcol.auth.basic #
Gère l'authentification `Basic Auth` (utilisateur/mot de passe).
Exemple de configuration :
otelcol.auth.basic "default" {
username = "admin"
password = "password"
}otelcol.auth.bearer #
Gère l'authentification par jeton (Bearer Token).
Exemple de configuration :
otelcol.auth.bearer "default" {
token = "my-secret-token"
}otelcol.auth.oauth2 #
Gère l'authentification via le protocole OAuth2.
Exemple de configuration :
otelcol.auth.oauth2 "default" {
client_id = "my-client"
client_secret = "secret"
token_url = "https://example.com/oauth2/token"
}6. Composants `discovery` #
Composants pour la découverte dynamique de cibles à superviser dans des environnements changeants.
discovery.kubernetes #
Découvre automatiquement les pods, services, endpoints et ingresses dans un cluster Kubernetes.
Exemple de configuration :
discovery.kubernetes "pods" {
role = "pod"
}discovery.docker #
Découvre les conteneurs Docker qui tournent sur la machine locale.
Exemple de configuration :
discovery.docker "local" {
host = "unix:///var/run/docker.sock"
}discovery.ec2 #
Découvre les instances EC2 dans un compte AWS.
Exemple de configuration :
discovery.ec2 "default" {
region = "eu-west-1"
}discovery.gce #
Découvre les instances de VM dans Google Cloud Engine.
Exemple de configuration :
discovery.gce "default" {
project = "my-gcp-project"
zone = "europe-west1-b"
}discovery.azure #
Découvre les machines virtuelles dans Microsoft Azure.
Exemple de configuration :
discovery.azure "default" {
subscription_id = "my-sub-id"
}discovery.consul #
Découvre les services enregistrés dans un cluster HashiCorp Consul.
Exemple de configuration :
discovery.consul "default" {
server = "localhost:8500"
}discovery.dns #
Découvre des cibles via des enregistrements DNS (A, AAAA, SRV).
Exemple de configuration :
discovery.dns "default" {
names = ["example.com"]
type = "A"
}discovery.file #
Lit une liste de cibles depuis un fichier JSON ou YAML.
Exemple de configuration :
discovery.file "default" {
files = ["/etc/alloy/targets.json"]
}discovery.http #
Découvre des cibles en interrogeant un endpoint HTTP.
Exemple de configuration :
discovery.http "default" {
url = "http://example.com/targets"
}discovery.process #
Découvre des processus en cours d'exécution sur la machine locale.
Exemple de configuration :
discovery.process "default" {
discover_all = true
}discovery.relabel #
Applique des règles de ré-étiquetage sur les cibles découvertes.
Exemple de configuration :
discovery.relabel "default" {
targets = discovery.kubernetes.pods.targets
rule {
action = "keep"
source_labels = ["__meta_kubernetes_pod_label_app"]
regex = "myapp"
}
}discovery.digitalocean #
Découvre les instances (Droplets) dans DigitalOcean.
Exemple de configuration :
discovery.digitalocean "default" {
bearer_token = sys.env("DO_TOKEN")
}discovery.linode #
Découvre les instances dans Linode.
Exemple de configuration :
discovery.linode "default" {
bearer_token = sys.env("LINODE_TOKEN")
}discovery.scaleway #
Découvre les ressources dans Scaleway (ex: instances, baremetal).
Exemple de configuration :
discovery.scaleway "default" {
project_id = "my-project-id"
access_key = sys.env("SCW_ACCESS_KEY")
secret_key = sys.env("SCW_SECRET_KEY")
}discovery.nomad #
Découvre les services et applications fonctionnant dans un cluster HashiCorp Nomad.
Exemple de configuration :
discovery.nomad "default" {
server = "http://nomad.service.consul:4646"
}7. Composants `pyroscope` #
Composants pour la collecte et l'envoi de profils de performance en continu vers Grafana Pyroscope.
pyroscope.scrape #
Collecte des profils de performance depuis des endpoints compatibles pprof (le format standard de Go).
Exemple de configuration :
pyroscope.scrape "default" {
targets = [{"__address__" = "localhost:8080"}]
forward_to = [pyroscope.write.local.receiver]
}pyroscope.write #
Envoie les profils collectés vers une instance Grafana Pyroscope.
Exemple de configuration :
pyroscope.write "local" {
endpoint {
url = "http://pyroscope:4040"
}
}pyroscope.ebpf #
Collecte des profils de performance (CPU) d'applications Linux en utilisant eBPF, sans nécessiter d'instrumentation dans le code.
Exemple de configuration :
pyroscope.ebpf "default" {
forward_to = [pyroscope.write.local.receiver]
targets = discovery.process.local.targets
}8. Composants `beyla` et `faro` #
Composants pour l'auto-instrumentation et la collecte de télémétrie front-end.
beyla.ebpf #
Utilise eBPF pour auto-instrumenter des applications (Go, C++, Rust...) sans modifier leur code, afin de générer des traces et des métriques (RED : Rate, Errors, Duration).
Exemple de configuration :
beyla.ebpf "default" {
open_port = 8080
output {
traces = [otelcol.exporter.otlp.default.input]
}
}faro.receiver #
Agit comme un point de collecte pour les signaux envoyés par le SDK Grafana Faro (Real User Monitoring pour le front-end).
Exemple de configuration :
faro.receiver "default" {
server {
listen_address = "0.0.0.0:12347"
}
output {
logs = [loki.write.local.receiver]
}
}9. Composants Utilitaires #
Composants génériques pour la manipulation de fichiers, de chaînes de caractères et la communication HTTP.
local.file_match #
Découvre des fichiers sur le système de fichiers local en se basant sur un pattern. Utile pour alimenter `loki.source.file`.
Exemple de configuration :
local.file_match "logs" {
path_targets = [{"__path__" = "/var/log/*.log"}]
}local.file #
Lit le contenu d'un fichier sur le disque et l'expose comme une chaîne de caractères.
Exemple de configuration :
local.file "secret" {
filename = "/etc/secret.txt"
is_secret = true
}remote.http #
Récupère le contenu d'une ressource distante via HTTP.
Exemple de configuration :
remote.http "config" {
url = "http://example.com/config.json"
poll_frequency = "5m"
}remote.vault #
Récupère et renouvelle dynamiquement des secrets depuis HashiCorp Vault.
Exemple de configuration :
remote.vault "db_credentials" {
server = "http://vault:8200"
path = "secret/data/db"
auth {
token = sys.env("VAULT_TOKEN")
}
}remote.kubernetes.secret #
Lit et met à jour dynamiquement des secrets depuis l'API Kubernetes.
Exemple de configuration :
remote.kubernetes.secret "api_keys" {
name = "my-secret"
namespace = "default"
}remote.kubernetes.configmap #
Lit et met à jour dynamiquement le contenu de ConfigMaps Kubernetes.
Exemple de configuration :
remote.kubernetes.configmap "app_config" {
name = "my-configmap"
namespace = "default"
}remote.s3 #
Télécharge périodiquement le contenu d'un objet (ex: fichier de configuration) depuis un bucket S3.
Exemple de configuration :
remote.s3 "targets" {
endpoint = "s3.eu-west-1.amazonaws.com"
bucket = "my-configs"
path = "targets.json"
key = sys.env("AWS_ACCESS_KEY")
secret = sys.env("AWS_SECRET_KEY")
}