Saltar al contenido principal

Monitoreo

Métricas

Las métricas son emitidas desde Horizon a través de HTTP en el formato de exposición basado en texto de facto. Las métricas se publican en la ruta privada /metrics del puerto de administración de Horizon, que es un servicio opcional a iniciar y que será vinculado por el proceso de Horizon a la red de bucle invertido de la máquina host (localhost o 127.0.0.1). Para habilitar el puerto de administración, agrega el parámetro de configuración de entorno ADMIN_PORT=XXXXX, el endpoint de métricas será accesible en la máquina host como localhost:<ADMIN_PORT>/metrics. Puedes verificar esto apuntando cualquier navegador que pueda alcanzar esta dirección, imprimirá todas las claves de métricas.

Exportando

Una vez que el puerto de administración está habilitado, el endpoint de métricas de Horizon puede ser 'raspado' por infraestructuras de monitoreo externas. Dado que la salida de métricas está codificada en formato de texto estándar, será compatible para su uso con muchos tipos de infraestructuras de monitoreo que interoperan con el mismo formato estándar.

En el caso de Horizon, las métricas se publican en el puerto HTTP de administración que está vinculado a la interfaz de red de bucle invertido de la máquina host (127.0.0.1), por lo que los sistemas o servicios de monitoreo externos no pueden alcanzar el puerto directamente. Para exponer las métricas de manera segura, recomendamos seguir el patrón de exportador, que es una estrategia común de raspado de métricas.

Un ejemplo del mundo real para exportar desde una instalación de Horizon en metal desnudo (Horizon se ha instalado directamente en un sistema operativo), utiliza FluentBit y el Exportador de Prometheus en la misma máquina host donde se está ejecutando Horizon. FluentBit realizará una simple canalización de reenvío de puerto en la máquina host. Configura la entrada para que sea localhost:<ADMIN_PORT>/metrics de Horizon y la salida para que sea el host y puerto que representan la interfaz de red de destino y el puerto en la máquina host, y luego configura tu infraestructura de monitoreo para raspar esa dirección de host.

En entornos orquestados en contenedores como Kubernetes, puedes usar la misma estrategia de exportador. Asumimos que ya tienes un despliegue de infraestructura de métricas como Prometheus y Grafana configurado en el clúster a través del Operador de Prometheus, y solo necesitarás configurar esa infraestructura para raspar el pod de Horizon basado en el ADMIN_PORT.

Modelo de datos

Hay numerosas claves de métricas de aplicación emitidas por Horizon en tiempo de ejecución, codificadas en cuatro tipos de formatos de exposición: contador, medidor, histograma, resumen. Cada clave se califica además con etiquetas para mayor granularidad. Para resumir, podemos resaltar los agrupamientos de claves de métricas por función común denotada en el prefijo de su nombre:

  • go_: rendimiento específico de golang en tiempo de ejecución
  • horizon_txsub_: atributos del sistema de subtitulado de transacciones de Horizon si está habilitado.
  • horizon_stellar_core_: atributos de tiempo de ejecución de la red stellar reportados por el núcleo cautivo.
  • horizon_order_book_: atributos de tiempo de ejecución del libro de órdenes en memoria mantenido por Horizon de la red stellar actual
  • horizon_log_: contadores de cuántos mensajes de registro se imprimen en cada nivel de severidad
  • horizon_ingest_: mediciones de rendimiento y aspectos mantenibles del sistema de ingestión interno de Horizon
  • horizon_http_: estadísticas y mediciones del servicio API HTTP de Horizon, todos los aspectos de carga y tiempos de solicitud/respuesta.
  • horizon_history_: estadísticas sobre los libros mayores históricos ingeridos por Horizon
  • horizon_db_: mediciones sobre el rendimiento de la base de datos, tiempos de consulta por endpoints, estadísticas de agrupamiento
  • process_: mediciones genéricas de computación de la máquina host

Y para cada clave, habrá una posibilidad de 0 o más etiquetas, el formato de salida serializado (exposición) sigue esta plantilla:

<metrics_key_name>{label_1="value",label_2="value",,,} <value>

En lugar de listar todas las claves de métricas individuales en los documentos, ya que cambian a menudo, la recomendación es realizar un HTTP GET contra el endpoint de métricas de Horizon, localhost:<ADMIN_PORT>/metrics, utilizando cualquier cliente http (navegador, curl, wget, etc.) y la respuesta tendrá las claves de métricas y información meta adicional sobre cada clave de métrica para descripción y tipo (contador, medidor, histograma, resumen), como ejemplo para una clave, horizon_http_requests_duration_seconds:

# HELP horizon_http_requests_duration_seconds HTTP requests durations, sliding window = 10m
# TYPE horizon_http_requests_duration_seconds summary
horizon_http_requests_duration_seconds{method="GET",route="/",status="200",streaming="false",quantile="0.5"} 0.000186958
horizon_http_requests_duration_seconds{method="GET",route="/",status="200",streaming="false",quantile="0.9"} 0.00043625
horizon_http_requests_duration_seconds{method="GET",route="/",status="200",streaming="false",quantile="0.99"} 0.000645
...

Consultas

Construir consultas contra el modelo de datos de métricas para resaltar el rendimiento de un despliegue de Horizon dado. Consulta el Tablero de Grafana Horizon de Stellar para ejemplos de consultas de métricas para derivar el rendimiento de la aplicación:

  • Número de solicitudes por minuto.
  • Número de solicitudes por ruta (las rutas más populares).
  • Tiempo de respuesta promedio por ruta.
  • Tiempo de respuesta máximo para solicitudes no en streaming.
  • Número de solicitudes en streaming vs. no en streaming.
  • Número de solicitudes limitadas por tasa.
  • Lista de IPs limitadas por tasa.
  • IPs únicas.
  • Los SDKs/apps más populares que envían solicitudes a un nodo de Horizon dado.
  • Tiempo promedio de ingestión de un libro mayor.
  • Tiempo promedio de ingestión de una transacción.

Elige la pestaña de revisiones, y descarga el archivo fuente del tablero para tener acceso al código fuente del tablero de Grafana y las consultas de métricas que construyen cada panel en los tableros.

Alertas

Una vez que las consultas se desarrollan en un tablero de Grafana, habilita un conveniente paso siguiente para agregar reglas de alerta basadas en consultas específicas para activar notificaciones cuando se superan los umbrales.

Aquí hay algunas alertas de ejemplo a considerar con posibles causas y soluciones.

AlertaCausaSolución
Pico en el número de solicitudesPosible ataque DoSconfiguraciones de balanceo de carga de red o conmutador de contenido
La ingestión es lentalos recursos de computación del servidor host son bajosaumenta las especificaciones de computación
Las respuestas de la API HTTP están devolviendo erroreslos recursos de computación del servidor host son bajos o la red hacia DB se ha perdidoverifica los logs de Horizon para ver qué errores se están emitiendo, reduce la causa raíz desde allí

Registros

Horizon emitirá registros a la salida estándar del sistema operativo. Registrará en todos los aspectos de la ejecución, incluyendo solicitudes HTTP y ingestión. Típicamente, hay muy pocos mensajes emitidos con niveles de severidad warn o error. El nivel de severidad predeterminado registrado en Horizon está configurado a LOG_LEVEL=info, este parámetro de configuración de entorno puede configurarse a uno de trace, debug, info, warn, error. La verbosidad de la salida de registro es inversa al nivel de severidad elegido. Es decir. para logs más verbosos usa 'trace', para logs menos verbosos usa 'error'.

Para despliegues de producción, recomendamos usar la configuración de severidad predeterminada de nivel info y elegir una estrategia de captura de registros según el despliegue.

  • Despliegue en metal desnudo directo al sistema operativo, redirigir la salida estándar del proceso de Horizon a un archivo en disco y aplicar una herramienta de rotación de registros en el archivo como logrotate para gestionar el uso del espacio en disco.
  • Despliegue orquestado en Kubernetes, usar un stack EFK/ELK en el clúster y puede configurarse para capturar la salida estándar del pod de Horizon.

Perfilado en tiempo de ejecución

Horizon está escrito en Golang, por lo tanto se ha habilitado para emitir opcionalmente los diagnósticos y la salida de perfilado de tiempo de ejecución de Golang pprof. Los endpoints HTTP de pprof están alojados en el puerto HTTP de administración de Horizon, se puede habilitar agregando el parámetro de configuración de entorno ADMIN_PORT=XXXXX, ya que la vinculación del puerto de administración está deshabilitada de forma predeterminada.

Dos de los perfiles predefinidos estándar están publicados:

localhost:<ADMIN_PORT>/debug/pprof/heap - perfilado de heap

localhost:<ADMIN_PORT>/debug/pprof/profile - perfilado de CPU

Usa la herramienta de línea de comandos pprof de Go para acceder a los endpoints publicados y visualizar los datos de diagnóstico perfilados que se emiten. Un breve ejemplo de uso de la herramienta pprof desde la línea de comandos para comenzar, usando web para mostrar una representación gráfica de las asignaciones de heap actuales:

$ go tool pprof http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
Saved profile in ./pprof/pprof.stellar-horizon.alloc_objects.alloc_space.inuse_objects.inuse_space.022.pb.gz
File: stellar-horizon
Type: inuse_space
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) web

¡Estoy Atascado! ¡Ayuda!

Si alguno de los pasos anteriores no funciona o se te impide configurar correctamente Horizon, por favor únete a nuestra comunidad y háznoslo saber. Ya sea que publiques una pregunta en nuestro Stack Exchange o chates con nosotros en Horizon Discord para pedir ayuda.