Búsqueda de sitios web

Introducción al seguimiento de estadísticas con Graphite, StatsD y CollectD


Introducción

Hay muchas razones por las que recopilar estadísticas sobre sus servidores, aplicaciones y tráfico es una buena idea. La recopilación y organización de datos puede brindarle confianza en sus decisiones sobre escalado, resolución de problemas y seguimiento de puntos débiles en sus configuraciones.

Hay una variedad de herramientas que se pueden usar para rastrear métricas en nuestras máquinas y, a menudo, se delegan a una pequeña parte del proceso. Podemos conectar estas herramientas para crear un sistema para recopilar, registrar y mostrar los resultados.

En esta guía, analizaremos algunas tecnologías que le permitirán recopilar, almacenar y visualizar los datos generados por sus servidores y aplicaciones.

Hablaremos de Graphite, una biblioteca de gráficos formada por varios componentes que se pueden usar para representar representaciones visuales de sus datos a lo largo del tiempo. También analizaremos collectd, un demonio de estadísticas del sistema que puede recopilar información casi en tiempo real sobre un servidor en ejecución. El último en nuestra lista será StatsD, un agregador de estadísticas flexible que se puede usar para recopilar y organizar datos arbitrarios.

En una guía posterior, veremos cómo instalar y configurar estos componentes en un servidor Ubuntu 14.04 para que pueda comenzar a utilizarlo.

¿Por qué hacemos un seguimiento de los datos?

Lo primero que debemos establecer son las razones por las que rastreamos datos en un entorno de servidor o aplicación.

La razón general es bastante simple: cuantos más datos tengamos, más probable será que podamos entender lo que está sucediendo en un momento dado. Esto nos brinda la notable capacidad de respaldar nuestras decisiones con datos concretos y ver con anticipación si es probable que un cambio esté dirigido al componente correcto. Las estadísticas de seguimiento nos brindan una fuente de información adicional que podría no estar presente en los registros de la aplicación.

La mayoría de los sistemas de registro (pero no todos) no pueden correlacionar datos de varias aplicaciones o conectar eventos a ciertos estados del sistema porque básicamente representan una salida de aplicación independiente. Esto puede dificultar la creación de una visión holística de las circunstancias que rodean un evento.

Podemos imaginar por un momento que tiene un incidente en el que su servidor de base de datos deja de funcionar. Mientras lee los registros, puede notar que a las 15:35:28 UTC, su servicio MySQL se eliminó con un error OOM (memoria insuficiente). Ahora sabemos que el uso de la memoria fue el problema, pero es posible que no tengamos idea de qué causó el aumento en el uso de la memoria en un servidor anteriormente estable.

Si estuviéramos rastreando datos sobre nuestro servidor y nuestras aplicaciones, podríamos comenzar a reunir partes aparentemente dispares de datos del sistema para ayudarnos a comprender cómo era exactamente el entorno en el momento del problema. Es posible que descubramos que tuvimos un aumento constante en el uso de la memoria que puede provenir de una fuga de memoria. Si tenemos información sobre el uso de memoria a nivel de aplicación, probablemente podamos ver exactamente qué programa es el culpable. También podríamos ver que hubo un pico inusual, lo que podría significar algo completamente diferente.

En un escenario diferente, podemos ver cómo se ve el sistema antes y después de una implementación. Si el nuevo código crea algunas condiciones extrañas, podemos ver el efecto que tiene en nuestros otros componentes y comparar su rendimiento con nuestro código anterior. Podemos identificar puntos en los que nuestro nuevo código muestra una mejora y lugares en los que es posible que hayamos cometido un error.

Con la recopilación inteligente de datos, podemos ver nuestro sistema como un sistema, en lugar de como un conjunto suelto de componentes no relacionados.

Componentes de grafito

Vamos a comenzar un poco hacia atrás aquí y hablar primero sobre Graphite, la biblioteca de gráficos. Luego regresaremos y cubriremos parte del software que Graphite puede usar para obtener datos.

Graphite es una biblioteca gráfica responsable de almacenar y representar representaciones visuales de datos. Esto significa que Graphite requiere otras aplicaciones para recopilar y transferir los puntos de datos.

El proyecto Graphite en sí está compuesto por algunos componentes diferentes, cada uno de los cuales tiene un propósito específico y enfocado.

La aplicación web Graphite

El componente más visible y dinámico de una instalación de Graphite es la aplicación web de Graphite.

Aquí es donde puede diseñar gráficos que representen sus datos:

Graphite te ofrece una interfaz muy flexible para diseñar gráficos. Puede combinar diferentes tipos de métricas, etiquetas de control, fuentes, colores y propiedades de línea, y puede cambiar el tamaño y manipular los datos a voluntad.

La idea clave para resumir aquí es que Graphite representa gráficos en función de los puntos de datos que recibe y las instrucciones que le das. No solo imprime el gráfico y luego desecha los datos. Puede representar los datos en cualquier dato que desee, sobre la marcha.

La aplicación web también le permite guardar propiedades y diseños de gráficos, para que pueda abrir su interfaz de monitoreo con todas las configuraciones que desee. Puede tener tantas vistas de tablero como desee, lo que significa que puede tener un tablero separado para cada máquina o aplicación. Si necesita correlacionar los datos entre estos, simplemente arrastre y suelte los gráficos para combinar la visualización.

Sin embargo, la flexibilidad no termina ahí. Graphite le permite representar gráficos en una URL simple para incrustarlos en otras interfaces. También puede exportar los datos en representaciones no gráficas como JSON o CSV, o generar un SVG con información de datos incrustada.

Ahora que sabe lo que puede hacer con los datos cuando los obtiene, hablemos de los otros componentes de Graphite para ver los procesos que nos permiten hacer esto.

Carbón

Carbon es el backend de almacenamiento para una configuración Graphite. Una sola configuración de Graphite tendrá uno o más demonios de Carbon que son responsables de manejar los datos que envían otros procesos que recopilan y transmiten estadísticas (los recopiladores no son parte de Graphite).

Hay una variedad de demonios Carbon diferentes, cada uno de los cuales maneja los datos de una manera diferente. El más básico de estos se llama carbon-cache.py. Este demonio es sencillo. Escucha los datos en un puerto y los escribe en el disco a medida que llegan, de manera eficiente.

Almacena los datos a medida que llegan y luego los descarga en el disco después de un período de tiempo predeterminado. Es importante reconocer que el componente Carbon maneja los procedimientos de recepción y vaciado de datos. No maneja los mecanismos de almacenamiento reales. Eso queda para el componente whisper del que hablaremos en un momento.

Al demonio carbon-cache.py se le dice en qué formatos, protocolos y puertos trabajar. También se indica qué políticas de retención de datos utilizar para el almacenamiento de datos. Estos se entregan al susurro. Para la mayoría de las configuraciones básicas, una sola instancia de carbon-cache.py es suficiente para manejar la recepción de datos.

Se pueden ejecutar varias instancias a la vez a medida que crece su configuración. Estos se pueden equilibrar con un daemon carbon-relay.py o carbon-aggregator.py al frente.

El daemon carbon-relay.py se puede utilizar para enviar solicitudes a todos los daemons back-end para cierta redundancia. También se puede usar para fragmentar datos en diferentes instancias de carbon-cache.py para distribuir las cargas de lectura en varias ubicaciones de almacenamiento.

El demonio carbon-aggregator.py puede almacenar datos en el búfer y luego volcarlos en carbon-cache.py después de un tiempo. Esto puede ayudar a disminuir el impacto del procesamiento de estadísticas en el sistema a expensas de los detalles.

Susurro

Whisper es una biblioteca de base de datos que Graphite utiliza para almacenar la información que se envía.

Es muy flexible y permite almacenar datos de series temporales con gran detalle. Crea diferentes archivos en diferentes niveles de detalle, de modo que en el uso práctico, la información se degrada con gracia a resoluciones más bajas cuando pasa ciertos umbrales de envejecimiento configurados.

Por ejemplo, podría almacenar un punto de datos por segundo para una determinada métrica. Puede decirle al susurro que estos datos detallados deben mantenerse durante 5 horas. También puede tener un archivo que almacene datos de menor resolución. Es posible que solo almacene un punto por minuto y lo conserve por un período de 6 meses.

Cada punto en un archivo de menor resolución se calcula a partir de los mismos datos que se registran en los archivos de mayor resolución. Puede tener tantos archivos de diferentes resoluciones y tasas de retención como desee. Puede configurar cómo susurro calcula los datos para archivos de menor resolución según el tipo de métrica que se rastrea.

Por ejemplo, una métrica puede ser un recuento de la cantidad de veces que ocurre un evento en un período de tiempo corto. Para crear un punto para un marco de tiempo más grande a una resolución más baja, sumaría los puntos de datos del archivo de resolución más alta para resumir los valores de datos durante el período de tiempo más largo.

Whisper puede calcular datos de menor resolución de otras formas, según la naturaleza de las métricas. Por ejemplo, algunos datos se generalizan promediando, mientras que otros pueden rastrear un valor máximo. Para el promedio, se calcula un valor medio real a partir de los puntos de mayor resolución para crear el punto de menor resolución. Para el máximo, se debe mantener el valor más alto y el resto se debe desechar para mantener el significado del número.

Whisper calcula y registra los datos de menor resolución en el momento en que recibe los datos (después del tiempo necesario para recopilar los valores necesarios). Simplemente recopila los puntos de datos que necesita para realizar la técnica de agregación de datos (promedio, máximo, etc.) y luego los escribe.

Graphite usará el archivo de mayor resolución que contenga el período de tiempo solicitado cuando solicite datos para representar gráficos.

Recopilación y entrega de estadísticas

Como mencionamos anteriormente, Graphite en sí mismo no se preocupa por la recopilación de datos. En cambio, se basa en recibir información de otros servicios. Esto permite que el proyecto mantenga un enfoque estrecho y le permite interactuar modularmente con una variedad de servicios de entrada.

A continuación, analizaremos los protocolos que Graphite comprende y luego analizaremos dos programas de recopilación populares, collectd y StatsD, que se pueden usar para pasar datos a Carbon para su procesamiento.

protocolos

Hay tres protocolos diferentes que puede usar para enviar datos a Graphite.

En primer lugar, Graphite acepta y puede comprender texto sin formato. Este es el formato más flexible porque casi cualquier aplicación o servicio puede producir una salida de texto y esto se puede usar para alimentar Graphite o una herramienta intermedia.

Los mensajes de texto sin formato incluyen información sobre el nombre de la métrica, el valor que se proporciona y una marca de tiempo para ese valor. Estos mensajes se pueden enviar directamente a Carbon en un puerto designado para texto sin formato, sin formato adicional.

Debido a que Graphite se crea en Python, Graphite también acepta el formato de serialización de datos \pickle. Este estándar de Python le permite almacenar en búfer y enviar múltiples valores de tiempo en una sola transacción.

Graphite también puede aceptar datos mediante mensajes AMQP. Esto le permite manejar grandes cargas de datos con más gracia. Puede alimentar una gran cantidad de estadísticas y manejar las interrupciones en las conexiones de red entre hosts remotos sin perder datos con esta configuración.

recogido

Una de las formas más sencillas de recopilar información detallada sobre un servidor es con un demonio llamado collectd.

Collectd puede recopilar estadísticas sobre muchos componentes diferentes de un entorno de servidor. Le permite rastrear fácilmente métricas comunes como uso de memoria, carga de CPU, tráfico de red, etc. Esto le permite correlacionar fácilmente eventos con el estado de sus sistemas.

Más allá de recopilar información estándar del sistema, collectd también tiene un sistema de complementos que amplía su funcionalidad. Esto significa que puede rastrear fácilmente software común como Apache, Nginx, iptables, memcache, MySQL, PostgreSQL, OpenVPN y muchos más.

Collectd proporciona una forma sencilla de obtener datos de aplicaciones preconstruidas y servicios comunes en sus servidores. Esto debe usarse para rastrear el comportamiento de su infraestructura y los servicios en los que confía.

EstadísticasD

StatsD es un demonio muy simple que se puede usar para enviar otros datos a Graphite. El beneficio de este enfoque es que se vuelve trivial incorporar el seguimiento de estadísticas a las aplicaciones y sistemas que está creando.

StatsD opera escuchando en una interfaz paquetes UDP simples que representan un solo punto de datos. Esto significa que puede aceptar una gran cantidad de información sin conexión. Luego puede agregar los valores que recibe y pasarlos a Graphite.

Este sistema le permite enviar estadísticas en grandes cantidades sin preocuparse por aumentar la latencia de la aplicación. El servicio StatsD recopilará todos los datos a medida que lleguen, los agregará y luego enviará buenos puntos de datos resumidos a Graphite en el período de tiempo esperado.

Debido a estas ventajas, en realidad es un buen intermediario para cualquier tipo de datos enviados a Graphite. Pero la forma principal en que podemos aprovechar esto es monitorear nuestras propias aplicaciones y herramientas que creamos.

StatsD es perfecto para esto porque es un demonio de propósito general que acepta tráfico UDP. Hay muchas bibliotecas diferentes del lado del cliente en varios lenguajes de programación que pueden enviar datos directamente a una instancia de StatsD. Esto significa que las aplicaciones que está creando pueden enviar fácilmente datos para su seguimiento.

Conclusión

A estas alturas, debería tener una comprensión bastante buena de cómo una colección de diferentes estadísticas y utilidades gráficas pueden trabajar juntas para brindarle una imagen completa de su entorno.

En la siguiente guía, hablaremos de StatsD to Graphite para alimentar las estadísticas para monitorear.

Por Justin Ellingwood

Artículos relacionados: