Métricas, salud y registros#
Además de la consola, Empowerment Center se puede vigilar desde las herramientas de su organización: un orquestador de contenedores que pregunta si el servidor está vivo, Prometheus que recoge sus cifras y un syslog o un SIEM que recibe sus registros. Esta página explica qué expone ECenter para cada uno y cómo activarlo.
Antes de empezar#
- Lo que se configura aquí son variables de entorno del backend (véase Configuración) y se aplica al reiniciarlo.
/actuatorno pasa por el proxy del frontal, que solo manda al backend/api/,/embed/,/.well-known/oauth-protected-resource/y las rutas del inicio de sesión único. Las sondas y Prometheus llegan al backend directamente, por la red interna.
La salud#
| Ruta | Para qué | Sesión |
|---|---|---|
/actuator/health |
El estado del servidor y de la BD propia | No |
/actuator/health/liveness |
Sonda de vida para un orquestador: si falla, hay que reiniciar el contenedor | No |
/actuator/health/readiness |
Sonda de disponibilidad: si falla, el balanceador no le manda peticiones | No |
/api/about |
El producto y la versión, sin sesión ni licencia. Es lo que comprueba el healthcheck de deploy/compose.yaml |
No |
Las BD de los clientes no cuentan en la salud: que una no responda abre la alerta BD de cliente inaccesible, pero el servidor sigue atendiendo las demás conexiones y no debe salir del balanceador.
Con Docker Compose, docker compose -f deploy/compose.yaml ps enseña los servicios como healthy cuando están listos.
Las métricas#
ECenter publica sus cifras con Micrometer. Las propias empiezan por ecenter. y llevan solo etiquetas de pocos valores (la clase de trabajo, el resultado, la gravedad…), nunca logins, nombres, conexiones ni identificadores.
| Métrica | Tipo | Etiquetas | Qué mide |
|---|---|---|---|
ecenter.jobs.running, ecenter.jobs.queued |
Medidor | class |
Trabajos en ejecución y en cola, por clase |
ecenter.sessions.active |
Medidor | — | Sesiones abiertas |
ecenter.workbooks.locked |
Medidor | — | Libros abiertos para escritura |
ecenter.alerts.open |
Medidor | severity |
Alertas operativas abiertas, por gravedad |
ecenter.connections.unreachable |
Medidor | — | Conexiones cuya BD no responde |
ecenter.security.logins |
Contador | outcome (success, failure) |
Inicios de sesión |
ecenter.querying.queries |
Temporizador | outcome (success, failure, canceled) |
Sentencias contra las BD de los clientes |
ecenter.distribution.deliveries |
Contador | status, reason |
Entregas de las suscripciones |
ecenter.distribution.evaluations |
Contador | result |
Evaluaciones de las alertas de datos |
ecenter.distribution.subscriptions.active |
Medidor | — | Suscripciones activas |
ecenter.distribution.runs.running |
Medidor | kind (subscription, alert) |
Envíos y evaluaciones en marcha |
ecenter.distribution.alerts |
Medidor | state |
Instancias de las alertas de datos activas, por estado |
ecenter.api.requests |
Contador | surface (query, mcp), outcome |
Peticiones a la API de consulta y al MCP |
ecenter.api.rejections |
Contador | surface, reason |
Peticiones rechazadas (límite, consulta pesada, columnas ocultas…) |
ecenter.api.queries |
Temporizador | outcome, reason |
Consultas de la API terminadas |
ecenter.api.runs.active |
Medidor | — | Consultas de la API en curso |
ecenter.api.tool.calls |
Contador | tool, outcome |
Llamadas a las herramientas del MCP |
ecenter.credentials.active, ecenter.credentials.expiring |
Medidor | scope |
Credenciales de servicio vigentes y que caducan en 30 días |
ecenter.embedding.tokens.issued, .redeemed, .rejected |
Contador | source, stage, reason |
Tokens de incrustación |
ecenter.embedding.sessions.active |
Medidor | — | Sesiones incrustadas vivas |
ecenter.render.renders |
Contador | result |
Dibujos del navegador sin interfaz |
ecenter.render.duration |
Temporizador | — | Lo que tarda cada dibujo |
ecenter.render.active |
Medidor | — | Dibujos en curso |
ecenter.provisioning.requests |
Contador | resource, method, outcome |
Peticiones de SCIM del proveedor de identidad |
ecenter.metadata.impact |
Temporizador | outcome |
Análisis de impacto al guardar el metadata |
ecenter.usage-index.pending |
Medidor | module |
Objetos que quedan por reindexar tras una actualización |
ecenter.metadata.groupings.loads |
Contador | outcome |
Cargas de las tablas de trabajo de las agrupaciones |
ecenter.metadata.exchange |
Contador | kind, outcome |
Exportaciones, análisis, importaciones y restauraciones del metadata |
ecenter.portal.layout.restores |
Contador | outcome |
Restauraciones de copias de plantillas |
ecenter.bookmarks |
Medidor | scope, visibility |
Marcadores |
Están además las de Spring Boot: JVM (memoria, recolección, hilos), proceso, peticiones HTTP por plantilla de ruta y el pool de la BD propia. Los pools de las BD de los clientes no publican métricas: se ven en la consola.
Los contadores son de cada instancia y empiezan en cero al arrancarla. Con varias instancias, recoja cada una.
El puerto de gestión para Prometheus#
Prometheus recoge las métricas en su formato en /actuator/prometheus, que solo responde por un puerto de gestión aparte, pensado para la red interna y apagado por defecto.
Activarlo#
- Elija un puerto que no publique fuera de la red de ECenter, por ejemplo
9090. -
Póngalo en el fichero de entorno del backend:
Para atarlo a una sola interfaz, añada
MANAGEMENT_SERVER_ADDRESScon su dirección. -
Reinicie el backend.
-
Compruébelo desde la red interna:
El resultado es texto con líneas como
ecenter_jobs_running{class="cube"} 2.0(las clases de trabajo van en minúsculas en la etiquetaclass).
Cómo cambia Actuator con el puerto de gestión#
| Sin puerto de gestión | Con puerto de gestión | |
|---|---|---|
/actuator/prometheus |
No responde a nadie | Sin sesión, en el puerto de gestión |
/actuator/health y sus sondas |
Sin sesión, en el puerto de la aplicación | Sin sesión, en el puerto de gestión |
/actuator/info |
Sin sesión, en el puerto de la aplicación | Sin sesión, en el puerto de gestión |
/actuator/metrics y el resto |
Con una sesión de Administración del sistema | Denegado (403) |
/actuator en el puerto de la aplicación |
Sí | Deja de existir |
El puerto de gestión no tiene cookies, CSRF ni sesiones, y por él no llega la aplicación (/api/ no existe allí). Con él activo, apunte también las sondas del orquestador a ese puerto: http://<instancia>:<puerto>/actuator/health/liveness y /readiness.
Configurar Prometheus#
scrape_configs:
- job_name: ecenter
metrics_path: /actuator/prometheus
static_configs:
- targets: ['ecenter-1:9090', 'ecenter-2:9090']
Los nombres pasan al formato de Prometheus: ecenter.jobs.running es ecenter_jobs_running, y los contadores llevan _total (ecenter_api_requests_total).
Los registros#
El backend escribe su registro en la salida estándar. Con Docker Compose se lee con:
deploy/compose.yaml hace que los registros roten: el controlador json-file de Docker con 5 ficheros de 50 MB como mucho por servicio. Sin rotación, los registros crecerían sin tope, porque cada acceso es una línea. Si su organización recoge los registros con journald o syslog, cambie el controlador en el ancla x-logging de deploy/compose.yaml, y la rotación pasa a ser la de ese sistema.
Loggers que interesan#
| Logger | Qué escribe | Nivel por defecto |
|---|---|---|
ecenter.operations.alert |
Una línea por alerta operativa que se abre (ERROR o WARN) o se resuelve (INFO), y el arranque |
Activo |
ecenter.audit |
Una línea por entrada de la auditoría, en ecenter.audit.<categoría> |
info |
ecenter.audit.query |
Una línea por consulta a una BD de cliente | warn (apagado) |
ecenter.audit.job |
Una línea por trabajo terminado | warn (apagado) |
Los niveles se cambian como cualquier propiedad de Spring Boot. Por ejemplo, para sacar también las consultas al registro:
Las líneas de la auditoría y cómo llevarlas a un syslog o un SIEM se explican en el capítulo de Auditoría.
Qué buscar en el registro#
- Al arrancar, el identificador de la instalación («Instalación …»), que es el que pide Action Ware para la licencia.
- Un fallo interno de una petición: «Fallo interno en una petición de …» con la traza. Es lo que hay detrás de un 500
INTERNAL_ERRORo de un trabajo fallido con «Error interno al calcularlo». - El correo sin configurar: «Hay avisos de operación por correo pero no hay servidor de correo (spring.mail.host)», una sola vez.
- Un aviso que no se pudo enviar: «No se pudo avisar por correo: …».