Monitorización y observabilidad
La estrategia en IPF para monitorización y observabilidad se consigue utilizando un paradigma dirigido por eventos, categorización estricta del comportamiento de la aplicación y extensibilidad para exponer estos datos a través de canales apropiados, con las mejores herramientas.
La monitorización de servicios de aplicaciones IPF puede hacerse de tres maneras principales:
-
APIs HTTP
-
Métricas de series temporales vía Prometheus y Grafana
-
Logging de la aplicación
Fuera de alcance:
-
Application Performance Monitoring (APM) - Algo a considerar si dicho software está disponible en el sitio del cliente. Software APM como Dynatrace o AppDynamics puede ayudar a diagnosticar problemas potenciales antes de que se materialicen.
-
Monitorización de infraestructura, p. ej., Brokers, contenedores
Definiciones
La "aplicación IPF" en realidad está compuesta por múltiples paquetes de software en tiempo de ejecución. Esta sección describirá la terminología que se usará aquí:
| Component | Sometimes known as | Description | Needs to be in Akka cluster with other similar nodes? |
|---|---|---|---|
Payment Services (Customised) |
Write side |
El conjunto de flujos de pago que el cliente ha definido. Puede haber múltiples de estos representando diferentes conjuntos de flujos (p. ej., credit transfer, recall, value-added service). |
Yes |
CSM Service |
CSM Pack, Scheme Pack |
Un adaptador para un proveedor de pagos como un esquema de pagos, wallet, etc. |
No |
Support Services |
Notification Service |
Procesamiento adicional de eventos hacia sistemas de terceros. |
Yes |
APIs de servicios individuales (HTTP)
Hay ciertas APIs HTTP que están habilitadas por defecto y que pueden interrogarse cuando la aplicación está en ejecución, cada una con un propósito específico.
Aquí hay un resumen de esas APIs y los elementos de configuración que establecen sus hostnames y puertos:
| What is it? | What does it do? | Example use case | API reference (or similar) | Default hostname | Default port | Host override env var | Port override env var | Available on |
|---|---|---|---|---|---|---|---|---|
Spring Boot Actuator API |
Métricas estilo Spring Boot para la JVM, propiedades de configuración de Spring, beans, health |
Para verificar la versión de librerías activas |
|
|
|
|
|
|
Akka Management Cluster HTTP API |
Información sobre el cluster Akka en ejecución para propósitos de depuración |
Para verificar el estado del cluster y gestionar nodos manualmente |
(el resultado de |
|
|
|
|
Spring Boot Actuator API
Usa esta API para consultar el ApplicationContext de Spring que se está ejecutando en este nodo en particular. Algunos endpoints de Spring Actuator interesantes para IPF:
-
conditions: Verifica que el lado de escritura y lectura de la aplicación se han configurado correctamente en los nodos relevantes -
env: Muestra variables de entorno para comprobar que los overrides son correctos -
health: Útil para liveness probes y similares -
info: Información general de la aplicación (también útil para liveness probes)
Hay más endpoints disponibles.
Consulta el enlace de Spring Boot Actuator en la tabla superior para ver todos los detalles.
Además, consulta esta sección sobre cómo habilitar y deshabilitar endpoints de Actuator (MANAGEMENT_ENDPOINT_X_ENABLED donde X es la parte relevante del Actuator).
Para información sobre cómo configurar TLS para los endpoints de Actuator, ver esta sección.
Akka Cluster HTTP Management
Esta API permite al usuario interactuar con el cluster Akka subyacente de IPF usando una interfaz HTTP.
El uso principal de esta API es verificar el estado del cluster. Los componentes de implementación de cliente de IPF requieren que todos los nodos "write" que sirven el mismo conjunto de flujos (p. ej., credit transfer, recall, digital wallet payout) estén en un cluster Akka juntos. Si no es el caso, no se tomará nuevo trabajo para evitar pérdida de transacciones.
El cluster encuentra otros nodos similares por sí mismo, pero en caso de que la aplicación parezca no estar consumiendo nuevo trabajo, este debería ser el primer punto a comprobar para asegurar que el cluster está en un estado válido y que la aplicación no está en un "split brain" (múltiples nodos creados en clusters separados).
Las situaciones de split brain pueden resolverse usando Akka Split Brain Resolver. Más información disponible en el sitio de Akka.
El endpoint Akka Cluster HTTP Management también permite operaciones de actualización.
Si este comportamiento no es deseado, establece la variable de entorno AKKA_MANAGEMENT_READ_ONLY a true para habilitar el modo de solo lectura, donde la información del cluster solo puede recuperarse pero no actualizarse.
La configuración TLS para Akka Management es la misma que para Spring Boot, pero los prefijos server o management.server se reemplazan por akka.management.
Por ejemplo, para establecer la ruta del keystore, la propiedad sería akka.management.ssl.keystore o AKKA_MANAGEMENT_SSL_KEYSTORE (el equivalente en Spring Boot sería server.ssl.keystore o SERVER_SSL_KEYSTORE).
Métricas de series temporales
Las métricas se exponen mediante un servidor HTTP Prometheus que es interrogado a intervalos por Prometheus y visualizado con herramientas como Grafana y Kibana.
El componente AlertManager realiza agregación configurable de eventos basada en umbrales y condiciones para traducir este comportamiento del sistema en algo que pueda requerir acción por parte de un Operador.
Métricas de aplicación relevantes
Las métricas agregadas a nivel de aplicación también se exponen con el mismo mecanismo:
| Metric name | Type | Description | Event information | Source | ||
|---|---|---|---|---|---|---|
|
Histogram |
Tiempo en segundos que dura la ejecución de un flujo |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Número total de invocaciones |
mismas etiquetas que en ipf_behaviour_end_to_end_latency_seconds_bucket |
Spring Actuator (TCP/8080) |
||
|
Counter |
Tiempo total empleado por todas las invocaciones |
mismas etiquetas que en ipf_behaviour_end_to_end_latency_seconds_bucket |
Spring Actuator (TCP/8080) |
||
|
Histogram |
Tiempo que pasan los flujos en ese estado |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Número total de llamadas a ese estado |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Tiempo empleado por todas las llamadas a ese estado |
|
Spring Actuator (TCP/8080) |
||
|
Gauge |
Número de flujos activos por estado |
|
Spring Actuator (TCP/8080) |
||
|
Histogram |
Tiempos desde el momento en que IPF recibe un command hasta que se completan todos los efectos secundarios |
Segmentado por behaviour, nombre del command, estado previo, estado resultante, resultado de la llamada (success, failure)
|
Spring Actuator (TCP/8080) |
||
|
Histogram |
Tiempo para realizar una llamada a IPF, incluyendo tiempo de persistencia de eventos, ejecución de todos los efectos secundarios y posibles reintentos |
Segmentado por behaviour, nombre del command, resultado de la llamada (success/failure)
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Número de transacciones creadas (iniciadas) |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Número de transacciones que han alcanzado un estado terminal (final) |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Número de flujos que han generado un timeout system event |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Se eleva cuando el dominio IPF invoca una action en un sistema externo |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Se eleva cuando una action invocada por IPF no ha recibido respuesta dentro del timeout configurado |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Se eleva cuando un Domain Event se ha persistido correctamente |
|
Spring Actuator (TCP/8080) |
||
|
Counter |
Se eleva cuando el dominio IPF recibe un command que no puede manejarse en el estado actual del aggregate |
|
Spring Actuator (TCP/8080) |
||
|
Histogram |
que registra la duración entre la creación de un domain event y el momento en que se envía a ODS; las duraciones serán sensibles al desfase de tiempo entre servidores, por lo que deben tratarse solo como estimaciones |
Spring Actuator (TCP/8080) |
|||
|
Counter |
Conteo del número total de domain events enviados a ODS |
||||
|
Counter |
Tiempo total empleado para enviar domain events a ODS |
|
Dashboards de Spring Boot
Métricas básicas de la JVM a través del endpoint prometheus de Spring Boot Actuator.
Hay varios dashboards que pueden usarse para visualizar estos datos, pero recomendamos este de la colección de dashboards de Grafana.
Dashboards de Akka
Hay algunos dashboards de Grafana listos para usar que están disponibles para Akka, documentados y disponibles para descarga aquí. Los dashboards de Akka interesantes que buscar - en lo que respecta a IPF - son:
-
Event Sourced Behaviours: Métricas sobre events y commands procesados por flujos IPF
-
Akka Streams y Akka Streams (extended): Métricas de rendimiento del procesamiento de conectores
Dashboards específicos de IPF
También hay algunos dashboards específicos de IPF:
| Name | Description | Required Data |
|---|---|---|
|
Estadísticas por conector sobre números de requests enviados, recibidos y tiempos de respuesta promedio por conector. |
|
|
Estadísticas por flujo sobre cuánto tardan los flujos en procesarse desde la iniciación hasta alcanzar un estado final. |
|
|
Informa estadísticas sobre los circuit breakers de conectores usando métricas definidas en Resilience4J. |
|
|
Proporciona algunas estadísticas sobre la JVM, por ejemplo memoria heap, por pod en el cluster. Para un dashboard más detallado ver |
|
|
Informa sobre las métricas de request/response de simuladores CSM desplegados en el cluster. |
Requiere una etiqueta |
|
Informa sobre una amplia gama de métricas de servicios de aplicación (MongoDB/Akka…) para determinar la salud general del ecosistema IPF y ayudar a identificar si ha habido degradación del rendimiento a lo largo del tiempo. |
|
|
Estadísticas relacionadas con el servicio de ingesta ODS informando sobre cualquier lag entre ingestiones, así como métricas relacionadas con Kafka/MongoDB. |
Se asume que el nombre del pod es El consumer group de Kafka para el ingreso se asume llamado El topic de egreso de Kafka se asume llamado |
|
Informa estadísticas basadas en métricas de flujo para mostrar transacciones en estados completados o no completados |
Se asume que el nombre del estado de finalización termina con la palabra |
|
Informa sobre métricas de actions e inputs de Event Sourced Behaviours (ESBs) proporcionando la tasa de ejecución entre estas funciones. |
|
|
Proporciona estadísticas detalladas sobre la JVM a partir de métricas proporcionadas por el actuator de Spring. |
|
|
Proporciona métricas generales y por conector sobre tiempos de request y response. |
Requiere una etiqueta |
Ejemplo funcional de uso de PromQL para generar un gráfico personalizado
Requisito
Un gráfico de tarta para representar todos los estados de finalización CSM de todas las transacciones que ocurrieron en este día natural y que tardaron menos del SLA de 5 segundos.
Paso 1 - Elección de la métrica
Primero debes encontrar la métrica más cercana que proporcione los datos necesarios; en este caso los datos del histograma ipf_behaviour_end_to_end_latency_seconds deberían funcionar.
sum by(event) (
increase(
ipf_behaviour_end_to_end_latency_seconds_bucket{type="CSM_STATES_ONLY", service=~".*creditor.*", le="5.0"}[15m]
)
)
Esta consulta devolverá el número de estados completados en un intervalo de 15 minutos agrupados por event
-
increase- calcula el incremento en la serie temporal del vector de rango -
sum- calcula el total en la serie temporal
Más funciones PromQL que pueden usarse se encuentran aquí.
Paso 2 - Agrupar por días
Ahora puedes crear un diario para hoy con la siguiente consulta
last_over_time(
sum by(event) (
increase(
ipf_behaviour_end_to_end_latency_seconds_bucket{type="CSM_STATES_ONLY", service=~".*creditor.*", le="5.0"}[1d] offset -1d
)
)
[1d:1d]
)
-
last_over_time- el valor del punto más reciente en el intervalo especificado
Paso 3 - Limitar a un solo día
Altera las Query options del panel para añadir un relative time de now/d
Paso 4 - Cambiar el estilo del gráfico
Usando el selector Visualization del lado derecho, elige la opción Pie Chart y cambia el Title a Calls to Scheme.
También podrás añadir los siguientes cambios:
-
Añade etiquetas al gráfico de tarta de
Name -
Cambia Legend mode a
Table, coloca aRighty añade Label Values dePercentyValue
Ahora puedes guardar el dashboard, que se verá algo así
Configuración de exportadores
Las métricas de Spring Boot Actuator se exponen a través del mismo servidor HTTP Actuator documentado arriba. Consulta arriba cómo cambiar el host y puerto del Actuator.
Tanto las métricas de Prometheus de Akka como las específicas de IPF están disponibles en el mismo servidor web exportador de Prometheus, que por defecto escucha en todas las interfaces (0.0.0.0) y en el puerto 9001.
Para cambiar estos detalles, las variables de entorno relevantes son:
-
CINNAMON_PROMETHEUS_HTTP_SERVER_HOST -
CINNAMON_PROMETHEUS_HTTP_SERVER_PORT
Si estas propiedades se cambian, recuerda también cambiar el lado de Prometheus para que Prometheus pueda recopilar datos de series temporales desde las direcciones correctas.
Logging
IPF usa Logback para la configuración de logging. Esto permite al usuario configurar un setup de logging que pueda reflejar el de otras aplicaciones desarrolladas dentro de la organización, y hacer que IPF informe de los datos de log de la misma manera.
Este documento explicará algunos setups típicos de logging que pueden usarse para sacar datos de log de varias maneras.
Para todos los setups, el archivo de configuración de Logback debe montarse en el classpath de la app.
Para una imagen construida por Icon, siempre está disponible en /[name of container]/conf.
Así que si el contenedor se llama credit-transfer, entonces la configuración de Logback puede montarse en /credit-transfer/conf/logback.xml.
Opción 1: Elasticsearch/Logstash/Kibana
Una pila popular en la industria es ELK: una combinación de Elasticsearch, Logstash (y/o Beats) y Kibana. Antes se conocía como la pila ELK, pero con la introducción de Beats, Elastic ha promovido el nombre más genérico "Elastic Stack" para este setup.
En cualquier caso, el setup se ve así:
Primero necesitamos configurar Logstash para escuchar un puerto TCP. Aquí hay un ejemplo de cómo configurarlo en Logstash:
input {
tcp {
port => 4560
codec => json_lines
}
}
Esto hace que Logstash escuche en el puerto 4560 líneas JSON separadas por el carácter de nueva línea \n.
El appender Logstash Logback hace esto por nosotros y puede configurarse así:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="stash" class="net.logstash.logback.appender.LogstashAccessTcpSocketAppender">
<destination>127.0.0.1:4560</destination>
<encoder class="net.logstash.logback.encoder.LogstashAccessEncoder" />
</appender>
<appender-ref ref="stash" />
</configuration>
Esto configurará que los logs de la aplicación IPF se envíen a Logstash. Configurar Logstash para conectarse a Elasticsearch (y Kibana a Elasticsearch) está fuera del alcance de este documento pero se puede encontrar en el sitio de Elastic aquí.
Más ejemplos, incluyendo:
-
Configuración de TLS sobre la conexión TCP, y;
-
Una variante UDP del appender
Pueden encontrarse en la página de GitHub del appender Logstash Logback aquí.
Configurar un appender de Logstash para System Events
Si deseas agregar IPF system events, considera usar com.iconsolutions.payments.systemevents.utils.Slf4jEventLogger
que reenvía todos los system events recibidos a un appender.
Esto puede usarse junto con este appender Logstash para enviar system events a un agregador como Elasticsearch como se mencionó arriba.
Aquí hay un ejemplo de configuración Logback que toma eventos Slf4jEventLogger y los envía a nuestro appender STASH:
<logger name="com.iconsolutions.payments.systemevents.utils.Slf4jEventLogger" level="DEBUG" additivity="false">
<appender-ref ref="STASH"/>
</logger>
Opción 2: Splunk
Aparte de un setup específico como el anterior, una verdadera app "twelve-factor" debe emitir sus logs - sin buffer - a stdout, y esto puede analizarse con software como Splunk.
Splunk proporciona un appender HTTP para Logback. Está documentado aquí. Ese documento también describe algunas consideraciones de rendimiento para logging con HTTP, y también un appender TCP que puede usarse en lugar de HTTP.
La plantilla Logback a la que se hace referencia en ese documento se puede encontrar aquí.
Hay tres campos obligatorios:
-
url: La URL de Splunk a la que reenviar -
token: El token proporcionado por Splunk para autenticación y autorización -
index: El índice de Splunk (repositorio) para almacenar estos datos de log
Opción 3: Archivos (no recomendado)
|
Hacer logging a archivo rompe principios cloud-native sobre no hacer suposiciones acerca de un sistema de archivos subyacente. Los logs deben tratarse como flujos de datos en lugar de archivos que requieren mantenimiento. Usa este enfoque solo como último recurso cuando sea absolutamente imposible usar un enfoque más moderno para logging. Para más información, consulta XI. Logs en The Twelve-Factor App. |
Es posible especificar un appender de archivo normal de Logback.
Un logback.xml típico podría verse así:
<?xml version="1.0" encoding="UTF-8" scan="true"?>
<configuration>
<jmxConfigurator />
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/opt/ipf/logs/credit-transfer-service.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>/opt/ipf/logs/credit-transfer-service.log.%i</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>20</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>50MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd} %d{HH:mm:ss.SSS} %-5level %X{traceId} %logger{36} %X{sourceThread} %X{akkaSource} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE" />
</root>
</configuration>
Este archivo crea la siguiente configuración:
-
El archivo de log se analiza para cambios en vivo cada minuto (
scan="true"). -
La configuración de logging puede modificarse en vivo con JMX. Más información en este enlace.
-
Logging a archivo en
/opt/ipf/logs/credit-transfer-service.log. -
Rotación de archivos a
/opt/ipf/logs/credit-transfer-service.log.n, donde n es un número entre 1-20, y la rotación ocurre cuandocredit-transfer-service.logalcanza 50 MB. Ten en cuenta que solo se conservarán 20 archivos de este tipo (es decir, un total de 1 GB de logs).
Este archivo también puede ser recolectado por un framework como Splunk forwarder o Beats como se muestra en el siguiente diagrama:
System Events
Qué son los IPF System Events
-
Las aplicaciones IPF se sustentan en un framework de System Events, que proporciona capacidades pub/sub entre componentes de aplicación.
-
Jerárquicos, extensibles, versionados, catalogados. Todas las áreas de la aplicación: Technical, Functional & Lifecycle. Todos los eventos incluyen propiedades comunes: ubicación de origen, hora de creación, nivel, tipo, contexto de asociación; es sencillo obtener todos los System Events para un pago dado.
-
El marco de datos fundamental para capturar comportamiento de la aplicación, proporcionando un lugar para construir funcionalidad extensible dirigida por eventos, que luego puede alimentar tareas de soporte como proporcionar datos para monitorización y alertas.
-
Patrón de suscripción de procesadores de System Events: "Actuar en todos los WARN level Infrastructure System Events".
-
Configurar múltiples procesadores, estilo funcional, almacenar / transformar – emitir sobre un Connector.
-
Todos los System Events que un servicio IPF puede emitir están catalogados y tienen un esquema, están versionados respecto al software desplegado.
-
Se anima a añadir nuevos eventos específicos del cliente para una solución dada. Proporcionando una extensión muy limpia para aprovechar el framework existente y aportar información adicional.
Dónde se definen
La lista completa de system events que IPF produce está listada aquí.
Solución de problemas de mensajes de error
Los eventos en esta tabla son eventos ERROR registrados por IPF y describen pasos de remediación recomendados a seguir si se encuentran.