Skip to content

Paridad de plantilla Prometheus con los 26 jobs efectivos

20 de octubre de 2026. Fase de fuente; sin despliegue. Se reconciliaron únicamente prometheus.yml.j2 y un nuevo test local. No se recargó ni reinició Prometheus, no se aplicó Ansible ni se descifraron secretos SOPS. La validación del candidato con promtool nativo fue completada por el coordinador tras publicar7b80f76, como se documenta al final.

Aclaración del contrato de fuente, 22 de octubre de 2026

Los hashes de este informe siguen siendo referencias históricas de 7b80f76. El test exige ahora dos deltas posteriores exactos: el target externo WP-Pulse retirado por PR114 debe estar ausente y Rchat debe conservar personal.lan:8791 con etiqueta host: personal (CT218, ADR0027). Sólo dentro del test se reconstruye la referencia anterior para comparar ambos hashes; cualquier otro cambio sigue fallando. No se renueva el pin del fichero runtime ni se acredita un despliegue. Las alertas Rchat pasan a diagnóstico local filtrado, sin asumir cookie caducada ni recomendar arrancar el Docker antiguo de VM208.

Evidencia fijada y tratamiento privado

Se revalidó CT217 como LXC en marcha, propietario proxmox2. La lectura selectiva de /opt/observa/conf/prometheus.yml exigió SHA256 <REDACTED>. El YAML se capturó exclusivamente en memoria: no se guardó una copia cruda ni se imprimieron su contenido completo, targets privados o valores de autenticación.

La inspección recursiva de campos de autenticación/secretos y URLs con userinfo o query sensible encontró sólo esta ruta de campos: scrape_configs.3.bearer_token, perteneciente a homeassistant. Su valor fue sustituido en memoria por TOKEN_SENTINEL antes de generar fuente o fingerprints semánticos. No se encontraron otros campos de ese tipo.

La revisión independiente detectó que el scanner de pruebas debía cubrir también URLs sin esquema y queries relativas. Se corrigió ese helper, se añadieron las regresiones sintéticas y se repitió la comprobación del YAML fijado en memoria: continuó habiendo únicamente el campo HA esperado. No se imprimieron valores.

La plantilla conserva exactamente una expresión existente {{ ha_prometheus_bearer_token }}. El origen SOPS y su integración en el playbook no se modificaron; no se añadió una credencial ni se escribió un token literal.

Delta limitado respecto a la fuente anterior

La fuente pasa de 23 a 26 jobs, incorporando tres contratos ya efectivos:

  • blackbox-dns.
  • blackbox-wallet.
  • blackbox-wallet-local.

Entre los jobs previamente declarados cambian sólo static_configs de: node, blackbox-http-internal, asus-router, openclaw-vm-node, openclaw-vm-process, rchat y jev-gateway.

Los bloques superiores global, rule_files y alerting quedan semánticamente idénticos. También permanecen iguales los otros campos de esos siete jobs y todos los demás jobs existentes. Se conservaron comentarios útiles; se retiró de dos cabeceras la ubicación antigua en VM208. No se introduce un probe que no estuviese ya declarado en el runtime comparado.

Comparación y pruebas

El render local usa únicamente TOKEN_SENTINEL, sin lookup externo. Se ordenan los jobs por nombre para el fingerprint semántico; las estructuras y listas internas se conservan. El digest del runtime sanitizado y el del render coinciden:

<REDACTED>.

Al retirar los tres jobs añadidos y los siete bloques static_configs afectados, el digest de la estructura preservada coincide con el baseline de fuente:

<REDACTED>.

python3 ansible/roles/observability_collector/tests/test_prometheus_config_parity.py: cinco tests PASS. Comprueban los 26 nombres únicos y la paridad completa, el alcance exacto del cambio, la única variable HA, el pin de hash y sustitución de autenticación, y rechazo de campos/URLs sensibles desconocidos. Los fixtures de autenticación son sintéticos. Los asserts de autenticación no imprimen su valor ante un fallo. git diff --check quedó limpio para estos dos archivos.

Fuente candidata SHA256
ansible/roles/observability_collector/templates/prometheus.yml.j2 <REDACTED>
ansible/roles/observability_collector/tests/test_prometheus_config_parity.py <REDACTED>

La revisión independiente concluyó PASS sobre esos dos hashes y repitió los cinco tests, incluyendo las URLs relativas, sin consultas remotas. También contrastó el fingerprint completo, la proyección del baseline y el alcance de tres jobs/siete static_configs. La fuente sigue congelada. Esta comparación no sustituye promtool nativo ni acredita la aplicación de esta plantilla.

Límites y recuperación

Este cambio no reconcilia el propietario del playbook legado ni versiona el Compose vivo de /opt/observa; las guardas de esas operaciones son trabajo separado del coordinador. No se invoca el antiguo swap ni se usa el fichero auxiliar del home como fuente efectiva. El contexto de mounts y deriva se documentó en la investigación de fuente efectiva.

La recuperación de esta fase consiste en revertir únicamente el diff de la plantilla y el test nuevo, preservando los cambios ajenos. No hay rollback de runtime que ejecutar porque no se ha alterado ese runtime. Cualquier aplicación posterior debe volver a comprobar propietario, mounts y hashes actuales, sin actualizar automáticamente este pin por una divergencia.

Validación nativa del candidato, 02:27 CEST

Después de publicar7b80f76, Root renderizó el candidato con TOKEN_SENTINEL (sin consultarSOPS ni utilizar el token real) y las87 alertas fuente. Se copiaron sólo esos dos archivos a un directorio temporal nuevo0700 con archivos0600 dentro del contenedor Prometheus existente en CT217. Se preservó la referencia relativa alerts.yml y se validó el par con promtool check config prometheus.yml.

ResultadoSUCCESS: configuración sintácticamente válida, un fichero de reglas, 87reglas correctas. Se retiraron exclusivamente los dos temporales y su directorio. Sin reload/restart/pull, cambios live, consultas a productos ni notificaciones. Esta prueba valida el candidato y las referencias; no acredita salud de los26targets ni aplicación o autenticación del token real.