暮らしの技術

暮らしを豊かにする技術や、特に暮らしを豊かにしない技術があります

mackerel でギガを監視する

ギガっていうの受け入れちゃったね*1

こうなります。検証のために追加クーポン(200円)を買いました、これって経費で落とせますか?

数年前 IIJmio に乗り換え、以来便利に使っているのだけれど、最近は気がつくと月のデータ通信量を使い切って破滅、と言ったことが増えてきた*2

それほど困っているわけではないが、一体いつ使い切ったのか調べようとすると、公式のアプリでは5日ほどしか遡れず、また1日単位でしか確認ができないのでよくわからない。

調べてみると API があるとのことなので、mackerel にサービスメトリックとして投稿することで可視化してみた。

IIJmioクーポンスイッチAPI | クーポンについて | IIJmio

これをみながら実装する。

認証周りをエイヤし、`/mobile/d/v2/coupon/` API を叩くとのようなレスポンスを得られる*3

{
  "returnCode": "OK",
  "couponInfo": [
    {
      "hddServiceCode": "XXXXXX",
      "coupon": [
        {
          "volume": 0,
          "expire": "202209",
          "type": "bundle"
        },
        {
          "volume": 4000,
          "expire": "202210",
          "type": "bundle"
        },
        {
          "volume": 0,
          "expire": "202209",
          "type": "topup"
        },
        {
          "volume": 0,
          "expire": "202210",
          "type": "topup"
        },
        {
          "volume": 0,
          "expire": "202211",
          "type": "topup"
        },
        {
          "volume": 0,
          "expire": "202212",
          "type": "topup"
        }
      ],
      "hdoInfo": [
        {
          "couponUse": true,
          "coupon": [
            {
              "volume": 0,
              "expire": null,
              "type": "sim"
            }
          ],
          "hdoServiceCode": "XXXX",
          "sms": true,
          "number": "090XXXXXXXX",
          "regulation": false,
          "iccid": "XXXXXXXXXXXXXXXX",
          "voice": true
        }
      ],
      "plan": null
    }
  ]
}

あとは好きな方法で mackerel に投稿できるフォーマットへ変換する。以下のようなコードを書いた。

const input = require("fs").readFileSync(process.stdin.fd, "utf8");

const couponResponse = JSON.parse(input)
const targetServiceCode = 'XXXXXXXX'
const coupon = couponResponse.couponInfo.find(e => e.hddServiceCode === targetServiceCode).coupon
const body = coupon.map(c => {return {'name': `iijmio.${targetServiceCode}.${c.type}-${c.expire}`, "time": Math.floor(Number(new Date())/1000), 'value': c.volume}})
console.log(JSON.stringify(body))

最終的に、 `curl IIJmio APIリクエスト` | node format.js | `curl mackerel サービスメトリック投稿` と言った風にパイプをつなげた shell script を cron で実行すれば終わり。

ここまでできれば、最初の画像のようなグラフが自動で生成されます。

さらに mackerel の機能を使うことで、例えば過剰に使っている時にアラートを出すなども簡単に実現できますね。

それでは皆様、よき監視ライフを!

*1:実際ギガって呼ぶのに慣れちゃうといちいちデータ通信量って呼ぶのだるいよね。ということでデータ通信量の話です。

*2:時代が変わったのか私のスタイルが変わったのか

*3:ドキュメント通り