Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

đŸ¶ Partie 2 : Pilier 1 - MĂ©triques & Dashboards

Types (Gauge, Count), IntĂ©grations (Checks), MĂ©triques Custom (DogStatsD), Dashboards (Widgets) & RequĂȘtage (Querying).

2.1 Moyen

Types de Métriques (Deep Dive)

Gauge (état), Count (total), Rate (par sec), Histogram (p95).

Gauge Count Histogram
2.2 Moyen

Collecte N°1 : Intégrations

Configuration des "Checks" de l'Agent. (Ex: postgres.d/conf.yaml).

Intégrations conf.d
2.3 Avancé

Collecte N°2 : DogStatsD (Custom)

Envoyer des métriques "business" (applicatives) via UDP (port 8125).

DogStatsD Custom Metrics
2.4 Facile

Visualisation : Dashboards

Timeboards (investigation) vs Screenboards (NOC). Widgets (Timeseries...).

Dashboards Widgets
2.5 Avancé

RequĂȘtage (Querying)

Anatomie : avg:metric{tags} by {group}. (Filtre & Agrégation).

Query avg: by {}
2.6 Facile

Cheat-sheet (Métriques)

Syntaxe de requĂȘte, commandes DogStatsD (Python).

cheat Query
2.1 Types de Métriques (Deep Dive)

Comprendre les 4 types de métriques est essentiel pour savoir *comment* les interroger et les agréger (avg, sum, p95...).

TypeDescriptionExempleType 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)
HISTOGRAMUne distribution statistique d'une valeur sur une période. (Ex: temps de réponse).api.response.latency_ms
ecommerce.payment.value
p95, p99, avg, max, count
SETCompte le nombre de valeurs *uniques* vues.myapp.users.unique_loginscount (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).

2.2 Collecte N°1 : Intégrations (Agent Checks)

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).

2.3 Collecte N°2 : Métriques Custom (DogStatsD)

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
    )
    
2.4 Visualisation : Dashboards

Les Dashboards sont le "point de rencontre" de toutes vos métriques (et logs/traces). DataDog en propose deux types :

TypeAxe X (Temps)Usage
TimeboardFixe (ex: "DerniÚre heure").Investigation. Corréler des graphiques (tous bougent ensemble).
ScreenboardFlexible (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).
2.5 RequĂȘtage (Querying) - La Syntaxe

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)

  1. CPU Moyen (Global) :
    Affiche 1 ligne (le CPU moyen de *tous* les hosts en prod).
    avg:system.cpu.user{env:prod}
  2. CPU Moyen par Host :
    Affiche N lignes (1 ligne par host).
    avg:system.cpu.user{env:prod} by {host}
  3. Trafic NGINX (Total) :
    Affiche la somme (RATE) des requĂȘtes/s sur *tous* les NGINX tagguĂ©s service:web.
    sum:nginx.requests.per.second{service:web, env:prod}
  4. 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}
  5. 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
    
2.6 Cheat-sheet (Métriques)
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