Monitoreo de la API
Métricas en memoria
El middleware metrics_middleware (ver api/main.py) registra:
- Conteo de códigos HTTP.
- Últimas 50 solicitudes (path, método, timestamp, bytes enviados).
- Metadatos del último payload (
payload_meta). - Versión semver + commit (
meta.version,meta.git_commit) cuando se consulta/status.
Se expone vía GET /api/0.6.9/status.
{
"status_codes": {"200": 42, "404": 3},
"recent_requests": [
{"path": "/api/0.6.9/datasets", "status_code": 200, ...}
],
"last_payload": {"collection": "datasets", "resource": "dim_region", "returned": 25, "timestamp": 1696876800.0}
}Publicador en segundo plano
api.metrics.storage.APIMetricsmantiene la ventana de peticiones recientes y los contadores agregados. El middleware registra cada request conmetrics.record(...).api.metrics.publisher.MetricsPublishertoma esos snapshots y, cadainterval_seconds, invocapublish_oncepara persistir los percentiles, RPS y tasa de error enmonitor_api_metrics.start_metrics_publisher(engine, interval_seconds=60, window_seconds=300, max_retries=3, retry_backoff=1.0)inicializa un hilodaemon. Los tiempos de espera entre reintentos siguen el patrónretry_backoff * intento.- Ante errores de base de datos (
SQLAlchemyError) se reintenta hastamax_retriesveces y se registra unwarning; si se agotan los intentos, se continúa el ciclo sin interrumpir la API. - El método
publish_oncepuede usarse en tareas programadas (cron) para correr el mismo flujo en ejecución síncrona.
Flujo resumido
- Middleware →
APIMetrics.record: acumula datos crudos. - Hilo
MetricsPublisher→collect_route_stats: agrupa por ruta/método y calcula percentiles (p50, p95, p99) y error rate. _flush→ INSERT enmonitor_api_metricscalculando RPS (sample_size / interval_seconds).
Configuración
- Variables de entorno sugeridas:
API_METRICS_INTERVAL_SECONDS,API_METRICS_WINDOW_SECONDS,API_METRICS_RETRY_BACKOFF. - Se recomienda fijar
history_sizedeAPIMetricssegún el tráfico estimado (por defecto 50). - Pruebas unitarias:
tests/unit/test_api_metrics.pycubreAPIMetrics,collect_route_statsy los reintentos del publicador con un engine simulado.
Cache de respuestas
- Implementado en
api/caching.py(TTL configurable conAPI_CACHE_TTL_SECONDS). - Decorador
@cached_responseenvuelve endpoints idempotentes. - Limpiar cache: reiniciar el servicio (
systemctl restart illanes00-ep).
Logs y auditoría
etl_logalmacena ejecuciones de pipelines y puede usarse para monitoreo a largo plazo.- Los accesos a la API quedan en
journalctl -u illanes00-epy en la métrica en memoria.
Cobertura DIPRES (status page)
- El endpoint
/api/0.6.9/statusexponedipres_coveragecon el inventario de archivos descargados y la listapending_downloads(meses/trimestres faltantes, datasets pendientes). - El script
PYTHONPATH=. python scripts/check_dipres_coverage.pyimprime el mismo resumen en consola. - Integración en la landing: sección “Estado de datos” enlaza al JSON de status y muestra los faltantes destacados (hasta 4 años recientes + resumen de pendientes).
Próximos pasos sugeridos
- Exportar métricas a Prometheus (adapter constante).
- Persistir
status_codesen Postgres cada X minutos. - Alertar si se detecta incremento de
5xxen la ventana configurable.