đ¶ Partie 2 : Pilier 1 - MĂ©triques & Dashboards
Types (Gauge, Count), IntĂ©grations (Checks), MĂ©triques Custom (DogStatsD), Dashboards (Widgets) & RequĂȘtage (Querying).
Types de Métriques (Deep Dive)
Gauge (état), Count (total), Rate (par sec), Histogram (p95).
Gauge Count HistogramCollecte N°1 : Intégrations
Configuration des "Checks" de l'Agent. (Ex: postgres.d/conf.yaml).
Collecte N°2 : DogStatsD (Custom)
Envoyer des métriques "business" (applicatives) via UDP (port 8125).
DogStatsD Custom MetricsVisualisation : Dashboards
Timeboards (investigation) vs Screenboards (NOC). Widgets (Timeseries...).
Dashboards WidgetsRequĂȘtage (Querying)
Anatomie : avg:metric{tags} by {group}. (Filtre & Agrégation).
Cheat-sheet (Métriques)
Syntaxe de requĂȘte, commandes DogStatsD (Python).
cheat QueryComprendre les 4 types de métriques est essentiel pour savoir *comment* les interroger et les agréger (avg, sum, p95...).
| Type | Description | Exemple | Type d'agrégation |
|---|---|---|---|
GAUGE (Jauge) | Une valeur ponctuelle. Le "snapshot" d'un état. (Ex: un thermomÚtre). | system.mem.used (4.5 GB)temperature.cpu (65°C) | avg, max, min, last (sum est rare) |
COUNT (Compteur) | Un compteur qui ne fait qu'augmenter (incrémental). (Ex: un odomÚtre de voiture). | nginx.requests.total (5,001,000)myapp.errors.total (450) | sum (Total sur la période) |
RATE (Taux) | Un COUNT calculé "par seconde". DataDog le calcule automatiquement pour vous (via .as_rate()). | nginx.requests.per.second (50 req/s) | avg, max (Taux moyen, Taux max) |
HISTOGRAM | Une distribution statistique d'une valeur sur une période. (Ex: temps de réponse). | api.response.latency_msecommerce.payment.value | p95, p99, avg, max, count |
SET | Compte le nombre de valeurs *uniques* vues. | myapp.users.unique_logins | count (des uniques) |
Note (p95) : Le HISTOGRAM est vital. Se baser sur la avg (moyenne) d'une latence est dangereux (ex: avg=200ms). Le p95 (95Úme percentile) vous dit la vérité : "95% des utilisateurs ont une latence < 350ms, mais 5% ont > 350ms" (c'est souvent là que se cachent les problÚmes).
C'est la collecte "out-of-the-box". L'Agent exécute des "Checks" (scripts Python) pour interroger les services standards (Postgres, NGINX, Redis, Kafka, etc.) et envoyer leurs métriques.
Cela se configure dans le dossier /etc/datadog-agent/conf.d/ (sur l'hĂŽte) ou via Autodiscovery (sur K8s/Docker) (Voir Partie 1).
Exemple (PostgreSQL)
# Fichier: /etc/datadog-agent/conf.d/postgres.d/conf.yaml
init_config:
# Configuration pour CHAQUE instance Postgres Ă monitorer
instances:
- host: my-db-instance.rds.amazonaws.com # Endpoint de la DB
port: 5432
username: datadog
password: "VOTRE_PASSWORD_SECURISE"
# Active le "Database Monitoring" (produit avancé)
dbm: true
# Ajoute ces tags à TOUTES les métriques de CETTE instance
tags:
- env:production
- service:postgres-primary
- db:shop-db
(AprÚs un sudo systemctl restart datadog-agent), DataDog recevra postgresql.connections, postgresql.locks, etc., toutes tagguées avec env:production.
Exemple (NGINX)
NGINX doit d'abord exposer son "stub_status" (un endpoint HTTP simple).
# Fichier: /etc/datadog-agent/conf.d/nginx.d/conf.yaml
init_config:
instances:
- nginx_status_url: http://localhost/nginx_status/
tags:
- env:production
- service:nginx-ingress
DataDog recevra alors nginx.requests.per.second (un RATE) et nginx.net.connections (un GAUGE).
Les intégrations sont bien pour l'infrastructure (le "systÚme"), mais vous avez besoin de métriques **applicatives (business)** (ex: "commandes passées", "paniers abandonnés").
Pour cela, on utilise DogStatsD. C'est un service (basé sur StatsD) qui tourne à l'intérieur de l'Agent et écoute sur un port (8125 par défaut) en UDP.
Votre application (Python, Java, Go...) envoie des paquets UDP "fire-and-forget" Ă l'Agent local. C'est asynchrone et ultra-rapide (votre code ne bloque pas).
Exemple (DogStatsD en Python)
Utilisation de la bibliothÚque datadog pour envoyer des métriques custom depuis un script Python (ex: une API Flask/Django).
# (Nécessite: pip install datadog)
from datadog import initialize, statsd
# (Initialiser (se connecte Ă l'Agent local: localhost:8125))
initialize()
# --- Cas d'usage : Un utilisateur finalise un paiement ---
def handle_payment(user_id, cart_value, payment_provider):
tags = [
f"env:{os.environ.get('ENV')}",
f"payment_provider:{payment_provider}"
]
# 1. COUNT (Incrémente)
# "Un paiement a réussi"
statsd.increment(
"ecommerce.payment.success",
tags=tags
)
# 2. HISTOGRAM (Distribution)
# "Ce paiement valait 45.50 âŹ"
statsd.histogram(
"ecommerce.payment.value",
cart_value,
tags=tags
)
# 3. SET (Compte les utilisateurs uniques)
statsd.set(
"ecommerce.users.active",
user_id,
tags=tags
)
Les Dashboards sont le "point de rencontre" de toutes vos métriques (et logs/traces). DataDog en propose deux types :
| Type | Axe X (Temps) | Usage |
|---|---|---|
| Timeboard | Fixe (ex: "DerniÚre heure"). | Investigation. Corréler des graphiques (tous bougent ensemble). |
| Screenboard | Flexible (chaque widget a son temps). | Statut (NOC). Vue d'ensemble (ex: TV murale), mélange de métriques, logs, images. |
Widgets Principaux (dans l'éditeur "drag-and-drop")
- Timeseries : Le graphique linéaire (le plus utilisé).
- Query Value : Un seul chiffre (ex: "CPU Actuel", "P95 Latence").
- Top List : Classement (ex: "Top 5 hosts par CPU", "Top 10 utilisateurs par erreurs").
- Heat Map : Distribution (ex: "Latence p95 par service" ou "par région").
- Host Map : Visualisation de votre infrastructure (1 carré = 1 host, coloré par CPU/Mem).
- Log Stream : Affiche les logs (filtrés) en direct.
- Service Map : Affiche la carte des dépendances (APM).
C'est la partie la plus importante pour *utiliser* DataDog. La syntaxe de requĂȘte des widgets est standardisĂ©e.
Diagramme : Anatomie d'une RequĂȘte
avg:system.cpu.user{env:prod, service:api-users} by {host}
\__/ \_____________/ \_________________________/ \______/
| | | |
| | | |
1. Aggregator 2. Metric Name 3. Filter (Scope) 4. Group By (Dimension)
(avg, sum, (Ce qu'on mesure) (WHERE) (GROUP BY)
max, min,
p95, ...)
Exemples de RequĂȘtes (pour un Widget Timeseries)
- CPU Moyen (Global) :
Affiche 1 ligne (le CPU moyen de *tous* les hosts en prod).avg:system.cpu.user{env:prod} - CPU Moyen par Host :
Affiche N lignes (1 ligne par host).avg:system.cpu.user{env:prod} by {host} - Trafic NGINX (Total) :
Affiche la somme (RATE) des requĂȘtes/s sur *tous* les NGINX tagguĂ©sservice:web.sum:nginx.requests.per.second{service:web, env:prod} - Latence p99 (Custom Histogram) :
Affiche la latence p99 (99% des requĂȘtes sont plus rapides que X) pour le paiement Stripe.p99:ecommerce.payment.latency_ms{payment_provider:stripe} by {region} - Calcul (Formule) :
Affiche le "Taux d'Erreur" (APM Traces).# (RequĂȘte 'a' : Erreurs) sum:trace.http.request.errors{env:prod, service:api-payment}.as_count() # (RequĂȘte 'b' : Total) sum:trace.http.request.hits{env:prod, service:api-payment}.as_count() # (Formule: a / b * 100) (a / b) * 100
DogStatsD (Python)
from datadog import statsd
tags = ["env:prod", "service:api"]
# COUNT
statsd.increment(
"myapp.events.count",
tags=tags
)
# GAUGE
statsd.gauge(
"myapp.users.online",
150, # (Valeur actuelle)
tags=tags
)
# HISTOGRAM
statsd.histogram(
"myapp.request.latency_ms",
250.5, # (Temps)
tags=tags
)
# SET
statsd.set(
"myapp.users.unique_ids",
"user_123", # (ID unique)
tags=tags
)
Syntaxes de RequĂȘte (Dashboard)
# CPU Moyen (1 ligne)
avg:system.cpu.user{env:prod}
# CPU Moyen (par host)
avg:system.cpu.user{env:prod} by {host}
# CPU Max (par service)
max:system.cpu.user{env:prod} by {service}
# CPU p95 (Histogram)
p95:system.cpu.user{env:prod}
# RequĂȘtes NGINX (Total)
sum:nginx.requests.per.second{service:web}
# Latence APM (p99)
p99:trace.http.request.latency{service:api, env:prod}
# Taux Erreur (Formule)
( sum:trace.http.request.errors{service:api}.as_count() /
sum:trace.http.request.hits{service:api}.as_count() ) * 100
