Monitorizando servicios de systemd
Es importante tener controlado el estado de los principales servicios que corren en nuestro servidor Linux. En esta entrada, vamos a contar cómo realizarlo con el stack Prometheus-Grafana-Alertmanager.
Si bien existen muchos exporters específicos para diferentes servicios que nos permiten realizar esta tarea, en esta ocasión vamos a ver cómo podemos obtener el estado que nos reporta systemd cuando realizamos un systemctl status de un servicio en concreto.
Para ello, vamos a realizarlo mediante node_exporter, con la opción que nos da el collector systemd (Exposes service and system status from systemd), que por defecto viene deshabilitada.
Partimos de la base de que tenemos instalados Prometheus y Grafana, para recoger los datos de monitorización y visualizarlos. También Alertmanager, para enviarnos las alertas.
Lo primero que vamos a realizar es instalar el servicio node_exporter:
1 2 3 4 5 |
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz useradd -r -s /usr/sbin/nologin node_exporter tar zxvf node_exporter-1.0.1.linux-amd64.tar.gz cp node_exporter-1.0.1.linux-amd64/node_exporter /usr/local/bin/ chown node_exporter:node_exporter /usr/local/bin/node_exporter |
Descargamos la última versión disponible a día de hoy y creamos un usuario del sistema sin home y sin shell. A continuación, descomprimimos y copiamos el binario a una ubicación más lógica. Por último, hacemos propietario al usuario que hemos creado del binario del node_exporter.
A continuación, con nuestro editor preferido creamos el fichero del servicio en /etc/systemd/system/node_exporter.service, agregando la opción –collector.systemd:
1 2 3 4 5 6 7 8 9 10 11 |
[Unit] Description=Node_Exporter Service After=network-online.target [Service] ExecStart=/usr/local/bin/node_exporter --collector.systemd User=node_exporter Type=simple [Install] WantedBy=multi-user.target |
Ahora sólo nos falta habilitar el servicio del node_exporter para que se ejecute al inicio y ejecutarlo para que empiece a recoger los datos:
1 2 |
systemctl enable node_exporter systemctl start node_exporter |
Es importante que el puerto 9100, donde escucha el servicio esté abierto, sería conveniente limitarlo a nivel del firewall de la máquina a la IP de Prometheus.
Para recoger los datos, sólo nos hace falta agregarlo en la configuración de Prometheus:
1 2 3 4 5 6 |
- job_name: 'node_exporter' scrape_interval: 15s static_configs: - targets: ['miserver.systemd.local:9100'] labels: group: 'MiGrupo' |
Donde debemos colocar el nombre del host o la IP que corresponda.
En este punto, ya estamos recibiendo los datos en Prometheus. Ahora queremos visualizar dicha información en Grafana. Hay multitud de paneles disponibles. En concreto, hay alguno para mostrar información que recoge el node_exporter a través de systemd, pero no muestra la información que necesitamos. Por eso, vamos a crear un panel en el que se visualice el estado de los servicios. No nos interesan todos los servicios que se están ejecutando, ya que son muchos, la mayoría del sistema, sino sólo los más relevantes, como por ejemplo nginx, postgresql y tomcat.
Mediante la variable node_systemd_unit_state obtenemos los servicios que nos interesan con estado activo.
Si el valor que nos devuelve es 1, el servicio está activo. Si el valor es 0, es porque no está activo.
Con esta información, vamos a crear una reglas específicas para que Alertmanager nos alerte si alguno de los servicios que nos interesa tener controlados deja de estar activo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# Alerts por servicios en systemd - name: AlertaServicios rules: - alert: NginxDown expr: node_systemd_unit_state{name=~"nginx.*",state="active"} != 1 for: 1m labels: severity: Critical annotations: Summary: Servicio no activo Description: "El servicio Nginx lleva más de 3m detenido." - alert: TomcatDown expr: node_systemd_unit_state{name=~"tomcat.*",state="active"} != 1 for: 1m labels: severity: Critical annotations: Summary: Servicio no activo Description: "El servicio Redis lleva más de 3m detenido." - alert: PostgreSQLDown expr: node_systemd_unit_state{name=~"postgresql.*",state="active"} != 1 for: 1m labels: severity: Critical annotations: Summary: Servicio no activo Description: "El servicio PostgreSQL lleva más de 3m detenido." |
Con estas reglas, recibiríamos una alerta cuando alguno de los servicios anteriores dejara de estar activo por más de un minuto.
Podemos personalizar los servicios para monitorizar con sólo node_exporter, si el estado de cualquiera de los servicios que hay en nuestro servidor está activo, con la información que nos brinda systemd. Podremos recibir alertas si alguno de ellos deja de estarlo.
Deja una respuesta