Introducción al registro de HAProxy

iniciar sesión en HAProxy

Cuando se trata de poner en funcionamiento sus datos de registro, HAProxy proporciona una gran cantidad de información. En esta publicación de blog, demostramos cómo configurar el registro de HAProxy, dirigirnos a un servidor de registro de sistema, comprender los campos de registro y sugerir algunas herramientas útiles para analizar archivos de registro.

Profundice en el registro de HAProxy

HAProxy se encuentra en la ruta crítica de su infraestructura. Ya sea que se use como equilibrador de carga de borde, sidecar o controlador de ingreso de Kubernetes, es imprescindible sacar registros significativos de HAProxy.

El registro le proporciona información sobre cada conexión y solicitud. Permite la observabilidad necesaria para la resolución de problemas e incluso se puede usar para detectar problemas de forma temprana. Es una de las muchas formas de obtener información de HAProxy. Otras formas incluyen obtener métricas utilizando la página de estadísticas o la API de tiempo de ejecución, configurar alertas por correo electrónico y hacer uso de las diversas integraciones de código abierto para almacenar datos estadísticos o de registro a lo largo del tiempo. HAProxy proporciona registros muy detallados con una precisión de milisegundos y genera una gran cantidad de información sobre el tráfico que fluye a su infraestructura. Esto incluye:

  • Métricas sobre el tráfico: datos de temporización, contadores de conexiones,tamaño del tráfico, etc.
  • Información sobre las decisiones de HAProxy: cambio de contenido, filtrado, persistencia, etc.
  • Información sobre solicitudes y respuestas: encabezados, códigos de estado,cargas útiles, etc.
  • Estado de terminación de una sesión y la capacidad de rastrear dónde se producen los errores (lado del cliente, lado del servidor?)

En esta publicación, aprenderás a configurar el registro de HAProxy y a leer los mensajes de registro que genera. A continuación, enumeraremos algunas herramientas que le resultarán útiles al operacionalizar sus datos de registro.

Servidor Syslog

HAProxy puede emitir mensajes de registro para su procesamiento por un servidor syslog. Esto es compatible con herramientas de registro de sistema conocidas como Rsyslog, así como con el nuevo diario de servicio systemd. También puede utilizar varios reenviadores de registros como Logstash y Fluentd para recibir mensajes de registro de sistema de HAProxy y enviarlos a un agregador de registros central.

Si trabaja en un entorno contenedor, HAProxy admite el registro nativo en la nube, lo que le permite enviar los mensajes de registro a stdout y stderr. En ese caso, pasa a la siguiente sección, donde verás cómo hacerlo.

Antes de ver cómo habilitar el registro a través del archivo de configuración de HAProxy, primero debe asegurarse de tener un servidor Syslog, como rsyslog, configurado para recibir los registros. En Ubuntu, instalaría rsyslog usando el administrador de paquetes de apt, de la siguiente manera:

Una vez que rsyslog esté instalado, edite su configuración para manejar la ingestión de mensajes de registro de HAProxy. Añada lo siguiente en /etc / rsyslog.conf o a un nuevo archivo dentro del rsyslog.directorio d, como /etc / rsyslog.d/haproxy.conf:

A continuación, reinicie el servicio rsyslog. En el ejemplo anterior, rsyslog escucha en la dirección de bucle invertido IP, 127.0.0.1, en el puerto UDP predeterminado 514. Esta configuración en particular escribe en dos archivos de registro. El archivo elegido se basa en el nivel de gravedad con el que se registró el mensaje. Para entender esto, eche un vistazo más de cerca a las dos últimas líneas del archivo. Empiezan así:

El estándar Syslog prescribe que a cada mensaje registrado se le debe asignar un código de instalación y un nivel de gravedad. Dado el ejemplo de configuración de rsyslog anterior, puede asumir que configuraremos HAProxy para enviar todos sus mensajes de registro con un código de instalación de local0.

El nivel de gravedad se especifica después del código de instalación, separado por un punto. Aquí, la primera línea captura mensajes en todos los niveles de gravedad y los escribe en un archivo llamado haproxy-traffic.registro. La segunda línea captura solo mensajes de nivel de aviso y superiores, registrándolos en un archivo llamado haproxy-admin.registro.

HAProxy está codificado para usar ciertos niveles de gravedad al enviar ciertos mensajes. Por ejemplo, categoriza los mensajes de registro relacionados con conexiones y solicitudes HTTP con el nivel de gravedad de la información. Otros eventos se clasifican utilizando uno de los otros niveles menos detallados. De lo más importante a lo menos importante, los niveles de gravedad son:

Nivel de gravedad Registros HAProxy
Errores emerg como quedarse sin descriptores de archivos del sistema operativo.
alerta Algunos casos raros en los que ha ocurrido algo inesperado, como no poder almacenar en caché una respuesta.
crit No se utiliza.
errar Errores como no poder analizar un archivo de mapa, no poder analizar el archivo de configuración de HAProxy y cuando falla una operación en una tabla de sticks.
advertencia Ciertos errores importantes, pero no críticos, como no configurar un encabezado de solicitud o no conectarse a un servidor de nombres DNS.
observe que Cambia al estado de un servidor, como estar ARRIBA o ABAJO o cuando un servidor está deshabilitado. También se incluyen otros eventos en el inicio, como el inicio de proxies y los módulos de carga. El registro de comprobación de estado, si está habilitado, también utiliza este nivel.
info Detalles y errores de conexión TCP y solicitud HTTP.
debug Puede escribir código Lua personalizado que registre mensajes de depuración

Las distribuciones de Linux modernas se incluyen con el administrador de servicios systemd, que introduce journald para recopilar y almacenar registros. El servicio journald no es una implementación de Syslog, pero es compatible con Syslog ya que escuchará en el mismo socket /dev/log. Recopilará los registros recibidos y permitirá al usuario filtrarlos por código de instalación y / o nivel de gravedad utilizando los campos journald equivalentes (SYSLOG_FACILITY, PRIORIDAD).

Configuración de registro de HAProxy

El manual de configuración de HAProxy explica que el registro se puede habilitar con dos pasos: El primero es especificar un servidor de registro de sistema en la sección global utilizando una directiva log:

El log indica a HAProxy que envíe registros al servidor Syslog escuchando en 127.0.0.1:514. Los mensajes se envían con facility local0, que es una de las instalaciones de Syslog estándar definidas por el usuario. También es la instalación que espera nuestra configuración de rsyslog. Puede agregar más de una instrucción log para enviar resultados a varios servidores Syslog.

Puede controlar cuánta información se registra agregando un nivel de registro de sistema al final de la línea:

El segundo paso para configurar el registro es actualizar los diferentes proxies (seccionesfrontendbackend y listen) para enviar mensajes a los servidores Syslog configurados en la sección global. Esto se hace añadiendo una directiva log global. Puede agregarlo a la sección defaults, como se muestra:

La directiva log global básicamente dice, use la línea log que se estableció en la sección global. Colocar una directiva log global en la sección defaults es equivalente a colocarla en todas las secciones de proxy posteriores. Por lo tanto, esto permitirá iniciar sesión en todos los proxies. Puedes leer más sobre las secciones de un archivo de configuración de HAProxy en nuestra entrada de blog Las Cuatro Secciones Esenciales de una configuración de HAProxy.

De forma predeterminada, la salida de HAProxy es mínima. Agregar la línea option httplog a su sección defaults habilitará un registro HTTP más detallado, que explicaremos con más detalle más adelante.

Una configuración típica de HAProxy se ve así:

Usar reglas de registro globales es la configuración más común de HAProxy, pero puedes ponerlas directamente en una sección frontend en su lugar. Puede ser útil tener una configuración de registro diferente de una sola vez. Por ejemplo, es posible que desee apuntar a un servidor de registro de sistema de destino diferente, usar una instalación de registro diferente o capturar diferentes niveles de gravedad según el caso de uso de la aplicación de backend. Considere el siguiente ejemplo en el que las seccionesfrontend, fe_site1 y fe_site2, establecen diferentes direcciones IP y niveles de gravedad:

Al iniciar sesión en un servicio de registro de sistema local, escribir en un socket UNIX puede ser más rápido que dirigirse a la dirección de bucle de retorno TCP. Generalmente, en sistemas Linux, un socket UNIX que escucha mensajes de Syslog está disponible en /dev / log porque aquí es donde la función syslog() de la biblioteca C de GNU envía mensajes de forma predeterminada. Apunte al socket UNIX de la siguiente manera:

Sin embargo, debe tener en cuenta que si va a usar un socket UNIX para el registro y al mismo tiempo está ejecutando HAProxy dentro de un entorno chroot, o deja que HAProxy cree un directorio chroot mediante la directiva de configuración chroot, entonces el socket UNIX debe estar disponible dentro de ese directorio chroot. Esto se puede hacer de una de dos maneras.

Primero, cuando rsyslog se inicia, puede crear un nuevo socket de escucha dentro del sistema de archivos chroot. Agregue lo siguiente a su archivo de configuración HAProxy rsyslog:

La segunda forma es agregar manualmente el socket al sistema de archivos chroot mediante el comando mount con la opción --bind.

Asegúrese de agregar una entrada a su archivo/etc / fstab o a un archivo de unidad systemd para que el montaje persista después de un reinicio. Una vez que haya configurado el registro, querrá comprender cómo se estructuran los mensajes. En la siguiente sección, verá los campos que componen los registros de nivel TCP y HTTP.

Si necesita limitar la cantidad de datos almacenados, una forma es muestrear solo una parte de los mensajes de registro. Establezca el nivel de registro en silencioso para un número aleatorio de solicitudes, como:

Tenga en cuenta que, si es posible, es mejor capturar la mayor cantidad de datos posible. De esa manera, no tendrá información faltante cuando más la necesite. También puede modificar la expresión ACL para que ciertas condiciones anulen la regla.

Otra forma de limitar el número de mensajes registrados es establecer option dontlog-normal en su defaults o frontend. De esta manera, solo se capturan los tiempos de espera, los reintentos y los errores. Probablemente no quiera habilitar esto todo el tiempo, pero solo durante ciertos momentos, como cuando se realizan pruebas de evaluación comparativa.

Si está ejecutando HAProxy dentro de un contenedor de Docker y está utilizando HAProxy versión 1.9, en lugar de enviar la salida de registro a un servidor Syslog, puede enviarla a stdout y/o stderr. Establecer la dirección a stdout o stderr, respectivamente. En ese caso, también es preferible establecer el formato del mensaje en raw , así:

Formato de registro de HAProxy

El tipo de registro que verá está determinado por el modo proxy que configuró dentro de HAProxy. HAProxy puede funcionar como proxy de capa 4 (TCP) o como proxy de Capa 7 (HTTP). El modo TCP es el predeterminado. En este modo, se establece una conexión dúplex completo entre clientes y servidores, y no se realizará ningún examen de capa 7. Si ha configurado su configuración de rsyslog en función de nuestra discusión en la primera sección, encontrará el archivo de registro en /var/log/haproxy-traffic.registro.

Cuando está en modo TCP, que se establece agregando mode tcp, también debe agregar la opción tcplog. Con esta opción, el formato de registro predeterminado es una estructura que proporciona información útil como detalles de conexión de capa 4, temporizadores, recuento de bytes, etc. Si tuviera que volver a crear este formato utilizando log-format, que se utiliza para establecer un formato personalizado, se vería así:

Las descripciones de estos campos se pueden encontrar en la documentación del formato de registro TCP, aunque describiremos varios en la próxima sección.

formato de registro TCP de haproxy

Formato de registro TCP en HAProxy

Cuando HAProxy se ejecuta como proxy de capa 7 a través de mode http, debe agregar la directiva option httplog. Garantiza que las solicitudes y respuestas HTTP se analicen en profundidad y que ningún contenido compatible con RFC quede sin capturar. Este es el modo que realmente resalta el valor de diagnóstico de HAProxy. El formato de registro HTTP proporciona el mismo nivel de información que el formato TCP, pero con datos adicionales específicos para el protocolo HTTP. Si tuviera que volver a crear este formato utilizando log-format, se vería así:

Se pueden encontrar descripciones detalladas de los diferentes campos en la documentación del formato de registro HTTP.

formato de registro http haproxy

Formato de registro HTTP en HAProxy

También puede definir un formato de registro personalizado, capturando solo lo que necesita. El uso de la etiqueta log-format (o log-format-sd para estructurada de datos syslog) la directiva en su defaults o frontend. Lea nuestra publicación de blog Personalización de registros de HAProxy para obtener más información y ver algunos ejemplos.

En las siguientes secciones, se familiarizará con los campos que se incluyen cuando usa option tcplog o option httplog.

Proxies

Dentro del archivo de registro que se produce, cada línea comienza con el frontend, el backend y el servidor al que se envió la solicitud. Por ejemplo, si tuviera la siguiente configuración de HAProxy, vería líneas que describen las solicitudes como enrutadas a través del frontend http-in al backend estático y luego al servidor srv1.

Esto se convierte en información vital cuando necesita saber dónde se envió una solicitud, como cuando ve errores que solo afectan a algunos de sus servidores.

Temporizadores

Los temporizadores se proporcionan en milisegundos y cubren los eventos que ocurren durante una sesión. Los temporizadores capturados por el formato de registro TCP predeterminado son Tw / Tc / Tt. Los proporcionados por el formato de registro HTTP predeterminado son TR / Tw / Tc / Tr / Ta. Estos se traducen como:

Temporizador Que significa
TR El tiempo total para obtener la solicitud del cliente (solo en modo HTTP).
Tw El tiempo total pasado en las colas esperando una ranura de conexión.
Tc El tiempo total para establecer la conexión TCP con el servidor.
Tr El tiempo de respuesta del servidor (solo en modo HTTP).
Ta El tiempo total de actividad de la solicitud HTTP (solo en modo HTTP).
Tt El tiempo total de duración de la sesión TCP, entre el momento en que el proxy la aceptó y el momento en que se cerraron ambos extremos.

Usted encontrará una descripción detallada de todos los temporizadores en el HAProxy documentación. El siguiente diagrama también muestra dónde se registra el tiempo durante una sola transacción de extremo a extremo. Tenga en cuenta que las líneas moradas en los bordes indican temporizadores.

Grabación de tiempo haproxy

Grabación de tiempo durante una única transacción de extremo a extremo

Estado de sesión al desconectarse

Los registros TCP y HTTP incluyen un código de estado de terminación que indica la forma en que terminó la sesión TCP o HTTP. Es un código de dos caracteres. El primer carácter informa del primer evento que provocó la finalización de la sesión, mientras que el segundo informa del estado de la sesión TCP o HTTP cuando se cerró.

Aquí hay algunos ejemplos de código de terminación:

código de Dos letras que Significa
terminación Normal en ambos lados.
cD El cliente no envía ni reconoce ninguna de datos y eventualmente timeout client caducado.
SC El servidor se negó explícitamente la conexión TCP.
PC El proxy se negó a establecer una conexión con el servidor porque se alcanzó el límite de sockets del proceso al intentar conectarse.

Hay una amplia variedad de razones por las que una conexión puede haberse cerrado. Puede encontrar información detallada sobre todos los códigos de terminación posibles en la documentación de HAProxy.Los contadores

Los contadores

indican el estado del sistema cuando se realiza una solicitud. HAProxy registra cinco contadores para cada conexión o solicitud. Pueden ser invaluables para determinar cuánta carga se está colocando en el sistema, dónde se está retrasando el sistema y si se han alcanzado los límites. Al mirar una línea dentro del registro, verá los contadores listados como cinco números separados por barras: 0/0/0/0/0.

En modo TCP o HTTP, estos se desglosan como:

  • El número total de conexiones simultáneas en el proceso HAProxy cuando se registró la sesión.
  • El número total de conexiones simultáneas enrutadas a través de este frontend cuando se registró la sesión.
  • El número total de conexiones simultáneas enrutadas a este backend cuando se registró la sesión.
  • El número total de conexiones simultáneas que siguen activas en este server cuando se registró la sesión.
  • El número de reintentos intentados al intentar conectarse al servidor backend.

Otros campos

HAProxy no graba todo listo para usar, pero puedes modificarlo para capturar lo que necesites. Un encabezado de solicitud HTTP se puede registrar agregando la directiva http-request capture:

El registro mostrará encabezados entre llaves y separados por símbolos de tubería. Aquí puede ver los encabezados de Host y Agente de usuario para una solicitud:

Se puede registrar un encabezado de respuesta agregando una directiva http-response capture:

En este caso, también debe agregar una directiva declare capture response, que asigna una ranura de captura donde se puede almacenar el encabezado de respuesta una vez que llegue. A cada ranura que agregue se le asigna automáticamente un ID a partir de cero. Haga referencia a este ID cuando llame a http-response capture. Los encabezados de respuesta se registran después de los encabezados de solicitud, dentro de un conjunto separado de llaves.

Los valores de las cookies se pueden registrar de forma similar con la directiva http-request capture.

Cualquier cosa capturada con http-request capture, incluidos los encabezados HTTP y las cookies, aparecerá dentro del mismo conjunto de llaves. Lo mismo ocurre con cualquier cosa capturada con http-response capture.

También puede usar http-request capture para registrar los datos muestreados de las tablas de stick. Si estuviera haciendo un seguimiento de las tasas de solicitudes de usuario con un stick-table, podría registrarlas de la siguiente manera:

Así que, al hacer una solicitud a una página web que contenga el documento HTML y dos imágenes, se mostraría la tasa de solicitudes simultáneas del usuario aumentando a tres:

También puede registrar los valores de los métodos de búsqueda, como para registrar la versión de SSL/TLS que se utilizó (tenga en cuenta que hay una variable de registro incorporada para obtener esto llamada %sslv):

Las variables establecidas con http-request set-var también se pueden registrar.

Las expresiones ACL se evalúan como verdadero o falso. No puede registrarlos directamente, pero puede establecer una variable en función de si la expresión es verdadera. Por ejemplo, si el usuario visita /api, puede definir una variable llamada req.is_api a un valor de API y, a continuación, captura de que en los registros.

Habilitación de perfiles de HAProxy

Con la versión de HAProxy 1.9, puede registrar el tiempo de CPU dedicado al procesamiento de una solicitud dentro de HAProxy. Agregar la etiqueta profiling.tasks directiva a su global sección:

Hay nuevos métodos de captura que exponen los perfiles de métricas:

método de búsqueda Descripción
date_us microsegundos parte de la fecha.
cpu_calls El número de llamadas a la tarea que procesa la secuencia o solicitud actual desde que se asignó. Se restablece para cada nueva solicitud en la misma conexión.
cpu_ns_avg El número promedio de nanosegundos gastados en cada llamada a la tarea que procesa la secuencia o la solicitud actual.
cpu_ns_tot El número total de nanosegundos gastados en cada llamada a la tarea que procesa la secuencia o la solicitud actual.
lat_ns_avg El número promedio de nanosegundos pasados entre el momento en que se despierta la tarea que maneja la transmisión y el momento en que se llama efectivamente.
lat_ns_tot El número total de nanosegundos entre el momento en que se despierta la tarea que maneja la secuencia y el momento en que se llama efectivamente.

Agregue estos a sus mensajes de registro como este:

Esta es una excelente manera de medir qué solicitudes cuestan más procesar.

Analizar los registros de HAProxy

Como ha aprendido, HAProxy tiene muchos campos que proporcionan una gran cantidad de información sobre conexiones y solicitudes. Sin embargo, leerlos directamente puede llevar a una sobrecarga de información. A menudo, es más fácil analizarlos y agregarlos con herramientas externas. En esta sección, verá algunas de estas herramientas y cómo pueden aprovechar la información de registro proporcionada por HAProxy.

HALog

HALog es una herramienta de análisis de registros pequeña pero potente que se suministra con HAProxy. Fue diseñado para implementarse en servidores de producción, donde puede ayudar con la solución de problemas manual, como cuando se enfrentan a problemas en vivo. Es extremadamente rápido y capaz de analizar registros TCP y HTTP de 1 a 2 GB por segundo. Al pasarle una combinación de indicadores, puede extraer información estadística de los registros, incluidas solicitudes por URL y solicitudes por IP de origen. Luego, puede ordenar por tiempo de respuesta, tasa de error y código de terminación.

Por ejemplo, si desea extraer estadísticas por servidor de los registros, puede usar el siguiente comando:

Esto es útil cuando necesita analizar líneas de registro por código de estado y descubrir rápidamente si un servidor determinado no es saludable (por ejemplo, devuelve demasiadas respuestas 5xx). O bien, un servidor puede estar denegando demasiadas solicitudes (respuestas 4xx), lo que es un signo de un ataque de fuerza bruta. También puede obtener el tiempo de respuesta promedio por servidor con la columna avg_rt, que es útil para solucionar problemas.

Con HALog, puede obtener estadísticas por URL utilizando el siguiente comando:

La salida muestra el número de solicitudes, el número de errores, el tiempo total de cómputo, el tiempo promedio de cómputo, el tiempo total de cómputo de solicitudes exitosas, el tiempo promedio de cómputo de solicitudes exitosas, el número promedio de bytes enviados y el número total de bytes enviados. Además de analizar estadísticas de servidor y URL, puede aplicar varios filtros para comparar registros con un tiempo de respuesta determinado, código de estado HTTP, código de terminación de sesión, etc.

Página de estadísticas de HAProxy

Analizar los registros con HALog no es la única manera de obtener métricas de HAProxy. La página de estadísticas de HAProxy se puede habilitar agregando la directiva stats enable a una sección frontend o listen. Muestra estadísticas en vivo de sus servidores. La sección follow listen inicia la página de estadísticas escuchando en el puerto 8404:

La página de estadísticas es muy útil para obtener información instantánea sobre el tráfico que fluye a través de HAProxy. Sin embargo, no almacena estos datos y solo muestra los datos de un único equilibrador de carga.

Panel de control en tiempo real de HAProxy Enterprise

Si utiliza HAProxy Enterprise, tiene acceso al Panel de control en tiempo real. Mientras que la página Estadísticas muestra estadísticas para una sola instancia de HAProxy, el panel en tiempo real agrega y muestra información en un clúster de equilibradores de carga. Esto hace que sea fácil observar el estado de todos sus servidores desde una sola pantalla. Los datos se pueden ver durante un máximo de 30 minutos.

El panel almacena y muestra información sobre el estado del servicio, las tasas de solicitud y la carga. También facilita la realización de tareas administrativas, como habilitar, deshabilitar y drenar backends. De un vistazo, puede ver qué servidores están activados y durante cuánto tiempo. También puede ver los datos de la tabla de stick, que, según el seguimiento de la tabla de stick, pueden mostrarle tasas de error, tasas de solicitudes y otra información en tiempo real sobre sus usuarios. Los datos de la tabla de barras también se pueden agregar.

Panel de control en tiempo real de haproxy enterprise

El Panel de control en tiempo real de HAProxy Enterprise

El Panel de control en tiempo real es uno de los muchos complementos disponibles con HAProxy Enterprise.

Conclusión

En esta publicación de blog, aprendiste a configurar el registro de HAProxy para obtener observabilidad sobre el equilibrador de carga, que es un componente crítico dentro de tu infraestructura. HAProxy emite mensajes de registro de sistema detallados cuando se opera en modo TCP y HTTP. Estos se pueden enviar a una serie de herramientas de registro, como rsyslog.

HAProxy se incluye con la utilidad de línea de comandos HALog, que simplifica el análisis de los datos de registro cuando necesita información sobre los tipos de respuestas que reciben los usuarios y la carga en sus servidores. También puede obtener una imagen visual del estado de sus servidores utilizando la página de estadísticas de HAProxy o el panel de control en tiempo real de HAProxy Enterprise.

¿Quieres saber cuándo se publica contenido como este? Suscríbete a este blog o síguenos en Twitter. ¡También puedes unirte a la conversación en Slack! HAProxy Enterprise combina HAProxy con funciones de clase empresarial, como el Panel de control en tiempo Real y el soporte premium. Póngase en contacto con nosotros para obtener más información o regístrese para una prueba gratuita hoy mismo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.