Promtail → Alloy: plan de equivalencia, 20 octubre de 2026¶
Sólo fuente y documentación; sin despliegue, instalación o lectura remota. Promtail llegó a EOL el 2 de marzo de 2026 según Grafana. La propuesta sustituye el agente de logs existente, sin añadir plataforma, receptor, scraping de productos ni cambios de watchdog. La incidencia de pmx50 sigue abierta; no se propone cambiar su colector durante una ventana inestable.
Qué acredita la fuente¶
Base revisada 405b429. El role Promtail
declara binario 3.6.10, usuario root, unidad propia, configuración en
/etc/promtail/config.yml y posiciones en /var/lib/promtail/positions.yaml.
La play tiene tags promtail,never: no converge mediante el pull ordinario.
Aplicar ese role instala/arranca/reinicia y consulta /ready; no usarlo para
inspección ni como dry-run de esta propuesta.
Render local StrictUndefined + YAML, sin SOPS ni Ansible: pmx50 declara 10 jobs
(6 LXC) y pmx51 declara 22 (18 LXC). Los hashes del render son
<REDACTED>
y <REDACTED>.
Son contratos de fuente, no inventario de agentes ni journals accesibles hoy.
El README del role conserva listas LXC antiguas; prevalecen template y host_vars.
| Flujo fuente | Contrato que debe conservar Alloy |
|---|---|
| Journal de host | /var/log/journal, max_age 12h; job=systemd-journal; host proxmox-50 o proxmox2-51; unit, syslog_identifier y priority derivados de los campos journal actuales |
| Journal LXC | Ruta ZFS por CT, max_age 24h; job=lxc, host=lxc-ID, ct_name; unit y priority, sin añadir syslog_identifier por defecto |
| varlogs | Los seis patrones existentes syslog/kern/auth/daemon/messages/user; job/host y el mismo regex→label syslog_identifier |
| vzdump / pveproxy | Los globs actuales, job/host y etiquetas filename equivalentes; sin nuevo parser |
| Salida | http://observa.lan:3101/loki/api/v1/push; ningún campo auth declarado en el cliente fuente; no inferir por ello auth runtime ausente |
El perfil CT217 sitúa Observa en proxmox2; la lectura Loki 17:56 revalidó ese propietario y puerto 3101, pero no permisos de push, DNS de los emisores ni configuración de Promtail. El inventario de septiembre que apunta a VM208 no se toma como runtime actual.
Conversión y estado: decisiones obligatorias¶
Usar el conversor oficial
sólo sobre copias privadas de configuraciones acreditadas, con binario/release y
SHA fijados en la futura implementación. Revisar todas las advertencias y validar
el candidato; no activar --config.bypass-conversion-errors ni usar conversión
transparente en producción como sustituto de revisión.
- Journal:
loki.source.journalcon path y 12h/24h explícitos, más reglas de metadatos; no adoptar su valor por defecto 7h. Su documentación advierte de un job basado en el nombre del componente: fijar el job histórico en un relabel final posterior al source y comprobar el evento emitido, no sólo el HCL. MantenerMESSAGE, sin envolverlo en JSON ni convertir todos los campos en labels. - Cursor journal: evaluar
legacy_position { file=..., name=... }con copia privada de posiciones.namees el job_name Promtail:journalpara host,lxc-ID-ct_namepara cada CT; no el labelsystemd-journal/lxc. La importación sólo ocurre si no existe estado nuevo. Mantener nombres de componentes y storage.path estables después. Referencia journal. - Ficheros: local.file_match→loki.source.file y el proceso regex existente.
Usar
legacy_positions_filesegún su formato soportado, conservando paths y labels; no compartir un fichero de posiciones mutable entre agentes. El estado Alloy pertenece a su storage.path/componente; retirarlo o renombrar componentes puede causar replay. Posiciones desconocidas/corruptas bloquean el cambio; no elegir silenciosamente inicio o fin del archivo. Referencia file. - Tiempo: la fuente no declara stage.timestamp. No añadir uno para “corregir” la falta de cobertura PRE observada en Loki. Exigir fixtures journal con tiempo de evento conocido y llegada diferida, y ficheros con fechas en el texto: comparar timestamp enviado, precisión, zona y cuerpo entre agentes. La falta de ese cotejo deja equivalencia temporal pendiente.
Alcance LXC y secuencia operativa futura¶
ADR27 §4.5 propone journal-upload por CT y journal-remote central en Observa, para seguir al CT tras HA. La fuente actual sigue leyendo subvolúmenes por nodo; esa centralización no está acreditada. No mezclarla con el reemplazo del agente: primero levantar un contrato de cada ruta realmente usada, propietario PVE y journal local frente a réplica pasiva. No copiar a ciegas las 24 entradas LXC, leer ambas réplicas, perder flujos silenciosamente ni declarar HA resuelto por cambiar Promtail a Alloy. Si fuente y runtime difieren, bloquear y reconciliar antes de diseñar el cambio desplegable.
- Preflight futuro, acotado y de lectura: propietario, versión/hash/argv de unidad, configuración efectiva y archivos/cursores con permisos e identidad; credenciales sólo en RAM. Acreditar también recursos y destino existente.
- Probar fuera del homelab con journals exportados sintéticos y archivos temporales, receptor HTTP local de fixture, sin Loki de producción. Casos: labels exactos, mensaje sin cambios, tiempos anteriores al arranque del lector, importación de posiciones, reinicio, rotación, cursor ausente/corrupto y auth error. Medir RAM/CPU, duplicados, omisiones y cola; no asumirlos cero.
- Antes de un canario autorizado, conservar binario, unidad, config y estado Promtail. Un único escritor por flujo: parar ordenadamente el agente anterior, acreditar su cola/errores y snapshot final de posiciones, importar la copia e iniciar Alloy sin compartir estado. No ejecutar ambos hacia los mismos streams ni hacerlo en ambos nodos a la vez. Verificar límites del lote y cola en el corte: cursor leído no demuestra entrega confirmada; no se promete exactly-once.
- Aceptar sólo con etiquetas históricas comprobadas en salida y recepción,
progreso de cursor/lectura y envío, cero errores no explicados y continuidad
tras reinicio sintético y rotación.
/readyo componente healthy no bastan: la documentación advierte que falta de acceso al journal puede dejarlo sin entradas aunque arranque. Adaptar métricas/consultas del agente, no las reglas de salud de productos, y observar el canario antes del segundo nodo. - Rollback preparado antes del corte: detener sólo Alloy del canario, conservar su estado y pendientes, restaurar unidad/config/estado Promtail acreditados y revisar replay/gap limitado. No trasplantar offsets Alloy al fichero legacy, eliminar cursores ni declarar ausencia de duplicados sin cotejo. Sin rollback automático ante corte o resultado desconocido.
Entrega siguiente: un role de sustitución con never, pin verificable,
render y fixtures anteriores en CI; sin auto-start por publicar fuente. Este plan
no descarga Alloy, no ejecuta convert, no modifica roles o servicios y no acredita
una migración realizada. La arquitectura journal-upload central queda en otra fase.