[Kibana]Y-AxisのJSON inputについて


#1

Lineグラフのmetrics(Y軸)にMax Bucketを使用し、以下を実現したいのですが、JSON inputでcountした結果を60で割るという計算はできないでしょうか。

・ログから分単位で件数をcountした値を60で割り、各時刻(分)における1秒間の平均値を算出

[max bucketの設定]
:black_medium_square:︎bucket
・aggregation: data histogram
・field: DATE型のfield
・interval: minute

:black_medium_square:︎metric
・aggregation: Count
→Advancedで、countした結果を60で割りたいですが、記述の仕方が分かりませんでした。

JSON inputは、erasticsearchのfieldへのアクセスしかしないものでしょうか。
X-axisでは、_valueを指定すると、X軸の数値に対し計算できるようですが…

やりたいこととしては以下の記事が類似していますが解決していないようでした。
(分単位のcountを60で割ってならしたいため、秒単位でcountする、ですとやりたいことと異なります)

Kibanaでの集計が難しそうでしたら、logstashでのログ加工を検討します。
お力添え頂ければ幸いです。


(tsgkdt) #2

こんにちわ

json inputについて

こちらによりますと、

The script parameter defines an inline script, which operates against each document , and not the result of the aggregation. So you can't use it to accomplish what you're trying to do.

と書いてあり、Aggregationの結果に対しての操作をするものじゃないよ、と読めます。
今回は、avgやsumなどではなくcountした値を式にかけたい、ということだったので、このアプローチを止めて下に紹介するTimeSeriesを確認してみました。

Visual Builderでの例

もし、標準のLineチャートでなければだめだ、ということがなければ、VisualBuilderで作成することができるTimeSeriesでは如何でしょうか。
Countに、AggregationでMath を追加することでやりたいことができるのでは?と思います。
以下では、分かりやすいように、件数を10倍して描画する例を確認しています。

カウントだけを描画した例

カウント件数を10倍して描画した例

参考になったdiscuss

ご参考になれば幸いです。


(Makoto Nozawa) #3

バージョンがわかりませんがline chartではなくtimelionを使い、Intervalを1mにして下記の定義ではどうでしょうか

.es(index=YOUR_INDEX, q='*', timefield=YOUR_FIELD,metric=count).divide(divisor=60)

25


#4

他の人ほどスマートな回答ではないけど、一応こんな方法でもできます。


① 「Index Patterns → Scripted fields」で新フィールド「0.13333」(固定値)を作成。

painless1


それをSumで足せば「Countを60で割った値」が表示される。


ただ計算で値を求めるため、速度は落ちると思います。


#5

https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-search

みなさまご助言ありがとうございます。

バージョンは6.5.1を使用しております。

◆TimeSeriesは、aggregation(count)をelastic searchに登録した「分」のfieldでgroup byし、ご教示いただいた方法で計算できればやりたいことに近いかと思いましたが、group byをTermsに変更しようとすると「未定義またはNULL参照のプロパティ'contains'は取得できません」とエラー画面がでてつまづいてしまいました。。

◆Scripted fieldの方法も試しましたが、そもそもElastic Searchに登録するログのつくり上、lineグラフ横軸にする時刻情報がかけてしまう(◯時台にログの出力件数が0であった場合、グラフ上その時刻が出力されない)という問題があり、ES登録前にログを集計しないと難しそうでしたため(ログは極力加工しない方針)いったん断念しました。。

が、Scripted fieldの使い方を知らなかったため、勉強になりました。ありがとうございます。

◆そのため、Timelionで実施しています。仰る通り、intervalを1mにするとやりたいことになりました!

可能であれば、60で割ったカウントから、さらに1時間あたり最大値を算出・intervalを1hにしたいのですが、Timelionの関数だとうまくできないものでしょうか…


(system) closed #6

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