Observabilidad#
Logs#
- En local, el backend puede escribir en
storage/logs/*(segun configuracion de logger). - En Docker/CT110, lo mas confiable es revisar logs del container:
cd /opt/signaldashpro/current/deploy
docker compose --env-file ../.env -f docker-compose.ct110.yml logs -f --tail=200 backend
docker compose --env-file ../.env -f docker-compose.ct110.yml logs -f --tail=200 frontend
- El directorio
storage/esta montado como volumen (../storage -> /app/storage) en el backend y debe persistir evidencia y reportes. - Evidencia y ejecuciones operativas (CT110):
storage/logs/ops/(salida de los timers)storage/logs/evidence/(JSON diario)- TODO: enviar logs a stack central (Elastic, Loki, Datadog) si el mes demo requiere auditoria.
Campos relevantes#
- Binance/session (
binance,pre-trade-check,orders). - Jobs (
market_sync,news_ingestor,run_data_pipeline). - Riesgo (
kill-switch,alignment-guard). - Alertas (
notify_external_alerts).
Metricas#
- Actualmente no hay Prometheus/StatsD. TODO: exponer metricas para:
- latencia y error-rate por endpoint.
- salud de jobs (
market_synclast_run, duration, failures). - tasa de retries/failures en
signal_queue. - snapshots de balance/posiciones (si se activa user stream / futures risk endpoints).
KPIs por fase (F0-F6)#
KPIs minimos recomendados para seguimiento semanal:
F0(operacion):- disponibilidad backend (
/status) y frontend. market_syncejecutandose sin gaps.signal_queue.failedy retries promedio.F1(macro/intermarket):- frescura de
macro_events(actual/consensus/previous). - frescura de proxies externos (DXY, UST 2Y/10Y).
- latencia evento->persistencia.
F2(regimen/confluencia):- distribucion de decisiones
allow/skip/block. - porcentaje
no_tradepor contradiccion. - performance por regimen (rango/tendencia, vol alta/baja).
F3(flujo no-indicador):- cobertura de features de flujo (agresor/imbalance/absorcion).
- precision por setup (absorcion/reversion).
F4(decision adaptativa):- ratio de parcial 1R y extension condicionada.
- impacto de enforcement en expectancy neta.
F5(degradacion/autopausa):- drift de expectancy semanal.
- eventos de modo defensivo/autopausa.
- tiempo promedio en recuperacion.
F6(30 dias):- cumplimiento de criterios Go/No-Go por semana.
- estabilidad mensual (DD, PF, win-rate por regimen).
Trazas#
- Sin APM configurado. TODO: evaluar OpenTelemetry + collector para FastAPI.
Dashboards sugeridos#
| KPI | Fuente | Estado |
|---|---|---|
| Estado Binance (keys, base_url, limites) | /binance/status + vista /binance |
|
| KPIs financieros (P/L, drawdown) | /analytics/summary |
|
| Jobs automaticos (ultima ejecucion, duracion) | GET /jobs/status + logs |
(manual) |
| Alertas externas/locales | storage/logs/ops/alerts-*.log + estado storage/alerts/alert_state.json |
activo |
| LLM adviser shadow (coverage/parse/latency/tokens) | GET /ops/ai/llm-adviser/summary + /ops + /control-tower |
activo |
| Rendimiento estrategia (win-rate/PF/DD/expectancy) | GET /ops/strategy/performance + /ops |
activo |
Alertas automaticas#
notify_external_alerts.pyrevisa metas y errores cada 5 min y persiste estado local de alertas (storage/alerts/alert_state.json) con evidencia en logs.- Incluye alertas LLM adviser (shadow) por umbrales:
coverage_pctbajo (ALERT_LLM_MIN_COVERAGE_PCT).parse_ok_pctbajo (ALERT_LLM_MIN_PARSE_OK_PCT).latency p95alto (ALERT_LLM_MAX_LATENCY_P95_MS).tokens 24halto (ALERT_LLM_MAX_TOKENS_24H).- Incluye alertas de frescura de
market_sync: - velas stale o ausentes por simbolo/timeframe (
ALERT_MARKET_SYNC_*). - la validacion prioriza
GET /ops/p0/readiness -> operation_7d.market_syncpara evitar falsos positivos por orden de velas en endpoints legacy. - Incluye alertas de degradacion semanal:
win_ratebajo,max_drawdownalto,queue_failedalto (ALERT_DEGRADATION_*).- Incluye alertas de oportunidad perdida en gates:
- dispara cuando
potential_win_rate_pctde bloqueos sube por encima del umbral con muestra minima (ALERT_GATES_OPPORTUNITY_*). - puede crear auto-CaseReview con accion abierta si la firma de alerta se repite N ciclos (
ALERT_GATES_OPPORTUNITY_AUTO_CASE_*). - Incluye alertas de degradacion de feed:
- macro/news/alignment stale o ausente (
ALERT_FEED_*) basado enGET /ops/data/freshness. - En modo "sin macro feed" usar
ALERT_FEED_CHECK_MACRO=falsepara evitar ruido permanente pormacro_stale. - Para endpoints
/ops/*, usaX-Ops-TokenconOPS_READ_TOKEN(si esta configurado). - Endpoint operativo nuevo:
GET /ops/data/freshness(frescura demacro_events,market_news,market_alignment_events). - Endpoint operativo nuevo:
GET /ops/strategy/performance(KPI de trades cerrados + breakdown por symbol/source/close_reason). - Endpoint operativo nuevo:
GET /ops/strategy/performance/delta(comparativa actual vs ventana previa). - Endpoint operativo nuevo:
GET /ops/trace/trade/{trade_id}(traza puntualdecision->queue->execution->trade). - Endpoint operativo nuevo:
GET /ops/traceability/auto-cases/ownership(resumen de ownership de auto-cases de trazabilidad: open/sin-owner/overdue + alertas). - Endpoint operativo nuevo:
POST /ops/traceability/auto-cases/bulk-claim(claim masivo por owner, opcionalset_in_progress, con auditoria JSONL). - Endpoint operativo nuevo:
GET /ops/traceability/auto-cases/bulk-history(historial de ejecuciones bulk enstorage/logs/ops/traceability-auto-cases-bulk.jsonl). - Endpoint operativo nuevo:
GET /ops/web-auth-smoke/latest(ultimo smoke autenticado web/API + edad + racha de fallos). - Endpoint operativo nuevo:
GET /ops/p0/readiness(estado consolidado de P0.2-P0.5: frecuencia minima, noticias TE+impacto, operacion 7d y hour-edge auto). news_te_operational.breaches:te_source_not_seensolo se activa si la ventana de noticias es RSS-only (source=google_news_rss) y no hay huella TE explicita.
effective_moments:- en modo
auto, siCFG_AUTO::AUTOPILOT_ALLOW_HOURS_UTCglobal esta vacio, usa fallback por simbolo (CFG_AUTO::<SYMBOL>::AUTOPILOT_ALLOW_HOURS_UTC) con merge. - incluye
auto_hours_scope(global|symbol_merged) yauto_hours_by_symbolpara inspeccion.
- en modo
- Endpoint operativo nuevo:
GET /ops/autopilot/tune/latest(ultimo lote de cambiosCFG_AUTO::*, con foco enAUTOPILOT_ALLOW_HOURS_UTC). - Endpoint operativo nuevo:
GET /ops/autopilot/hour-edge/effectiveness(comparativa in-hours vs out-hours: muestra, PnL medio y delta). - Endpoint operativo nuevo:
GET /ops/gates/opportunities-report(reporte accionable de oportunidades perdidas porreason/symbol/session+ top casos bloqueados conpotential_win). - Endpoint operativo nuevo:
GET /ops/execution/health(salud E2Equeue -> execution -> live_tradecon semaforo, brechas y stage-flow). - Endpoint operativo nuevo:
GET /ops/postmortems/assistant-summary(resumen asistido 30d con highlights y recomendaciones priorizadas). - Script operativo nuevo:
scripts/run_ops_weekly_audit.py(auditoria semanal consolidada con recomendaciones enstorage/logs/ops/weekly-audit-*.json/md). - incluye chequeo de
traceability_coverage7d para vigilar la cadenadecision -> queue -> execution -> live_trade. - Smoke recomendado post-deploy:
scripts/smoke_p0_readiness.sh --api-base=https://api.sdp.perlatec.net --email=<admin> --password=<secret>- alternativa con token ops:
OPS_READ_TOKEN=... scripts/smoke_p0_readiness.sh --api-base=https://api.sdp.perlatec.net
- Endpoint analitico nuevo:
GET /analytics/postmortems/summary(resumen 30d de case reviews postmortem: conclusiones, severidad y acciones abiertas/overdue). - Variables nuevas de auto-case (
notify_external_alerts.py): ALERT_GATES_OPPORTUNITY_AUTO_CASE_ENABLED(true/false).ALERT_GATES_OPPORTUNITY_AUTO_CASE_MIN_REPEATS(repeticiones consecutivas minimas).ALERT_GATES_OPPORTUNITY_AUTO_CASE_OWNER(owner inicial opcional para la accion creada).ALERT_GATES_OPPORTUNITY_AUTO_CASE_PRIORITY(low|medium|high).ALERT_GATES_OPPORTUNITY_AUTO_CASE_DUE_HOURS(horas paradue_atde la accion inicial).- En CT110,
deploy/ops/alerts.shreenvia umbrales/owner desde.envcomo flags CLI para asegurar que runtime use los valores operativos: --llm-min-coverage-pct--market-sync-max-lag-minutes--gates-opportunity-auto-case-*- Pendiente prioritario: extender deteccion de ausencia de loops a mas jobs criticos.
- Pendiente fase
F5: alertas de degradacion (expectancy drift / drawdown drift / autopause trigger).
Runbook P0 (warn/danger)#
status=warn:- revisar
breachespor bloque en/ops/p0/readiness. - si el warning involucra hour-edge (
allow_hours_*), aplicarAplicar Hour-Edge Autoen/opsy confirmar que aparece en/ops/autopilot/tune/latest. - validar impacto en
/ops/autopilot/hour-edge/effectiveness(edge_delta_avg_pnl). status=danger:- ejecutar smoke:
scripts/smoke_p0_readiness.sh --fail-on-danger ...y anexar salida al incidente. - revisar
operation_7d(market sync, queue failed, web auth smoke). - si hay
news_stale/no_news_window, ejecutar backfill:python scripts/score_news_impact.py --lookback-days 30. - abrir/actualizar
CaseReviewcon etiquetap0-readiness.