おうちの回線速度をお手軽に可視化してみよう
2022年12月21日 水曜日
CONTENTS
【IIJ 2022 TECHアドベントカレンダー 12/21(水)の記事です】
はじめに
名古屋支社の kmmt-t です。
今年の夏頃、インターネットの回線速度を測定するブームがありました。(なぜ?については触れませんが・・・)
俗に言われる「回線速度」というものは、時間帯やご近所さんの利用状況などの様々な要因で変化するものなので1回だけ測ったところで大した意味は持たないでしょう。先日公開された弊社のハンズオン研修の1つである「監視Overview」でも述べられている通り、何かのシステムを監視するのであれば「可視性」「通知性」「特定性」「分析性」を重視しなければなりません。・・・例えそれが自宅のインターネット回線であっても!
というわけで今回は、以下のような監視画面を弊社の「Machinist」サービスを使ってお手軽に実現してみました。ちなみにお試しは無料ですよ!
回線速度の可視化をしよう
スピードテストをしてみる
回線速度の測定と言えば、おなじみのサービスとして思いつくサイトがいくつかあるかと思います。そういったサービスのほとんどはブラウザやスマホアプリで測定をするものですが、継続的な測定をするにあたって毎度ブラウザやアプリを立ち上げていては寝る暇もありません。
そんななか、救世主的な立ち位置で「コマンドラインで実行可能なスピードテストアプリケーション」を提供してくれているのが、Ookla社のSpeedtest.netです。皆様も、どこかで1度位は以下のような画像を見かけたことがあるんじゃないでしょうか。
多くの人がブラウザ版やスマホアプリ版で測定しているのと同様の測定を、CLIで実現出来るのは大変ありがたいものです。使い方は至って簡単、speedtest.net内のダウンロードページからご利用のOS向けのプログラムをダウンロードし、以下のようなコマンドをぽんと叩くだけで、速度測定が行われて結果が表示されます。
$ speedtest
Speedtest by Ookla
Server: IPA CyberLab 400G - Tokyo (id: 48463)
ISP: Internet Multifeed Co.
Idle Latency: 4.52 ms (jitter: 0.68ms, low: 4.28ms, high: 5.18ms)
Download: 183.89 Mbps (data used: 231.8 MB)
6.11 ms (jitter: 15.20ms, low: 4.25ms, high: 242.76ms)
Upload: 94.26 Mbps (data used: 129.9 MB)
7.48 ms (jitter: 2.30ms, low: 4.21ms, high: 16.70ms)
Packet Loss: 0.0%
Result URL: https://www.speedtest.net/result/c/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
オプションを指定すれば、宛先サーバや出力インタフェース、出力形式なども指定できる優れものです。
今回、自動化という形でスクリプト化を行い、出力結果についても機械が処理しやすい形で出力したかったため、以下のようなコマンドを使うことにしました。
$ speedtest -s 48463 -f csv
# -s 48463 : サーバID 48463(IPA CyberLab)を指定
# -f csv : 出力フォーマットにCSV (Comma Separated Values) を指定
データを投入をしてみる
弊社が提供する「Machinist」は、ブラウザで表示可能な可視化ツールです。メトリクス(数値)情報をHTTP POSTするだけで使える簡単なサービスなので、専用のアプリケーションやシステムを導入すること無く可視化を始められるという手軽さが魅力です。
きちんとした使い方の説明は公式サイトの「Getting Started」にまかせるとして、今回の目的である回線速度の可視化をするために必要な処理を準備していきます。
まず、前述したコマンドを実行するとカンマ区切りで結果が出力されますが、この中で可視化に使いたいデータは3個目の「RTT (Round Trip Time = 俗に言うPing値)」と、6個目の「Download Speed」です。ただし、カンマ区切りで出力した場合のDownload Speedの値はBytes単位となっているため、bit単位の速度に変換するために8倍する必要があります。これらをよしなに処理できるよう、以下のようなシェルスクリプト(bash向け)を作成しました。
#!/bin/bash
declare -A DATA
##### ユーザ変数 #####
API_KEY=xxxxxxxxxxxxxxxx
AGENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
##### データ生成 #####
now=$(date +%s)
RESULT=$(speedtest -s 48463 -f csv)
DATA=(
["RTT"]=$(echo $RESULT | cut -d, -f3)
["Download"]=$(( $(echo $RESULT | cut -d, -f6 | tr -d'"') * 8 ))
)
##### データ送信 #####
for N in ${!DATA[@]}; do
curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer ${API_KEY}" "https://gw.machinist.iij.jp/endpoint" -d @- <<EOS
{
"agent_id": "$AGENT_ID",
"metrics": [
{
"namespace": "Speedtest.net",
"name": "$N",
"data_point": {
"value": ${DATA[$N]},
"timestamp": $now
}
}
]
}
EOS
done
前述の通り、Machinistは特別なクライアントソフトを導入する必要がなく、上記のようにOS標準の curl コマンドでJSON形式のデータをPOSTするだけで投稿することが出来ます。
Windows環境の場合でも、OS標準のPowerShellで利用可能な Invoke-RestMethod コマンドなどを利用することで、特別なツールを使うこと無く実装できます。
##### ユーザ変数 #####
$API_KEY = 'xxxxxxxxxxxxxxxx'
$AGENT_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
##### 定数セット #####
$URI = 'gw.machinist.iij.jp/endpoint'
$HEADER = @{
Authorization = "Bearer $API_KEY"
}
##### データ生成 #####
$RESULT = (.\speedtest.exe -s 48463 -f csv --output-header | ConvertFrom-Csv | Select-Object @{
name='Download'
expr={[Int]$_.download * 8}
},
@{
name='RTT'
expr={$_.'idle latency'}
!})
$DATA = @{
agent_id = $AGENT_ID
metrics = @(
@{
name = "Download"
namespace = "Speedtest.net"
data_point = @{
value = $RESULT.Download
}
},
@{
name = "RTT"
namespace = "Speedtest.net"
data_point = @{
value = [double]$RESULT.RTT
}
}
)
}
$BODY = $DATA | ConvertTo-Json -Depth 5 # Depthオプションが無いとdata_point内がJSON化されない
##### データ送信 #####
Invoke-RestMethod -Method Post -ContentType 'application/json' -Headers $HEADER -Uri $URI -Body $BODY
上記のようなPowershellスクリプトを、Windowsマシンの「タスクスケジューラ」などから定期実行することで、Linux環境がなくとも自動実行することが可能です。(当然、PCを立ち上げておく必要はありますが・・・)
可視化をしてみる
手軽さが売りのMachinistでは、データを投入したあと「自分でグラフを作る」といった手間が無い点も魅力の1つです。
データを投入しただけの状態で管理画面から「メトリック」のページにアクセスすると、特に何も設定していなくとも自動でグラフ描画が始まっています。単に1つ、2つの要素をグラフ化したいだけであればこのページで確認するだけでも十分機能するでしょう。エクセルファイルのように手動で更新していくような手間も掛からない点も魅力です。
さらには、「カスタムチャート」の設定を行うことで、複数のメトリックグラフを1枚のグラフに重ねることが出来ます。上記の例では、4箇所で測定した Download Speed のメトリックを重ねて表示しています。カーソルを重ねた時点での値を表示したり、取得した生データを表形式で確認したりといったリッチな機能が簡単に利用可能です。(単位や表示期間の設定も可能です)
さらには、カスタムチャートについてはこの画面そのものをリードオンリーな形で他の人に共有することが可能です。例えば、このリンクでは上記スクリーンショットの回線速度グラフにアクセスすることが可能です。
また、個人でブログやウェブサイトを運営している方であれば、上記のようにインラインフレームでグラフをページに埋め込むことも出来ます。技術ブログやガジェットブログなどで定点観測のデータなどを定常的にアップロードしている方には持って来いな機能かなと思います。
おまけ:こんなこともできます
室温を記録する
例えば、スマートホーム用の機器などで温度を取得できる機器をお持ちであれば、そのデータを投入することで自宅の温度変化をグラフ化できます。スマートホームのアプリなどでは、瞬間値を確認したりすることは可能ですが、継続的なデータの記録をすることでその部屋が冷えやすい・熱くなりやすいなどを確認することができます。
サーバの死活監視をさせる
Machinistではメトリックの変化を検知してアラートを発報する監視機能が標準で提供されています。これを利用することにより、例えば「回線速度が一定の速度を下回ってしまった時」や「回線速度測定してるマシンがフリーズしてしまった時」などを基準にしてアラートを上げることが出来ます。
通知方法は「メール」「Teams Webhook」「Slack Webhook」の3パターンに限られていますが、いずれもビジネス用途では広く利用されているツールであるため設定することは難しくないでしょう。
また、個人のユーザさんなどで「TeamsもSlackも使ってないよ」という場合は、コンシューマ向けのコミュニケーションツール「Discord」にもWebhookによる通知を投げることが出来ます。DiscordアプリのWebhookには「Slack互換機能」が用意されているため、通常のWebhook URLの末尾に「/slack」を付与したURLをSlack Webhook の監視設定に入力するだけで利用可能です。
おわりに
以上、Machinistでお手軽に可視化をしてみよう、という内容でした。
“逸般の誤家庭”にある24時間365日稼働のマシンさえあれば、特にツールを用意すること無く、常にデータをプロットし続けられるという良さがあります。そしてプロットしたデータを可視化することによって、「どこで」「いつ」「何が」「どうなったか」といった監視をすることが出来ます。
ちなみに我が家の24時間365日稼働なマシンには、PrometheusとGrafanaを組み合わせた今どきな監視ダッシュボードも用意していますが、結局Machinistばかり使っています。
無料版のMachinistでは最大10個のグラフしか作成できず、データも1ヶ月しか保持されませんが、月額680円の有料コースを選べば半年分のデータを100個も保持することが出来ます。気になった方は、まずは1データのプロットから始めてみてはいかがでしょうか!
参考:Machinistに関連した記事
- Machinistでリモートワーク中の自宅環境を分析する
- Vim で起きているイベントを Machinist で可視化する
- 園芸×IoT(前編)環境センサ「お花大好きボックス」(Maker Faire Tokyo 2019)
- 園芸×IoT(後編)可視化ツール「Machinist」(Maker Faire Tokyo 2019)
- IIJ飯田橋オフィスでDFSはどれくらいおきているのか?
- 【資料公開】IIJ Technical NIGHT vol.6 開催しました
- JANOG41 Wi-Fiチーム報告書3(運用監視ツールの紹介)

Twitterフォロー&条件付きツイートで、「IoT米」と「バリーくんストラップ」と「バリーくんシール」のセットを抽選でプレゼント!
応募期間は2022/12/01~2022/12/31まで。詳細はこちらをご覧ください。
今すぐツイートするならこちら→
フォローもお忘れなく!







