nasneの録画件数をシェルスクリプトとmackerelで監視する

# nasneの最大録画件数は以外と少な~~い~~かった

nasneには録画できる番組の最大数が決まっていて、最大数に達すると例えHDDに十分な空き容量があっても録画がエラーとなってしまいます。
最大予約件数は、2017/11/16にリリースされたシステムソフトウエア Ver.2.60[^1]にて3,000件に拡張されましたが、それ以前は1,000件でした。一見すると多いように感じますが、一度番組を録り溜めてしまうとすぐ上限値に達してしまい、奥さんが予約した番組がエラーで録画できず、こっぴどく叱られたことが何度かありました。
そこで、nasneに録画されている番組数を監視し、上限値に近くなったときに通知する仕組みを作ることにしました。

# 環境
  - ハード
    - Intel NUC（自宅サーバ）
  - OS
    - CentOS 6.9
  - 追加導入ソフト
    - mkr
    - jq

# 録画件数の取得

nasneはAPIを持っているので、これを使って録画件数を取得します。
録画件数はJSONの `TotalMatches` が該当しますので、この値を `curl` と `jq` を使用して取り出します。
nasneのAPIについては、こちらのサイトを参考にさせていただきました。

  - [nasneのエラーを監視してslackに通知するツールを作った](http://abcang.hatenablog.com/entry/2016/09/02/000137)
  - [nasneの録画番組一覧を取得する](http://tateren.hateblo.jp/entry/2016/03/03/005415)

# mackerelを使って録画件数のしきい値監視をする

[mackerel](http://mackerel.io/)はメトリックに対し警戒域、危険域の2種類のしきい値監視ができ、EメールやLINEへの通知が可能です。
またSaaSなので導入が簡単で、なにより今回の要件の範囲内であれば無料で使用できるというのが素晴らしいです。
今回はnasneの録画件数をmackerelの `mkr` というツールを使用し、[サービスメトリック](https://mackerel.io/ja/features/service-metrics/)としてデータを投稿します。
`mkr` のインストールは公式サイトを参考にしました。

  - [CLIツール mkr を使う](https://mackerel.io/ja/docs/entry/advanced/cli)
  - [RPMパッケージでmackerel-agentをインストールする](https://mackerel.io/ja/docs/entry/howto/install-agent/rpm)

`mkr` は  `mackerel-agent` がなくても動作します。今回の要件では `mackerel-agent` のインストールは必須ではありません。
また `mkr` でメトリックの投稿先となるサービスは事前にmackerelの管理画面で作成しておいてください。
`mkr` については、こちらのサイトが大変参考になりました。

  - [Mackerel事始め mkr(3)](http://htnosm.hatenablog.com/entry/2016/05/24/090000)

# シェルスクリプトの作成

というわけでシェルスクリプトを作成しました。
家庭内限定利用ということでエラー処理は考慮していません。
スクリプトを利用する場合は必要に応じてエラー処理を追加してください。

```nasne.TotalNumberOfRecodings.mkr.sh
#! /bin/bash

: mackerel設定
export MACKEREL_APIKEY='mackerelのAPIキー'
_service='サービス名'
_value='メトリック名'

: リストファイル（後述）のパスを記載
_list=/path/to/nasne.lst

_mkr=/path/to/mkr
_jq=/path/to/jq

_time=`date -u +%s`

for _line in `grep -E -v "#"\|^$ ${_list}`; do
        _name=`echo ${_line} | cut -d, -f1`
        _addr=`echo ${_line} | cut -d, -f2`
        _num=`curl -s \
            'http://'${_addr}':64220/recorded/titleListGet?searchCriteria=0&filter=0&startingIndex=0&requestedCount=0&sortCriteria=0&withDescriptionLong=0&withUserData=0' | \
             ${_jq}  '.totalMatches'`

        echo -e "${_value}.${_name}\\t${_num}\\t${_time}" | ${_mkr} throw -s ${_service}

done
```

今回は複数台のnasneに対応させるため、nasneのIPアドレスをリストファイルとしてシェルスクリプトに読み込ませています。
リストファイルは以下のようにカンマ区切りで `nasneの名前,IPアドレス` の順に記載してください。
作成したリストのパスをスクリプトの `_list` 変数にセットしてください。

```（例）nasne.lst
nasne-ani,192.168.0.55
nasne-ototo,192.168.0.56
```

ちなみに、我が家では最初に買ったnasneを `nasne-ani(兄)` 、後から買ったnasneを `nasne-ototo(弟)` と呼んでます。

# crontab登録
録画件数を定期的にmackrelに投稿するため、このスクリプトをcrontabに登録します。
実行間隔は30分～1時間程度がいいかと思います。

# 監視ルール設定
mackerelにメトリックが投稿されると、自動的にこんな感じグラフが作成されます。
（最初は手動で何回かスクリプトを実行してあげるとグラフがすぐ表示されます）
![mackerel.png](https://qiita-image-store.s3.amazonaws.com/0/212332/355f1206-2c2b-8b3d-c30e-806a2f4a9e39.png)

グラフが作成できていることを確認したら、監視ルールを設定します。
今回はnasneの録画件数をサービスメトリックで投稿していますので、サービスメトリック監視を選択し、しきい値を設定します。
しきい値については、まずはテストのため現在の録画件数の近辺を設定し、
正しく監視できていることを確認した後に本番で監視したい値を設定し直すことをおすすめします。

# まとめ
システムソフトウェアのアップデートにより、録画件数の上限が"ほぼ"ない状態となった今では、このスクリプトはあまり利用する機会がないかもしれませんが、身の回りの機器を監視してしきい値を超えたらアラートを出すというのはIoTチックなところもあり大変興味深いです。
また、nasneはAPIでいろいろな情報を取得できるようなので、nasneを使った次のネタを考えてみようかと思います。

[^1]: [今日から｢nasne(ナスネ)™｣がVer.2.60にアップデート！ 最大録画件数が1,000件から3,000件に大幅拡張！](https://www.jp.playstation.com/blog/detail/5997/20171116-nasne.html)