Midiendo velocidad con Grafana, Telegraf, InfluxDB, Docker y Speedtest

Anteriormente escribí una entrada donde mencionaba que Ubiquiti había eliminado sutilmente la opción de realizar un test de velocidad periódico contra sus servidores al poner como intervalo mínimo 12 horas, opción que claramente no es práctica para analizar el rendimiento de tu ISP.

Luego en otra entrada comenté el hecho que algunos usuarios lograron ejecutar el script de test de velocidad a través de una tarea cron con la cual podíamos definir el intervalo que deseamos en el tiempo.

Ahora, buscando una solución alterna a la UniFi, he terminado usando la aplicación de línea de comandos de Speed Test que recién fue lanzada en el último trimestre de 2019. Si, esa Ookla, donde todos hacemos test de velocidad de vez en cuando. Tienen una aplicación de línea de comandos oficial que nos sirve perfectamente para esta tarea y nos permite exportar los datos al menos en modo csv o json. Existen varios scripts en diferentes lenguajes que también hacen lo mismo, pero sus resultados nos son tan fiables como la aplicación oficial.

Como planeo utilizar este script en mis laptops, para instalarlo, la guía oficial esta aquí y está disponible para varias arquitecturas. Después de añadir el repositorio, solo es cuestión de instalar.

1
$ sudo apt install speedtest

La primera vez que ejecutas el comando speedtest aparece un documento tipo EULA el cual debes aceptar para continuar. Después de vender nuestra alma al diablo, entonces podemos ejecutarlo

1
2
3
4
5
6
7
8
9
$ speedtest
   Speedtest by Ookla
     Server: OVNICOM - Panama City (id = 16914)
        ISP: Cable Onda
    Latency:     9.59 ms   (5.18 ms jitter)
   Download:   205.98 Mbps (data used: 177.1 MB)                              
     Upload:     9.86 Mbps (data used: 4.8 MB)                              
Packet Loss:     0.0%
 Result URL: https://www.speedtest.net/result/c/30fe01e3-da9d-41e6-8af1-fa4376f8846b

Este fue el resultado, tengo contratado un plan 200 Mbps de bajada y 10 Mbps de subida, así que el resultado es el esperado a pesar de estar conectado a la red a través del WiFi. Evidentemente, para lograr este máximo estaba conectado usando la banda de 5 GHz de la red y bastante cerca de uno de los access point.

Ahora, podemos hacer cosas interesantes con esta aplicación. La idea general es tomar estos datos y graficarlos de manera tal que podamos tener un pantallazo de cómo se comporta nuestra conexión en el tiempo y llevar un registro mucho más fiable que el realizado con UniFi contra sus servidores, pues Ookla tiene una red dedicada para este fin y con servidores mucho más próximos que los de Ubiquiti en Atlanta o en Miami…

Lo ideal sería que el mismo router realizará el test, pero, he terminado usando mi servidor bastión para realizarlo. Para esta tarea tenemos entonces a grafana, telegraf, influxdb, docker y por supuesto la aplicación oficial de speedtest. No hay que reinventar la rueda, pues ya alguien creo un proyecto para docker-compose con todo lo que necesitamos. Así que clonamos ese repositorio.

1
2
$ git clone git@github.com:raaaimund/internet-speed-monitor.git
$ cd internet-speed-monitor

Vamos al directorio del proyecto, dentro veremos una serie de archivos y directorios. Dentro del directorio speedtest veremos un Dockerfile, aquí editaremos la frecuencia que se realizará el test. De manera predeterminada se realizará cada 5 minutos.

Lo siguiente sería seleccionar el código del servidor contra el cual haremos el test de velocidad. Este número ID podemos encontrarlo cuando realizamos un test simple con la aplicación. O bien, de la siguiente tabla, podemos tomar el que nos convenga.

NombreURI hostID
Gold Data Panamá15020
Telefónica Móviles Panamá3999
Cable Onda S.A.3853
Liberty Technologies11924
Interfast Panamá12632
Claro Panamá20322
OVNICOM16914
Ufinet31830
DBS Network21586
Trans Ocean Network28116
Digicel Panamá13892
Sistemas Inalámbricos S.A.20041

El contenido original es este:

1
2
3
4
5
6
7
FROM python:3-alpine
WORKDIR /usr/speedtest
RUN pip install --no-cache-dir speedtest-cli && \
    speedtest-cli --csv-header > speedtest-results.csv && \
    # server 3744 - Nessus GmbH (10G Uplink) (Vienna, Austria)
    echo "*/5 * * * * speedtest-cli --server 3744 --secure --csv >> /usr/speedtest/speedtest-results.csv" > /etc/crontabs/root
CMD ["crond", "-f", "-d", "8"]

Ahora con mis ediciones ajuste el tiempo en la tarea cron a ejecutarse cada 15 minutos y seleccione el servidor de Speedtest de Cable Onda, 3853.

1
2
3
4
5
6
7
FROM python:3-alpine
WORKDIR /usr/speedtest
RUN pip install --no-cache-dir speedtest-cli && \
    speedtest-cli --csv-header > speedtest-results.csv && \
    # server 3744 - Nessus GmbH (10G Uplink) (Vienna, Austria)
    echo "*/15 * * * * speedtest-cli --server 3853 --secure --csv >> /usr/speedtest/speedtest-results.csv" > /etc/crontabs/root
CMD ["crond", "-f", "-d", "8"]

Una vez hecho este cambio, podemos levantar los contenedores y sus volúmenes.

1
$ docker-compose up -d

Si se da el caso que levantamos un contenedor y luego hacemos una edición, solo hay que reconstruir

1
$ docker-compose build

Al terminar de levantar los contenedores tendremos corriendo varias cosas.

  • speedtester: es una tarea cron que ejecuta periódicamente la aplicación de speedtest y guarda sus resultados en un archivo csv.
  • influxdb: almacenará los datos que genera speedtest-cli.
  • telegraf: leerá la última línea del archivo csv dónde speedtest-cli vuelca los datos y los enviara a influxdb.
  • grafana: toma los datos de InfluxDB y los presenta en forma gráfica.

Al final tendremos corriendo este servicio sobre el puerto 3000 y accesible vía web, solo hace falta conectarnos a través del navegador web. La primera vez, grafana te solicitará cambiar la credencial por defecto, la cual es admin/admin. Una vez finalizado el cambio seleccionamos el tablero de Speedtest y veremos nuestro registro gráfico sobre el ancho de banda en el tiempo.

Tablero de Grafana/Speedtest

Y de este modo, tengo otra alternativa para medir el ancho de banda disponible que entrega mi proveedor.


Moisés Serrano Samudio Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth y diseñador/desarrollador de sitios web de salud. Médico, apasionado del EdTech/eHealth y diseñador/desarrollador de sitios web de salud.
Moisés Serrano Samudio

@linkmoises

Médico de atención primaria, fotógrafo aficionado, apasionado de las tecnologías relacionadas con el EdTech y el eHealth.

Entradas relacionadas

  1. Aún no hay comentarios...

Deja una respuesta

Su email no será publicado. Required fields are marked *