Monitoreo por proceso con Promethus
Publicado por Deimos el 21/Apr/2019 - 03:36 PM
Monitorear la carga en el servidor es útil, pero no tanto cuando no tenemos una clara separación por proceso para identificar problemas entre los mismos, existen exporters para Prometheus que nos ayudan con algunos de ellos, pero cuando no controlamos el código en que se escribieron, o simplemente por que no es práctico crear un exporter directamente para ello, podemos recurrir al process exporter.
process-exporter es un exporter que nos permite monitorear procesos de manera individual sin meternos en tantos problemas, únicamente indicamos por una sintaxis sencilla y él se encarga de enviar datos, en específico, el número de procesos, carga en CPU, memoria, y actividad de lectura y escritura en disco. Veamos cómo instalar su monitoreo por medio de Prometheus.
Recuerda que ya debes tener configurado Prometheus y Grafana, tal y como lo vimos en el post dedicado a ello (consultar post).
1. Obtener el exporter
Dado nuestro sistema operativo seleccionamos la versión necesaria y la descargamos a nuestro servidor:
$ wget https://github.com/ncabatoff/process-exporter/releases/download/v0.5.0/process-exporter-0.5.0.linux-amd64.tar.gz
Extraemos los archivos y los movemos a una locación donde idealmente estarán otros exporters para llevar un orden:
$ tar -xvzf process-exporter-0.5.0.linux-amd64.tar.gz
$ mv process-exporter-0.5.0.linux-amd64 process_exporte
2. Crear el archivo de configuración
Creamos un archivo de configuración en formato YML, donde configuraremos los procesos que deseamos monitorear, en el repositorio podemos consultar la sintaxis apropiada, aquí te doy algunos ejemplos:
$ nano config.yml
process_names:
- comm:
- mysqld
- apache2
3. Arrancar el exporter
Ya está listo para correr, podemos arrancar para prueba nuestro exporter con el siguiente comando:
$ ./process-exporter -config.path config.yml
Podrás consultar las métricas en el puerto 9256.
4. Configurar el exporter como servicio
Para que nos sea más fácil administrar nuestro exporter lo configuraremos como servicio.
$ sudo useradd -r -s /bin/false process_exporter
$ nano init_process_exporter
#!/bin/sh
cd /path_to_prometheus_dir/process_exporter
sudo -u process_exporter ./process-exporter -config.path config.yml
Permisos para ejecución
$ sudo chmod 700 init_process_exporter
Creamos el archivo de configuración para el servicio
$ sudo nano /etc/systemd/system/process_exporter.service
[Unit]
Description=Process Exporter
[Service]
ExecStart=/path_to_prometheus_dir/process_exporter/init_process_exporter
[Install]
WantedBy=multi-user.targe
Recargamos la configuración de servicios, arrancamos el nuevo servicio y lo configuramos para que inicie con el sistema:
$ sudo systemctl daemon-reload
$ sudo systemctl start process_exporter
$ sudo systemctl enable process_exporter
5. Configurar Prometheus para que obtenga datos del exporter
En la sección scrape_configs agregaremos el siguiente nodo:
- job_name: 'local_process_exporter'
static_configs:
- targets: ['localhost:9256]
Reiniciamos Prometheus
$ sudo systemctl restart prometheus
6. Configurar el dashboard para Grafana
Utilizaremos el dashboard https://grafana.com/dashboards/249 para mostrar nuestros datos en Grafana. El dashboard por defecto sólo toma datos del nodo principal, si sólo tienes un nodo configurado será todo lo que necesites hacer.
Sin embargo, si lo que deseas es poder intercambiar entre varios nodos, tendremos que agregar dos variables a la plantilla para poder switchear entre nodos, las variables a ingresar serán las siguientes (recuerda que ésto se hace en Configuration > Templating > Variables > + New):
Node:
Variable:
Name: node
Type: query
Label: Host:
Query Options:
Data Source: prometheus (o la que hayamos configurado)
Refresh: On dashboard load
Query: label_values(node_boot_time, instance)
Regex: /([^:]+):.*/
Sort: disabled
Port:
Variable:
Name: port
Type: query
Label: Port:
Query Options:
Data Source: prometheus (o la que hayamos configurado)
Refresh: On dashboard load
Query: label_values(node_boot_time, instance)
Regex: /[^:]+:(.*)/
Sort: disabled
Una vez hecho esto podremos visualizar la lista de nodos para seleccionar, y los puertos. Por último habrá que editar las peticiones de cada una de las gráficas para que utilicen las nuevas variables (recuerda que ésto se hace en Edit > Metrics, sobre cada uno de los gráficos):
Para num_processes la petición quedará como:
namedprocess_namegroup_num_procs{groupname=~"$processes",instance=~"$node:$port"}
para cpu quedará como:
rate(namedprocess_namegroup_cpu_seconds_total{groupname=~"$processes",instance=~"$node:$port"}[$interval])
para resident memory quedará como:
namedprocess_namegroup_memory_bytes{groupname=~"$processes",instance=~"$node:$port", memtype="resident"}
para virtual_memory quedará:
namedprocess_namegroup_memory_bytes{groupname=~"$processes",instance=~"$node:$port", memtype="virtual"}
para read bytes:
rate(namedprocess_namegroup_read_bytes_total{groupname=~"$processes",instance=~"$node:$port"}[$interval])
Y finalmente, para write bytes:
rate(namedprocess_namegroup_write_bytes_total{groupname=~"$processes",instance=~"$node:$port"}[$interval])
Eso es todo, podrás monitorear la carga de los procesos por separado, espero que haya sido de ayuda.
Hasta la próxima
Luis Manuel Ramírez
+DEIMOS+