Inventario de cobertura de monitoreo¶
Fuente de verdad del epic Monitoreo de aplicaciones V1 (Taiga #256, historia #506). Lista qué corre en cada VM y qué cobertura tiene hoy desde el stack de observabilidad, para estimar el trabajo pendiente de monitoreo. Foco actual: GCP. Oficina y SAP on-premise quedan relevados al final como referencia. No cubre seguridad ni infraestructura: eso va en otro proyecto.
Cómo se relevó¶
| Fuente | Qué aportó | Fecha |
|---|---|---|
gcloud compute instances list + SSH por IAP a las 6 VMs encendidas (scripts/relevamiento-gcp.sh y una segunda pasada dirigida) |
Contenedores, servicios systemd, puertos, exporters instalados, agentes, reinicios y consumo | 2026-09-03 |
API de Prometheus de producción (targets, up, probe_success, node_*, rules, status/tsdb) |
Qué llega realmente, alertas activas, cardinalidad | 2026-09-03 |
API de Loki (labels) |
Qué logs llegan realmente | 2026-09-03 |
| Configs del repo y de los agentes remotos | Qué se pretende recolectar vs. qué llega | 2026-09-03 |
docker ps en el servidor Docker de oficina |
Contenedores de oficina | 2026-09-03 |
Leyenda: ✅ existe y funciona · ⚠️ existe pero no llega o está roto · ❌ no existe · ➖ no aplica · ❓ a confirmar.
Resumen ejecutivo (GCP)¶
Estado al 2026-09-08, tras el sprint 37. El relevamiento original es del 2026-09-03; las tablas de más abajo conservan lo encontrado entonces con las columnas de cobertura actualizadas.
- Proyecto
wordpress-bitnami-218212, zonasouthamerica-east1-a: 7 VMs, 6 encendidas. Prometheus scrapea las 6: node_exporter en todas, cAdvisor en las 3 con Docker, exporters de Postgres, PgBouncer, Redis (3 instancias), Kafka y n8n. - 41 targets, todos
UP; 53 reglas en 9 grupos, cada una con test entests/alertas_test.yml; 22 tableros provisionados desde el repo. - Ecommerce cubierto de punta a punta: probes públicos e internos de storefront, CMS, Medusa y n8n; Kafka con lag por consumer group y DLQ; Redis; base en postgres-db-vm; contenedores. Vista de operación: tablero
ecommerce-stack. - devops-vm corre el stack y 43 contenedores de apps internas; monitoreada como host, sus contenedores por cAdvisor y el stack se automonitorea. Sin Watchdog por decisión (ADR-0005).
- wp-server-1 en retiro:
MySQLDownpermanente documentado y no corregido. Retirar sus targets al apagarla. - Sin cobertura todavía: bases en contenedores de devops-vm (#567), probes de las apps internas (#272), ResourceSpace (#289), logs de contenedores (#556, con Ops Agent de Google ya mandando syslog a Cloud Logging en 4 VMs), probes SAP que dejaron de llegar (#171).
- Fuera de este proyecto:
/metricsde n8n y la API de kafka-ui responden públicos sin autenticación (anotado en el epic de hardening).
VMs de GCP¶
| VM | Tipo | SO | IP interna | Estado | Rol |
|---|---|---|---|---|---|
| devops-vm | c3-standard-4 (4 vCPU, 15 GB) | Debian 12 | 10.158.0.22 | RUNNING | Stack de observabilidad + apps internas + túnel Cloudflare |
| ecommerce-srv | e2-custom-4-6144 (4 vCPU, 6 GB) | Debian 12 | 10.158.0.19 | RUNNING | Tienda: Medusa, storefront, Payload CMS, Kafka |
| integrador | c3-highcpu-4 (4 vCPU, 8 GB) | Debian 11 | 10.158.0.3 | RUNNING | Integrador Laravel + MariaDB + PC Manager, crm, dba |
| postgres-db-vm | n2d-custom-2-4096 (2 vCPU, 4 GB) | Debian 12 | 10.158.0.24 (sin IP pública) | RUNNING | PostgreSQL 16 + PgBouncer centralizado |
| redis-srv-vm | e2-small (2 vCPU, 2 GB) | Debian 13 | 10.158.0.23 | RUNNING | Redis 7 en contenedor |
| wp-server-1 | e2-standard-4 (4 vCPU, 16 GB) | Debian 12 | 10.158.0.21 | RUNNING | WordPress público (www), Apache + MariaDB nativos |
| wordpress-dev-vm | e2-standard-2 | Debian 12 | 10.158.0.20 | TERMINATED | Apagada, fuera de alcance |
Cobertura por VM¶
| VM | node_exporter | Scrape en Prometheus | Contenedores | Exporters de servicio | Probes | Logs | Ops Agent GCP | Alertas |
|---|---|---|---|---|---|---|---|---|
| devops-vm | ✅ (:9100, basic auth) | ✅ | 48, ✅ cAdvisor | ✅ job stack: Alertmanager, Loki, Grafana, Blackbox |
ICMP ✅, HTTP a Alertmanager ✅ | ❌ (json-file local) | ✅ default | ✅ servidor_alertas + stack_alertas |
| ecommerce-srv | ✅ | ✅ | 8, ✅ cAdvisor | ✅ redis_exporter (medusa_redis), ✅ kafka_exporter | TCP :9000 ✅, HTTP público a shop, cms y medusa ✅, HTTP interno a los 3 ✅, ICMP ✅ | ❌ | ✅ default | ✅ servidor + redis + contenedores + probes |
| integrador | ✅ | ✅ | ➖ sin Docker | ✅ mysqld_exporter. ❌ redis-server local, php-fpm, apache | HTTP integrador ✅, pcm ✅, ICMP ✅. ❌ crm, dba |
✅ Laravel → Loki por Alloy (general, channels, jobs, horizon) | ✅ default | ✅ servidor + mysql |
| postgres-db-vm | ✅ (:9100, sin auth) | ✅ | ➖ | ✅ postgres_exporter :9187 scrapeado. ⚠️ pgbouncer_exporter :9127 bloqueado por ufw de la VM. Textfile pgbackrest.prom disponible (backups) |
❌ | ❌ | ❌ | ✅ servidor_alertas + postgres_alertas |
| redis-srv-vm | ✅ (:9100, basic auth) | ✅ | 1 (redis), ✅ cAdvisor | ✅ redis_exporter :9121 | ICMP ✅ | ❌ | ❌ | ✅ servidor + redis + contenedores |
| wp-server-1 (en retiro) | ✅ | ✅ | ➖ sin Docker | ⚠️ mysqld_exporter UP pero mysql_up = 0: Error 1130: Host '::1' is not allowed. No se corrige |
HTTP www ✅, ICMP ✅ |
❌ | ✅ default | ✅ servidor + mysql (MySQLDown disparada de forma permanente) |
Estado de recursos al momento del relevamiento:
| VM | RAM usada | Disco / |
|---|---|---|
| devops-vm | 9,4 de 15 GB | 52 % de 99 GB |
| ecommerce-srv | 3,0 de 5,8 GB | 51 % de 49 GB |
| integrador | 4,1 de 7,8 GB | 70 % de 79 GB |
| postgres-db-vm | 1,6 de 3,8 GB | 20 % de 30 GB |
| redis-srv-vm | 0,5 de 1,9 GB | 36 % de 9,7 GB |
| wp-server-1 | 6,1 de 15 GB | 56 % de 99 GB |
devops-vm: contenedores por proyecto compose¶
Todos con log driver json-file, sin límite de memoria salvo donde se indica.
Proyecto (/opt/...) |
Contenedores | Imágenes | Salud / reinicios | Público |
|---|---|---|---|---|
| observability-stack | prometheus, alertmanager, grafana, loki, blackbox_exporter | latest / loki 3.0.0 | sin healthcheck, 0 reinicios | prometheus, grafana, loki |
| taiga | gateway (nginx :9900), front, back, async, events, protected, custom-admin, db, 2 rabbitmq | taiga latest, postgres 12.3, rabbitmq 3.8 | solo db con healthcheck | proyectos |
novu (/opt/novu) |
api :3300, dashboard :4000, worker, ws :3302, mongodb, redis | novu 3.18.0, mongo 8.0.17 | healthy | novu, novu-ws |
| resourcespace | web :8085, cron, db | resourcespace 11.0, mariadb 11.4 | web sin healthcheck | ❓ hostname no encontrado |
| frappe | frontend :8080, backend, scheduler, websocket, 2 queues, db, 2 redis | frappe-docker v16.26.1, mariadb 10.6 | solo db con healthcheck | hr |
| planka | planka :1337, planka-db | planka 2.1.1, postgres 16 (límite 3 GB / 512 MB) | healthy | ❓ |
| n8n-production | n8n :5678, worker, redis | n8n 2.26.3 (límites 1 GB / 2 GB) | healthy. Base en postgres-db-vm. Monitoreado: job cloud-n8n, redis_exporter, probes, n8n_alertas, tablero n8n |
n8n |
| openwebui-production | open-webui :8090 | open-webui 0.10.2 (límite 2 GB, usa 1 GB) | healthy. Base en postgres-db-vm | chat |
| chatwoot | rails :3050, sidekiq | chatwoot v4.14.0 | sin healthcheck. Base ❓ (no hay postgres local ni en postgres-db-vm) | chatwoot |
| tracar | app :8082 + :5001/:5023 GPS, postgres | traccar latest, postgres 16 | app sin healthcheck | ❓ |
| outline | outline :3000, postgres, redis | outline latest | healthy | wiki ❓ |
| sap-bridge, sap-kafka-enrichment-worker | 1 + 1 | ghcr.io/compulandiati | enrichment-worker con 43 reinicios en 3 días, sin healthcheck | ➖ |
El túnel de Cloudflare corre en devops-vm con configuración remota (token): el mapeo hostname a servicio se administra en el panel de Cloudflare, no hay archivo local.
ecommerce-srv: contenedores¶
| Contenedor | Imagen | Puerto | Salud / reinicios | Notas |
|---|---|---|---|---|
| medusa_backend | ecommercev2backend v1.0.1 | :9000 | sin healthcheck, 7 reinicios | /health responde 200 |
| medusa_storefront | ecommercev2frontend v0.1.1 | :8000 | healthy | |
| medusa_redis | redis 7 | :6379 | sin healthcheck | |
| payload-cms | payload-cms v1.0.0 | :3000 | unhealthy hace 3 días: wget: can't connect |
cms responde 200 por el edge, verificar qué sirve |
| kafka | apache/kafka 4.2.0 | :9092, :9094 | healthy | 1,27 de 1,95 GB de límite, sin JMX expuesto |
| kafka-ui | provectuslabs | :8080 | sin healthcheck | 277 de 500 MB de límite |
Postgres de Medusa y Payload ya migró a postgres-db-vm (epic #255).
postgres-db-vm: bases¶
| Base | Tamaño | Consumidor |
|---|---|---|
| n8n | 1,3 GB | devops-vm / n8n-production |
| medusa | 199 MB | ecommerce-srv |
| openwebui | 18 MB | devops-vm |
| payload | 15 MB | ecommerce-srv |
| outline, planka, traccar | 7,5 MB c/u | devops-vm (los contenedores locales *-postgres siguen corriendo: confirmar cuál usa cada app) |
PgBouncer en 10.158.0.24:6432 para las 7 bases. Sin Ops Agent. Sin
métricas de backup.
integrador¶
Sin Docker. Apache 2 con vhosts integrador, pcm, crm, dba (con
certificados Let's Encrypt), PHP-FPM 8.3, MariaDB 10.5.29, redis-server
local, servicio integrador-kafka-consumer (artisan sap:consume-enriched-items)
y Alloy que scrapea el host y envía 4 grupos de logs Laravel a Loki.
wp-server-1 (en retiro)¶
Sin Docker. WordPress en /var/www/html/wordpress, Apache 2 con
certbot, MariaDB, fail2ban, ufw. La observabilidad de MySQL no funciona:
el mysqld_exporter falla por grant IPv6 y MySQLDown queda activa de forma
permanente. Decisión del 2026-09-03: WordPress se reemplaza por el ecommerce
nuevo, así que no se invierte en corregirlo. Cuando la VM se apague hay que
retirar sus targets de prometheus.yml para que no queden ServidorCaido y
MySQLDown colgadas.
Stack de observabilidad¶
| Componente | Estado relevado | Cobertura propia |
|---|---|---|
| Prometheus | 21.312 series, 17 targets directos + 14 jobs por remote_write, retención 30 d | ✅ se scrapea. Sin alerta de targets caídos globales ni de ausencia de datos remotos |
| Alertmanager | Receptor único de correo; ruta critical igual a la default; receptor Slack sin ruta |
HTTP probe ✅. Sin alerta de notificaciones fallidas ni Watchdog |
| Grafana 12.4.1 | 6 tableros, uid duplicado entre los dos del Integrador |
❌ sin scrape |
| Loki 3.0 | Un solo origen (job=laravel). /ready da 503 desde afuera pero ready en local: es el edge o Access, no Loki |
❌ sin scrape |
| Blackbox | 5 módulos, 11 targets, todos probe_success = 1 |
❌ sin scrape. Grupo blackbox comentado |
| Reglas | 18 alertas en 3 grupos | Activas: MySQLDown wp-server-1, ServidorCaido staging oficina |
Huecos GCP y estimación¶
Solo monitoreo y observabilidad. Tamaño: S ≤ 1 día, M 2 a 3 días, L 4 a 6 días, incluyendo reglas, tablero, prueba de alerta y runbook. Historias del epic #256.
| # | Hueco | Alcance concreto | Historia | Tamaño |
|---|---|---|---|---|
| 1 | Exporters instalados y no scrapeados | En curso (2026-09-03): devops-vm y postgres-db-vm en cloud-nodes, jobs cloud-postgres, cloud-pgbouncer y stack, reglas postgres_alertas y stack_alertas, tablero postgres-db. Desplegado: devops-vm, postgres-db-vm (:9100, :9187) y el job stack en UP. Bloqueo restante: ufw en postgres-db-vm permite 9100 y 9187 desde devops-vm pero no 9127, así que cloud-pgbouncer queda down hasta que se agregue esa regla (la regla GCP deny-internal-to-postgres no resultó ser el impedimento) |
#544 (devops), #562 (postgres) | S + S |
| 2 | MySQLDown permanente en wp-server-1 |
Sin acción (VM en retiro). Al apagar la VM, retirar sus targets de prometheus.yml |
#506 | ➖ |
| 3 | Probes sin alertas | Hecho (2026-09-04): blackbox_alertas con severity por target, ICMP ampliado a postgres-db-vm y redis-srv-vm, tablero Blackbox exportado al repo |
#539 | S |
| 4 | Automonitoreo del stack | Hecho (2026-09-04): job stack, stack_alertas con absent() por job remoto y disco, tablero stack-observabilidad, prueba en vivo con blackbox_exporter. Sin Watchdog por decisión: riesgo aceptado hasta tener un receptor externo |
#544 | M |
| 5 | Cero métricas de contenedores | Desplegado (2026-09-03): cAdvisor 0.55.1 en devops-vm, ecommerce-srv y redis-srv-vm, job cadvisor, reglas contenedores_alertas, tablero contenedores. cAdvisor no expone el estado unhealthy del healthcheck de Docker: Payload unhealthy sigue sin alerta hasta el probe HTTP (7) |
#550 | M |
| 6 | Redis sin exporter | Hecho (2026-09-04): redis_exporter en redis-srv-vm y ecommerce-srv, node_exporter en redis-srv-vm, redis_alertas, tablero redis. Kafka pasó a #579 |
#170 | M |
| 7 | Apps internas sin probe | Probe HTTP a proyectos, hr, novu, novu-ws, n8n, chat, chatwoot, wiki, kafka-ui, crm, dba, docs, más Planka, Traccar y ResourceSpace cuando se confirme hostname. Un job, tablero apps-internas. Los del ecommerce (shop, cms, medusa) ya están (#572) |
#272 | M |
| 8 | ResourceSpace | Probe HTTP, mysqld_exporter contra resourcespace-db-1 (mariadb 11.4), disco del volumen de archivos |
#289 | S |
| 9 | Bases de datos en contenedores sin exporter | En devops-vm: postgres de taiga (12.3), traccar, outline, planka; mariadb de frappe y resourcespace; mongo de novu; 6 redis; 2 rabbitmq. Primero confirmar cuáles siguen en uso tras la migración a postgres-db-vm | nueva historia | L |
| 10 | Logs de contenedores | Fase 1: decidir por app entre Loki (Alloy con loki.source.docker), Cloud Logging (Ops Agent ya instalado, solo falta el receiver de Docker) o nada. Fase 2 proporcional |
#556 | M + M/L |
| 11 | Ops Agent sin criterio | 4 VMs mandan a Cloud Monitoring y Cloud Logging con config default. Decidir si se mantiene como segundo canal o se apaga para no duplicar costo | #556 | S |
| 12 | Healthchecks ausentes | 20 contenedores en devops-vm sin healthcheck (Taiga, Frappe, Chatwoot, Traccar, ResourceSpace, el propio stack). Sin healthcheck, cAdvisor solo puede ver reinicios y consumo | #550 (documentar) / repos de cada app | S por app |
| 13 | Deuda de tableros | uid duplicado del Integrador; tablero network-health-check alineado a alertas |
#494 | S |
Foco: ecommerce-srv (Medusa, storefront, Payload, Kafka, Redis)¶
Vista de operación: tablero Ecommerce — Stack completo (ecommerce-stack).
El ecommerce nuevo es la prioridad de la V1. Lo que tiene y lo que falta:
| Pieza | Hoy | Falta |
|---|---|---|
| Host | node_exporter ✅, servidor_alertas ✅, ICMP ✅ |
➖ |
| Medusa backend (:9000, v1.0.1) | probes TCP y HTTP público e interno ✅ con alertas, contenedor ✅ | sin /metrics propio (404): métricas de aplicación quedan como pendiente del repo de Medusa; logs (10) |
| Storefront (:8000, v0.1.1) | probe HTTP a shop.compulandia.com.py/api/health e interno ✅, contenedor ✅ |
al migrar a www, cambiar el target y reetiquetar el de WordPress. / redirige en bucle a /py para clientes sin cookie |
| Payload CMS (:3000) | probe HTTP a cms.compulandia.com.py/api/health e interno ✅, contenedor ✅ |
el unhealthy de Docker es un bug del healthcheck (localhost → ::1), corregir en el repo de payload-cms |
| Kafka 4.2 (:9092) | kafka_exporter ✅, kafka_alertas ✅ (lag por grupo, DLQ, consumidores críticos), tablero ✅ |
sin JMX: métricas de JVM del broker pendientes de jmx_exporter si hacen falta |
| Redis (medusa_redis y redis-srv-vm) | redis_exporter ✅, redis_alertas ✅, tablero ✅ |
ninguno tiene maxmemory: definirlo en cada redis.conf |
| Postgres de Medusa y Payload | ✅ postgres-db-vm scrapeado, postgres_alertas |
➖ |
Orden sugerido: 1 (postgres-db-vm y devops-vm, casi inmediato), 3 y 4 (confianza en alertas), 5 y 6 (contenedores, Kafka, Redis del ecommerce), 7 (probes de storefront y Payload junto con las apps internas). 9, 10 y 11 necesitan decisión previa. wp-server-1 no recibe trabajo.
Pendientes de confirmar¶
- Hostnames públicos de Planka, Traccar, ResourceSpace y Outline (se probó
wiki, responde 200 pero no se confirmó que sea Outline). - Base de datos que usa Chatwoot.
- Si los contenedores
outline-postgres-1,tracar-postgres,planka-dbsiguen en uso o quedaron tras la migración a postgres-db-vm. - Qué sirve
cms.compulandia.com.pymientras el contenedor de Payload está unhealthy. - Qué consume
redis-srv-vm. - Identidad de
vm-01(manda node_exporter por Grafana Agent; no coincide con ninguna VM de GCP: 8 vCPU, 7,7 GB, Debian 12).
Referencia: oficina y SAP on-premise¶
Fuera del foco actual. Relevado el 2026-09-03 desde Prometheus y el propio servidor Docker de oficina.
| Host | Cobertura | Pendiente |
|---|---|---|
| dkr-srv 192.168.0.201 (Debian 11, 6 vCPU, 23 GB, disco al 84 %) | node_exporter vía Grafana Agent de dev. 52 contenedores en 18 proyectos (staging de Medusa, Payload, n8n, OpenWebUI, Novu, Typesense; Frappe HR, Planka, Chatwoot, ResourceSpace, Glitchtip, Kafka local, sap-bridge; compose monitoring-network con Alloy, mktxp, smokeping, snmp-exporter, speedtest) |
Sin métricas de contenedores ni logs. speedtest-exporter unhealthy y sin datos en Prometheus. Payload staging unhealthy |
| dev 192.168.0.220 | node + mysqld vía Grafana Agent | ➖ |
| staging 192.168.0.250 | Servidor dado de baja (2026-09-04). Job staging_node retirado del config de referencia del Grafana Agent; aplicar en el agente de dev (192.168.0.220) |
➖ |
| MikroTik 192.168.0.1 | snmp, mktxp, smokeping | Sin reglas de red |
| sap-linux 10.100.102.10 (SLES 15 SP4, 40 vCPU, 113 GB) | node (+ textfile sap_backup_*), sap_host_exporter, hanadb |
Probes TCP a HANA y Service Layer definidos en config.alloy: dejaron de llegar hace pocos días (hay muestras en la ventana de 7 días al 2026-09-04, ninguna reciente). Solo sap_backup_full_* con muestras recientes |
| WIN-IATHEPGGQIU 10.100.102.20 (Windows Server 2022) | windows_exporter (3.900 series de servicios, mayor cardinalidad del sistema) | Sin reglas. Probe RDP no llega |
| OMS 10.100.0.245 | ❌ | Probes HTTP y logs PM2 definidos y no llegan. Tablero OMS con datos ausentes |