Saltar a contenido

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 termina Success con 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 en Error y no se cambió nada en stg.

Reproceso

  • La carga es todo o nada: si falló, stg quedó 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_refreshes y stg.dataflow_refreshes (y stg.m_expression_analysis si 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 retries contra api.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_analysis no llega a ods.dim_m_expression_analysis.

Fuente: repositorio job-monitor-pbi-performance, versión 1193801. Página generada con tools/publicar_docs.py.