Capa de interoperabilidad · Prueba técnica de arquitectura

ADR-032: panel de monitoreo de solo lectura y pila de observabilidad en el clúster

Aceptado el 15/11/2026 (regla de Andrés: ADR necesario y no absorbido por otro, aprobado; lo comunicó la sesión de planeación). Propuesto ese mismo día por el carril `monitoreo-en-vivo`. Pedido de Andrés del 15/11/2026: un panel de solo lectura en `monitor.andesretail.com` con logs, métricas, trazas, quién compra, la prueba de carga y el grafo de componentes en vivo.

Contexto

docs/to-be/10-observabilidad.md fija las piezas del demo (OpenTelemetry Collector, Prometheus, Loki, Tempo y Grafana en el clúster) y ADR-021 que las métricas de negocio salen en /metrics y las lee el recolector. Faltaba cómo se despliegan y cómo se muestran, y había tres puntos abiertos:

  1. El plan decía que en Kubernetes el agente de OpenTelemetry lo inyectaría el operador de OpenTelemetry con su recurso Instrumentation, que pide cert-manager. Son dos piezas más en un clúster que ya corre 20 cargas, a dos días de la entrega.
  2. El subdominio grafana del catálogo no existe en DNS. Andrés pidió monitor, con el grafo de la malla además de los tableros.
  3. El grafo de componentes en acción no es un tablero: lo dibuja Kiali con las métricas que ya emiten los sidecars de Istio.

Opciones

Punto Opción elegida Alternativa Por qué
Agente de OpenTelemetry Contenedor de arranque en el chart workload que copia el agente desde la imagen de autoinstrumentación del operador (la misma imagen, digest y rutas que compose, deploy/compose/otel.yaml) y las mismas variables de entorno Operador de OpenTelemetry con cert-manager Mismo resultado sin dos componentes más; compose y Kubernetes quedan iguales. Se pierde el cambio de versión del agente sin tocar el chart
Instalación Charts propios pequeños en platform/k8s/charts/ (prometheus, loki, tempo, otel-collector, grafana, kiali), una réplica, retención corta Charts de la comunidad (kube-prometheus-stack, loki, tempo, kiali-operator) Pasan k8s-verify (kubeconform y Trivy sin hallazgos) como el resto, sin operadores ni CRD nuevas, y caben en el nodo del demo
Métricas El recolector, uno por nodo, lee /metrics de los pods con anotaciones prometheus.io/* (con sidecar, el puerto 15020 que une las de la aplicación y las de Envoy) y las manda a Prometheus por remote write con los filtros de ADR-021 Prometheus lee directo a los pods Respeta ADR-021: los filtros de datos personales y etiquetas sin límite quedan en un solo lugar
Grafo de componentes Kiali, servidor sin operador, view_only_mode, acceso anónimo y un ClusterRole que solo lee, en monitor.<zona>/kiali Panel de grafo de nodos de Grafana con las métricas de servicio de Tempo Kiali dibuja la malla real (mTLS, 429, errores por arista) sin escribir código
Acceso monitor.<zona> detrás de Cloudflare Access (correo), Grafana anónimo en rol Viewer sin ingreso ni edición, Prometheus, Loki y Tempo sin ruta pública Grafana con usuarios propios Una sola puerta (Access) y nada que editar: el demo no puede romperse desde el panel

Decisión

Qué se sacrifica