年末だしSlack上のHubotの今年一年の労をねぎらってあげる

#この投稿について

私の働いているチームではSlack上のHubotを主役としたChatOpsを行っています。

![スクリーンショット 2014-12-22 15.47.00.png](https://qiita-image-store.s3.amazonaws.com/0/47881/ff121618-0115-9bfa-9d58-3180c756ae61.png)

↑こんな感じで私のチームのHubotは擬犬化され、その名も「ワンコ」としてチームの為に働いてくれています。

そこで年末の今回はワンコの今年一年（とはいってもワンコは今年9月にチームにジョインしたので約４ヶ月間）の活躍ぶりを定量的に算出して、労をねぎらってあげたいと思います。

#Hubotの働きぶりを計算する

ワンコ(Hubot)の働きぶりを図る方法として、SlackのAPIを用いました。

![スクリーンショット 2014-12-19 23.31.14.png](https://qiita-image-store.s3.amazonaws.com/0/47881/fba92ceb-b7ec-3de3-6b93-f5ea6ad6f9dd.png)

SlackのAPIを叩いてワンコに対するコマンドを集計するPHPスクリプトを以下のように実装しました。
コード中のbot名などの数カ所を変えるだけで、みなさんのbotの働きぶりや、人気のコマンドが分かりますのでお試しください。
コードは[Gist](https://gist.github.com/s-kiriki/2df9ca0e787f91cb8ce3)にもあげています。


```php:slackbot-contribution.php


<?php 


if (!getenv(SLACK_API_TOKEN)) {
	exit('You must set env SLACK_API_TOKEN');
}

ini_set('date.timezone', 'Asia/Tokyo');


{// You can change belows
	$slackbot_name = 'wanko';
	$bot_cmd_arr = array('ote', 'deploy', 'merge', 'update ref', 'assign', 'soba', 'container', 'omikuji', 'repo aliase');
	$start_date = '2014-01-01';
	$end_date = '2014-12-26';
}


$data = getMessage($slackbot_name);
$pageCnt = $data['pageCnt'];

$callCnt = 0;
$callCntPerCmd = array();
$callCntPerUser = array();


for ($page = 1; $page <= $pageCnt; $page++) {
	
	print $page. '/'. $pageCnt. "\r";
	
	$data = getMessage($slackbot_name, $page);
	$messages = $data['messages'];
	
	if (!$messages) {
		continue;
	}
	
	foreach ($messages as $message){
		
		//期間内かチェック
		if ( $message['ts'] < strtotime($start_date) || $message['ts'] > strtotime($end_date) ) {
			continue;
		}
		
		$isValid = false;
		//対象コマンドかチェック
		foreach ($bot_cmd_arr as $bot_cmd) {
			if(preg_match("/^{$slackbot_name} {$bot_cmd}/", $message['text'])){
				$callCnt++;
				$callCntPerCmd[$bot_cmd]++;
				$callCntPerUser[$message['username']]++;				
				break;
			}
		}
		
	}
}

arsort($callCntPerCmd);
arsort($callCntPerUser);

echo $callCnt. PHP_EOL;
echo "{$slackbot_name} contributed {$callCnt} times!!!". PHP_EOL;
echo PHP_EOL;
echo '[ Popular command ranking ]'. PHP_EOL;
foreach ($callCntPerCmd as $cmd => $cnt) {
	echo "{$cmd} : {$cnt} times". PHP_EOL;
}
echo PHP_EOL;
echo PHP_EOL;
foreach ($callCntPerUser as $user => $cnt) {
	echo "{$user} : {$cnt} times". PHP_EOL;
}

function getMessage($slackbot_name, $page = null){
	
	$url = 'https://slack.com/api/search.messages';
	$params = array(
		'token' => getenv(SLACK_API_TOKEN),
		'query' => $slackbot_name,
		'sort' => 'timestamp'
	);
	
	if ($page) {
		$params['page'] = $page;
	}
	
	$data = http_build_query($params);
	$url = ($data != '')?$url.'?'.$data:$url;
	
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($ch, CURLOPT_TIMEOUT, 2);
	$res = curl_exec($ch);
	
	$resArr = json_decode($res, true);
	return array('pageCnt'=>$resArr['messages']['pagination']['page_count'], 'messages'=>$resArr['messages']['matches']);
}

```

#結果発表

それではいよいよ上述したスクリプトを実行して計算したワンコの活躍ぶりを発表していきます。

##今年(9月~)の総リクエスト回数

> 10,343


今年(9月~)のチームメンバーのワンコに対するリクエストは10,343回となり、10,000回超になりました。
これは営業日で割ると1日120回超となり、非常に多くのリクエストに応えてくれたことになります。


##人気コマンドランキング

では次に、リクエスト回数が多かったコマンドを第5位からカウントダウン形式で見ていきます。

###第5位

> **wanko assign**  ( 40 times )


![スクリーンショット 2014-12-22 15.01.29.png](https://qiita-image-store.s3.amazonaws.com/0/47881/92b68c27-32a8-ef59-0d72-5aaa61f1e0d3.png)


第5位にランクインしたのは、`assign`コマンドでした。
これはGitHub上でプルリクエストが作られた際、レビュアーが[ワンコによって自動アサイン](http://qiita.com/s-kiriki/items/4b38af4ebd05bad70eb7)されるのですが、そのレビュアーが不在であったり、別のメンバーにレビューしてもらいたい際などに使う手動アサインのコマンドです。

###第4位

> **wanko ote**  ( 60 times )

![スクリーンショット 2014-12-22 15.03.02.png](https://qiita-image-store.s3.amazonaws.com/0/47881/082c5f2e-4ee8-4bea-d62b-fa1f237504eb.png)

第4位にランクインしたのは、`ote`コマンドでした。
これは癒し系のワンコ生存確認コマンドです。
Hubotには`ping`などの生存確認コマンドがデフォルトで用意されていますが、
デザイナー等の非エンジニアも含めたチームでのChatOpsなので、`ote`コマンドの方が馴染みやすく心も和みます。

###第3位

> **wanko update ref**  ( 256 times )

![スクリーンショット 2014-12-22 14.59.53.png](https://qiita-image-store.s3.amazonaws.com/0/47881/f95a393a-7a57-0312-1017-f0327586ee35.png)

第3位にランクインしたのは、`update ref`コマンドでした。
これは検証環境用のブランチのheadを`master`ブランチのheadに合わせるコマンドです。
このコマンドについての詳細は、[「ChatOps時のブランチ運用戦略」](http://qiita.com/s-kiriki/items/194d266e0de070131a25)にまとめてあります。


###第2位

> **wanko deploy**  ( 337 times )

![スクリーンショット 2014-12-22 15.08.57.png](https://qiita-image-store.s3.amazonaws.com/0/47881/05b1770c-5956-8484-c3f1-0c746ab5f68f.png)

第2位にランクインしたのは、`deploy`コマンドでした。
このコマンドを打つと、ワンコが`master`ブランチから`deployment/production`ブランチ（商用ブランチ）へのプルリクエストを作ってくれます。
あとは最終確認者がGitHub上でマージボタンをポチっと押すだけでリリースとなります。
デプロイ周りの運用の詳細は[「Slack / Hubot / GitHub / CircleCI によるChatOpsなデプロイ方法」](http://qiita.com/s-kiriki/items/26bdf537169891b22653)にまとめてあります。

###第1位

> **wanko merge**  ( 341 times )

![z_スクリーンショット_2014-12-22_15_09_15.png](https://qiita-image-store.s3.amazonaws.com/0/47881/8efd56f8-e991-3b8d-5bd5-48d8bfb00931.png)

見事2014年の第1位に輝いたのは、`merge`コマンドでした。
これはGitのマージをChatOps経由で行うコマンドであり、`master`ブランチや`deployment/production`ブランチ（商用ブランチ）へのマージは拒否されるように実装してあるので、安全なブランチ管理が行えます。


#最後に

今回はSlackAPIを使ってワンコへのSlack上からのリクエスト回数を集計する形でその活躍ぶりを定量化してみました。

ただし実際にはワンコは今回集計したSlack上からのリクエストだけでなく、他のものをトリガーとした仕事もたくさん行っています。
例えば、[プルリクエストの自動アサイン](http://qiita.com/s-kiriki/items/4b38af4ebd05bad70eb7)や[アプリケーションエラーの定期的な監視と通知等](http://qiita.com/s-kiriki/items/a59cb9ef28137a2d5c93)がそれにあたります。

私のチームの開発フローにワンコは既に無くてはならない存在になっていますが、来年は更にワンコに芸を仕込んで、より便利で楽しいChatOpsライフを送りたいと思います。