【问题标题】:logstash jruby filter returns bad datalogstash jruby 过滤器返回错误数据
【发布时间】:2021-03-05 02:17:58
【问题描述】:

我尝试使用 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
                ],
                    .
                    .
       }

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

【问题讨论】:

  • 您正在使用类变量(以@开头)。这意味着这些值在事件中保持不变。我认为没有理由这样做。如果您得到一个缺少 highNumber 或 lowNumber 字段的事件,那么它将使用前一个事件中的值,这可能是不合适的。
  • 是的,谢谢。修复。类变量是问题
  • 随意标记为已回答 :-)

标签: ruby elasticsearch logstash


【解决方案1】:

您正在使用类变量(以 @ 开头)。这意味着值在事件中保持不变。我认为没有理由这样做。如果您得到一个缺少 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多