Twitter
fluentd
Elasticsearch
Kibana4

Elasticsearch(v2.1) + Kibana(v4.3) + fluentd(v0.12) twitter解析/環境構築

More than 3 years have passed since last update.

2015y12m04d_142744042.png
2015y12m04d_142751042.png

こんな感じの事ができるようになるためのツールについてご紹介。おお!なんかかっこいい!

具体的にどういうデータを見るの?

  • レスポンス要件が厳しい時に、要件を満たせていないPath(ロジック)を確認する事ができる。
    黒画面の右下では、レスポンスタイムが遅い処理をURL別にグラフ化。本来は3秒以内に返さないといけない処理が10秒くらいかかっているので、対処することとなった。

  • 外部からの攻撃・手法・時間・位置情報の確認。毎朝7時にめっちゃアクセスくる!!と思ったらクローラーが来ていた。

  • どのワードがどの地域でtwitterで呟かれているか確認し、マーケットに利用する。自社の味方になってくれている人を一覧化。バズったワードの発生タイミングや誰からスタートしたかとかも可視化。

何を可視化するか?

ログデータと言われているが、テキストにできるデータならなんでも可能。

OSS製品使っています。サポートを受けようと思えば受けれそうですが、経験はありません・・・

▼構成

architecture
twitter  ---(streaming api)-> java batch --ログファイル---> fluentd ---> elasticsearch ---> kibana <--- nginx <---- browser(client)

ツイッターの情報を取得し、整形してログファイルに吐き出す。
fluentdではログファイルをtailし、elasticsearchに転送する。
クライアントからはKibanaを介してelasticsearchのデータを参照する。

▼インストール

install
 sudo yum install nginx

#"$request_time" "$upstream_response_time"を追加することで、レスポンスタイムを正確に測定できます。
sudo vi /etc/nginx/nginx.conf

/etc/nginx/nginx.conf
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$request_time" "$upstream_response_time"';

    location / {
        proxy_pass http://localhost:5601/;
    }

編集が終わったら、sudo service nginx restartで再起動

そのほかインストールしていきます。

install
#elasticsearch
wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.1.0/elasticsearch-2.1.0.rpm
sudo rpm -ivh elasticsearch-2.1.0.rpm
#kibana
wget https://download.elastic.co/kibana/kibana/kibana-4.3.0-linux-x64.tar.gz
tar zxf kibana-4.3.0-linux-x64.tar.gz

terminalを開いて次のcurlコマンドを実行

elasticsearchに勝手にサマリを作られないようにします。

curl
curl -XDELETE localhost:9200/nginx*
curl -XDELETE localhost:9200/twitter*
curl -XPUT localhost:9200/_template/template_1 -d '
{
   "template" : "twitter.httpurl*",
   "mappings" : {
       "twitter.httpurl*": {
           "properties": {
                "url" : { "type" : "string", "index" : "not_analyzed" },
                "tag" : { "type" : "string", "index" : "not_analyzed" }
           }
       }
   }
}'

curl -XPUT localhost:9200/_template/template_2 -d '
{
   "template" : "twitter.kuromoji*",
   "mappings" : {
       "twitter.kuromoji*": {
           "properties": {
                "word" : { "type" : "string", "index" : "not_analyzed" }
           }
       }
   }
}'

curl -XPUT localhost:9200/_template/template_3 -d '
{
   "template" : "twitter.influence*",
   "mappings" : {
       "twitter.influence*": {
           "properties": {
                "user_id" : { "type" : "string", "index" : "not_analyzed" },
                "user_name" : { "type" : "string", "index" : "not_analyzed" },
                "user_location" : { "type" : "string", "index" : "not_analyzed" },
                "tweet_text" : { "type" : "string", "index" : "not_analyzed" }
           }
       }
   }
}'

curl -XPUT localhost:9200/_template/template_nginx -d '
{
   "template" : "nginx.access*",
   "mappings" : {
       "nginx.access*": {
           "properties": {
                "remote" : { "type" : "string", "index" : "not_analyzed" },
                "path" : { "type" : "string", "index" : "not_analyzed" },
                "referer" : { "type" : "string", "index" : "not_analyzed" },
                "method" : { "type" : "string", "index" : "not_analyzed" },
                "forwarder" : { "type" : "string", "index" : "not_analyzed" },
                "request_time" : { "type" : "long"},
                "size" : { "type" : "long"},
                "upstream_response_time" : { "type" : "long"},
                "agent" : { "type" : "string", "index" : "not_analyzed" }
           }
       }
   }
}'

elasticsearch自身が検索エンジンとなっているため、例えばURLが
http://hogehoge.com/aaa/bbb
となっていた場合、 "http://","hogehoge.com","aaa","bbb"に分割されて登録されてしまうので、それを解消するために上記を実施する。

install
#fluentd
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch

sudo vi /etc/td-agent/td-agent.conf

/etc/td-agent/td-agent.conf
<match nginx.access>
  type copy


  <store>
    type elasticsearch
    host localhost
    port 9200
    type_name @nginx_log
    include_tag_key true
    logstash_format true
    logstash_prefix nginx.access
    flush_interval 10s
  </store>
</match>


<match twitter.trend>
  type copy


  <store>
    type elasticsearch
    host localhost
    port 9200
    type_name @twitter.influence
    include_tag_key true
    logstash_format true
    logstash_prefix twitter.influence
    flush_interval 10s
  </store>
</match>


<match twitter.kuromoji>
  type copy


  <store>
    type elasticsearch
    host localhost
    port 9200
    type_name @twitter.kuromoji
    include_tag_key true
    logstash_format true
    logstash_prefix twitter.kuromoji
    flush_interval 10s
  </store>
</match>


<match twitter.httpurl>
  type copy


  <store>
    type elasticsearch
    host localhost
    port 9200
    type_name @twitter.httpurl
    include_tag_key true
    logstash_format true
    logstash_prefix twitter.httpurl
    flush_interval 10s
  </store>
</match>


<match debug.**>
  type stdout
</match>


<source>
  type forward
</source>


<source>
  type tail
  format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)" "(?<request_time>[^\"]*)" "(?<upstream_response_time>[^\"]*)")?/
  time_format %d/%b/%Y:%H:%M:%S %z
  types request_time:long,upstream_response_time:long,size:long
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx-access.pos
  tag nginx.access
</source>
<source>
  type tail
  format /^\[(?<time>[^\]]*)\](?<user_name>.*)(!?;\(userName=)(?<user_id>.*)(!?/userLocation=)(?<user_location>.*)\) : (?<tweet_text>.*)(!?; followersCount=)(?<follwers_count>.*)/
  types follwers_count:integer
  time_format %Y-%m-%d %H:%M:%S
  path /home/ec2-user/logs/influence.log
  pos_file /var/log/td-agent/twitter-trend.pos
  tag twitter.trend
</source>


<source>
  type tail
  format /(?<word>.*)/
  path /home/ec2-user/logs/kuromoji.log
  pos_file /var/log/td-agent/kuromoji.pos
  tag twitter.kuromoji
</source>


<source>
  type tail
  format /(?<url>.*)/
  path /home/ec2-user/logs/httpurl.log
  pos_file /var/log/td-agent/httpurl.pos
  tag twitter.httpurl
</source>

サービス起動: sudo service td-agent start

ソースコード(2015/12/07 時点):https://github.com/n01boy/twitter-trend-searcher

ビルドは "gradle fatJar"コマンドで行う。
生成されたJarファイル: twitter-trend.jar

生成されたtwitter-trend.jarを操作する。 twitter-trend.jarと同じディレクトリに配置:userdict.txt
※JDK1.8にしておく必要があります。ご注意ください。

shell
java -Dtwitter.keywords="検索したいキーワードをカンマ区切りで列挙" -Dtwitter4j.oauth.consumerKey="kaiBWJcoFbfEIFNn7v3pqF***" -Dtwitter4j.oauth.consumerSecret="2d8v1Co2LXmDZOPbpih2NbmdaKJTnFcakhKwr3keBickg3***" -Dtwitter4j.oauth.accessToken="144549526-LLXKbSu1jHNlvc83TNHYMvNt8X8PfVJBRLU9***" -Dtwitter4j.oauth.accessTokenSecret="gAiHbwwJVf52sIsSCqbALSw3zUWGH3yo20wScY2p***" -jar twitter-trend.jar

正常動作を確認できたら、Ctrl+Cでストップ
./logs/influence.logにデータが書き込まれる。これをfluentdが吸い上げている。

▼デーモン化

twitter-trend.sh
twitter-trend.sh
#!/bin/sh
export LANG=ja_JP.UTF-8
java -Dtwitter.keywords="検索したいキーワードをカンマ区切りで列挙" -Dtwitter4j.oauth.consumerKey="kaiBWJcoFbfEIFNn********" -Dtwitter4j.oauth.consumerSecret="2d8v1Co2LXmDZOPbpih2NbmdaKJTnFcakhKwr3keB********" -Dtwitter4j.oauth.accessToken="144549526-LLXKbSu1jHNlvc83TNHYMvNt8X8PfVJ********" -Dtwitter4j.oauth.accessTokenSecret="gAiHbwwJVf52sIsSCqbALSw3zUWGH3yo20w********" -jar twitter-trend.jar

chmod +x twitter-trend.sh

sudo vi /etc/init/twitter-trend.conf

/etc/init/twitter-trend.conf
description "twitter-trend"
author  "Nakam <nakam@hogehoge.com>"
start on runlevel [2345]
stop on runlevel [016]
chdir /home/centos
exec /home/centos/twitter-trend.sh
respawn

sudo initctl start twitter-trend


sudo vi /etc/init/kibana.conf

/etc/init/kibana.conf
description "kibana"
author  "Nakam <nakam@hogehoge.com>"
start on runlevel [2345]
stop on runlevel [016]
chdir /opt/kibana/bin/
exec /opt/kibana/bin/kibana
respawn

sudo initctl start kibana


sudo vi /etc/init/td-agent.conf

/etc/init/td-agent.conf
description "td-agent"
author  "Nakam <nakam@hogehoge.com>"
start on runlevel [2345]
stop on runlevel [016]
chdir /opt/td-agent/embedded/bin
exec /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent
respawn
sudo initctl start td-agent

-Dtwitter.keywords="ラブライブ,ラブライバ,μ's,ミューズ,音ノ木坂,高坂 穂乃果,絢瀬 絵里,南 ことり,園田 海未,星空 凛,西木野 真姫,東條 希,小泉 花陽,矢澤 にこ,にっこにっこにー"
とかにしておけば、
2015y12m10d_174327687.png

左上はフォロワーの数に比例して縦軸が伸びます。
左下はワードカウントで、何かがバズった時に一気に伸びます。
右の棒グラフは、呟きの中に入っているURLのランキングです。今話題になっているURLが集計できます。
一番右上の円グラフはインフルエンサーのランキング。
その下はホットワード。
上記のグラフで細分化して見たい時用に、右下に生データを表示しています。

自分の会社名をキーワードにしておいて、自社の評判とか、こうして欲しいという要望を集めるためのツールとして利用できると思います。
また、自分が気になるワードを登録しておけば、ニュース等を集めてこれると思います。

■クラスタリング
※また次回・・・