[blackbird-kinesis-stream] Monitoring AWS KinesisStream

この[プラグイン](https://github.com/Vagrants/blackbird-Kinesis-Stream)ではKinesis StreamのCloudWatch Metricsを取得します。

What Metrics does this plugin get?
----------------------------------

Metric NameカラムはMetricName.Statisticsで、メトリック名.どの取り方(SumとかAvgとか)です。Unitは単位(バイトとかmsとか)です。

| Metric Name | Unit | Detail |
|-------------|--------------|-------------------------------------|
| PutRecord.Bytes                    | Bytes        | Streamに入れたアイテムのバイト数 |
| PutRecord.Latency                  | milliseconds | Streamに入れた時のLatency(PutRecord APIのresponse time)    |
| PutRecord.Success                  | Count        | PutRecord APIの成功回数 |
| GetRecords.Bytes                   | Bytes        | Streamから取得されたバイト数 |
| GetRecords.IteratorAgeMilliseconds | milliseconds | - |
| GetRecords.Latency                 | milliseconds | Streamから取得した時のLatency(GetRecords APIのresponse time)   |
| GetRecords.Success                 | Count        | GetRecords APIの成功回数            |

Zabbix Template
---------------

### Items

上記のCloudWatch Metricsを秒間あたり(per second)で計算したアイテムです。

* PutRecord Bytes per Second
* PutRecord Success per Second
* GetRecords Bytes per Second
* GetRecords Success per Second

### Triggers

//トリガーの作成はここだけの話超苦労しました。

Kinesis Streamの特性上(Queueと違って取り出してもDataがなくならない)、Stream全体のサイズはあまり意味がないので、PutRecordやGetRecordsの差分で前回よりあまりに少ない流量(あるいはあまりに多い)であればトリガーをあげるようにしてみたのですが、consumer側がGerRecordsで一気に取得する特性上、結構フラップします。そのため、最初導入時は正直、監視がなりまくってました(実験段階ではぼくのケータイだけに飛ばしてたのでなりまくってたｗ)。

そこで、単純な差分監視ではなく、(何回分の平均にするかの回数のところは例です)10回分(long spanでの)の平均値から3回分(short spanでの)の平均値を引いた差分が25%を超えたらアラートを投げるというふうに変更してみました。

これで、フラップする値を均してあげて、均した差分で見ることができます。Streamへの流量(あるいは取り出した流量)が極端に増えたり減ったりした時にのみ、`あ、なんか起こったんだな`と認識できます。

もちろん、アプリケーションの特性によってはこのlong spanとshort spanの均す値を長くしたり短くしたりする必要があると思うのでspanと閾値はそれぞれMACROに起こしておきました。

* 上記のロジックによる平均差分監視
    + PutRecord.Bytes
    + PutRecord.Success
    + GetRecords.Bytes
    + GetRecords.Success
* PutRecord.Latency
* GetRecords.Latency

がトリガーになっています。それぞれinfo, average, highの閾値を指定できるので、chatやメールと通知integrationを変更してください。

### Graphs

上記の平均差分監視は言葉だとわかりづらいんですが、グラフだととてもわかりやすいはずです。

#### GetRecords.Bytesの生の値のグラフ

![スクリーンショット_2014-12-11_2_06_20.png](https://qiita-image-store.s3.amazonaws.com/0/26256/8eac3634-9c58-5f52-8913-fb3e450c80d6.png)

結構ぎざぎざです。これを単純な前回との比較だけの差分で監視するとかなりアラートが飛びます。

#### GetRecords.Bytesの平均差分グラフ

![スクリーンショット_2014-12-11_2_07_15.png](https://qiita-image-store.s3.amazonaws.com/0/26256/2e840b79-536c-3abc-8d29-50648cd7be3d.png)

こっちがならしたグラフなんですが、だいぶ落ち着いた感じに見えると思います。実際に少し長いspanで見てアプリケーションのピークタイムと照らし合わせると、こんな感じの流量になるんではないでしょうか。

そのほかのグラフとして

* Get/Put Latency
    + GetRecordsとPutRecordのLatency(各APIのresponse time)
* Get/Put Success
    + GetRecordsとPutRecordのSuccess数
* Write/Read per second
    + 秒間の読み書きバイト

があります。

How to Install
--------------

[いつものとこ](https://vagrants.github.io/blackbird/repo/yum/6/x86_64/repoview/index.html)にRPMをうｐしておいたので、[こちらの手順](http://qiita.com/JumpeiArashi/items/849281083b6c7888f25d#case-of-using-yum)よりrepoファイルを作成して、

```bash
yum install blackbird-kinesis-stream --enablerepo=blackbird
```

しちゃってくださいまし。

pipの方もすぐに更新しておくのでもう少々お待ちくださいませ＞＜

っでShardごとの監視はねえの??
-------------------------

CloudWatch的にはShardごとにMetricを取得できるので、本当は実装したいところなんですが(Keyがどこによってるとかがわかる)、差分の流量だけでもよほどアプリケーションのロジックが間違っていない限りは`なにかおこってるぞ`に気づくことは可能だと考えておりますです。

ただ、将来的にはShardごとの監視もやる予定はあるます。

最後に
-----

先日PutRecords APIが実装されたのでPutのThrouputがとてもよくなったと思いますが、まだplugin側で未実装なのでなる早で取得してZabbix Templateに追加したいと思います。