tweetの流量をDiamond+Graphite+Grafanaで可視化する


# はじめに
前回に引き続き、Diamondを使ったネタを書きます。今回は、tweetの流量を収集する機能をもったDiamond collectorを自作し、Graphite+Grafanaで可視化してみます。

Diamond, Graphite, Grafanaのことを知らない方は、以下のページを参考にしてみてください。
[metrics収集ツール、Diamondで遊んでみた](http://qiita.com/risuoku/items/bdb7d0b20756fabfe91c)

# collectorを自作する
## 準備
まず、diamond.conf にcollectorを置くディレクトリを記述します。

```conf:diamond.conf
# Directory to load collector modules from
collectors_path = /usr/share/diamond/collectors/
```

例えばubuntuで普通にインストールすると、上記のようになってると思います。この場合、/usr/share/diamond/collectors にあるcollectorが参照されます。今回紹介する例では、collectorをhomeに移動させて以下のようにパスを設定しました。

```conf:diamond.conf
# Directory to load collector modules from
collectors_path = /home/risuo/local/projects/risuo-diamond-collecter/collectors
```

collectorのディレクトリが決まったら、"twitter"というディレクトリと"twitter.py"というファイルを作成します。treeは以下のとおり。

```
-[9432]% pwd
/home/risuo/local/projects/risuo-diamond-collecter/collectors
-[9433]% tree twitter
twitter
├── twitter.py
└── twitter.pyc
```

## やりたいこと
今回、以下のような機能をもつcollectorを作成しました

* 指定したリストのtimelineを取得し、1分ごとのツイート数をhandlerに渡す

前回と同様Graphiteを使ったので、TwitterCollector -> GraphiteHandler -> Graphite なデータの流れです。

## 実装
こんな感じで書いてみました。
https://gist.github.com/risuoku/324ba24a8f5ed8de1ff8

基本的には、metricsを収集してpublish(handlerにmetricsを渡すメソッド)するcollectメソッドを実装することになります。
また、上記実装ではtweepyをラップしてAPI制限の上限を疑似的に拡張するための自作ツール（stapi）を使ってます。
stapi: https://github.com/risuoku/stapi

## できたもの
７つの公開リストを収集対象にしています。

### Grafanaで見る
![grafana_3.png](https://qiita-image-store.s3.amazonaws.com/0/12053/bc36db94-77d8-af3b-a81f-69297750b9d6.png)

* 緑の線だけ見える７つのグラフが、各リストのデータ、右下は７つ全部重ねたもの
* 軸の見方
 * ７つのグラフ：縦軸が1分あたりのツイート数、横軸が時刻
 * 右下のグラフ：縦軸が1分あたりのツイート数*100/そのリストの人数、横軸が時刻

見えづらいので例えば左下を拡大します。
![grafana_4.png](https://qiita-image-store.s3.amazonaws.com/0/12053/0c0f67e4-f6b6-e4fa-c72e-836409365309.png)

1日のスパンで見るとこんな感じ
![grafana_5.png](https://qiita-image-store.s3.amazonaws.com/0/12053/f29e84b0-bca4-7673-8bb1-ee81df9af557.png)


### whisperファイルを見る
直接、Graphiteのwhisperファイルを見てみます。

```
-[21466]% whisper-fetch.py total6.wsp --until=1406654580 | tail -20
1406653440      2.000000
1406653500      3.000000
1406653560      6.000000
1406653620      3.000000
1406653680      2.000000
1406653740      5.000000
1406653800      4.000000
1406653860      3.000000
1406653920      3.000000
1406653980      4.000000
1406654040      0.000000
1406654100      5.000000
1406654160      2.000000
1406654220      2.000000
1406654280      3.000000
1406654340      3.000000
1406654400      4.000000
1406654460      5.000000
1406654520      3.000000
1406654580      4.000000
```

左カラムがunix時間、右カラムがツイート数です。60秒おきにとれているのがわかります。

# 分析っぽいことをしてみる
## 時間帯によるツイート量の違いを調べる
![grafana_5.png](https://qiita-image-store.s3.amazonaws.com/0/12053/507ce36b-7cc3-50a7-d8ca-1724f357cb8c.png)
先に見せた1日単位のグラフと同じですが、もう一度貼ります。

* 深夜-早朝にかけてはツイート量がかなり減少する
* 20時-24時くらいでツイート量が多い
* ピーク時は12[tweets/min] くらい

みたいなことがわかります。ごく普通の結果が得られました。

土日も入れて平日とのツイート量の比較をしてみます。

![grafana_6.png](https://qiita-image-store.s3.amazonaws.com/0/12053/0fe0aa6f-9972-bc72-a5fc-90f381981a51.png)

* 7/26->土曜日、7/27->日曜日
* あまり、平日と変わらないように見える

![grafana_7.png](https://qiita-image-store.s3.amazonaws.com/0/12053/66c50371-020d-607f-1d6a-0cfac4b53fea.png)

* 全体的に、平日と土日でそれほど差がない

## ツイート量が特殊なポイントを見つける
以下のグラフを見て、何か気付くところはないでしょうか。

![grafana_8.png](https://qiita-image-store.s3.amazonaws.com/0/12053/5dabbd30-8665-d223-349b-d890cde68d6c.png)

よく見ると、普通は流量がかなり小さいはずの朝4時頃に一気にはねています。
実は、このリストはプログラミングコンテストに興味ある人を集めています。調べてみると、28日の2:00-4:30(JST) で[MemSQL announces the start[c]up](http://codeforces.com/blog/entry/8051)というイベントがあったようです。開催時刻は[こちら](http://www.timeanddate.com/worldclock/fixedtime.html?continent=asia&p1=224&iso=20140727T10&msg=MemSQL%20Start%5bc%5dUP%202.0%20Round%201&ah=2&am=30)を見るのがわかりやすいです。
プログラミングコンテストが終わった後は色々と感想を書きたくなって、早朝にもかかわらずツイートの流量が増えた、といったところでしょうか。

![grafana_9.png](https://qiita-image-store.s3.amazonaws.com/0/12053/b43c869a-7c2f-ce5c-c3f8-9cafcfd9d88d.png)

* 4:30あたりで一気に増えている

ただし、この例のようにサンプル数が少ないと、特別な理由もなく急激に変化する可能性があるので注意が必要です。

# 似たような話

[InfluxDBとGrafanaとfluentdで、twitterデータのリアルタイム集計・可視化](http://qiita.com/ixixi/items/a56ea15b582c7f014a57)
twitterのstreaming apiからひたすらサンプリングするためのfluentdプラグインであるfluent-plugin-twitterとInfluxDB,Grafanaを組み合わせるなどしています。

# まとめ・感想
リストのtimelineの流量を測定するDiamond collectorを作成し、データ収集・可視化などしてみました。今回はプロトタイプとして単純なものを紹介しましたが、時系列データなら基本的に何でも収集できるので色々と試して遊んでみようと思います。