# 2017/11/12 Jun Ohtaniさんからコメントいただきましたので追記しました。
アットファイブ 稲吉です。
最近ちょっと気になっていたELK。(Elasticsearch、Logstash、Kibana)
Elasticsearch+Logstash+Kibanaと言えば、可視化ソリューションで有名ですが、そこは置いといて、個人的気になりポイントは語感です。
「エラスティックサーチログスタッシュキバナ」
言いきった感は「高濃度茶カテキン」、「ラクトバチルス・カゼイ・シロタ株」と互角と思います。
なんなら「エラスティックサーチ・ログスタッシュー・キバナー!!!!」ってドラゴンボール風に言いたいです。
今回、基本は「言いたいだけ」なんですが、せっかくなのでSlackのoffice Channel(弊社本社Channel)の投稿をエラスティックサーチログスタッシュキバナ!(+クロモジ)でタグクラウドしてみます。
ELKレシピ
1.Elasticsearchをインストール
brew install elasticsearch
かなり説明を省きましたが、インストール先はMacBookです。最初は公開目的でAWSの無料枠上に作ってましたが、t2.microのメモリでELK動かず、断念。。。
2.logstashをインストール
brew install logstash
3.kibanaダウンロード
wget https://artifacts.elastic.co/downloads/kibana/kibana-5.5.2-darwin-x86_64.tar.gz
ダウンロード後、解凍して、適当なディレクトリに配置。
4.logstashからElasticsearchにデータ投入
が、その前にSlackからデータを抜かないといけないので、Slackのchannels.historyというAPIでデータを抜きます。
で、以下logstashのコンフィグファイルを書いて、抜いたjsonデータをlogstashに食わせようとしましたが、channels.historyで返ってくるjsonデータを、codec=>jsonの形式で読み込めず。
slack_log.conf
input {
file {
path => "/Users/inayoshimasaki/slacklog/20170828.log"
sincedb_path => "/tmp/cero_t.sincedb"
start_position => "beginning"
codec => json
}
}
output {
elasticsearch {
index => "slack-%{+YYYY.MM}"
}
}
さて、どうしようかと悩んでも仕方ないので、一手間加えて、channels.historyから取得したjsonデータからlogstashに渡すためだけのjsonに変換する、javascriptを用意。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script>
// ページ読み込み時にSlackからデータ取得
$(document).ready( function(){
var url = "https://slack.com/api/channels.history?token=" +
"xxxx-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + "&" +
"channel=" +
"XXXXXXXXX" + "&" +
"count=1000&pretty=1";
$.getJSON(url , function(data) {
var len = data.messages.length;
var tbodyObj = $("#datatbl_tbody");
tbodyObj.find("*").remove();
for(var i = len-1; i >= 0; i--) {
var tr = $('<tr>')
var outputtext = data.messages[i].text;
if(data.messages[i].attachments != null){
for(var j=0; j <data.messages[i].attachments.length; j++ ){
attachtext = data.messages[i].attachments[j].text;
outputtext = outputtext + attachtext;
}
}
tr.append('<td>{"text":"' + $('<div />').text(outputtext).html() + '"}</td>');
tbodyObj.append(tr);
}
});
});
</script>
</head>
<body>
<table id="datatbl">
<tbody id="datatbl_tbody">
</tbody>
</table>
</body>
</html>
で、こんな感じのデータにして
logstashに食わせて、Elasticsearchに流し込みます。
logstash -f ./slack_log.conf
5.kibanaで可視化
最後は、Elasticsearchに流し込んだ、データをkibanaで可視化。
途中、Kuromojiで日本語解析して(以下画像参照)、タグクラウド側で不要なワードを除いたりしてますが、その部分の説明は(めんどうくさいので)割愛。
で、こんな感じのタグクラウドができた。
まあ、予想通りですが、「店長、そろそろ、注文」「了解」がメイン。(前記事参照)こりゃ商店channelだ。ウケる。
あとは「事務所」もしくは「開発」「センター」へ「向かう」からの「拝承」。この辺りも弊社office channel見ていただけると分かる、鉄板やりとり。
タグクラウド以外と面白い。
追記
Jun Ohtaniさんからtwitterにありがたいコメントをいただきました。
なるほど、ひっくるめてElastic stackなのですね。リプありがとうございます!
この事実をを知った直後、僕は日曜の人影の無い職場の片隅で「イエス!エラステイック、スタック!」と一人呟きました。
改題 ”職場の片隅でエラスティックスタックと呟く”