Aggregate filter pluginのオプションtimeout_timestamp_fieldについて、
機能追加の経緯やドキュメントの記載から設定すると、タイムアウトの判定がシステム時間からログのタイムスタンプに変わると思っていたが、実際に動かしてみると、システム時間で判定されたような挙動をした。
(私と同じ疑問を持った方が過去にいたよう。https://discuss.elastic.co/t/aggregate-filter-with-timeout-timestamp-field/144260)
このオプションを設定した場合の正しい挙動がわかる方いたら教えてください。
【検証】
検証で使った設定(.conf)
input {
stdin{}
}
filter {
grok {
match => [ "message", "%{NOTSPACE:event_time} %{LOGLEVEL:loglevel} - %{NOTSPACE:taskid} - %{NOTSPACE:logger} - %{WORD:label}( - %{INT:duration:int})?" ]
}
date{
match => [ "event_time", "yyyy-MM-dd'T'HH:mm:ss.SSS"]
target => "event_time"
}
if [logger] == "TASK_START" {
aggregate {
task_id => "%{taskid}"
timeout_timestamp_field => "event_time"
code => "map['sql_duration'] = 0"
map_action => "create"
timeout => 30
push_map_as_event_on_timeout => true
}
}
if [logger] == "SQL" {
aggregate {
task_id => "%{taskid}"
code => "map['sql_duration'] += event.get('duration')"
map_action => "update"
}
}
if [logger] == "TASK_END" {
aggregate {
task_id => "%{taskid}"
code => "event.set('sql_duration', map['sql_duration'])"
map_action => "update"
end_of_task => true
}
}
}
output{
stdout{}
}
入力
2023-06-17T07:30:00.000 INFO - 12345 - TASK_START - start
2023-06-17T07:30:40.000 INFO - 12345 - SQL - sqlQuery1 - 12 ←タスク開始から40秒後のログが投入されたため、この時点でタイムアウトになりマップの情報がイベントとして出力されることを想定
結果
タスク開始から約30秒後にマップに格納されていた値がイベントとして出力されたことを確認
{
"@version" => "1",
"@timestamp" => 2023-06-17T15:31:35.935962Z,
"sql_duration" => 12
}