Cet article est l'article du 13ème jour du JSL \ (Nippon System Giken ) Advent Calendar 2019.
Récemment, j'ai senti qu'il y avait un moment où le WiFi dans l'entreprise ralentissait, mais je ne savais pas à quel point il était lent, alors j'ai écrit un script pour exécuter un test de vitesse régulièrement.
-J'ai écrit un programme en Python pour mesurer la vitesse du WiFi interne en utilisant Speedtest CLI \ -Mesure de connexion Internet pour les développeurs.
Tout d'abord, je voulais l'exécuter régulièrement avec cron etc., alors j'ai pensé à faire un test de vitesse avec CUI
Dans mon image, le test de vitesse a été mesuré comme suit: recherche → exécuter….
J'ai essayé d'organiser les moyens de mesurer la vitesse de la ligne réseau sur Linux | Developers \ .IO ) Il semble que speedtest.net
fournit la CLI lorsque j'ai enquêté en regardant l'article, etc.
La CLI Speedtest fournit également un package Python,
--Il est possible d'installer binaire avec pip
j'ai découvert
J'ai construit un environnement en utilisant pipenv
$ mkdir wifi_speedtest
$ cd $_
#Si pipenv n'est pas installé
# brew install pipenv
#Créer un environnement virtuel
$ pipenv --python 3.7
#Installation du package
$ pipenv install speedtest-cli
#Activer l'environnement virtuel
$ pipenv shell
#tester la commande speedtest
(.venv) $ speedtest --version
speedtest-cli 2.1.2
Python 3.7.4 (default, Oct 12 2019, 18:55:28) [Clang 11.0.0 (clang-1100.0.33.8)]
Vous pouvez obtenir une liste de serveurs de destination de connexion fournie par des volontaires avec speedtest --list
, alors choisissez-en un et notez le numéro.
(.venv) $ speedtest --list | grep Tokyo
15047) OPEN Project (via 20G SINET) (Tokyo, Japan) [6.34 km]
24333) Rakuten Mobile , Inc (Tokyo, Japan) [6.34 km]
28910) fdcservers.net (Tokyo, Japan) [6.34 km]
18516) GIAM PING VIETPN.COM (Tokyo, Japan) [6.34 km]
22247) Tokyonet (Castro, Brazil) [18486.74 km]
Si vous spécifiez ce qui suit, le test de vitesse sera toujours exécuté sur le serveur spécifié. Par exemple, pour un serveur fourni par «Rakuten Mobile, Inc», le numéro serait «24333».
#Test de vitesse d'exécution
(.venv) $ speedtest --server 24333
Retrieving speedtest.net configuration...
Testing from XXX (xx.xx.xx.xx)...
Retrieving speedtest.net server list...
Retrieving information for the selected server...
Hosted by Rakuten Mobile , Inc (Tokyo) [6.34 km]: 200.123 ms
Testing download speed................................................................................
Download: 16.08 Mbit/s
Testing upload speed......................................................................................................
Upload: 31.96 Mbit/s
J'ai pu mesurer en toute sécurité (certaines informations client sont masquées)
Cependant, cela est difficile à gérer sur le programme, alors ajoutez --json
et essayez d'obtenir le résultat au format json.
(.venv) $ speedtest --server 24333 --json
résultat
{"download": 20208058.464686207, "upload": 54426180.687909536, "ping": 48.215, "server": {"url": "http://ookla.mbspeed.net:8080/speedtest/upload.php", "lat": "35.6833", "lon": "139.6833", "name": "Tokyo", "country": "Japan", "cc": "JP", "sponsor": "Rakuten Mobile , Inc", "id": "24333", "host": "ookla.mbspeed.net:8080", "d": 6.336536019993832, "latency": 48.215}, "timestamp": "2019-12-23T07:23:16.316637Z", "bytes_sent": 68534272, "bytes_received": 25353712, "share": null, "client": {"ip": "xx.xx.xx.xx", "lat": "xx.xxxx", "lon": "xxx.xxxx", "isp": "XXX", "isprating": "3.7", "rating": "0", "ispdlavg": "0", "ispulavg": "0", "loggedin": "0", "country": "JP"}}
Pensez à gérer cela sur Python
Comme il est fourni en tant que package Python, j'ai pensé à exécuter un test de vitesse de manière enfichable en Python, mais cette fois j'ai pensé à gérer le résultat de l'exécution dans CUI tel quel, donc test de vitesse avec module de sous-processus
Décidé d'exécuter la commande
sous-processus \ - \ - \ - gestion des sous-processus - documentation Python 3 \ .8 \ .1
wifi_speedtest.py
def get_speedtest_result():
process = subprocess.run(['speedtest', '--server', '24333', '--json'], capture_output=True)
return json.loads(process.stdout)
def bit_to_mbit(bit):
"""
Faire un sentiment qui ne se soucie pas des erreurs
"""
return bit / 1024 / 1024
result = get_speedtest_result()
print(bit_to_mbit(result["download"]), bit_to_mbit(result["upload"]))
résultat
13.46394215 50.48002296
Il y a plusieurs façons d'exécuter une commande avec subprocess
, mais cette fois j'ai obtenu la sortie standard avec run ()
+ capture_output = True
, qui est officiellement mentionnée dans l'exemple d'utilisation.
Cette fois, j'ai frappé l'API SpreadSheet pour l'enregistrer (les détails sont omis ci-dessous).
Vous pouvez l'ignorer dans Slack et l'enregistrer comme vous le souhaitez.
En passant, l'utilisation des scripts de Pipenv était pratique car il n'était pas nécessaire d'activer l'environnement virtuel lors de l'exécution à partir de cron (les processus exécutés via pipenv run sont traités de la même manière que l'exécution dans un environnement virtuel).
Pipfile
[scripts]
dev = 'python wifi_speedtest.py'
Recommended Posts