Aller au contenu
Outils medium

Exporters Prometheus

14 min de lecture

Les exporters sont des adaptateurs : ils transforment une source (système, base de données, réseau…) en un endpoint /metrics que Prometheus scrappe. Ce guide vous aide à choisir le bon outil et à comprendre comment ça s'emboîte.

Flux d'un exporter : la source envoie les métriques à l'exporter qui les expose pour Prometheus

[SOURCE] → (exporter / instrumentation) → /metrics ──scrape──▶ Prometheus
  • Source : OS, DB, service réseau, application…
  • Exporter : pont qui rend la source "scrapable"
  • Prometheus : collecte, stocke, interroge, alerte
SituationSolutionPourquoi
J'ai le code de l'appInstrumentation (client libs, OTel)Métriques métier précises, moins d'approximation
Produit tiers, pas de codeExporter dédiéMySQL, PostgreSQL, Redis, Nginx
Système d'exploitationAgent (Node/Windows Exporter)CPU, RAM, disque, réseau
Vérifier la disponibilité externeBlackbox ExporterProbes HTTP, DNS, TCP, ICMP

C'est LA distinction à comprendre avant de configurer quoi que ce soit.

Un exporter = une machine/service. L'exporter tourne sur ou près de la cible.

ExempleUsage
Node ExporterMétriques système Linux
Windows ExporterMétriques système Windows

Configuration Prometheus (simple) :

scrape_configs:
- job_name: node
static_configs:
- targets: ['server1:9100', 'server2:9100']

Chaque target est directement l'exporter.

L'exporter se connecte à un service (MySQL, PostgreSQL, Redis…) via TCP + credentials, puis expose /metrics.

ExempleUsage
mysqld_exporterMySQL/MariaDB
postgres_exporterPostgreSQL
redis_exporterRedis
mongodb_exporterMongoDB

Points d'attention :

  • Droits minimum (read-only quand possible)
  • Latence de collecte → ajuster scrape_timeout
  • Cardinalité des labels

Un seul exporter peut monitorer N cibles via un paramètre target=.... C'est le pattern multi-target exporter.

ExempleUsage
Blackbox ExporterProbes HTTP, DNS, TCP, ICMP
SNMP ExporterÉquipements réseau SNMP

Pourquoi c'est différent ?

  • L'exporter ne connaît pas les cibles à l'avance
  • Prometheus passe la cible en paramètre via relabeling
  • Un seul exporter peut sonder des centaines d'URLs
IntentionOutilFamilleCe que ça mesure
Santé machine LinuxNode ExporterACPU, RAM, disque, réseau
Santé Windowswindows_exporterAPerformance counters
Disponibilité HTTP/DNS/TCP/ICMPBlackbox ExporterCProbes externes, SSL expiry
Santé MySQL/MariaDBmysqld_exporterBConnexions, requêtes, réplication
Santé PostgreSQLpostgres_exporterBConnexions, locks, bloat
Santé Redisredis_exporterBMémoire, keys, ops/sec
Métriques conteneurscAdvisor / kubeletSourceCPU, RAM, I/O par conteneur

Liste complète des exporters officiels

Le plus important : collecte les métriques système Linux.

  1. Télécharger

    Fenêtre de terminal
    cd /tmp
    VERSION="1.9.0"
    wget https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz
  2. Installer

    Fenêtre de terminal
    tar xvfz node_exporter-${VERSION}.linux-amd64.tar.gz
    sudo cp node_exporter-${VERSION}.linux-amd64/node_exporter /usr/local/bin/
    sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
  3. Créer le service

    /etc/systemd/system/node_exporter.service
    [Unit]
    Description=Node Exporter
    Wants=network-online.target
    After=network-online.target
    [Service]
    User=node_exporter
    Group=node_exporter
    Type=simple
    ExecStart=/usr/local/bin/node_exporter
    Restart=always
    # Hardening
    NoNewPrivileges=true
    ProtectSystem=strict
    ProtectHome=true
    [Install]
    WantedBy=multi-user.target
  4. Démarrer

    Fenêtre de terminal
    sudo systemctl daemon-reload
    sudo systemctl enable node_exporter
    sudo systemctl start node_exporter
prometheus.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets:
- 'server1:9100'
- 'server2:9100'
MétriqueDescription
node_cpu_seconds_totalTemps CPU par mode (idle, user, system)
node_memory_MemAvailable_bytesMémoire disponible
node_filesystem_avail_bytesEspace disque disponible
node_network_receive_bytes_totalBytes reçus par interface
node_load1, node_load5, node_load15Load average
# CPU utilisé (%)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Mémoire utilisée (%)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# Disque utilisé (%)
(1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100

Surveille la disponibilité depuis l'extérieur : HTTP, DNS, TCP, ICMP. C'est du synthetic monitoring (probes), pas de la télémétrie interne.

Blackbox ne "tourne pas sur" les cibles. Un seul Blackbox Exporter peut sonder des centaines d'URLs. La magie : Prometheus passe la cible en paramètre.

Prometheus scrappe:
GET /probe?target=https://example.com&module=http_2xx
Blackbox répond:
probe_success 1
probe_duration_seconds 0.234
Fenêtre de terminal
docker run -d \
--name blackbox_exporter \
-p 9115:9115 \
-v $(pwd)/blackbox.yml:/config/blackbox.yml:ro \
prom/blackbox-exporter:v0.25.0 \
--config.file=/config/blackbox.yml
blackbox.yml
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_http_versions: ["HTTP/1.1", "HTTP/2.0"]
valid_status_codes: [200, 201, 204]
follow_redirects: true
tcp_connect:
prober: tcp
timeout: 5s
icmp:
prober: icmp
timeout: 5s
dns_resolve:
prober: dns
dns:
query_name: "example.com"
query_type: "A"

Le relabeling transforme une liste d'URLs en paramètres pour Blackbox :

prometheus.yml
scrape_configs:
- job_name: 'blackbox-http'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- https://example.com
- https://api.example.com/health
- https://docs.example.com
relabel_configs:
# 1. L'URL devient le paramètre ?target=
- source_labels: [__address__]
target_label: __param_target
# 2. L'URL est aussi copiée dans le label "instance"
- source_labels: [__param_target]
target_label: instance
# 3. L'adresse réelle de scrape devient Blackbox Exporter
- target_label: __address__
replacement: blackbox-exporter:9115

Ce qui se passe :

  1. Prometheus voit https://example.com dans targets
  2. Relabeling transforme en GET blackbox-exporter:9115/probe?target=https://example.com
  3. Le label instance garde l'URL d'origine pour identifier les métriques
MétriqueDescription
probe_success1 si probe réussie, 0 sinon
probe_duration_secondsDurée totale de la probe
probe_http_status_codeCode HTTP retourné
probe_ssl_earliest_cert_expiryDate d'expiration du certificat SSL
rules/blackbox.yml
groups:
- name: blackbox
rules:
- alert: EndpointDown
expr: probe_success == 0
for: 2m
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} is down"
- alert: SSLCertExpiringSoon
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 30
for: 1h
labels:
severity: warning
annotations:
summary: "SSL cert for {{ $labels.instance }} expires in < 30 days"
  1. Créer l'utilisateur MySQL (droits minimum)

    CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'password';
    GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
    FLUSH PRIVILEGES;
  2. Lancer l'exporter

    Fenêtre de terminal
    export DATA_SOURCE_NAME='exporter:password@(localhost:3306)/'
    ./mysqld_exporter

    Ou via Docker :

    Fenêtre de terminal
    docker run -d \
    --name mysqld_exporter \
    -p 9104:9104 \
    -e DATA_SOURCE_NAME='exporter:password@(mysql:3306)/' \
    prom/mysqld-exporter
  3. Configuration Prometheus

    - job_name: 'mysql'
    static_configs:
    - targets: ['localhost:9104']

Métriques clés :

MétriqueDescription
mysql_upMySQL accessible (1/0)
mysql_global_status_threads_connectedConnexions actives
mysql_global_status_slow_queriesRequêtes lentes
mysql_global_status_questionsRequêtes exécutées
Fenêtre de terminal
export DATA_SOURCE_NAME='postgresql://exporter:password@localhost:5432/postgres?sslmode=disable'
./postgres_exporter

Métriques clés :

MétriqueDescription
pg_upPostgreSQL accessible
pg_stat_activity_countConnexions par état
pg_stat_database_deadlocksDeadlocks
pg_stat_database_tup_fetchedLignes lues
Fenêtre de terminal
docker run -d \
--name redis_exporter \
-p 9121:9121 \
oliver006/redis_exporter:v1.58.0 \
--redis.addr=redis://localhost:6379

Pour des métriques d'un système tiers non couvert, créez un exporter.

my_exporter.py
from prometheus_client import start_http_server, Gauge
import requests
import time
# Définir les métriques
ORDERS_PENDING = Gauge('orders_pending_total', 'Pending orders count')
ORDERS_VALUE = Gauge('orders_pending_value_euros', 'Value of pending orders')
def collect_metrics():
"""Collecte depuis une API externe."""
response = requests.get('https://api.internal/orders/stats')
data = response.json()
ORDERS_PENDING.set(data['pending_count'])
ORDERS_VALUE.set(data['pending_value'])
if __name__ == '__main__':
start_http_server(8000)
print("Exporter running on :8000/metrics")
while True:
collect_metrics()
time.sleep(15)
TypeUsageExemple
CounterValeur croissante uniquementRequêtes, erreurs
GaugeMonte et descendMémoire, connexions
HistogramDistribution avec bucketsLatence
SummaryQuantiles côté clientLatence (moins recommandé)
namespace_name_unit_suffix
  • myapp_http_requests_total
  • myapp_request_duration_seconds
  • requestCount ❌ (pas de namespace, pas d'unité)
PiègeImpactSolution
/metrics exposé sans authFuite d'infosFirewall, TLS, basic auth
Trop de labelsExplosion cardinalitéLabels faible cardinalité uniquement
Scrape interval trop courtSurcharge exporter15s-60s selon criticité
Scrape timeout trop courtTargets "DOWN"Ajuster scrape_timeout
SymptômeCause probableSolution
Exporter non accessibleFirewall/réseaucurl http://exporter:port/metrics
Métriques videsPas de permissionsVérifier droits DB/système
Scrape timeoutExporter lentAugmenter scrape_timeout
Target "DOWN"DNS/réseauVérifier résolution + ping

Commandes de debug :

Fenêtre de terminal
# Vérifier l'endpoint
curl -s http://localhost:9100/metrics | head -20
# Vérifier dans Prometheus
# Status → Targets
# Pour Blackbox, tester la probe manuellement
curl "http://localhost:9115/probe?target=https://example.com&module=http_2xx"
  • 3 familles : single-target (Node), service (MySQL), multi-target (Blackbox)
  • Instrumentation > Exporter si vous avez le code
  • Blackbox = synthetic monitoring (disponibilité externe)
  • Relabeling : essentiel pour le pattern multi-target
  • Sécurité : ne jamais exposer /metrics sans protection réseau

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn