#この投稿について
私の働いているチームではSlack上のHubotを主役としたChatOpsを行っています。
↑こんな感じで私のチームのHubotは擬犬化され、その名も「ワンコ」としてチームの為に働いてくれています。
そこで年末の今回はワンコの今年一年(とはいってもワンコは今年9月にチームにジョインしたので約4ヶ月間)の活躍ぶりを定量的に算出して、労をねぎらってあげたいと思います。
#Hubotの働きぶりを計算する
ワンコ(Hubot)の働きぶりを図る方法として、SlackのAPIを用いました。
SlackのAPIを叩いてワンコに対するコマンドを集計するPHPスクリプトを以下のように実装しました。
コード中のbot名などの数カ所を変えるだけで、みなさんのbotの働きぶりや、人気のコマンドが分かりますのでお試しください。
コードはGistにもあげています。
<?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 )
第5位にランクインしたのは、assign
コマンドでした。
これはGitHub上でプルリクエストが作られた際、レビュアーがワンコによって自動アサインされるのですが、そのレビュアーが不在であったり、別のメンバーにレビューしてもらいたい際などに使う手動アサインのコマンドです。
###第4位
wanko ote ( 60 times )
第4位にランクインしたのは、ote
コマンドでした。
これは癒し系のワンコ生存確認コマンドです。
Hubotにはping
などの生存確認コマンドがデフォルトで用意されていますが、
デザイナー等の非エンジニアも含めたチームでのChatOpsなので、ote
コマンドの方が馴染みやすく心も和みます。
###第3位
wanko update ref ( 256 times )
第3位にランクインしたのは、update ref
コマンドでした。
これは検証環境用のブランチのheadをmaster
ブランチのheadに合わせるコマンドです。
このコマンドについての詳細は、「ChatOps時のブランチ運用戦略」にまとめてあります。
###第2位
wanko deploy ( 337 times )
第2位にランクインしたのは、deploy
コマンドでした。
このコマンドを打つと、ワンコがmaster
ブランチからdeployment/production
ブランチ(商用ブランチ)へのプルリクエストを作ってくれます。
あとは最終確認者がGitHub上でマージボタンをポチっと押すだけでリリースとなります。
デプロイ周りの運用の詳細は「Slack / Hubot / GitHub / CircleCI によるChatOpsなデプロイ方法」にまとめてあります。
###第1位
wanko merge ( 341 times )
見事2014年の第1位に輝いたのは、merge
コマンドでした。
これはGitのマージをChatOps経由で行うコマンドであり、master
ブランチやdeployment/production
ブランチ(商用ブランチ)へのマージは拒否されるように実装してあるので、安全なブランチ管理が行えます。
#最後に
今回はSlackAPIを使ってワンコへのSlack上からのリクエスト回数を集計する形でその活躍ぶりを定量化してみました。
ただし実際にはワンコは今回集計したSlack上からのリクエストだけでなく、他のものをトリガーとした仕事もたくさん行っています。
例えば、プルリクエストの自動アサインやアプリケーションエラーの定期的な監視と通知等がそれにあたります。
私のチームの開発フローにワンコは既に無くてはならない存在になっていますが、来年は更にワンコに芸を仕込んで、より便利で楽しいChatOpsライフを送りたいと思います。