Skip to content

Freshness checks — Vérification de la fraîcheur des données

Les freshness checks vérifient qu'une table source a été alimentée récemment avant d'exécuter la tâche. Si la table est trop ancienne, la tâche échoue et le pipeline s'arrête — évitant de produire des rapports sur des données périmées.

Configuration

nodes:
  monthly_stats:
    sql: sql/monthly_stats.sql
    target: "{{ params.schema }}.monthly_stats"
    output_write: replace
    needs: [commandes]

    freshness_check:
      column: updated_at    # colonne TIMESTAMP à contrôler
      max_hours: 24         # échoue si MAX(updated_at) > 24h

Comment ça fonctionne

Avant d'exécuter le SQL de la tâche, Noria exécute :

SELECT EXTRACT(EPOCH FROM (CURRENT_TIMESTAMP - MAX(updated_at))) / 3600.0 AS age_hours
FROM schema.table_cible
  • Si age_hours > max_hours → la tâche échoue avec un message explicite
  • Si la table est vide → warning loggé, la tâche continue
  • Si la colonne n'existe pas → warning loggé, la tâche continue

Exemple d'erreur

ExecutionError: Freshness check FAILED for 'monthly_stats':
table 'main.commandes' column 'updated_at' is 36.2h old
(max allowed: 24.0h)

Cas d'usage typiques

Pipeline journalier — vérifier que la source a été alimentée aujourd'hui

nodes:
  daily_report:
    sql: sql/daily_reportournalier.sql
    target: "{{ params.schema }}.daily_report"
    freshness_check:
      column: date_load_orders
      max_hours: 25     # tolérance d'1h pour les décalages de planification

Données temps réel — alerter si plus de 2h de retard

nodes:
  live_dashboard:
    sql: sql/dashboard.sql
    target: "{{ params.schema }}.dashboard"
    freshness_check:
      column: ts_evenement
      max_hours: 2
    soft_fail: true   # warning sans bloquer le pipeline

Freshness sur la table cible elle-même

Utile pour vérifier qu'une tâche précédente a bien alimenté la table avant d'en dépendre :

nodes:
  monthly_aggreg:
    sql: sql/agreg.sql
    target: "{{ params.schema }}.agreg"
    needs: [load_raw]
    freshness_check:
      column: _noria_updated_at    # colonne technique ajoutée dans le SELECT
      max_hours: 2

  # Dans sql/load_raw.sql :
  # SELECT *, CURRENT_TIMESTAMP AS _noria_updated_at FROM source

Ne pas bloquer sur une source externe

Si la table source est alimentée par un tiers (flux externe, partenaire), tu peux logguer sans bloquer :

freshness_check:
  column: date_reception
  max_hours: 48
soft_fail: true    # le pipeline continue, un WARNING est loggué