TSVBとMetricのnull値の取り扱いの差

お世話になります。

TSVBとMetricのnull値の取り扱いの差について教えてください。

たとえば以下のようなデータの場合で、testdate を Time field としてソートした場合に、value の Top Hit ( Size=1 , ORDER BY DESC ) をとると、以下のとおり差があります。

  • TSVB
    _id=1のnullが無視され、_id=2の10が取得(表示)される
  • Metric
    _id=1のnullが取得され、値なし(ハイフン)で表示される。
      {
        "_index": "sample-index",
        "_type": "sample-type",
        "_id": "1",
        "_score": 1,
        "_source": {
          "title": "testdata-1",
          "testdate": "2020-01-03T00:00:00+09:00",
          "value": null
        }
      },
            {
        "_index": "sample-index",
        "_type": "sample-type",
        "_id": "2",
        "_score": 1,
        "_source": {
          "title": "testdata-2",
          "testdate": "2020-01-02T00:00:00+09:00",
          "value": 10
        }
      },
      {
        "_index": "sample-index",
        "_type": "sample-type",
        "_id": "3",
        "_score": 1,
        "_source": {
          "title": "testdata-3",
          "testdate": "2020-01-01T00:00:00+09:00",
          "value": 20
        }
      }

実現したいこと

TSVBでも、Metricのときと同じ動きをしてほしい(nullを捉えてほしい)です。
必要な設定などありましたら、ご教示いただけますと幸いです。

動作環境

  • Elasticsearch 7.3.0
  • Kibana 7.3.0

@sshota さん

TSVBとMetricのnull値の違い、サンプルデータを使ってこちらでも試してみました。確かにおっしゃるとおりTSVBだとソート後にnull値を除外した値が表示されますね。

TSVBのMetric表示結果
image

同じaggsをMetricビジュアライゼーションで表示
image

違いが生まれるのはTSVBの描画ロジックだと思われます。そもそもMetricビジュアライゼーションでは index_name/_search APIを使っています。一方、TSVBは /api/metrics/vis/data というAPIを呼び出しています (searchプラス何かしてる)、その結果はnullが返っているので、TSVBのJavascript部分でnullを描画時に外すロジックが入っているのかと思われます (ここは推測)。

解決策の一つになるかわかりませんが、mappingnull_valueを明示するのはいかがでしょうか。例えば以下のマッピングを行うと、nullの場合にTSVBのMetricと、Metricでどちらも0を表示できます。

PUT test_index
{
  "mappings": {
    "properties": {
      "testdate": {"type": "date"},
      "title": {"type": "text"},
      "value": {
        "type": "long",
        "null_value": 0
      }}}}

TSVBのMetric, null_value=0
image

Metricビジュアライゼーション, null_value=0
image

テスト時に使ったバルクリクエストも貼っておきます。

POST test_index/_bulk
{"index":{"_id":"1"}}
{"title":"testdata-1","testdate":"2020-01-03T00:00:00+09:00","value":null}
{"index":{"_id":"2"}}
{"title":"testdata-2","testdate":"2020-01-02T00:00:00+09:00","value":10}
{"index":{"_id":"3"}}
{"title":"testdata-3","testdate":"2020-01-01T00:00:00+09:00","value":20}

@Koji_Kawamura さん

丁寧なご回答ありがとうございます。
ロジックの違いについても大変参考になりました。

ご教示いただいた ” mappingnull_valueを指定 ” ですが
実現したいことが、nullの場合に0を表示したい、ではなくその逆で、nullの場合にTSVBでもnull(値なし)として表示してほしい、という内容なのです。

Dashboardで、ある時間に取れたデータをMetricで並べて横並びに見ることをしているのですが、TSVBだとnullを無視されてしまうので、値が取れていない項目があると、そのMetricだけほかと時間軸がずれてしまうということが発生しており、それの解消法を探しております。

@sshota さん

なるほど、そういうことだったのですね。
Dashboardには複数のMetricを並べて見るということですが、TSVBのMetricと、VisualizationのMetricを併用しなくてはならない理由があるのでしょうか?
全てのMetricをVisualizationのMetricで統一すれば、解決されるのでは、とも思えます。

おそらくTSVBを使わないといけない理由があるんですよね。
TSVBのMetricだと一つのVisualizationで2つMetricを表示することができる利点がありますが。

@Koji_Kawamura さん

はい、おっしゃるとおりです。
諸般の事情により全てのMetricをTSVBで統一したかったのですが、本事象があるため現在は
ご指摘のとおり、VisualizationのMetricで統一することで対応をしております。

それでも

nullの場合にTSVBでもnull(値なし)として表示

ができるのであれば、今からでもTSVBへ変更したかったのですが、
ひとまずは現状で対応することにしたいと思います。

いろいろとご教示ありがとうございました。

1 Like

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