logstash jruby 过滤器 returns 错误数据

logstash jruby filter returns bad data

我尝试使用 logstash 将一些数据提取到 elastic 中。我有两个字符串,我必须将它们转换为整数,并且根据它们是偶数还是奇数,我正在创建一个数组,其中包含这些数字之间的所有偶数或奇数。

例如,对于两个数字 361371,我正在创建一个 [361, 363, 365, 367, 369, 371] 的数组。我有一个 ruby 脚本返回数组并设置事件。

这是清理字符串的地方-

filter {
  mutate {
    add_field => { "range" => ""}
  }
  mutate {
    gsub => [
      "lowNumber", "[^0-9]", "",
      "highNumber", "[^0-9]", ""
    ]
  }
}

这里是 ruby 脚本-

def filter(event)
    @low = event.get('lowNumber').to_i
    @high = event.get('highNumber').to_i
    
    # check if the low number is even or odd
    filter = @low.even? ? 'even?' : 'odd?'
    
    # create an array with all numbers between low and high
    @arr = (@low..@high).to_a.select{|i| i.send(filter) }

    event.set('range', @arr)

    return [event]
end

我没有收到任何错误消息,但有时它会完美地创建范围,而其他时候它会创建完全垃圾数组。

这是返回的良好数据的示例-

{
            .
            .
            .
            "highNumber" => "546",
            .
            .
            "lowNumber" => "542"
            "range" => [
            [0] 542,
            [1] 544,
            [2] 546
        ],
            .
            .
}
{
                .
                .
                .
                "highNumber" => "616",
                .
                .
                "lowNumber" => "616"
                "range" => [
                [0] 616
            ],
                .
                .
    }

这是很多情况下发生的事情-

{
                    .
                    .
                    .
                    "highNumber" => "627",
                    .
                    .
                    "lowNumber" => "627"
                    "range" => [
                       627.......13227
                ],
                    .
                    .
       }

这似乎没有规律或错误。有没有人指出任何可以让我了解这里发生的事情的事情?

您正在使用 class 个变量(以 @ 开头)。这意味着这些值在事件中保持不变。我认为没有理由这样做。如果您得到一个缺少 highNumber 或 lowNumber 字段的事件,那么它将使用前一个事件的值,这可能是不合适的。我建议你改成

low = event.get('lowNumber').to_i
high = event.get('highNumber').to_i

if low and high
    # check if the low number is even or odd
    ...
end