dbt: Freshness


🧠 Contexte

Tu dĂ©clares une source dans dbt (par exemple : une table dans ton data warehouse), et tu veux surveiller si elle est fraĂźche, c’est-Ă -dire :

  • qu’elle a bien Ă©tĂ© mise Ă  jour rĂ©cemment
  • qu’elle respecte une frĂ©quence d’alimentation attendue

Mais parfois, une mĂȘme source est alimentĂ©e par plusieurs pipelines diffĂ©rents :

Exemple de table sourceProcessus de chargementFréquence
raw.transactionsingestion par API temps réeltoutes les 15 minutes
batch de consolidation backend1 fois par heure

🎯 ProblĂšme : une seule dĂ©finition freshness standard ne suffit pas

Si tu fais simplement :

freshness:
  error_after: { count: 30, period: minute }
  warn_after: { count: 15, period: minute }

→ Tu appliques une rùgle unique à une source potentiellement multi-origine. Tu risques :

  • soit de dĂ©clencher des alertes inutiles,
  • soit de ne pas dĂ©tecter le vrai problĂšme (ex : si la partie “batch” est en retard mais que les donnĂ©es arrivent toujours cĂŽtĂ© API).

✅ Solution : plusieurs blocs freshness avec critĂšres diffĂ©rents

dbt permet de configurer plusieurs rĂšgles de fraĂźcheur (avec condition), dans une mĂȘme source, pour mieux reflĂ©ter la rĂ©alitĂ© mĂ©tier.

⚠ Attention : dbt ne supporte pas nativement plusieurs blocs freshness par source, mais tu peux contourner cela intelligemment en :

  • crĂ©ant plusieurs tables source logiques qui pointent vers la mĂȘme table physique
  • ou en utilisant une macro customisĂ©e pour la validation conditionnelle selon l’heure, la partition ou l’environnement

🔧 Exemple 1 : dĂ©finir deux sources logiques pour la mĂȘme table physique

version: 2

sources:
  - name: app_sources
    schema: raw
    tables:
      - name: transactions_api
        identifier: transactions
        freshness:
          warn_after: { count: 15, period: minute }
          error_after: { count: 30, period: minute }
        loaded_at_field: updated_at
        meta:
          origin: api

      - name: transactions_batch
        identifier: transactions
        freshness:
          warn_after: { count: 1, period: hour }
          error_after: { count: 2, period: hour }
        loaded_at_field: updated_at
        meta:
          origin: batch

âžĄïž Tu dĂ©clares deux entrĂ©es source, mais elles pointent vers la mĂȘme table transactions dans le warehouse.


đŸ§Ș Tu peux ensuite surveiller chaque “flux” :

dbt source freshness --select source:app_sources.transactions_api
dbt source freshness --select source:app_sources.transactions_batch

đŸ§© Exemple 2 : logique conditionnelle dans une macro

Si tu veux une logique dĂ©pendante de l’heure (ex : tolĂ©rance plus large la nuit), tu peux crĂ©er un test personnalisĂ© ou une macro :

{% macro validate_transactions_freshness(source_name, max_delay_minutes) %}
  {% set now = modules.datetime.datetime.now() %}
  {% set allowed_delay = modules.datetime.timedelta(minutes=max_delay_minutes) %}
  {% set freshness = ... %}  {# lire le MAX(updated_at) #}
  {% if now - freshness > allowed_delay %}
    {{ exceptions.raise_compiler_error("Freshness check failed for " ~ source_name) }}
  {% endif %}
{% endmacro %}

Et tu appelles cette macro via un dbt run-operation.


✅ Avantages de cette stratĂ©gie

BénéficeDétail
🎯 Suivi prĂ©cis de chaque flux de chargementTu sais si l’API ou le batch est en retard
đŸ§© Une seule dĂ©finition source rĂ©utilisableTu gardes la maintenance facile
🔁 FlexibilitĂ© horaire ou mĂ©tierTu peux adapter la rĂšgle Ă  l’heure, au type, Ă  l’env…
🛑 Moins de fausses alertesChaque flux a sa propre tolĂ©rance de dĂ©lai

🧠 RĂ©sumĂ©

ÉlĂ©mentExplication
freshness:Permet de vérifier si une table source est à jour
Cas multi-fluxTu dois surveiller chaque logique de chargement individuellement
Solution 1Déclarer plusieurs entrées source avec identifier commun
Solution 2Utiliser une macro conditionnelle ou personnalisée
AvantageMonitoring plus fin, détection plus fiable des incidents

Leave a Reply

Your email address will not be published. Required fields are marked *