Modify

modify 过滤器插件允许您指定规则和条件更改记录。

Example usage

以 JSON 格式的数据作为示例,执行如下操作

  • Key2 重命名为 RenamedKey
  • 如果 OtherKey 不存在,则添加值为 Value3OtherKey 记录映射

输入示例

  1. {
  2. "Key1" : "Value1",
  3. "Key2" : "Value2"
  4. }

输出示例:

  1. {
  2. "Key1" : "Value1",
  3. "RenamedKey" : "Value2",
  4. "OtherKey" : "Value3"
  5. }

Configuration Parameters

Rules

该插件支持以下规则:

操作 参数 1 参数 2 描述
Set STRING:KEY STRING:VALUE 添加带有指定 KEYVALUE 的记录键值对映射。如果 KEY 已经存在,则覆盖
Add STRING:KEY STRING:VALUE 如果 KEY 不存在,则添加带有指定 KEYVALUE 的记录键值对映射
Remove STRING:KEY NONE 删除记录键值对中指定的 KEY
Remove_wildcard WILDCARD:KEY NONE 删除记录键值对中 KEY 通配符匹配的键值对
Remove_regex REGEXP:KEY NONE 删除记录键值对中 KEY 通正则匹配的键值对
Rename STRING:KEY STRING:RENAMED_KEY 如果 KEY 存在且 RENAMED_KEY 不存在,则将 KEY 重命名为 RENAMED_KEY
Hard_rename STRING:KEY STRING:RENAMED_KEY 重命名 KEYRENAMED_KEY。如果 RENAMED_KEY 已经存在,则覆盖
Copy STRING:KEY STRING:COPIED_KEY 如果 KEY 存在且 COPIED_KEY 不存在,则将 KEY 复制为 COPIED_KEY
Hard_copy STRING:KEY STRING:COPIED_KEY 复制 KEYCOPIED_KEY。如果 COPIED_KEY 已经存在,则覆盖
  • 规则不区分大小写,参数区分大小写
  • 过滤器实例中可以设置任意数量的规则
  • 规则按照它们出现的顺序应用,每个规则都根据前一个规则的结果进行操作

Conditions

该插件支持以下条件:

条件 参数 1 参数 2 描述
Key_exists STRING:KEY NONE 指定 KEY 存在则为 true
Key_does_not_exist STRING:KEY STRING:VALUE 指定 KEY 不存在则为 true
A_key_matches REGEXP:KEY NONE 匹配指定正则表达式 KEY 则为 true
No_key_matches REGEXP:KEY NONE 不匹配指定正则表达式 KEY 则为 true
Key_value_equals STRING:KEY STRING:VALUE 指定 KEY 存在且值为 VALUE,则为 true
Key_value_does_not_equal STRING:KEY STRING:VALUE 指定 KEY 存在且值不为 VALUE,则为 true
Key_value_matches STRING:KEY REGEXP:VALUE 指定 KEY 存在且值匹配正则表达式 VALUE,则为 true
Key_value_does_not_match STRING:KEY REGEXP:VALUE 指定 KEY 存在且值不匹配正则表达式 VALUE,则为 true
Matching_keys_have_matching_values REGEXP:KEY REGEXP:VALUE 所有匹配 KEY 的键都具有匹配 VALUE 的值,则为 true
Matching_keys_do_not_have_matching_values REGEXP:KEY REGEXP:VALUE 所有匹配 KEY 的键都具有不匹配 VALUE 的值,则为 true
  • 条件不区分大小写,参数区分大小写
  • 过滤器实例中可以设置任意数量的条件
  • 条件适用于整个过滤器实例及其所有规则。而不是单个规则
  • 要应用规则,所有条件都必须为 true(条件间关系为与)

Example #1 - Add and Rename

要开始记录过滤,您可以从命令行或通过配置文件运行过滤器。以下调用 mem(内存数据指标)输入插件,它输出如下示例记录:

  1. [0] memory: [1488543156, {"Mem.total"=>1016044, "Mem.used"=>841388, "Mem.free"=>174656, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
  2. [1] memory: [1488543157, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
  3. [2] memory: [1488543158, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]
  4. [3] memory: [1488543159, {"Mem.total"=>1016044, "Mem.used"=>841420, "Mem.free"=>174624, "Swap.total"=>2064380, "Swap.used"=>139888, "Swap.free"=>1924492}]

Using command Line

注意: 使用命令行模式要求引号正确解析通配符。建议使用配置文件。

  1. bin/fluent-bit -i mem \
  2. -p 'tag=mem.local' \
  3. -F modify \
  4. -p 'Add=Service1 SOMEVALUE' \
  5. -p 'Add=Service2 SOMEVALUE3' \
  6. -p 'Add=Mem.total2 TOTALMEM2' \
  7. -p 'Rename=Mem.free MEMFREE' \
  8. -p 'Rename=Mem.used MEMUSED' \
  9. -p 'Rename=Swap.total SWAPTOTAL' \
  10. -p 'Add=Mem.total TOTALMEM' \
  11. -m '*' \
  12. -o stdout

Configuration File

  1. [INPUT]
  2. Name mem
  3. Tag mem.local
  4. [OUTPUT]
  5. Name stdout
  6. Match *
  7. [FILTER]
  8. Name modify
  9. Match *
  10. Add Service1 SOMEVALUE
  11. Add Service3 SOMEVALUE3
  12. Add Mem.total2 TOTALMEM2
  13. Rename Mem.free MEMFREE
  14. Rename Mem.used MEMUSED
  15. Rename Swap.total SWAPTOTAL
  16. Add Mem.total TOTALMEM

Result

命令行和配置调用的输出应相同,输出如下:

  1. [2018/04/06 01:35:13] [ info] [engine] started
  2. [0] mem.local: [1522980610.006892802, {"Mem.total"=>4050908, "MEMUSED"=>738100, "MEMFREE"=>3312808, "SWAPTOTAL"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "Service1"=>"SOMEVALUE", "Service3"=>"SOMEVALUE3", "Mem.total2"=>"TOTALMEM2"}]
  3. [1] mem.local: [1522980611.000658288, {"Mem.total"=>4050908, "MEMUSED"=>738068, "MEMFREE"=>3312840, "SWAPTOTAL"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "Service1"=>"SOMEVALUE", "Service3"=>"SOMEVALUE3", "Mem.total2"=>"TOTALMEM2"}]
  4. [2] mem.local: [1522980612.000307652, {"Mem.total"=>4050908, "MEMUSED"=>738068, "MEMFREE"=>3312840, "SWAPTOTAL"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "Service1"=>"SOMEVALUE", "Service3"=>"SOMEVALUE3", "Mem.total2"=>"TOTALMEM2"}]
  5. [3] mem.local: [1522980613.000122671, {"Mem.total"=>4050908, "MEMUSED"=>738068, "MEMFREE"=>3312840, "SWAPTOTAL"=>1046524, "Swap.used"=>0, "Swap.free"=>1046524, "Service1"=>"SOMEVALUE", "Service3"=>"SOMEVALUE3", "Mem.total2"=>"TOTALMEM2"}]

Example #2 - Conditionally Add and Remove

Configuration File

  1. [INPUT]
  2. Name mem
  3. Tag mem.local
  4. Interval_Sec 1
  5. [FILTER]
  6. Name modify
  7. Match mem.*
  8. Condition Key_Does_Not_Exist cpustats
  9. Condition Key_Exists Mem.used
  10. Set cpustats UNKNOWN
  11. [FILTER]
  12. Name modify
  13. Match mem.*
  14. Condition Key_Value_Does_Not_Equal cpustats KNOWN
  15. Add sourcetype memstats
  16. [FILTER]
  17. Name modify
  18. Match mem.*
  19. Condition Key_Value_Equals cpustats UNKNOWN
  20. Remove_wildcard Mem
  21. Remove_wildcard Swap
  22. Add cpustats_more STILL_UNKNOWN
  23. [OUTPUT]
  24. Name stdout
  25. Match *

Result

  1. [2018/06/14 07:37:34] [ info] [engine] started (pid=1493)
  2. [0] mem.local: [1528925855.000223110, {"cpustats"=>"UNKNOWN", "sourcetype"=>"memstats", "cpustats_more"=>"STILL_UNKNOWN"}]
  3. [1] mem.local: [1528925856.000064516, {"cpustats"=>"UNKNOWN", "sourcetype"=>"memstats", "cpustats_more"=>"STILL_UNKNOWN"}]
  4. [2] mem.local: [1528925857.000165965, {"cpustats"=>"UNKNOWN", "sourcetype"=>"memstats", "cpustats_more"=>"STILL_UNKNOWN"}]
  5. [3] mem.local: [1528925858.000152319, {"cpustats"=>"UNKNOWN", "sourcetype"=>"memstats", "cpustats_more"=>"STILL_UNKNOWN"}]

Example #3 - Emoji

Configuration File

  1. [INPUT]
  2. Name mem
  3. Tag mem.local
  4. [OUTPUT]
  5. Name stdout
  6. Match *
  7. [FILTER]
  8. Name modify
  9. Match *
  10. Remove_Wildcard Mem
  11. Remove_Wildcard Swap
  12. Set This_plugin_is_on 🔥
  13. Set 🔥 is_hot
  14. Copy 🔥 💦
  15. Rename 💦 ❄️
  16. Set ❄️ is_cold
  17. Set 💦 is_wet

Result

  1. [2018/06/14 07:46:11] [ info] [engine] started (pid=21875)
  2. [0] mem.local: [1528926372.000197916, {"This_plugin_is_on"=>"🔥", "🔥"=>"is_hot", "❄️"=>"is_cold", "💦"=>"is_wet"}]
  3. [1] mem.local: [1528926373.000107868, {"This_plugin_is_on"=>"🔥", "🔥"=>"is_hot", "❄️"=>"is_cold", "💦"=>"is_wet"}]
  4. [2] mem.local: [1528926374.000181042, {"This_plugin_is_on"=>"🔥", "🔥"=>"is_hot", "❄️"=>"is_cold", "💦"=>"is_wet"}]
  5. [3] mem.local: [1528926375.000090841, {"This_plugin_is_on"=>"🔥", "🔥"=>"is_hot", "❄️"=>"is_cold", "💦"=>"is_wet"}]
  6. [0] mem.local: [1528926376.000610974, {"This_plugin_is_on"=>"🔥", "🔥"=>"is_hot", "❄️"=>"is_cold", "💦"=>"is_wet"}]