Logstash中的Agregate上的Agregate过滤器?
我有一个库存表,其中有商店/产品的库存:Logstash中的Agregate上的Agregate过滤器?,logstash,logstash-filter,Logstash,Logstash Filter,我有一个库存表,其中有商店/产品的库存: input { jdbc { statement => "SELECT ShopId, ProductCode, Quantity FROM stock ORDER BY productcode;" } } 然后我有一个简单的过滤器来聚合这些数据: filter { aggregate { task_id => "%{productcode}" code => "
input {
jdbc {
statement => "SELECT ShopId, ProductCode, Quantity FROM stock ORDER BY productcode;"
}
}
然后我有一个简单的过滤器来聚合这些数据:
filter {
aggregate {
task_id => "%{productcode}"
code => "
map['productcode'] ||= event.get('productcode')
map['objectID'] ||= event.get('productcode')
map['stocks'] ||= []
map['stocks'] << {
'ShopId' => event.get('ShopId'),
'quantity' => event.get('quantity'),
}
event.cancel()
"
push_previous_map_as_event => true
timeout => 3
}
}
现在我可以通过http输出插件将数据推送到Algolia。
但我的问题是,成千上万的对象会发出成千上万的调用
这就是为什么我认为使用批处理端点,将这些对象打包到f.e.1000对象的包中,但要这样做,我需要将结构调整为:
{
"requests": [
{
"action": "addObject",
"body": {
"productcode": "123",
"objectID": "123",
...
}
},
{
"action": "addObject",
"body": {
"productcode": "456",
"objectID": "456",
...
}
}
]
}
在我看来,这类似于另一个聚合函数,但我已经尝试过:
aggregate {
task_id => "%{source}"
code => "
map['requests'] ||= []
map['requests'] << {
'action' => 'addObject',
'body' => {
'productcode' => event.get('productcode'),
'objectId' => event.get('objectID'),
'stocks' => event.get('stocks')
}
}
event.cancel()
"
push_previous_map_as_event => true
timeout => 3
聚合{
任务id=>“%{source}”
代码=>”
映射['requests']| |=[]
映射['requests']'addObject',
“正文”=>{
'productcode'=>event.get('productcode'),
'objectId'=>event.get('objectId'),
'stocks'=>event.get('stocks')
}
}
event.cancel()
"
推送上一个映射为事件=>true
超时=>3
但它不起作用
此外,使用这种类型的聚合函数,我无法配置要发送到批处理输出的包的大小
如果有任何帮助或线索,我将不胜感激。这是一个很好的问题。但我要问你:你的方法1有什么问题?你提到了1000个电话。你这么说是什么意思?为什么你认为这样不好
logstash
是etl工具,它在接收数据时处理数据。@JBone我的输出是HTTP(我正试图将其推送到Algolia),因此这样它会创建50k HTTP调用,这需要很长时间。相反,Algolia支持批量更新,所以我可以进行50次批量调用,每个调用包含1000个元素。这是一个很好的问题。但我要问你:你的方法1有什么问题?你提到了1000个电话。你这么说是什么意思?为什么你认为这样不好logstash
是etl工具,它在接收数据时处理数据。@JBone我的输出是HTTP(我正试图将其推送到Algolia),因此这样它会创建50k HTTP调用,这需要很长时间。相反,Algolia支持批量更新,因此我可以进行50次批量调用,每个调用包含1000个元素。
aggregate {
task_id => "%{source}"
code => "
map['requests'] ||= []
map['requests'] << {
'action' => 'addObject',
'body' => {
'productcode' => event.get('productcode'),
'objectId' => event.get('objectID'),
'stocks' => event.get('stocks')
}
}
event.cancel()
"
push_previous_map_as_event => true
timeout => 3