Monitorizando servicios de systemd

Cloud, Tecnología de sistemas

Trevenque Group » Blog » Soluciones Empresariales » 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:

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:

Description=Node_Exporter Service
After=network-online.target


ExecStart=/usr/local/bin/node_exporter --collector.systemd
User=node_exporter
Type=simple


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:

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:

  - job_name: 'node_exporter'
    scrape_interval: 15s
    static_configs:
      - targets: 
        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:

# 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.

¿Te ha gustado? ¡Compártelo!

Logo Trevenque

trevenque group

Ofrecemos un conjunto de servicios completos para que puedas desarrollar tu negocio, gestionar tus datos de manera inteligente y tomar decisiones rentables.

Deja un comentario

Artículos similares

Sigue de cerca la actualidad de Grupo Trevenque y las últimas tendencias tecnológicas y de Business Intelligence.

Ver todas las noticias