RousselTMLEARNING

Observabilité

Référence des Composants Grafana Alloy

Un guide de référence complet sur tous les composants disponibles dans Grafana Alloy, organisé par catégorie (Loki, Prometheus, OpenTelemetry, etc.) pour vous aider à construire vos pipelines d'observabilité.

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")
}

Pour aller plus loin