Category Archives: Internet

Monitoriza tu velocidad de conexión

Después de llevar varios días monitorizando mi conexión de internet mediante mi script, y realizando variaciones y comprobaciones, he llegado a la conclusión que la mejor forma de utilizar el speedtest-cli es fijando siempre la prueba contra unos servidores. De esta forma no dejamos que speedtest-cli determine el servidor contra el cual hacer la prueba de velocidad y que puede desvirtualizar el resultado real del estado de la conexión.

Para ello creo que lo mejor es utilizar dos o tres servidores y hacer la prueba siempre sobre estos. Así que he modificado el script para que permita configurar una lista de servidores. Para conocer la lista de servidores (el número unívoco que utilizar speedtest-cli), es tan sencillo como llamar al script de speedtest-cli.py con el parámetro –list. Aparecerán los servidores que por ubicación son preferentes para hacer la prueba de conexión. Selecciona un par y configura el script a tu gusto.

También he modificado la forma de invocar a speedtest_cli.py, para poder pasarle parámetros. Ahora hay que indicar la ruta absoluta de donde está el script.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by Akirasan Febrero 2014

import plotly
import speedtest_cli
import string
import subprocess
from datetime import datetime

dia = datetime.today()
py = plotly.plotly(username_or_email="<USUARIO>", key="<KEY>")
layout = {'title': 'Velocidad Fibra'}

#Lista de servidores contra los que realizar test
#list_servidores = ['3747','4374','3466','1695','3171']
list_servidores = ['1695','2052']

for server in list_servidores:
  reportStr = subprocess.check_output(["python", "<PATH_ABSOLUTO>/speedtest_cli.py","--server",server])

  #Buscamos posición de la información
  dl_pos = string.find(reportStr, 'Download:')
  ul_pos = string.find(reportStr, 'Upload:')
  srv_pos1 = string.find(reportStr,'Hosted by')
  srv_pos2 = string.find(reportStr,'[')
  offset = srv_pos2 - srv_pos1
  servidor = reportStr[srv_pos1+10:srv_pos1+offset]

  data = [{'x': dia,
           'y': reportStr[dl_pos+9:dl_pos+9+6],
           'name':servidor+'_DL'
           },
          {'x': dia,
           'y': reportStr[ul_pos+7:ul_pos+7+6],
           'name':servidor+'_UL'
           }
          ]

  try:
     py.plot(data, filename='Monitorizacion Fibra Optica', fileopt='extend')
  except:
     print "ERROR envio datos a Monitorizacion"

El resultado son gráficas en las que se puede ver, que cuando el test de velocidad para un servidor da unos ratios muy malos, para otro se sigue manteniendo estable:

Os dejo un ejemplo en tiempo real https://plot.ly/~akirasan/4

Monitoriza tu velocidad de conexión con Python + Plot.ly

En un tweet the Linuxparty leo una forma de comprobar la velocidad de la conexión de internet desde la línea de comandos en Linux utilizando Python:


Partiendo de esta base y viendo la posibilidad de probar la API de Plot.ly (servicio para crear gráficas) para Python, me he creado un pequeño script que ejecuto cada 5 minutos (por ahora, seguramente lo deje en una ejecución cada hora), que verifica la velocidad de la conexión y alimenta una gráfica en Plot.ly.

Evidentemente lo primero es crear una cuenta en Plot.ly para poder tener de un usuario y una key para utilizar con la API (en el código de mi script está puesto como <USUARIO> y <KEY>

Después en nuestro sistema tenemos que instalar la librería Python para instalar la API de Plot.ly:

$# sudo apt-get install python-pip
$# sudo pip install plotly

Ahora nos bajamos el script para verificar la velocidad de conexión que sale en el artículo de Linuxparty:

wget https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py

Con esto ya tendremos todos los elementos.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by Akirasan Febrero 2014

import plotly
import datetime
import speedtest_cli
import sys
import StringIO
import string

from datetime import datetime

py = plotly.plotly(username_or_email='<USUARIO>', key='<KEY>')

#guardamos y redireccionamos el sys.stdout
stdout = sys.stdout
sys.stdout = reportSIO = StringIO.StringIO()

#Llamamos a la utilidad speedtest_cli
speedtest_cli.speedtest()

#Recuperamos lo escrito en nuestro IO
reportStr = reportSIO.getvalue()
#recuperar sys.stdout
sys.stdout = stdout

#Buscamos posición de la información
dl_pos = string.find(reportStr, 'Download:')
ul_pos = string.find(reportStr, 'Upload:')

dia = datetime.today()

layout = {'title': 'Velocidad conexion internet'}
data = [{'x': dia,
         'y': reportStr[dl_pos+9:dl_pos+9+6],
         'name':'Download'
         },
        {'x': dia,
         'y': reportStr[ul_pos+7:ul_pos+7+6],
         'name':'Upload'
         }
        ]

py.plot(data, filename='Velocidad_Internet', fileopt='extend', world_readable=False, layout=layout)

Luego ya solo falta o ejecutarlo como un script poniendo los permisos de ejecución y programarlo con el cron o similar.

Una vez hemos alimentado la información en Plot.ly podemos ir a consultar y ver el resultado de la gráfica. Algo como esto:

qtrnas-52f38b804c065