Ruby 过滤器插件
编辑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)" } }
使用 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 中,变量的名称决定其作用域。以下指南可以帮助您避免*意外*修改共享状态
-
自由使用局部变量,其名称以小写字母或下划线 (
_
) 开头。- 局部变量仅适用于正在处理的单个事件,并且会自动清理。
-
*修改*实例变量时要小心,实例变量的名称以
@
开头,后跟一个小写字母或下划线 (_
)。 -
*避免*使用作用域不限于插件实例的变量,因为它们会导致难以调试的问题,这些问题超出了单个插件或管道的范围
- 类变量:以
@@
开头。 - 全局变量:以
$
开头。 - 常量:以大写字母开头。
- 类变量:以
Ruby 过滤器配置选项编辑
此插件支持以下配置选项以及稍后描述的通用选项。
另请参阅通用选项,了解所有过滤器插件支持的选项列表。
通用选项编辑
以下配置选项受所有过滤器插件支持
设置 | 输入类型 | 必需 |
---|---|---|
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
||
否 |
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
标签)。
id
编辑
- 值类型为 字符串
- 此设置没有默认值。
向插件配置添加唯一的 ID
。如果未指定 ID,Logstash 将生成一个。强烈建议在配置中设置此 ID。当您有两个或多个相同类型的插件时,例如,如果您有 2 个 Ruby 过滤器,这将特别有用。在这种情况下,添加命名 ID 将有助于在使用监控 API 时监控 Logstash。
filter { ruby { id => "ABC" } }
id
字段中的变量替换仅支持环境变量,不支持使用密钥存储中的值。
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
(如果存在)。第二个示例还将删除一个不需要的标签。