在Logstash中聚合过滤器上聚合?

时间:2020-06-01 09:11:07

标签: logstash logstash-filter

我有一个库存表,其中有商店/产品的库存:

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
     }
}

这给了我期望的输出,例如:

{
    "productcode": "123", 
    "objectID": "123", 
    "stocks": [
        {
            "ShopId": 1
            "Quantity": 2
        },
        {
            "ShopId": 2
            "Quantity": 5
        }
    ] 
}

现在我可以通过http输出插件将该数据推送到Algolia。 但是我的问题是,成千上万的对象可以进行数千次调用。

这就是为什么我认为使用批处理终结点,将那些对象打包到文件包中的原因。 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

,但不起作用。

同样,使用这种类型的聚合函数,我无法配置要发送到批输出的大包。

我将非常感谢您的帮助或线索。

0 个答案:

没有答案