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.
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.
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:
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.