04 febrero, 2025

Tablero de equipos conectados con Mikrotik y Grafana

En una oportunidad se necesitaba presentar estadísticas con forma de lindo tablero de equipos conectados en diferentes routers Mikrotiks, para ello Grafana + Bash + Prometheus al rescate


Consideraciones

Parto de la base que el servidor (en mi caso 192.168.1.200) ya dispone de Grafana y base de datos Prometheus instalado, bajo un sistema operativo Ubuntu Linux. Ademas que desde ese server tengo conectividad hacia los routers MikroTik por SSH.

 

Descripción general

Tabla ARP

Contabilizo los dispositivos presentados en la tabla ARP, ya que cada dispositivo que se presenta queda su MAC Address en la tabla. La tabla retiene esas MAC por 30 segundo por default

ARP timeout es el tiempo máximo de duración en caché de un registro ARP

Dentro del router Mikrotik cambio la configuración del timeout de la tabla ARP: 

/ip settings set arp-timeout=4h


Tablero y Gráficos

La graficación se realiza mediante dashboard de Grafana, tomando los valores desde la base de datos Promtheus.


Obtención de datos

Mediante el servicio de pushgateway inserto los datos obtenidos del Mikrotik en Prometheus bajo el job Mikrotik_ARP , que escucha bajo el puerto 9091

La configuración del job se puede consulta en:
/etc/prometheus/prometheus.yml

 - job_name: pushgateway
    static_configs:
      - targets: ['localhost:9091']
        labels:
          instance: pushgateway


Los mikrotiks tienen el usuarios de servicio "prometheus" creado para ejecutar el comando por SSH:

/ip arp print count-only where interface=bridge1


El modo de autenticación para el acceso del script al router es mediante key para evitar la solicitud de claves, la publica que utiliza el Mikrotik

Con el usuario de servicio se cronea 🕐para que corra cada 5 min el script en:

/scripts/mikrotik.sh

El script es quien realiza la consulta por SSH al mikrotik y pushea a la base de datos  Prometheus la información. 

El usuario que corre el script en el server es usuarios_servicio


El formato para ingreso de datos a la base es:

http://localhost:9091/metrics/job/Mikrotik_ARP/instance/Nombre_Router


Agregando Routers a Prometheus

  1. Generar user en router Mikrotik (en mi caso se llama prometheus)
  2. Gerar la llave (ssh key) en un equipo con OpenSSH, con el comando:
    ssh-keygen -t rsa -b 4096
  3. Copiar el archivo mikrotik.pub al Mikrotik por SCP (el nombre del archivo puede variar según el paso 2)
  4. Ejecutar en el Mikrotik (importo la llave ssh):
    • user ssh-keys import user=prometheus public-key-file=mikrotik.pub

  5. Editar en el server 192.168.1.200, el archivo: /scripts/mikrotik.sh
  6. Dentro del script de bash, por cada router:
    • #Router IP #.#.#.# - Nombre_Router
    • string="Mikrotik_ARP "
    • string+=$(ssh -l prometheus -i /home/usuario_servicio/.ssh/mikrotik IP_ROUTER "/ip arp print count-only where interface=bridge1")
    • echo "$string"
    • echo $string |tr -d '\r'| curl --data-binary @- http://localhost:9091/metrics/job/Mikrotik_ARP/instance/Nombre_Router
  7. Guardar Cambios
  8. Validar la información en la interfaz de Prometheus
    http://192.168.1.200:9090/graph?g0.range_input=1h&g0.expr=Mikrotik_ARP&g0.tab=0
  9. Debemos visualizar un gráfico similar, tener en cuenta que se actualiza cada 5 minutos

 

Ajustar la retención (Prometheus)


En forma predeterminada guarda 15 días 😠

Para cambiar es necesario editar el archivo de configuración de Prometheus:  

sudo nano /etc/default/prometheus


Para guardar un año, modificar la línea 

ARGS="-storage.local.retention 8760h0m0s"

 En mi caso lo cambie por 1 año de retención


Dashboard en Grafana

A partir de este de la configuración de JSON se puede importar para obtener algo así:

En mi caso cada router se llama EP#, con tres métricas:

  • Contador de Promedio de dispositivos conectados
  • Contador de Máximo de dispositivos conectados
  • Histograma de Tiempo de dispositivos conectados

Configuración del origen de datos

Configuration -> Data Sources -> botón Add Data Source

Seleccionamos dentro de  "Time series databases" el motor Prometheus


Colocamos el nombre, URL de Prometheus (en mi caso http://192.168.1.200:9090)


Consideraciones de Seguridad

ES muuuuyy recomendable, aplicar algún tipo de autenticación al motor Prometheus , certificado y credenciales. El ejemplo esta armado para las capturas de pantallas


Creación del dashboard

Creamos un nuevo dashboard en Grafana, le damos un títulos y lo gradamos.

Dentro de ese dasboard creamos un nuevo Panel y obtenemos algo así

Donde dice default, seleccionar Promethus que es nuestro origen de datos. 

En Metrics -> seleccionamos Mikrotik -> Mikrotik_ARP

En Panel -> Visualización selecciono como quiero representar cada panel:


Los pasos del panel los repetimos por cada indicador que queremos colocar en el dashboard.

Este apartado no intenta ser un tutorial de como crear dashboard en Grafana, si no, dar los pasos generales para hacer foco en los indicadores para contar equipos conectados en los routers.


Configuración Histograma

Detalles de la Query

Obtengo los datos de origen de Prometheus, indicando la Métrica Mikrotik_ARP y que adjunte la leyenda {(exported_instance)} ya que cada instancia corresponde a un router

 

Tener en cuenta de excluir el que dice "{_name_=..." en Transform


Configuración Contador Máximos

Detalle de la Query

Obtengo los datos de origen de Prometheus, indicando la Métrica Mikrotik_ARP y que adjunte la leyenda {(exported_instance)} ya que cada instancia corresponde a un router


Transformación para calcular el Máximo

Dentro de Transform

  • Excluir el que dice "{_name_=..." para evitar ver ese valor
  • Seleccionar todos los router (en mi caso EP#) que quier ver en el dashboard
  • En Group by seleccionar Calculate y seleccionar "Max"
  • En Group by, en el campo Time seleccionar Group by para que aparezca un contador por cada router


Configuración Contador de Promedio conexiones

Detalle de la Query

Obtengo los datos de origen de Prometheus, indicando la Métrica Mikrotik_ARP y que adjunte la leyenda {(exported_instance)} ya que cada instancia corresponde a un router 

 

Transformación para calcular el Promedio (mean)

Dentro de Transform

  • Excluir el que dice "{_name_=..." para evitar ver ese valor
  • Seleccionar todos los router (en mi caso EP#) que quier ver en el dashboard
  • En Group by seleccionar Calculate y seleccionar "Mean"
  • En Group by, en el campo Time seleccionar Group by para que aparezca un contador por cada router



Referencias

  • https://wiki.mikrotik.com/Manual:IP/Settings
  • https://medium.com/@giovannyorjuel2/env%C3%ADe-m%C3%A9tricas-a-prometheus-mediante-pushgateway-5a8fe6357ea8
  • https://andalinux.wordpress.com/2018/08/28/ssh-pair-keys-on-mikrotik/

0 comments:

Publicar un comentario