世界の中心でELKを叫ぶ

# 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>

で、こんな感じのデータにして

ogstashに食わせて、Elasticsearchに流し込みます。

logstash -f ./slack_log.conf

5.kibanaで可視化
最後は、Elasticsearchに流し込んだ、データをkibanaで可視化。
途中、Kuromojiで日本語解析して(以下画像参照)、タグクラウド側で不要なワードを除いたりしてますが、その部分の説明は(めんどうくさいので)割愛。

で、こんな感じのタグクラウドができた。

まあ、予想通りですが、「店長、そろそろ、注文」「了解」がメイン。(前記事参照)こりゃ商店channelだ。ウケる。
あとは「事務所」もしくは「開発」「センター」へ「向かう」からの「拝承」。この辺りも弊社office channel見ていただけると分かる、鉄板やりとり。

タグクラウド以外と面白い。

追記

Jun Ohtaniさんからtwitterにありがたいコメントをいただきました。

なるほど、ひっくるめてElastic stackなのですね。リプありがとうございます!

この事実をを知った直後、僕は日曜の人影の無い職場の片隅で「イエス!エラステイック、スタック!」と一人呟きました。

改題 ”職場の片隅でエラスティックスタックと呟く”

最後までお読みいただき、誠にありがとうございます。


稲吉正樹

  • facebook
  • twitter
  • line
  • このエントリーをはてなブックマークに追加

アットファイブで一緒に働きませんか?

エンジニアをはじめ、複数の職種で仲間を募集しています!