BIGQUERY
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 :
- Billing → Budgets & alerts → Create budget
- Scope : filtrer sur BigQuery (service)
- Seuils : 50%, 80%, 100%
- 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.