こんにちわ
idとhostでキーとしてグルーピングをしたい、ということでしたらばtask_idをidとhostを連結した文字列としてはどうでしょうか?
task_id => "%{id}-%{host}"
idとhostを”-"をつなげて連結した文字列で一意になるという前提です。
テストデータとして、以下のようなCSVデータを用意しました。
id | host | name |
---|---|---|
1 | 0.0.0.0 | hoge |
1 | 1.1.1.1 | fuga |
2 | 0.0.0.0 | piyo |
2 | 0.0.0.0 | piyopiyo |
3 | 0.0.0.0 | bar |
3 | 0.0.0.0 | barbar |
3 | 0.0.0.0 | barbarbar |
logstashのfilterは以下のようにしました。
filter {
# import csv data
csv {
# set Column's names
columns => ["id","host","name"]
separator => ","
}
aggregate {
task_id => "%{id}-%{host}"
code => "
map['id'] = event.get('id')
map['host'] = event.get('host')
map['name'] ||= []
map['name'] << event.get('name')
event.cancel()
"
push_previous_map_as_event => true
timeout => 3
}
}
結果をstdoutで確認してみますと、nameがidとhostごとに出力されています。
{
"@timestamp" => 2019-08-06T13:19:30.249Z,
"@version" => "1",
"host" => "0.0.0.0",
"name" => [
[0] "hoge"
],
"id" => "1"
}
{
"@timestamp" => 2019-08-06T13:19:30.255Z,
"@version" => "1",
"host" => "1.1.1.1",
"name" => [
[0] "fuga"
],
"id" => "1"
}
{
"@timestamp" => 2019-08-06T13:19:30.257Z,
"@version" => "1",
"host" => "0.0.0.0",
"name" => [
[0] "piyo",
[1] "piyopiyo"
],
"id" => "2"
}
{
"@timestamp" => 2019-08-06T13:19:38.093Z,
"@version" => "1",
"host" => "0.0.0.0",
"name" => [
[0] "bar",
[1] "barbar",
[2] "barbarbar"
],
"id" => "3"
}
何か参考になれば幸いです。