Timeseriesのlabel間集計

こんにちは。
現在kibanaでサーバごとのディスク使用量の前日との増減を表示したいと思っています。
timeseriesで当日、前日のディス使用量は表示できたのですが、差分がうまく取れません。
別ラベルのデータをとってくることは出来るのでしょうか。
尚、ディスク使用量は1つのデータとなっているので、同じindexに対するoffsetを使用しています。

ラベル1
Aggregation:MAX
Field:use_disk
Aggregation:Backet Script
Variable:max:Max of use_disk

ラベル2
Aggregation:MAX
Field:use_disk
option:offset 1d
Aggregation:Backet Script
Variable:max_1d:Max of use_disk
Painless.Script:params
{ラベル1のmaxデータ(ここの表示の仕方)}- params.max_1d

すぐ思いつくろで書いてしまい申し訳ないですがTSVBではなく、Timelionはどうでしょうか?

サーバーCと書いたところ、赤い線がディスク使用量のイメージで、下の青い色が塗っているAreaチャート風のところが増減を計算して出している部分です。
増減のところは、同一Indexの同一フィールドで時間のフィールドのオフセット値を1日ずらすだけで、値を引き算して求めています。

TimelioneのSubtractで青線のところを求めています。

青線のところはこのように書いています。

.es(q="*:*", index="Index名", timefield="@timestamp", metric='max:use_disk', split='server.keyword:10')
.subtract(
  .es(q="*:*", index="index名", timefield="@timestamp", metric='max:use_disk', split='server.keyword:10', offset='-1d'))
  .label("サーバー 増減$1", "(\S+)")
  .lines(fill=2)

見やすくするための便宜上、無駄な改行とスペースがありますが、本当は1行で書いているものと思ってください。

もっとよいアプローチもあると思いますが、もうすぐ出ないといけないので取り急ぎこれだけ書いておきます。

@tsgkdt ご回答いただき有難うございます。
前日との差分はこれで表示できました。
すみません。いろいろ情報が不足していて申し訳ないですが、下記を表現したいと思っています。

[インデックス]
各サーバのディスク使用量を1日ごとに取得している

[実現したいこと]
・サーバごとの当日ディスク使用量-前日ディスク使用量を取得(timelionで実現可能)
・上記増減のうち、増加が多いサーバのtop10を表現

考えてみると日によって増加するサーバもあれば減少するサーバもあるので(単調増加ではないため)
それをグラフで表現するのは難しいのでしょうか。

SerialDiff Aggregationを使うと、Timelionのようなクエリを書かずともTSVBでできそうです。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-serialdiff-aggregation.html

このようなデータを想定したとした場合を考えました。

@timestamp max(value) 期待したい差分値
2019/11/23 00:00:00 90.0 なし
2019/11/24 00:00:00 100.0 10
2019/11/25 00:00:00 300.0 200
2019/11/26 00:00:00 100.0 -200

Max -> Serial Difference を選択することで、下記のような図になります。

もし、Elasticsearchのクエリであるならば、このようなイメージです。

POST forum1126/_search
{
  "query": {
    "match": {
      "server": "A"
    }
  }, 
   "size": 0,
   "aggs": {
      "my_date_histo": {                  
         "date_histogram": {
            "field": "@timestamp",
            "calendar_interval": "day"
         },
         "aggs": {
            "max_aggs": {
               "max": {
                  "field": "value"     
               }
            },
            "diff_ga_hoshii": {
               "serial_diff": {                
                  "buckets_path": "max_aggs",
                  "lag" : 1
               }
            }
         }
      }
   }
}

変化量のトップ10を出すのは、今すぐにアイデアがあるわけではないので、
TSVBの情報だけ共有しておきたいと思います。

Elastic社がどう考えているかはわかりかねますが、Timelionが颯爽と登場してもTimelionの独自すぎる記法がネックになって使いづらかったので、TSVBが出てきたように思います。
このことからすれば、個人的にはTSVBでやる方が、今後の苦労は少ないのではと思います。

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

@tsgkdt ご回答いただき有難うございます。
確かにTimelionの記法は独特で独学だと厳しいと感じました。
TSVBの「Serial Difference」で差分が出せるんですね。labelを2にすれば2日前のデータとの差分がとれそうです。
あとはうまくtop10が取れるかどうかはDocumenなどt読んで色々試してみようと思います!

n台あるサーバーのディスク使用量のうち、前日との変化量のトップm件を・・・というのを簡単に実現できる方法はまだ思いつきませんが、こういうアプローチはどうでしょう?

Serialdiff Aggregationで前日との差異が取れることが分かりましたので、それを別のIndexにいったん格納する方法です。
具体的には、Watcherによる定期実行で、前日との差分データを別Indexに入れるようにし、Top10のデータの見せ方は新たに作成した別Indexの方から取得するイメージです。

WatcherでAggregation結果を別Indexに格納する、という方法は下記のブログで想像いただけるかと思います。5の解決策と書かれたところが該当します。

https://shin0higuchi.hatenablog.com/entry/2017/06/20/022648
( via @shin-higuchi)

ご参考になれば。

1 Like

@tsgkdt
参考情報までありがとうございます!
参考ブログも読ませていただきました。Dev Tools使うのが初めてだったのでてこずりましたが、何とか取得できました。
ただ、watcherなんですが、こちら無償ライセンスを使用しており、
「GET _xpack」を実行してみたところ、下記出力されました。
これは有償へのアップグレードが必要ということでしょうか?

GET _xpack
"watcher" : {
"description" : "Alerting, Notification and Automation for the Elastic Stack",
"available" : false,
"enabled" : true
}

確かにWatcher(アラート)は、ゴールド以上のサブスクリプションが必要ですね。
https://www.elastic.co/jp/subscriptions

しかし、お試しで一定期間評価用に使うことはできるようになっています。
https://www.elastic.co/guide/en/elasticsearch/reference/current/start-trial.html

まずは試用してみて、やりたいことが実現できるかを確認していただき、
あわせて代替手段の検討(cronやタスクスケジューラなどと組み合わせた何かを自作するなど)をするのが良いのではないでしょうか。

@tsgkdt
ありがとうございます。
開発機で実現できるか試用期間で評価して、有用であれば有償オプションの申し込みをしようと思います。
出来ればkibana単体で実現したいですが、難しそうであれば組み合わせで実現させようと思います。
完成系をお見せできなくて申し訳ございませんが、ご助力いただき有難うございました。

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