この記事は Mackerel Advent Calendar 2024 の 9 日目の記事です。
普段使いのモバイル回線は docomo というか irumo なんですが、自宅から離れて生活するとギガを使い切って買い足す日々を送っています。
データ通信量ってなんか上手いことアラート出せないですよね。2GB 使った後に「使ってるよ」って言われても困る。というわけで Mackerel で監視するようにしました。
まずはブラウザから https://irumo.docomo.ne.jp/ を触って Developer Tools の Network タブを眺める。
https://irumo.docomo.ne.jp/api/uw/tra/v1.0/getdatareferenceinf
への POST で JSON が返ってきているっぽいのが分かったので、リクエストヘッダをどこまで削っても取れるかを試す。
今回は spsp
Cookie だけ渡せば動くっぽかったです。
curl 'https://irumo.docomo.ne.jp/api/uw/tra/v1.0/getdatareferenceinf' \ -H 'User-Agent: DataUsageCheckerBot/1.0 (@onk)' \ -H 'Cookie: spsp=xxxxxxxx' \ -H 'Content-Type: application/x-www-form-urlencoded' \ --data-raw 'requestpatterncode=0009&getuser_div=3'
{ ... "data": { ... "daydatainfo": { ... "dayusedatainfo_list": [ { "targetdate": "20241201", "daydatadetailinfo": { "databypacket": "973737", "databygb": "0.93", "speedlimitreleasecount": "0" }, "speedlimitreleasecountinfo": { "databypacket": "0", "databygb": "0.00" }, "highspeeddatainfo": { "databypacket": "973737", "databygb": "0.93" } }, ...
各日のデータに speedlimitreleasecount
として買い足した回数が入ってるのがちょっと面白い。highspeeddatainfo
と speedlimitreleasecountinfo
はそれぞれ通常時と速度制限時で使った通信量ですね。
JSON が取れたらあとは加工して Mackerel に送れば完成しそう!
値を取るのは jq でエイってやります。
... | jq -r ' .data.daydatainfo.dayusedatainfo_list[] | select(.targetdate | test("20241201")) | .daydatadetailinfo.databypacket'
973737
それっぽい数字が取れたので送信用にちょっと加工。
まずハードコードして試していた test("20241201")
の部分は外から --arg today $(date '+%Y%m%d')
と渡します。
また、Mackerel 向けに投げるならタブ区切りの文字列にしたいですよね。\(...)
で String interpolation できるし、now
で現在時刻を錬成できるので、全体はこうなります。
... | jq -r --arg today $(date '+%Y%m%d') ' .data.daydatainfo.dayusedatainfo_list[] | select(.targetdate | test($today)) | "custom.irumo.data-usage\t\(.daydatadetailinfo.databypacket)\t\(now)"'
custom.irumo.data-usage 908991 1733754915
あとは mkr throw
で投げて完成です。
... | mkr throw --service irumo
データが溜まったら線形回帰関数を使ってアラートを投げたりして遊びましょう。身の回りのメトリックっぽいデータはとりあえず Mackerel に投げておくと、そのうち使い道を思いつくものです。
Mackerel Advent Calendar 2024、明日は id:taxintt さんです。
追記
1 日のデータ取り出しても毎日 0 から始まってしまうので、今月のデータを合計する必要がありました。
jq -r --arg month $(date '+%Y%m') ' (.data.daydatainfo.dayusedatainfo_list | map( select(.targetdate | startswith($month)) | .daydatadetailinfo.databypacket | tonumber ) | add) as $total | "custom.irumo.data-usage\t\($total)\t\(now)" '