dbt

Junior

¿Cómo configuro sources.yml de dbt para que los datos obsoletos fallen fuerte, no en silencio?

Un modelo puede correr limpiamente contra una tabla que dejó de actualizarse hace tres días. sources.yml es donde le dice a dbt que realmente lo verifique, en vez de confiar en que el upstream está bien.

Leer en:
Sin fuente declarada Declarada, sin freshness Freshness nunca ejecutado
Cómo suele verse en la práctica la cobertura de fuentes de la mayoría de los equipos, aproximadamente en ese orden - no un desglose medido.

Los modelos de dbt pueden leer de cualquier tabla sin declararla como fuente - pero solo una fuente declarada obtiene rastreo de linaje, documentación y verificaciones de freshness. Sin eso, una carga upstream detenida simplemente parece un run exitoso normal.

Declarar una fuente antes de poder verificar su freshness

Una fuente es una declaración YAML que apunta a una tabla que dbt no construyó - típicamente datos crudos entregados por Fivetran, Airbyte, o un loader personalizado. Declararla no cambia en nada cómo sus modelos la consultan; una fuente declarada simplemente le da a dbt algo a lo que adjuntar documentación, tests y configuración de freshness.

# models/staging/sources.yml sources: - name: raw_orders database: analytics schema: raw tables: - name: orders loaded_at_field: _fivetran_synced freshness: warn_after: {count: 6, period: hour} error_after: {count: 24, period: hour}

loaded_at_field es la columna cuyo valor máximo verifica dbt - casi siempre una marca de tiempo de sincronización provista por el loader, no una columna de fecha de negocio (la fecha del pedido y "cuándo aterrizó esta fila" son cosas distintas, y freshness se preocupa por la segunda).

warn_after vs error_after, y ejecutar la verificación realmente

warn_after y error_after son umbrales independientes, no una escalada de dos etapas del mismo número - puede configurar un umbral warn y ningún umbral error si solo quiere visibilidad. Nada de esto corre como parte de un dbt run o dbt build normal, sin embargo - freshness es su propio comando:

# verifica cada fuente con un bloque de freshness, escribe sources.json dbt source freshness

Eso tiene que programarse explícitamente - un paso de cron, una tarea separada de Airflow, lo que sea que corra antes de los modelos que dependen de esa fuente. Un bloque de freshness que está configurado pero nunca se invoca no atrapa nada; no es una restricción pasiva que dbt aplique por sí solo.

Dónde esto todavía deja un vacío

Freshness solo le dice que la tabla recibió alguna fila recientemente - no dice nada sobre si los valores de esa fila son razonables, o si la carga solo escribió la mitad de los registros esperados. Una fuente puede pasar freshness y aun así estar mal. Y que dbt source freshness termine con código distinto de cero no detiene a los modelos downstream a menos que su orquestador esté explícitamente conectado para verificar ese código de salida y detenerse - dbt mismo no hará eso por usted.

Algo que opti-pipe no verifica: freshness y la configuración de fuentes viven enteramente en sources.yml, que el motor de reglas nunca lee - solo mira lo que run_results.json reporta sobre tiempo de ejecución y estado después de que un run ya ocurrió.

Vea cómo se ve esto en su propio pipeline.

Suba un event log real de Spark, un run_results.json de dbt o una exportación de métricas de Flink y obtenga recomendaciones concretas, que debe aprobar antes de aplicar - no otra regla general.