折れ線グラフにおいて、日付単位で集計0件の場合にcountを0で集計させたい

お世話になっております。
折れ線グラフにおいて、質問させていただきます。

サンプルログ
date    dstaddr_i  レコード数
11/19   10.1.2.1     1
11/19   10.2.1.1     1
11/19   172.16.2.1   2
11/19   192.168.2.1  2
11/19   11.1.2.1     2   グラフ表示対象
11/19   173.16.2.1   2   グラフ表示対象
11/19   193.168.2.1  2   グラフ表示対象

11/20~11/28 レコードなし

11/29   10.1.2.1     1
11/29   10.2.1.1     1
11/29   172.16.2.1   2
11/29   192.168.2.1  2
11/29   11.1.2.1     2   グラフ表示対象
11/29   173.16.2.1   2   グラフ表示対象
11/29   193.168.2.1  2   グラフ表示対象
・・・省略

質問
折れ線グラフにおいて、日付単位で集計時にレコードが無い日付において、
countを0で集計させることは出来ませんでしょうか。
11/20~11/28 をcount0として、折れ線を表示させることは出来ませんでしょうか。

設定
Data
 Metrics
  Y-axis
   Aggregation   Count
   Custom lavel
   Advanced
    JSON input
 Buckets
  X-axis
   Aggregation   Date Histogram
   Field      timestamp_start
   Minimum interval Day
   Drop partial buckets OFF
   Custom lavel
   Advanced
    Scale metric values (deprecated) OFF
    JSON input
  Split series
   Sub aggregation  Terms
   Field       dstaddr
   Order by      Metric: Count
   Order       Descending
   Size        20
   Group order valuesin separate buckets  OFF
   Show missing values  OFF
   Custom lavel
   Advanced
   Exclude
   Include
   JSON input

現設定の表示イメージ

Search条件
(NOT dstaddr_i:10.0.0.0/8) AND (NOT dstaddr_i:172.16.0.0/12) AND (NOT dstaddr_i:192.168.0.0/16)

お手数ですが、回答頂けますと幸いです。

日ごとのカウント数を示すなら棒グラフの方が良い(ヒストグラムですし)と思うのですが、折れ線グラフを利用する理由はありますか?参考に教えてもらえると嬉しいです。

一応折れ線グラフとしてはLensではなく、Aggregation based > LineとしてX-axisはDate Histgram Aggregationとし、Advanced > JSON inputに{"min_doc_count": 0}というパラメータを追加すると、挟まれた部分については0にできました。範囲の外は値が出ませんでした。

こんな感じ。

通常の棒グラフによるヒストグラムだとこうなります。こちらの方が良いような?

ご回答ありがとうございます。

折れ線グラフの利用理由については、実際に運用する者でないため、定かではありませんが
アクセスのあった情報(複数のアドレスなど)の推移を1つのグラフの中で確認したく、
棒グラフではなく折れ線の方が見やすくなるのでこちらを採用していると想定しています。

ご回答いただいている設定では、「X-axisはDate Histgram」のみでの日付集計では、実現ができたのですが、
「Split series」で「Field」を指定し、設定した場合には実現することが出来ておりません。
現在の設定とグラフ表示は以下の通りとなります。




12/14を「Split series」で指定している「Field:src_user.keyword」の内容Aと内容Bを0件として
表示させたいのですが、実現方法をご教示頂けませんでしょうか。
内容A 12/13および12/15に2件 12/14は0件
内容B 12/13および12/15に1件 12/14は0件

sub aggregation側でもmin_doc_countを指定していますか?

extended_boundsを指定することで、データがないところに0を埋められるようです。

しかし、Kibanaの標準のLineChartだと出来そうにないのですが、
Vegaなら標準で可能になってます。こちらは検討できないでしょうか?

ご回答ありがとうございます。
sub aggregation側のAdvanced > JSON inputに{"min_doc_count":0}を指定しても、期待通りの結果にはなりませんでした。

1 Like

Vegaでどのように出来るかを試してみているのですが、「Field:src_user.keyword」の「Split series」ように「data部」記載してみたのですが、「encoding」の書き方が良くわからずエラーになってしまいます。記載について、ご教示頂けませんでしょうか。

{
  $schema: https://vega.github.io/schema/vega-lite/v4.json
  title: Event counts from all indexes
  data: {
    url: {
      // Apply dashboard context filters when set
      %context%: true
      // Filter the time picker (upper right corner) with this field
      %timefield%: @timestamp
      index: index-test*
      body: {
        aggs: {
          categories: {
            terms: { field: "src_user.keyword" }
              aggs: {
                time_buckets: {
                  date_histogram: {
                    field: @timestamp
                    interval: {%autointerval%: true}
                    extended_bounds: {
                      min: {%timefilter%: "min"}
                      max: {%timefilter%: "max"}
                    }
                    min_doc_count: 0
                  }
                }
              }
            }
          }
        }
        size: 0
      }
    }
    format: {property: "aggregations.time_buckets.buckets"}
  }
 mark: line
  encoding: {
    x: {
      field: key
      type: temporal
      axis: {title: false} // Customize X axis format
    }
    y: {
      field: doc_count
//      field: src_user.keyword.count
      type: quantitative
      axis: {title: "Document count"}
    }
  }
}

実行の結果
Syntax error, found trailing characters at line 36,3 >>> mark: line
encod ...

確かに複数並べる場合は折れ線グラフの方が見やすいかもしれないですね、ありがとうございます。histogramでは間のビンがmin_doc_count=0で補完されますが、termsではどのキーワードがあるか明らかでないためかmin_doc_count=0は機能しませんでした。失礼しました。結果、kibanaのLineChartだと厳しそうに思います。

vega-liteで少し触ってみました。inline dataとして入力するとグラフになるのですが、kibana上でqueryにするとうまく動きませんでした。ヒントとして使ってください。

ご確認ありがとうございます。
展開頂きました情報を確認させて頂きます。

Aggregation basedのTimelionを利用すると容易に実現できました。

.es(index=index-test*,
    timefield=@timestamp,
    split=src_user.keyword:10)

で実現されると思います。試してみてください。

ご回答ありがとうございます。

>Aggregation basedのTimelionを利用すると容易に実現できました。
上記の設定を行うところが、どの箇所になるかが分かりませんでした。
「line chart」において、「X-axisでAggregation:Date Histogram」の「JSON input」に
記載するような形でしょうか。
大変申し訳ありません。どのような方法になるのかご教示頂けませんでしょうか。
よろしくお願いいたします。

これはDashboard上で利用できるLensではない他のタイプの可視化です。
Kibanaのバージョンによって少し違うかもしれませんが、7.16.2ではAll types>Aggregation based>Timelionから作成できます。"Timelion expression"に上の設定を入力します。


ご回答ありがとうございます。
>これはDashboard上で利用できるLensではない他のタイプの可視化です。
承知しました。今回は、他にも色々と表示させるものがありDashboard上での実現となるのですが、
参考にさせて頂きます。ありがとうございます。

すみません、分かりづらい日本語でした。
「「Dashboard上で利用できるLens」ではない他のタイプの可視化」ではなく、
「Dashboard上で利用できる「Lensではない他のタイプ」の可視化」という意図でした。
Dashboardで使えます。

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