RUNBOOK — recibe_performance_analisis_pbi (W21)¶
| Job | recibe_performance_analisis_pbi (W21) |
| Programación | 30 21 * * 0,1,2,3,4 (domingo a jueves, 21:30 hora de Buenos Aires) |
| Comando | .venv/bin/python -m monitor_pbi_performance |
Auditoría (ATHENAS.ods.tbl_control_procesos) |
ID08 - PY_PBI_Performance_Analysis_Dexter; Num_Registros = filas cargadas en total; estados Success / Error |
| Logs | /var/log/dabra/recibe_performance_analisis_pbi/ (los crea el panel) |
| Duración esperada | ~25 min (mediana 24, 19–29 en 95 corridas del original). Timeout propuesto: 90 min. Tolerancia 120 min (propuesta) |
| Una sola instancia | Sí (TRUNCATE + append sin deduplicar) |
Códigos de salida¶
| Código | Significado | Acción |
|---|---|---|
| 0 | Se cargó el inventario y se auditó | — (revisar los WARNING si los hay: elementos saltados) |
| 1 | Falló el token, la API de Power BI, la carga o la auditoría | Ver el log; reejecutar (ver abajo) |
| 2 | Configuración inválida | Revisar .env |
Comandos¶
python -m monitor_pbi_performance --dry-run # lee Power BI y cuenta lo que cargaría; no llama a Anthropic, no escribe ni audita
python -m monitor_pbi_performance # producción: carga los eventos de ayer (UTC) y el inventario
python -m monitor_pbi_performance --dia 2026-10-01 # carga los eventos de ESE día (UTC) en vez de ayer
Qué mirar en el log¶
WARNING Error 4xx/5xx in dataset|dataflow ...,Scan failed,Error ... starting scan: elementos saltados; la corrida terminaSuccesscon datos incompletos. Si son muchos o se repiten, avisar al equipo de BI.WARNING La tabla stg.X no tiene la columna 'Y': se agrega: la API de Power BI devolvió un campo nuevo; se agregó la columna a la tabla.WARNING Hash ...: la respuesta no es JSON valido/fallo el analisis: una expresión M no se analizó; se intentará en la próxima corrida (sigue sin estar en la tabla de hashes).ERROR FATAL: ...: la corrida falló; la auditoría queda enErrory no se cambió nada enstg.
Reproceso¶
- La carga es todo o nada: si falló,
stgquedó como antes. Reejecutar el comando completo es seguro para las tablas que se reemplazan. - Las tablas incrementales no se deduplican: reejecutar el mismo día duplica las filas de
stg.activity_events,stg.dataset_refreshesystg.dataflow_refreshes(ystg.m_expression_analysissi ya se cargó). Si se reejecuta después de una corrida que sí cargó, avisar a quien consume esas tablas. - Para recuperar un día de actividad que no se cargó:
--dia AAAA-MM-DD(día UTC). Carga solo los eventos de ese día y todo el inventario de nuevo.
Rollback¶
No hay estado fuera de las tablas. Para deshacer una carga de las tablas incrementales hay que borrar por audit_date (fecha de carga, hora de Buenos Aires).
Causas conocidas¶
- 401/403 de Power BI: el secreto del Service Principal venció o se rotó (
PBI_CLIENT_SECRET), o el principal perdió acceso a la Admin API. Read timed out/Connection aborted/Max retriescontraapi.powerbi.com: red o límite de la API (el original tuvo 3 en ~98 corridas). Reejecutar.- Costo de Anthropic anormal: las expresiones M nuevas se vuelven a analizar cada noche si
stg.m_expression_analysisno llega aods.dim_m_expression_analysis.
Fuente: repositorio job-monitor-pbi-performance, versión 1193801. Página generada con tools/publicar_docs.py.