sshota
(shota)
December 10, 2019, 7:08am
1
CanvasでTime filterを使用したいのですが、あるフィールドを設定すると、parse_exceptionが発生します。(@timestampフィールドを設定した場合にはエラーは発生しません)
動作環境
Elasticsearch 7.3.0
Kibana 7.3.0
発生しているエラーメッセージ
エラーが出るフィールドの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を作り変えることは現実的ではない状態です。
解決策などありましたら、ご教示いただけますと幸いです。
なにとぞよろしくお願いいたします。
tsgkdt
(tsgkdt)
December 11, 2019, 12:52am
2
既に「いいね」が押されていることから、参照済みかと思いますが、
他の方のため共有用です。↓
Hello,
I'm using Kibana 6.7.2
Adding a time filter I get a lot of Error Messages like this and a table with only Headers but now content rows:
[parse_exception] failed to parse date field [2019-11-21T23:00:00.000Z] with format [YYYYMMdd HHmmss Z]
Any Ideas how to change the date format?
Timefilter Expression:
timefilterControl compact=true column="@timestamp"
| render
Table Expression:
filters
| essql
query="SELECT
CDR_TIME AS timestamp,
IMSI AS IMSI,
sender AS Sender
FROM
"…
sshota
(shota)
December 11, 2019, 5:15am
3
共有ありがとうございます。
現状は、別途CanvasのFilter用にISO8601フォーマットのdateフィールドを追加し、testdateのデータをコピーすることで対応を試みています。
ですが、これもコピーの際にparse_exceptionが出るため、何とかScriptでparseしてコピーできないかを試していますが、なかなか上手くいかず苦慮しています。
追加で何か情報などありましたら、ぜひお願いいたします。
tsgkdt
(tsgkdt)
December 12, 2019, 12:44pm
4
この部分について、どのようなアプローチのことをおっしゃっていますか?
Ingest Pipelineで、testdateの値を他のフィールドにISO8601フォーマットのDateに変換して格納する、というようなことをなさっているのでしょうか?
sshota
(shota)
December 13, 2019, 12:13am
5
返信ありがとうございます。
testdateのformatを作り変えることは現実的ではない
当初はこう考えていたのですが、今後のことを考えるとISO8601フォーマットで持っていたほうが何かと便利かなと考え直して、testdateのフォーマットを修正する方向で検討しました。
このため、以下2点の対応を考えています。
1)既存データ(およびmapping)のformat修正
上記を参考に、_reindex時のIngest Pipelineで、gsubなどを用いて変換
2)新たに追加されるデータのISO8601変換
基本的にデータの取り込みはlogstashで行っているのですが、mutate filter pluginで変換して格納
一応やりたいことは成功しているのですが、正直なところ、あまりスマートではないなと思っています。
tsgkdt
(tsgkdt)
December 13, 2019, 1:10am
6
新しく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,
ご参考になれば幸いです。
sshota
(shota)
December 13, 2019, 9:05am
8
いつもご丁寧な回答ありがとうございます。
既存データの移行と、Logstashのフィルターによる新規データの登録とも、教えて頂いた内容を参考に、無事に対応することができました。
(当初考えていたものより、かなりスマートになったと思います)
大変勉強になりました。
ありがとうございました。
system
(system)
Closed
January 10, 2020, 9:06am
9
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.