kanejaku.org

Speedtest を定期実行して Prometheus に蓄積する

25 Oct 2020

Speedtest の CLI が存在することを知った。これを使ってインターネット回線速度を定期的に計測し、結果を可視化しよう。

Speedtest CLI

speedtest のデフォルト出力は人が見ることを想定していて機械的に処理するのには向いていない。--progress=noオプションで進捗状況の出力を抑止して、--format=jsonで結果を JSON で出力するようにする。オプションを変えれば、他のフォーマットの指定やサーバの一覧を取得したりすることもできる。詳しくは--helpを参照のこと。

speedtest の初回起動時に EULA に同意するかのプロンプトが表示される。手元で使う分には最初に同意すればよいのだけど、Docker コンテナで動かしたいときにこの挙動が邪魔になる。--accept-licenceオプションをつけるとプロンプトを抑止できる。このオプションはヘルプに出てこなかったので、調べるのに時間がかかってしまった。

実行例:

$ speedtest --progress=no --format=json --accept-license
{"type":"result","timestamp":"2020-10-25T04:33:05Z","ping":{"jitter":0.21199999999999999,"latency":3.5630000000000002},"download":{"bandwidth":55541994,"bytes":579003927,"elapsed":10708},"upload":{"bandwidth":89175892,"bytes":329375225,"elapsed":3701},"packetLoss":0,"isp":"JPNE","interface":{"internalIp":"x.x.x.x","name":"eth0","macAddr":"xx:xx:xx:x:xx:xx","isVpn":false,"externalIp":"y.y.y.y"},"server":{"id":15047,"name":"OPEN Project (via 20G SINET)","location":"Tokyo","country":"Japan","host":"speed.open.ad.jp","port":8080,"ip":"202.222.12.78"},"result":{"id":"(uuid)","url":"https://www.speedtest.net/result/c/(uuid)"}}

データの蓄積

データの蓄積には Prometheus を使う。Prometheus は Pull 型のメトリクス収集ツールだから、今回みたいなコマンドを走らせてその結果を記録する、といった用途には本来向いていない。Prometheus を選んだのは、こちらも最近存在を知って試してみたかったから。

Prometheus にデータを蓄積するには独自の expoter を用意するか、あるいは push gateway を使う。Exporter は一種のサーバで、特定の HTTP エンドポイントに観測対象のデータを公開する形で実装する。Push gateway はサーバとしての役割を肩代わりしてくれるもの。単発のバッチ処理とかに使うのが良いと説明されている。

やりたいことは定期的に speedtest を走らせて結果を蓄積するだけだから、Push gateway を使う (あるいは Prometheus 自体を選択しない) のが素直なやり方だと思うけれど、今回は勉強を兼ねて exporter を作ることにした。

(Exporter で実装する別のデメリットとして計測のタイミングと観測のタイミングがずれてしまう問題もある)

Exporter の実装には Prometheus 自体が Go で書かれている、公式がサポートしているという理由で Go のクライアントライブラリを使うことにした。Go を書くのは久しぶりでモジュールなど最近の動向をキャッチアップするのに手間取ったが、サーバを書くにはほんとに楽で良い。

コンテナに入れる

作った exporter を気軽に動かせるように Docker と docker-compose を使って speedtest のインストールや exporter のビルドをコンテナ化しておく。docker-compose を使うのも初めてなので何か変なことをしているかもしれない。docker-compose build して docker-compose up -d すればポート 9300 で listen するように設定した。

試運転

速度テストの間隔を30分、データ収集の間隔を5秒にして数時間試運転した。以下のグラフはダウンロード速度を表示したもの。8を掛けているのはバイト単位をビット単位に変換するため。

300Mbps以上は出てそう。安定してこのぐらいの速度が出ているのかを今後調べたい。

TODO

TODO をこなす前に飽きて計測しなくなる可能性の方が高い。つくりかけのものはここに置いている。