Ruby 过滤器插件编辑

  • 插件版本:v3.1.8
  • 发布时间:2022-01-24
  • 更新日志

有关其他版本,请参阅版本化插件文档

获取帮助编辑

如果您对该插件有任何疑问,请在论坛中打开一个主题。对于错误或功能请求,请在Github中打开一个问题。有关 Elastic 支持的插件列表,请参阅Elastic 支持矩阵

描述编辑

执行 Ruby 代码。此过滤器接受内联 Ruby 代码或 Ruby 文件。这两个选项是互斥的,并且工作方式略有不同,如下所述。

此插件的并发安全性取决于您的代码。请务必阅读如何避免并发问题

内联 Ruby 代码编辑

要在过滤器中添加内联 Ruby,请将所有代码放在code选项中。此代码将针对过滤器接收到的每个事件执行。您也可以将 Ruby 代码放在init选项中。它只会在插件的注册阶段执行一次。

例如,要取消 90% 的事件,您可以这样做

    filter {
      ruby {
        # Cancel 90% of events
        code => "event.cancel if rand <= 0.90"
      }
    }

如果需要创建其他事件,则必须使用特定的语法new_event_block.call(event),例如在此示例中复制输入事件

filter {
  ruby {
    code => "new_event_block.call(event.clone)"
  }
}

code选项中定义方法可能会显著降低吞吐量。请改用init选项

使用 Ruby 脚本文件编辑

由于内联代码可能会变得复杂,并且难以在code中的文本字符串内部构建,因此最好使用path选项将 Ruby 代码放在 .rb 文件中。

    filter {
      ruby {
        # Cancel 90% of events
        path => "/etc/logstash/drop_percentage.rb"
        script_params => { "percentage" => 0.9 }
      }
    }

Ruby 脚本文件应定义以下方法

  • register(params):一个可选的注册方法,接收在script_params配置选项中传递的键/值哈希
  • filter(event):一个强制性的 Ruby 方法,它接受一个 Logstash 事件,并且必须返回一个事件数组

下面是drop_percentage.rb Ruby 脚本的示例实现,该脚本删除可配置百分比的事件

# the value of `params` is the value of the hash passed to `script_params`
# in the logstash configuration
def register(params)
	@drop_percentage = params["percentage"]
end

# the filter method receives an event and must return a list of events.
# Dropping an event means not including it in the return array,
# while creating new ones only requires you to add a new instance of
# LogStash::Event to the returned array
def filter(event)
	if rand >= @drop_percentage
		return [event]
	else
		return [] # return empty array to cancel event
	end
end

测试 Ruby 脚本编辑

为了验证您实现的filter方法的行为,Ruby 过滤器插件提供了一个内联测试框架,您可以在其中断言预期结果。您定义的测试将在创建管道时运行,如果测试失败,将阻止管道启动。

您还可以使用 logstash -t标志验证测试是否通过。

例如,在上面的示例中,您可以在drop_percentage.rb Ruby 脚本的底部编写以下测试

def register(params)
  # ..
end

def filter(event)
  # ..
end

test "drop percentage 100%" do
  parameters do
    { "percentage" => 1 }
  end

  in_event { { "message" => "hello" } }

  expect("drops the event") do |events|
    events.size == 0
  end
end

现在我们可以测试我们正在使用的 Ruby 脚本是否已正确实施

% bin/logstash -e "filter { ruby { path => '/etc/logstash/drop_percentage.rb' script_params => { 'drop_percentage' => 0.5 } } }" -t
[2017-10-13T13:44:29,723][INFO ][logstash.filters.ruby.script] Test run complete {:script_path=>"/etc/logstash/drop_percentage.rb", :results=>{:passed=>1, :failed=>0, :errored=>0}}
Configuration OK
[2017-10-13T13:44:29,887][INFO ][logstash.runner          ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash

避免并发问题编辑

当事件流经具有多个工作线程的管道时,此过滤器的单个共享实例最终可能会*同时*处理许多事件。这意味着需要编写您的脚本以避免修改共享状态,除非以线程安全的方式进行。

在 Ruby 中,变量的名称决定其作用域。以下指南可以帮助您避免*意外*修改共享状态

  • 自由使用局部变量,其名称以小写字母或下划线 (_) 开头。

    • 局部变量仅适用于正在处理的单个事件,并且会自动清理。
  • *修改*实例变量时要小心,实例变量的名称以@开头,后跟一个小写字母或下划线 (_)。

    • 实例变量在此管道中的*所有*工作线程之间共享,这些工作线程可能同时处理多个事件。
    • 脚本定义的register函数中或使用init*设置*实例变量是安全的,但在处理事件时不应修改它们,除非通过互斥进行保护。
    • 实例变量*不会*在管道重新启动或插件崩溃时持久化。
  • *避免*使用作用域不限于插件实例的变量,因为它们会导致难以调试的问题,这些问题超出了单个插件或管道的范围

    • 类变量:以@@开头。
    • 全局变量:以$开头。
    • 常量:以大写字母开头。

Ruby 过滤器配置选项编辑

此插件支持以下配置选项以及稍后描述的通用选项

设置 输入类型 必需

code

字符串

init

字符串

path

字符串

script_params

哈希,{}

tag_on_exception

字符串,_rubyexception

tag_with_exception_message

布尔值,_false

另请参阅通用选项,了解所有过滤器插件支持的选项列表。

 

code编辑

  • 值类型为字符串
  • 此设置没有默认值。
  • 此设置不能与path一起使用。

要为每个事件执行的代码。您将有一个可用的event变量,它是事件本身。有关更多信息,请参阅事件 API

init编辑

  • 值类型为字符串
  • 此设置没有默认值。

在 logstash 启动时执行的任何代码

path编辑

  • 值类型为字符串
  • 此设置没有默认值。
  • 此设置不能与code一起使用。

实现filter方法的 Ruby 脚本文件的路径。

script_params编辑

  • 值类型为哈希
  • 默认值为{}

一个键/值哈希,其中包含传递给在path中定义的 Ruby 脚本文件的 register 方法的参数。

tag_on_exception编辑

  • 值类型为字符串
  • 默认值为_rubyexception

如果 Ruby 代码(内联或基于文件)导致异常,则添加到事件的标签。

tag_with_exception_message编辑

如果为true,则向事件添加一个标签,该标签是tag_with_exception_message和异常消息的串联。

通用选项编辑

以下配置选项受所有过滤器插件支持

add_field编辑

  • 值类型为哈希
  • 默认值为{}

如果此过滤器成功,请向此事件添加任何任意字段。字段名称可以是动态的,并且可以使用%{field}包含事件的一部分。

示例

    filter {
      ruby {
        add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
      }
    }
    # You can also add multiple fields at once:
    filter {
      ruby {
        add_field => {
          "foo_%{somefield}" => "Hello world, from %{host}"
          "new_field" => "new_static_value"
        }
      }
    }

如果事件的字段"somefield" == "hello",则此过滤器在成功时将添加字段foo_hello(如果存在),其值为上述值,并将%{host}部分替换为事件中的该值。第二个示例还将添加一个硬编码字段。

add_tag编辑

  • 值类型为数组
  • 默认值为[]

如果此过滤器成功,则向事件添加任意标签。标签可以是动态的,并且可以使用 %{field} 语法包含事件的一部分。

示例

    filter {
      ruby {
        add_tag => [ "foo_%{somefield}" ]
      }
    }
    # You can also add multiple tags at once:
    filter {
      ruby {
        add_tag => [ "foo_%{somefield}", "taggedy_tag"]
      }
    }

如果事件的字段 "somefield" == "hello",则此过滤器在成功时将添加标签 foo_hello(第二个示例当然会添加 taggedy_tag 标签)。

enable_metric编辑

为特定的插件实例禁用或启用指标记录。默认情况下,我们会记录所有可以记录的指标,但您可以为特定的插件禁用指标收集。

id编辑

  • 值类型为 字符串
  • 此设置没有默认值。

向插件配置添加唯一的 ID。如果未指定 ID,Logstash 将生成一个。强烈建议在配置中设置此 ID。当您有两个或多个相同类型的插件时,例如,如果您有 2 个 Ruby 过滤器,这将特别有用。在这种情况下,添加命名 ID 将有助于在使用监控 API 时监控 Logstash。

    filter {
      ruby {
        id => "ABC"
      }
    }

id 字段中的变量替换仅支持环境变量,不支持使用密钥存储中的值。

periodic_flush编辑

定期调用过滤器 flush 方法。可选。

remove_field编辑

  • 值类型为数组
  • 默认值为[]

如果此过滤器成功,则从此事件中删除任意字段。字段名称可以是动态的,并且可以使用 %{field} 示例包含事件的一部分

    filter {
      ruby {
        remove_field => [ "foo_%{somefield}" ]
      }
    }
    # You can also remove multiple fields at once:
    filter {
      ruby {
        remove_field => [ "foo_%{somefield}", "my_extraneous_field" ]
      }
    }

如果事件的字段 "somefield" == "hello",则此过滤器在成功时将删除名称为 foo_hello 的字段(如果存在)。第二个示例将删除另一个非动态字段。

remove_tag编辑

  • 值类型为数组
  • 默认值为[]

如果此过滤器成功,则从事件中删除任意标签。标签可以是动态的,并且可以使用 %{field} 语法包含事件的一部分。

示例

    filter {
      ruby {
        remove_tag => [ "foo_%{somefield}" ]
      }
    }
    # You can also remove multiple tags at once:
    filter {
      ruby {
        remove_tag => [ "foo_%{somefield}", "sad_unwanted_tag"]
      }
    }

如果事件的字段 "somefield" == "hello",则此过滤器在成功时将删除标签 foo_hello(如果存在)。第二个示例还将删除一个不需要的标签。