Kibanaでの項目集計について


(buchizo) #1

ログを集計しています。
ログには、項目A、項目B、項目Cとあり、内容は同じ様なデータが入っています。
この項目A,B,Cを足し込んで集計し、Visualizeする事は可能でしょうか?

ログ形式:日付 項目A 項目B 項目C
20170517 北海道 東京 名古屋
20170517 北海道 東京 大阪
20170517 青森 東京 名古屋

Visualizeのterm等で一つにしたい。
北海道 2
青森 1
東京 3
名古屋 1
大阪 1


(Shota Ito) #2

うーん、既存の機能でさくっと実現するのは難しいかもしれないですね。。。

無理やり&Data TableじゃなくてLineによるVisualizeになっちゃいますが、
やろうと思えばTimelionのVisualizeで以下クエリで近いものは出来るかもです。
※実際にデータ投入して動作確認しているわけではないので、クエリの書き方はドキュメントを確認しながら見てもらえればと。

  • Timelion Query
.sum(.es(index=INDEX名,metric=count,q=項目A:東京),.es(index=INDEX名,metric=count,q=項目B:東京),.es(index=INDEX名,metric=count,q=項目C:東京))

(buchizo) #3

なるほど。難しいようですね。
AかつBの様データの集計するには事前に何かしら細工した方が良さそうですね。
ありがとうございました。


(tsgkdt) #4

例えば、kibanaのManagementからIndex Pattensから見られる scripted Fieldではどうでしょう。

test1, test2, test3というフィールドに値が入っているとし、scipted fieldで指定するtest_arrayというフィールドに集めておいて、
このフィールドに対してVisualizeを設定するイメージです。

  • テストデータ

期待する結果は、tokyo=2. osaka=1, kyoto=1となるような、test1, test2, test3に値を入れました。

POST forum/test/1
{
  "test1": "kyoto",
  "test2": "osaka",
  "test3": "tokyo",
  "@timestamp": "2017/05/18 12:00:00"
}

POST forum/test/2
{
  "test1": "tokyo",
  "@timestamp": "2017/05/19 12:00:00"
}

  • scripted field

stringフィールド、painlessを指定し、scriptにこのように書きました。
内容としては、nullでなければ配列に足すというものです。

def t = []; 
if (doc['test1.keyword'].value != null) {
 t.add(doc['test1.keyword'].value);
}
if (doc['test2.keyword'].value != null) { 
 t.add(doc['test2.keyword'].value);
}
if (doc['test3.keyword'].value != null) {
 t.add(doc['test3.keyword'].value);
}
return t;

このtest_arrayフィールドで可視化を作ると、下のように見ることができました。

事前に集計用のフィールドに集めておくなどしておいた方がパフォーマンスは良いと思いますが、
方法の1つとして。


(buchizo) #5

ありがとうございます。
ばっちり希望通りの集計が出来ました。
スペック的に余り良くないサーバなので、タイムアウトが出たりしたので
logstashで取込み時に集計用フィールドに集めることを検討します。


(system) #6

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.