Monitoring et Alertes

Mettez en place un monitoring proactif pour détecter les anomalies de coûts et prévenir les dépassements de budget.

Dashboard des coûts

Coûts par jour

SELECT
  DATE(creation_time) as query_date,
  COUNT(*) as query_count,
  ROUND(SUM(total_bytes_billed) / POW(1024, 4), 2) as tb_billed,
  ROUND(SUM(total_bytes_billed) / POW(1024, 4) * 5, 2) as cost_usd
FROM `region-us`.INFORMATION_SCHEMA.JOBS
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND job_type = 'QUERY'
GROUP BY 1
ORDER BY 1 DESC;

Coûts par utilisateur

SELECT
  user_email,
  COUNT(*) as query_count,
  ROUND(SUM(total_bytes_billed) / POW(1024, 4) * 5, 2) as cost_usd,
  ROUND(AVG(total_bytes_billed) / POW(1024, 3), 2) as avg_gb_per_query
FROM `region-us`.INFORMATION_SCHEMA.JOBS
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND job_type = 'QUERY'
GROUP BY 1
ORDER BY cost_usd DESC
LIMIT 20;

A retenir

Le top 10% des utilisateurs represente souvent 80% des couts. Identifiez-les et proposez-leur une formation aux bonnes pratiques. Un coaching de 30 minutes peut economiser des milliers de dollars par mois.

Coûts par dataset

SELECT
  referenced_table.dataset_id,
  COUNT(DISTINCT job_id) as query_count,
  ROUND(SUM(total_bytes_billed) / POW(1024, 4) * 5, 2) as cost_usd
FROM `region-us`.INFORMATION_SCHEMA.JOBS,
UNNEST(referenced_tables) as referenced_table
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY 1
ORDER BY cost_usd DESC;

Alertes budget GCP

Configurez des alertes dans la console GCP Billing :

  1. Billing → Budgets & alerts → Create budget
  2. Scope : filtrer sur BigQuery (service)
  3. Seuils : 50%, 80%, 100%
  4. Notifications : Email, Pub/Sub, ou Slack via Cloud Functions

Erreur frequente

Ne pas configurer d'alertes et decouvrir la facture en fin de mois. Une requete mal ecrite peut couter $10,000 en une nuit. Configurez au minimum une alerte a 80% du budget mensuel estime.

Détection d'anomalies

-- Requêtes > $100 dans les 7 derniers jours
SELECT
  job_id,
  user_email,
  ROUND(total_bytes_billed / POW(1024, 4) * 5, 2) as cost_usd,
  creation_time,
  LEFT(query, 200) as query_preview
FROM `region-us`.INFORMATION_SCHEMA.JOBS
WHERE total_bytes_billed / POW(1024, 4) * 5 > 100
  AND creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND job_type = 'QUERY'
ORDER BY cost_usd DESC;
-- Pics de coût (jours > 2x la moyenne)
WITH daily_costs AS (
  SELECT
    DATE(creation_time) as query_date,
    SUM(total_bytes_billed) / POW(1024, 4) * 5 as daily_cost
  FROM `region-us`.INFORMATION_SCHEMA.JOBS
  WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  GROUP BY 1
),
avg_cost AS (
  SELECT AVG(daily_cost) as avg_daily_cost FROM daily_costs
)
SELECT
  dc.query_date,
  ROUND(dc.daily_cost, 2) as cost_usd,
  ROUND(ac.avg_daily_cost, 2) as avg_cost_usd,
  ROUND(dc.daily_cost / ac.avg_daily_cost, 1) as ratio
FROM daily_costs dc, avg_cost ac
WHERE dc.daily_cost > 2 * ac.avg_daily_cost
ORDER BY dc.query_date DESC;

Decision concrete

Planifiez la requete de detection d'anomalies pour qu'elle s'execute chaque matin a 8h et envoie les resultats par email. Vous aurez le temps de reagir avant que les couts n'explosent.

Checklist BigQuery

  • Billing export activé vers BigQuery
  • Labels sur tous les datasets et tables
  • require_partition_filter = TRUE sur les grosses tables
  • Pas de SELECT * dans le code (review)
  • Tables matérialisées pour les agrégations fréquentes
  • Alertes budget configurées (50%, 80%, 100%)
  • Quotas max_bytes_billed définis
  • Dashboard de monitoring en place

Succes

Module 2 terminé !

Vous maîtrisez maintenant l'optimisation des coûts BigQuery. Passons à Snowflake.

Jonathan Kini

Jonathan Kini

J'aide les équipes data à réduire et maîtriser leurs coûts BigQuery et Snowflake, sans sacrifier la performance. 8 ans de terrain, de la startup aux environnements data à grande échelle.