Monitoreo de sistemas con Prometheus

PorEdmundo Andrade

Monitoreo de sistemas con Prometheus

Que tal amigos, en las siguientes líneas les hablaré sobre un tema muy importante acerca del monitoreo de sistemas.

Ya que tomando la información que nos arroje el sistema que utilicemos podremos detectar múltiples situaciones: Desde algún fallo en un servidor, problemas en algún servicio en producción, una demanda alta de recursos por un desborde de memoria, entre muchos otros casos. Sin datos de nuestros sistemas estamos a ciegas y no podríamos prever algunas situaciones.

 

Esta no necesariamente permite detectar un problema; también podremos analizar las estadísticas y detectar alta demanda de una aplicación en determinados horarios, permitiéndonos encontrar cuellos de botella, latencia en puntos estratégicos.

No monitorear nuestros sistemas puede desencadenar diversos problemas que al final se puede traducir en pérdidas monetarias, de usuarios, mala imágen de la marca por problemas recurrentes. Por eso la capacidad de respuesta que tengamos frente a un incidente hace una enorme diferencia.

¿Qué es prometheus?

Por este motivo les voy a hablar sobre una herramienta de código abierto llamada Prometheus. Es un sistema de monitoreo escrito en go. Desarrollada en el 2012 por Matt T. Proud un ingeniero de SoundCloud.

El motivo del desarrollo del proyecto fue que en ese momento la empresa había estado moviéndose a una arquitectura de microservicios desde un modelo monolítico, esto provocó que se tuviera que dividir su sistema en pequeñas instancias que se convertirían en una forma difícil de monitorear.

El sistema de la empresa en ese momento eran monitoreados con StatsD y Graphite pero se encontraron con las siguientes limitaciones:

  • Un modelo de datos multidimensional
  • Simplicidad operacional.
  • Recopilación de datos escalable y arquitectura descentralizada.
  • Potente lenguaje de consulta para poder mostrar gráficas ó silenciar alertas.

A pesar de que ya había sistemas que tuvieran esas características la empresa no había logrado encontrar un sistema que pudiera tenerlas todas. El sistema desarrollado por Matt buscaba resolver ese obstáculo. Así fue como nació Prometheus.

Al principio el proyecto inició como un sistema interno de SoundCloud y desde sus inicios fue código abierto. Para enfatizar este punto el proyecto se unió a la Cloud Native Computing Foundation en 2016. Esta fundación busca impulsar la adopción de diversos paradigmas mediante el fomento y el mantenimiento de un ecosistema de proyectos de código abierto y neutral con respecto a los proveedores.

Características

Después de hablar sobre los inicios. Pasemos a los detalles técnicos, el porqué es tan importante y que lo destaca de entre otras herramientas similares.

Hablaremos sobre las principales características, arquitectura y finalmente los pasos básicos para instalar y configurar.

Las principales características de Prometheus son las siguientes:

  • Un modelo de datos multidimensional con datos de series de tiempo identificados por nombre de métrica y pares llave/valor también conocidas como etiquetas:

estructura:

<metric name>{<label name>=<label value>, …}

ejemplo:

probe_success{instance=»192.168.1.15″,job=»servidor-01″}

  • PromQL, un lenguaje de consulta flexible para aprovechar esta dimensionalidad. Tomando el punto anterior, podríamos hacer consultas avanzadas de las formas siguientes:

En este caso se utiliza una expresión regular que busca que coincida un “environment” de la lista y que el método HTTP sea distinto de GET:

http_requests_total{environment=~»staging|testing|development»,method!=»GET»}

En este otro caso utilizamos rangos de tiempo. Buscando un  job llamado ”prometheus” y nos devuelva los últimos 5 minutos de esta serie de tiempo:

http_requests_total{job=»prometheus»}[5m]

  • Soporte de gráficos y dashboards: prometheus directamente tiene una interfaz para realizar algunas acciones. Además es compatible con aplicaciones de terceros como Grafana.

Componentes

Prometheus consta de múltiples componentes, algunos son opcionales:

  • El servidor principal de Prometheus que extrae y almacena datos de series de tiempo.
  • Bibliotecas. Con el fin de exponer métricas de una aplicación. Actualmente solo hay 4 lenguajes soportados oficialmente (go, java, python y ruby), pero hay otras bibliotecas hechas por la comunidad.
  • Una biblioteca que que nos sirve para procesos efímeros o procesos por lotes: Push gateway. El funcionamiento es sencillo, cada que se ejecuta uno de estos procesos manda sus métricas a push gateway, él las almacena y están listas para que prometheus pueda consultarlas, hasta que el proceso por lotes vuelva a ejecutarse y mande nuevos datos.
  • Exportadores e integraciones: Existen exportadores que son bibliotecas que ayudan a extraer información de servidores, bases de datos, almacenamiento, entre otros servicios y se exponen para solamente consumirlos y almacenarlos. Además de integraciones para exponer las métricas como es el caso del software de Grafana.
  • Un administrador de alertas. AlertManager. como su nombre lo dice es el encargado de administrar las alertas que se le manden, notificar mediante distintos canales ó silenciar alertas si una condición se cumple.

Arquitectura

Después de la explicación de las partes en las que se divide Prometheus, en la siguiente imagen podrán ver partes de los componentes mencionados y como es el flujo general:

 

Instalación:

Ahora pasamos a la parte práctica, como instalar y configurar nuestro servidor de monitoreo.

Como un dato importante la instalación se enfocará completamente en linux, pero prometheus y las bibliotecas oficiales están soportados en varios sistemas operativos: windows, bsd, entre otros.

Tenemos varias formas de instalación:

  • Directamente desde los repositorios de ubuntu o debian en sus últimas versiones. Un punto en contra es que en el sitio oficial no mencionan que distribuciones están soportadas.
  • Compilando desde el código fuente.
  • Imágenes docker.

En nuestro caso nos enfocaremos en la última opción, debido a que es sencillo de desplegar y de actualizar. Además de que manejarlo en un container agrega varias medidas de de seguridad por el tipo de implementación.

Si no tienen docker instalado, sigan los pasos de la documentación oficial

La instalación no es compleja y teniendo la instalación base de docker podemos avanzar.

Para las personas que no tengan conocimiento de que es docker. En manera de resumen es un tipo de virtualización con contenedores, lo que hace es que este tipo de virtualización utilice menos recursos que una máquina virtual completa y como el contenedor comparte bibliotecas con su anfitrión es mucho más liviano, con beneficios de mayor rapidez en el despliegue de nuevos contenedores.

Configuración

Los archivos de configuración que utilizaremos en prometheus son archivos yaml.

Antes de crear nuestro contenedor docker crearemos un archivo llamado prometheus.yml con la información que aparece a continuación o descargarlo desde el siguiente link:

# Configuraciones globales
global:
 scrape_interval:     15s # El intervalo de tiempo en el que se extraen las métricas. Default 1 minuto.
 evaluation_interval: 15s # El intervalo de tiempo en el que se evaluarán las métricas en busca de coincidencias, sólo si se tienen reglas configuradas.

# Alertmanager – configuración de los objetivos a donde se mandan las alertas #cuando coincide una regla
# (En este momento no tenemos ningún objetivo configurado)
alerting:
 alertmanagers:
 – static_configs:
   – targets:
     # – alertmanager:9093

# Reglas en formato yaml, en caso de cumplirse se lanzan alertas
# Reglas que tienen relación con global: ‘evaluation_interval’.
rule_files:
 # – «first_rules.yml»

# Listado de los endpoints de los que se extraerán métricas
scrape_configs:
 # El campo job_name es una etiqueta que se agregara a todas las series de tiempo
 # que se extraigan de este trabajo
 # Ejemplo: `job=<job_name>`
 – job_name: ‘prometheus’
   static_configs:
   – targets: [‘localhost:9090’]

Teniendo nuestro archivo creado ahora si creamos nuestro contenedor ejecutando en la terminal el siguiente comando:

docker run –name prometheus -d -p 9090:9090 -v /home/eandrade/prom/prometheus.yml:/etc/prometheus/prometheus.yml –restart unless-stopped prom/prometheus

Explicación de los comandos:

  • docker run: Crea un nuevo contenedor
  • –name: un nombre personalizado para el container, útil cuando tienes varios contenedores
  • -d: Al correr un contenedor por defecto entras al contenedor y ves todo el flujo, pero de esta forma termina su creación y puedes seguir trabajando.
  • -p: De esta forma puedes exponer un puerto o rango de puertos y se mapean con los puertos del anfitrión, de lo contrario solo podrás tener acceso con la red creada por docker.
  • -v: Se pueden montar volúmenes en el contenedor, pueden ser carpetas o archivos para no entrar al contenedor y editarlos o tener que copiarlos dentro.
  • –restart: Es una forma de generar políticas para que se reinicie el contenedor de forma automática, por ejemplo si deseas qu sólo en caso de fallo suceda, que siempre se reinicie a menos que se se apague o reinicie el demonio de docker ó que siempre se reinicie el contenedor.
  • prom/prometheus: Por último, este es el nombre de la imagen, si no descargaste con anticipación la imagen se descarga y posteriormente se crea el contenedor.

El resultado al final es la generación de un identificador único para el contenedor, el cual se tiene que tener cuidado al compartir porque con este identificador se puede manipular el contenedor creado:

Para poder revisar que nuestro contenedor está corriendo, ejecutamos el siguiente comando:

docker ps

 

También podremos acceder por web al puerto 9090, el puerto por defecto para prometheus: http://127.0.0.1:9090

Si recuerdan creamos un archivo base en yaml y agregamos un “job” que apuntaba a localhost. Desde un inicio prometheus ya está exponiendo métricas por sí mismo que las podemos ver en /metrics y se pueden mostrar desde una aplicación de terceros.

http://127.0.0.1:9090/metrics

Como prometheus ya se encuentra funcionando podemos hacer una consulta y visualizar una gráfica de las métricas que por si mismo está generando.

A partir de este punto, de acuerdo a sus necesidades pueden utilizar un cliente y/o un exportador para comenzar a generar datos y poder lanzar alertas. A continuación les dejo una lista de algunos que son muy utilizados y son oficiales del proyecto:

  • Node exporter: Un exportador para hardware, generar métricas de recursos, procesos del sistema, almacenamiento, y por ejemplo procesos de systemd (inhabilitado por defecto)
  • Blackbox exporter: Pruebas a endpoints mediante HTTP, HTTPS, DNS, TCP e ICMP.
  • AlertManager: El administrador de alertas oficial, permite notifcacaciones por email, a múltiples servicios de diversas marcas y webhook si necesitas algo distinto.
  • Push gateway: En caso de tener procesos que se ejecutan cada cierto tiempo como un script en cron.

La lista completa la pueden ver aquí: https://prometheus.io/docs/instrumenting/exporters/

Conclusiones

Prometheus con el paso del tiempo se ha convertido en una herramienta muy importante en su segmento. Principalmente debido a que  en los últimos años hemos visto crecer las arquitecturas serverless generando muchos servicios que monitorear, fue el caso de SoundCloud en su momento.

En este artículo se trató, más allá de comparar las diversas aplicaciones existentes, mostrar las bondades de este proyecto de manera general y en caso de cubrir sus necesidades poder implementarlo en sus organizaciones.

En publicaciones posteriores escribiré a detalle sobre cómo poder trabajar con exportadores, poder configurar reglas y lanzar alertas.

 

Sobre el autor

Edmundo Andrade administrator