おうちの回線速度をお手軽に可視化してみよう

2022年12月21日 水曜日


【この記事を書いた人】
熊本 祐

2018年新卒入社。名古屋支社にてSI中心にお仕事をするエンジニア。仕事ではサーバやミドルウェアを、趣味ではウェブやアプリを弄っています。

「おうちの回線速度をお手軽に可視化してみよう」のイメージ

IIJ 2022 TECHアドベントカレンダー 12/21(水)の記事です】

はじめに

名古屋支社の kmmt-t です。

今年の夏頃、インターネットの回線速度を測定するブームがありました。(なぜ?については触れませんが・・・)

俗に言われる「回線速度」というものは、時間帯やご近所さんの利用状況などの様々な要因で変化するものなので1回だけ測ったところで大した意味は持たないでしょう。先日公開された弊社のハンズオン研修の1つである「監視Overview」でも述べられている通り、何かのシステムを監視するのであれば「可視性」「通知性」「特定性」「分析性」を重視しなければなりません。・・・例えそれが自宅のインターネット回線であっても!

というわけで今回は、以下のような監視画面を弊社の「Machinist」サービスを使ってお手軽に実現してみました。ちなみにお試しは無料ですよ!

※自宅(名古屋)の回線と実家(東京)の回線を測定して、こんなグラフを出してみます

回線速度の可視化をしよう

スピードテストをしてみる

回線速度の測定と言えば、おなじみのサービスとして思いつくサイトがいくつかあるかと思います。そういったサービスのほとんどはブラウザやスマホアプリで測定をするものですが、継続的な測定をするにあたって毎度ブラウザやアプリを立ち上げていては寝る暇もありません。

そんななか、救世主的な立ち位置で「コマンドラインで実行可能なスピードテストアプリケーション」を提供してくれているのが、Ookla社のSpeedtest.netです。皆様も、どこかで1度位は以下のような画像を見かけたことがあるんじゃないでしょうか。

speedtest.netのリザルト画像。よく見かけるやつ。

多くの人がブラウザ版やスマホアプリ版で測定しているのと同様の測定を、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つです。

Machinistのメトリクス画面のスクリーンショット。4つのグラフが表示されており、投入したデータが反映されている。

Machinistのメトリクス画面

データを投入しただけの状態で管理画面から「メトリック」のページにアクセスすると、特に何も設定していなくとも自動でグラフ描画が始まっています。単に1つ、2つの要素をグラフ化したいだけであればこのページで確認するだけでも十分機能するでしょう。エクセルファイルのように手動で更新していくような手間も掛からない点も魅力です。

カスタムチャートの例。追加したいグラフを選ぶだけで作成できます。

さらには、「カスタムチャート」の設定を行うことで、複数のメトリックグラフを1枚のグラフに重ねることが出来ます。上記の例では、4箇所で測定した Download Speed のメトリックを重ねて表示しています。カーソルを重ねた時点での値を表示したり、取得した生データを表形式で確認したりといったリッチな機能が簡単に利用可能です。(単位や表示期間の設定も可能です)

共有リンクは見え方の設定のほか、アクセス制限も可能

さらには、カスタムチャートについてはこの画面そのものをリードオンリーな形で他の人に共有することが可能です。例えば、このリンクでは上記スクリーンショットの回線速度グラフにアクセスすることが可能です。

また、個人でブログやウェブサイトを運営している方であれば、上記のようにインラインフレームでグラフをページに埋め込むことも出来ます。技術ブログやガジェットブログなどで定点観測のデータなどを定常的にアップロードしている方には持って来いな機能かなと思います。

おまけ:こんなこともできます

室温を記録する

自宅リビングで計測している室温グラフ。12月に入ったら急に寒い。

例えば、スマートホーム用の機器などで温度を取得できる機器をお持ちであれば、そのデータを投入することで自宅の温度変化をグラフ化できます。スマートホームのアプリなどでは、瞬間値を確認したりすることは可能ですが、継続的なデータの記録をすることでその部屋が冷えやすい・熱くなりやすいなどを確認することができます。

サーバの死活監視をさせる

 

通知設定の内容。他にも異常検出を動的に検知する機能(β版)があります。

Machinistではメトリックの変化を検知してアラートを発報する監視機能が標準で提供されています。これを利用することにより、例えば「回線速度が一定の速度を下回ってしまった時」や「回線速度測定してるマシンがフリーズしてしまった時」などを基準にしてアラートを上げることが出来ます。

通知方法は「メール」「Teams Webhook」「Slack Webhook」の3パターンに限られていますが、いずれもビジネス用途では広く利用されているツールであるため設定することは難しくないでしょう。

Discordへの通知例。筆者はリビングの室温監視に使っています。

また、個人のユーザさんなどで「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に関連した記事

IIJ Engineers blog読者プレゼントキャンペーン

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

熊本 祐

2022年12月21日 水曜日

2018年新卒入社。名古屋支社にてSI中心にお仕事をするエンジニア。仕事ではサーバやミドルウェアを、趣味ではウェブやアプリを弄っています。

Related
関連記事