22 KiB
Plan de métricas del bot
Este documento recoge:
- Inventario de las métricas ya existentes en el código.
- Clasificación de cada métrica:
- core: queremos cuidarla y mantenerla estable.
- nice-to-have: útil, pero no crítica; se puede ajustar.
- debug: orientada a depuración / exploración.
- dudosa: probablemente haya que redefinirla o eliminarla.
- Propuesta de set “core v1” (existentes + nuevas).
- Notas sobre persistencia y derivación desde BD.
- Próximos pasos para implementación.
1. Inventario actual de métricas
Nota: solo se listan métricas usadas en código de producción (no tests ni docs).
1.1. HTTP / Webhook / Tráfico
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
webhook_events_total_* |
counter | Webhook | evtNorm embebido en el nombre (*_xxx) |
Contar eventos de webhook por tipo (messages.upsert, etc.). | core |
webhook_errors_total |
counter | Webhook | – | Errores procesando webhooks. | core |
unknown_groups_discovered_total |
counter | Webhook/grupos | – | Mensajes recibidos de grupos no conocidos en BD. | nice-to-have |
messages_blocked_group_total |
counter | Webhook/grupos | – | Mensajes bloqueados por venir de grupos no permitidos. | nice-to-have |
1.2. Onboarding (grupos, DMs, asignaciones)
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
onboarding_prompts_sent_total |
counter | Onboarding-grupos | group_id, source, reason |
Prompts de onboarding enviados al grupo. | core (producto) |
onboarding_prompts_skipped_total |
counter | Onboarding-grupos | group_id, source?, reason |
Casos donde se decide no enviar prompt al grupo. | core (producto) |
onboarding_assign_failures_total |
counter | Onboarding-asignac. | group_id, source, reason |
Fallos al autoasignar tarea en onboarding. | nice-to-have |
onboarding_dm_skipped_total |
counter | Onboarding-DM | reason, group_id |
Razones por las que NO se envía DM de onboarding. | core (producto) |
onboarding_dm_sent_total |
counter | Onboarding-DM | variant, part, group_id |
DMs de onboarding efectivamente enviados. | core (producto) |
onboarding_recipients_capped_total |
counter | Onboarding-DM | group_id |
Número de destinatarios que se quedaron fuera por cap. | nice-to-have |
onboarding_bundle_sent_total |
counter | Onboarding-DM | variant, group_id |
“Bundles” de onboarding enviados. | nice-to-have |
onboarding_dm_sent_abs |
gauge | Onboarding-analytics | – | Valor absoluto de DMs enviados (derivado). | debug |
onboarding_recipients_abs |
gauge | Onboarding-analytics | – | Destinatarios totales (derivado). | debug |
onboarding_converted_users_abs |
gauge | Onboarding-analytics | – | Usuarios convertidos (derivado). | debug |
onboarding_conversion_rate |
gauge | Onboarding-analytics | – | Ratio de conversión calculado. | debug / dudosa |
1.3. Reacciones / Cola de respuestas
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
reactions_enqueued_total |
counter | Reacciones/cola | emoji |
Reacciones encoladas para enviar. | nice-to-have |
reactions_sent_total |
counter | Reacciones/cola | emoji |
Reacciones enviadas con éxito. | nice-to-have |
reactions_failed_total |
counter | Reacciones/cola | emoji |
Reacciones que fallaron al enviar. | nice-to-have |
responses_skipped_unresolvable_recipient_total |
counter | Cola respuestas | reason (non_numeric, too_long, bad_domain…) |
Respuestas descartadas por no poder resolver el JID. | debug (útil) |
1.4. Recordatorios
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
reminders_skipped_outside_window_total |
counter | Recordatorios | – | Recordatorios omitidos por estar fuera de ventana horaria. | dudosa (parcial) |
1.5. Group sync / grupos / miembros
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
sync_runs_total |
counter | Group sync | – | Número de ejecuciones de sync. | core (ops) |
sync_errors_total |
counter | Group sync | – | Errores en ejecuciones de sync. | core (ops) |
sync_skipped_group_total |
counter | Group sync | – | Grupos ignorados en la reconciliación (varios motivos). | nice-to-have |
allowed_groups_labels_filled_total |
counter | Group sync | – | Conteo de grupos donde se rellenaron labels de allowed_groups. | debug |
active_groups |
gauge | Group sync | – | Número de grupos activos cacheados. | core |
active_members |
gauge | Group sync | – | Conteo de miembros activos (BD). | core |
last_sync_timestamp_seconds |
gauge | Group sync | – | Marca de tiempo del último sync correcto. | core |
last_sync_ok |
gauge | Group sync | – | 1 si último sync OK, 0 si falló. | core |
last_sync_duration_ms |
gauge | Group sync | – | Duración del último sync. | core |
alias_coverage_ratio |
gauge | Group sync | group_id |
Cobertura de alias de identidad en el grupo. | debug/nice |
allowed_groups_total_pending |
gauge | Allowed groups | – | Grupos en estado pending. |
core |
allowed_groups_total_allowed |
gauge | Allowed groups | – | Grupos en estado allowed. |
core |
allowed_groups_total_blocked |
gauge | Allowed groups | – | Grupos en estado blocked. |
core |
group_sync_seconds_until_next |
gauge | Group sync | – | Segundos hasta el próximo sync, o -1 si inactivo. | core |
1.6. Identidad / alias
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
identity_alias_upsert_errors_total |
counter | Identidad | – | Errores al hacer upsert de alias. | debug |
identity_alias_upserts_total |
counter | Identidad | – | Número de upserts de alias realizados. | debug |
identity_alias_resolved_total |
counter | Identidad | – | Alias resueltos correctamente. | debug |
identity_alias_unresolved_total |
counter | Identidad | – | Casos en los que no se pudo resolver alias. | debug |
1.7. Administración (allow/block/list)
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
admin_actions_total_allow |
counter | Admin | – | Acciones de “allow” hechas por admins. | nice-to-have |
admin_actions_total_block |
counter | Admin | – | Acciones de “block” hechas por admins. | nice-to-have |
admin_actions_total_list |
counter | Admin | – | Invocaciones a listados de allowed_groups. | nice-to-have |
1.8. Comandos
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
commands_alias_used_total |
counter | Comandos | `action=info | mias | ...` |
commands_unknown_total |
counter | Comandos | – | Mensajes que no se mapean a ningún comando. | core (debug/ux) |
commands_blocked_total |
counter | Comandos | – | Comandos bloqueados (p.ej. grupo no permitido). | core (producto/ops) |
ver_dm_transition_total |
counter | Comandos | – | Veces que se hace transición a “ver por DM”. | nice-to-have |
web_tokens_issued_total |
counter | Web tokens | – | Número de tokens web emitidos. | nice-to-have |
1.9. Mantenimiento / “evolution” (instancia WA)
| Métrica | Tipo | Ámbito | Labels principales | Uso actual / intención | Categoría |
|---|---|---|---|---|---|
evolution_instance_state_changes_total |
counter | Evolution | instance |
Número de cambios de estado de la instancia. | core (ops) |
evolution_health_check_errors_total |
counter | Evolution | instance |
Errores en health checks. | core (ops) |
evolution_instance_restart_attempts_total |
counter | Evolution | instance |
Intentos de reinicio de la instancia. | core (ops) |
evolution_instance_restart_success_total |
counter | Evolution | instance |
Reinicios exitosos de la instancia. | core (ops) |
evolution_instance_state |
gauge | Evolution | instance, state |
Estados actuales de la instancia (por valor de state). |
core (ops) |
evolution_instance_last_state_change_ts |
gauge | Evolution | instance |
Timestamp del último cambio de estado. | nice-to-have |
evolution_instance_state_age_seconds |
gauge | Evolution | instance |
Tiempo en segundos en el estado actual. | nice-to-have |
2. Propuesta de set “core v1” (existentes)
2.1. Operación / salud
Mantener como core:
- Webhook / HTTP:
webhook_events_total_*webhook_errors_total
- Group sync:
sync_runs_totalsync_errors_totalactive_groupsactive_memberslast_sync_timestamp_secondslast_sync_oklast_sync_duration_msgroup_sync_seconds_until_nextallowed_groups_total_pendingallowed_groups_total_allowedallowed_groups_total_blocked
- Evolution / instancia WA:
evolution_instance_state_changes_totalevolution_health_check_errors_totalevolution_instance_restart_attempts_totalevolution_instance_restart_success_totalevolution_instance_state
2.2. Experiencia de usuario / producto
Mantener como core:
- Onboarding:
onboarding_prompts_sent_totalonboarding_prompts_skipped_totalonboarding_dm_sent_totalonboarding_dm_skipped_total
- Comandos:
commands_unknown_totalcommands_blocked_total
3. Métricas existentes marcadas como “nice-to-have” o “debug”
3.1. Nice-to-have (mantener pero sin contrato fuerte)
- Webhook / grupos:
unknown_groups_discovered_totalmessages_blocked_group_total
- Onboarding:
onboarding_assign_failures_totalonboarding_recipients_capped_totalonboarding_bundle_sent_total
- Reacciones:
reactions_enqueued_total/reactions_sent_total/reactions_failed_total
- Group sync:
sync_skipped_group_totalalias_coverage_ratio(si se usa en dashboards)
- Administración:
admin_actions_total_allowadmin_actions_total_blockadmin_actions_total_list
- Comandos:
commands_alias_used_totalver_dm_transition_totalweb_tokens_issued_total
- Evolution:
evolution_instance_last_state_change_tsevolution_instance_state_age_seconds
3.2. Debug / dudosas (candidatas a simplificar o eliminar)
- Onboarding analytics:
onboarding_dm_sent_absonboarding_recipients_absonboarding_converted_users_absonboarding_conversion_rate
- Identidad / alias:
identity_alias_upsert_errors_totalidentity_alias_upserts_totalidentity_alias_resolved_totalidentity_alias_unresolved_total
- Cola de respuestas:
responses_skipped_unresolvable_recipient_total(debug útil → mantener como tal).
- Recordatorios:
reminders_skipped_outside_window_total(parcial: solo una razón de skip, sin contexto de enviados totales).
4. Métricas nuevas propuestas (faltantes importantes)
Nota: nombres sujetos a ajuste, pero la idea es que sean lo más “Prometheus-friendly” posible.
4.1. Tareas
-
Counters (idealmente derivables de BD, o directamente desde DB en
/metrics):tasks_created_total- Definición:
COUNT(*) FROM tasks.
- Definición:
tasks_completed_total- Definición:
COUNT(*) FROM tasks WHERE completed = 1.
- Definición:
-
Gauges (derivables de BD):
tasks_active- Definición: tareas no completadas (criterio exacto según modelo).
tasks_overdue- Definición: tareas no completadas con
due_date < hoy.
- Definición: tareas no completadas con
- (Opcional)
tasks_active_by_groupcon labelgroup_idsolo si el número de grupos es manejable y se considera útil.
4.2. Mensajes y cola de respuestas
-
Tráfico recibido (webhook):
bot_messages_received_total(counter, en memoria)- Labels:
kind=text|reaction|system|other.
- Labels:
-
Tráfico enviado por el bot (muy importante, idealmente persistente):
bot_messages_sent_total(counter, persistente o derivado de BD si posible)- Labels:
kind=reply|reminder|onboarding|error|other.
- Labels:
-
Cola de respuestas:
- Counters:
response_queue_enqueued_total(por tipo de mensaje/reacción).response_queue_sent_total.response_queue_failed_total.response_queue_retried_total.response_queue_exhausted_total(cuando se dan por fallidos tras reintentos).
- Gauges (desde BD):
response_queue_pendingCOUNT(*) FROM response_queue WHERE status='pending'.
response_queue_oldest_age_secondsnow - MIN(created_at)de los pendientes.
- Counters:
4.3. Recordatorios (visión completa)
-
Counters:
reminders_scheduled_total- Cuando se programa un recordatorio.
reminders_sent_total- Recordatorios enviados efectivamente.
reminders_failed_total- Intentos de envío de recordatorio fallidos.
reminders_skipped_total- Con labels
reason=outside_window|user_opt_out|group_not_allowed|gating|invalid_time|other.
- Con labels
-
Opcionalmente ratios calculables en dashboards:
reminders_skipped_total / (reminders_sent_total + reminders_skipped_total).
4.4. Uso de ICS / Web
-
ICS:
ics_requests_total(counter)- Labels:
type=personal|group|aggregate,status_class=2xx|4xx|5xx.
- Labels:
-
HTTP genérico (si se desea):
http_requests_total- Labels:
handler=webhook|metrics|ics|web_ui|...,status_class=2xx|4xx|5xx.
- Labels:
4.5. Otras métricas posibles (según prioridad)
- Usuarios / grupos (como gauges desde BD):
groups_total,groups_active_total.group_members_total(activos).users_total.users_active_30d(si haylast_seen_at).
5. Persistencia vs. métricas derivadas
5.1. Derivadas desde BD (sin cambiar Metrics)
Buenas candidatas:
tasks_*(created,completed,active,overdue).groups_*(total,active).group_members_total.allowed_groups_total_*(ya se hace).response_queue_pending,response_queue_oldest_age_seconds.
Ventaja: son persistentes por diseño, no dependen de reinicios del proceso.
5.2. Contadores en memoria (se reinician)
Buenas candidatas:
- Tráfico “reciente”:
bot_messages_received_total.http_requests_total.
- Eventos de corto plazo:
sync_runs_total,sync_errors_total.evolution_*(si además se pueden inferir de logs/BD, no es grave que se reinicien).
Estos están bien para tendencias recientes, SLIs y alertas basadas en tasas.
5.3. Contadores que probablemente queremos persistir
Lista corta para no complicar demasiado:
bot_messages_sent_totalreminders_sent_total- (Opcional)
webhook_events_received_total(si se agrega unificado, en lugar de solo por tipo).
Opciones:
- Crear una tabla
persistent_metrics(name TEXT PRIMARY KEY, value INTEGER NOT NULL). - Implementar funciones de “incremento persistente” que actualicen BD y, opcionalmente, el estado de
Metrics. - Al renderizar
/metrics, leer estos valores persistentes y exponerlos.
6. Próximos pasos sugeridos
-
Validar este set “core v1”:
- Confirmar que las métricas “core existentes” listadas arriba son realmente las que quieres cuidar.
- Elegir cuáles de las nuevas propuestas son imprescindibles en la primera iteración (p.ej. tareas + mensajes + cola + recordatorios).
-
Definir contrato de nombres:
- Cerrar nombres finales de:
tasks_*bot_messages_*response_queue_*reminders_*ics_requests_total/http_requests_total.
- Cerrar nombres finales de:
-
Implementar por fases:
- Fase 1: gauges derivadas de BD en
/metrics(tareas, cola, grupos, etc.). - Fase 2: counters en memoria (mensajes recibidos/enviados, recordatorios, cola).
- Fase 3: mecanismo de métricas persistentes y migrar los 2–3 contadores elegidos.
- Fase 1: gauges derivadas de BD en
-
Limpiar / reclasificar métricas “debug/dudosas”:
- Mantener
responses_skipped_unresolvable_recipient_totalcomo debug útil. - Simplificar o eliminar gauges de onboarding
*_abs/conversion_ratesi no se usan. - Revisar
reminders_skipped_outside_window_totalcuando exista el set completo dereminders_*.
- Mantener
Este documento sirve como referencia para saber qué métricas existen, cuáles son “de contrato” y cuáles se pueden tocar con menos miedo, además de qué huecos importantes hay que cubrir en próximas iteraciones.