Saltar a contenido

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_sync last_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_sync ejecutandose sin gaps.
  • signal_queue.failed y 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_trade por 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.py revisa 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_pct bajo (ALERT_LLM_MIN_COVERAGE_PCT).
  • parse_ok_pct bajo (ALERT_LLM_MIN_PARSE_OK_PCT).
  • latency p95 alto (ALERT_LLM_MAX_LATENCY_P95_MS).
  • tokens 24h alto (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_sync para evitar falsos positivos por orden de velas en endpoints legacy.
  • Incluye alertas de degradacion semanal:
  • win_rate bajo, max_drawdown alto, queue_failed alto (ALERT_DEGRADATION_*).
  • Incluye alertas de oportunidad perdida en gates:
  • dispara cuando potential_win_rate_pct de 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 en GET /ops/data/freshness.
  • En modo "sin macro feed" usar ALERT_FEED_CHECK_MACRO=false para evitar ruido permanente por macro_stale.
  • Para endpoints /ops/*, usa X-Ops-Token con OPS_READ_TOKEN (si esta configurado).
  • Endpoint operativo nuevo: GET /ops/data/freshness (frescura de macro_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 puntual decision->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, opcional set_in_progress, con auditoria JSONL).
  • Endpoint operativo nuevo: GET /ops/traceability/auto-cases/bulk-history (historial de ejecuciones bulk en storage/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_seen solo 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, si CFG_AUTO::AUTOPILOT_ALLOW_HOURS_UTC global esta vacio, usa fallback por simbolo (CFG_AUTO::<SYMBOL>::AUTOPILOT_ALLOW_HOURS_UTC) con merge.
    • incluye auto_hours_scope (global|symbol_merged) y auto_hours_by_symbol para inspeccion.
  • Endpoint operativo nuevo: GET /ops/autopilot/tune/latest (ultimo lote de cambios CFG_AUTO::*, con foco en AUTOPILOT_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 por reason/symbol/session + top casos bloqueados con potential_win).
  • Endpoint operativo nuevo: GET /ops/execution/health (salud E2E queue -> execution -> live_trade con 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 en storage/logs/ops/weekly-audit-*.json/md).
  • incluye chequeo de traceability_coverage 7d para vigilar la cadena decision -> 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 para due_at de la accion inicial).
  • En CT110, deploy/ops/alerts.sh reenvia umbrales/owner desde .env como 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 breaches por bloque en /ops/p0/readiness.
  • si el warning involucra hour-edge (allow_hours_*), aplicar Aplicar Hour-Edge Auto en /ops y 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 CaseReview con etiqueta p0-readiness.