Canvas の Time filter で parse_exception が発生する

CanvasでTime filterを使用したいのですが、あるフィールドを設定すると、parse_exceptionが発生します。(@timestampフィールドを設定した場合にはエラーは発生しません)

動作環境

  • Elasticsearch 7.3.0
  • Kibana 7.3.0

発生しているエラーメッセージ

%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8

エラーが出るフィールドのmapping情報

        "testdate" : {
          "type" : "date",
          "format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
        },

エラーメッセージを見るに、formatがあってないようなのですが、このtestdateフィールドはindex作成時にindexのTime filter fieldとして設定している項目であり、まさか指定できないとは思ってもいませんでした。

こちら、回避方法(testdateフィールドをCanvasのTimefilterに指定する方法)はないのでしょうか?

ほか、DashboardやVisualizationなど、全てこのフィールドを基準にいろいろと設定をしているため、このフィールドのformatを作り変えることは現実的ではない状態です。

解決策などありましたら、ご教示いただけますと幸いです。
なにとぞよろしくお願いいたします。

既に「いいね」が押されていることから、参照済みかと思いますが、
他の方のため共有用です。↓

共有ありがとうございます。

現状は、別途CanvasのFilter用にISO8601フォーマットのdateフィールドを追加し、testdateのデータをコピーすることで対応を試みています。
ですが、これもコピーの際にparse_exceptionが出るため、何とかScriptでparseしてコピーできないかを試していますが、なかなか上手くいかず苦慮しています。

追加で何か情報などありましたら、ぜひお願いいたします。

この部分について、どのようなアプローチのことをおっしゃっていますか?
Ingest Pipelineで、testdateの値を他のフィールドにISO8601フォーマットのDateに変換して格納する、というようなことをなさっているのでしょうか?

返信ありがとうございます。

testdateのformatを作り変えることは現実的ではない

当初はこう考えていたのですが、今後のことを考えるとISO8601フォーマットで持っていたほうが何かと便利かなと考え直して、testdateのフォーマットを修正する方向で検討しました。
このため、以下2点の対応を考えています。

1)既存データ(およびmapping)のformat修正

  • 上記を参考に、_reindex時のIngest Pipelineで、gsubなどを用いて変換

2)新たに追加されるデータのISO8601変換

  • 基本的にデータの取り込みはlogstashで行っているのですが、mutate filter pluginで変換して格納

一応やりたいことは成功しているのですが、正直なところ、あまりスマートではないなと思っています。

新しくIndexを定義して、既存データはreindexによる移行で ISO8601形式のフィールドにし、
移行後に登録される新規データについては、Logstashのフィルターで何とかしたい、ということでしょうか。

Reindex時のフォーマット変換

date processorを使うと簡単かと思います。

PUT _ingest/pipeline/discusstest
{
  "description": "discuss test",
  "processors": [
    {
         "date" : {
          "field" : "testdate",
          "target_field" : "testdate",
          "formats" : ["yyyy/MM/dd HH:mm:ss"],
          "timezone" : "UTC"
        }
    }
  ]
}

で、このIngestPipelineをreindex時に指定しておくと、作成後の方はISO8601(dateのフォーマット指定なし)で作成されるかと思います。

POST _reindex
{
  "source": {
    "index": "before_index"
  },
  "dest": {
    "index": "after_index",
    "pipeline": "discusstest"
  }
}

Logstashでの日付フォーマット

dateフィルターを使って文字列からdate型にしておくと、出力されるときにはISO8601型になっているはずです。

filter {
    date {
        match => [ "hogehoge", "yyyy/MM/dd HH:mm:ss" ]
        # ↓ 元データがUTCでなければ、UTCに変換する(9時間引くなど)
        # timezone => "Asia/Tokyo"
        target => "hogehoge"
    }
}

たとえば、以下のようになります。

入力値 "hogehoge" => "2019/12/13 09:00:00"
出力値 "hogehoge" => 2019-12-13T00:00:00.000Z,

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

いつもご丁寧な回答ありがとうございます。

既存データの移行と、Logstashのフィルターによる新規データの登録とも、教えて頂いた内容を参考に、無事に対応することができました。
(当初考えていたものより、かなりスマートになったと思います)

大変勉強になりました。
ありがとうございました。

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