节流过滤器插件

编辑
  • 插件版本: v4.0.4
  • 发布日期: 2017-11-07
  • 变更日志

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

获取帮助

编辑

有关插件的问题,请在Discuss论坛中开一个主题。对于错误或功能请求,请在Github中开一个 issue。有关 Elastic 支持的插件列表,请查阅Elastic 支持矩阵

描述

编辑

节流过滤器用于限制事件的数量。该过滤器配置有下限“before_count”、上限“after_count”和时间段。所有通过过滤器的事件都将根据其键和事件时间戳进行计数。只要计数小于“before_count”或大于“after_count”,事件就会被“节流”,这意味着过滤器将被视为成功,并且将添加(或删除)任何标签或字段。

该插件是线程安全的,并且可以正确跟踪过去的事件。

例如,如果您想限制事件,以便在出现 2 次后仅接收一个事件,并且在 10 分钟内不超过 3 个事件,则可以使用以下配置

    period => 600
    max_age => 1200
    before_count => 3
    after_count => 5

这将导致

event 1 - throttled (successful filter, period start)
event 2 - throttled (successful filter)
event 3 - not throttled
event 4 - not throttled
event 5 - not throttled
event 6 - throttled (successful filter)
event 7 - throttled (successful filter)
event x - throttled (successful filter)
period end
event 1 - throttled (successful filter, period start)
event 2 - throttled (successful filter)
event 3 - not throttled
event 4 - not throttled
event 5 - not throttled
event 6 - throttled (successful filter)
...

另一个例子是,如果您想限制事件,以便每小时仅接收 1 个事件,则可以使用以下配置

    period => 3600
    max_age => 7200
    before_count => -1
    after_count => 1

这将导致

event 1 - not throttled (period start)
event 2 - throttled (successful filter)
event 3 - throttled (successful filter)
event 4 - throttled (successful filter)
event x - throttled (successful filter)
period end
event 1 - not throttled (period start)
event 2 - throttled (successful filter)
event 3 - throttled (successful filter)
event 4 - throttled (successful filter)
...

一个常见的用例是使用节流过滤器来限制 3 个之前的事件和 5 个之后的事件,同时使用多个字段作为键,然后使用 drop 过滤器删除节流事件。此配置可能显示为

    filter {
      throttle {
        before_count => 3
        after_count => 5
        period => 3600
        max_age => 7200
        key => "%{host}%{message}"
        add_tag => "throttled"
      }
      if "throttled" in [tags] {
        drop { }
      }
    }

另一种情况是存储所有事件,但仅发送非节流事件的电子邮件,这样在发生系统错误时,操作人员的收件箱就不会被电子邮件淹没。此配置可能显示为

    filter {
      throttle {
        before_count => 3
        after_count => 5
        period => 3600
        max_age => 7200
        key => "%{message}"
        add_tag => "throttled"
      }
    }
    output {
      if "throttled" not in [tags] {
        email {
          from => "[email protected]"
          subject => "Production System Alert"
          to => "[email protected]"
          via => "sendmail"
          body => "Alert on %{host} from path %{path}:\n\n%{message}"
          options => { "location" => "/usr/sbin/sendmail" }
        }
      }
      elasticsearch_http {
        host => "localhost"
        port => "19200"
      }
    }

当收到事件时,事件键存储在 key_cache 中。该键引用 timeslot_cache。根据事件的时间戳,事件被分配到一个时间槽(动态创建)。时间槽计数器递增。当在相同的“期间”内收到下一个事件(相同的键)时,它被分配到相同的时间槽。时间槽计数器再次递增。

如果超过了最大年龄,时间槽将过期。年龄根据最新的事件时间戳和 max_age 配置选项计算。

---[::.. DESIGN ..::]---

- [key_cache] - -- [timeslot_cache] -- | | | @created: 1439839636 | | @latest: 1439839836 | [a.b.c] ⇒ ---------------------- | [1439839636] ⇒ 1 | | [1439839736] ⇒ 3 | | [1439839836] ⇒ 2 | ----------------------

                   +-- [timeslot_cache] --+
                   | @created: eeeeeeeeee |
                   | @latest:  llllllllll |
   [x.y.z]  =>     +----------------------+
                   | [0000000060] => x    |
                   | [0000000120] => y    |
|               |  | [..........] => N    |
+---------------+  +----------------------+

Frank de Jong (@frapex) Mike Pilone (@mikepilone)

仅当大于当前值时才更新

节流过滤器配置选项

编辑

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

设置 输入类型 必需

after_count

数字

before_count

数字

字符串

max_age

数字

max_counters

数字

period

字符串

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

 

after_count

编辑
  • 值类型为数字
  • 默认值为-1

大于此计数的事件将被节流。将此值设置为默认值 -1,将不会根据上限节流任何事件。

before_count

编辑
  • 值类型为数字
  • 默认值为-1

小于此计数的事件将被节流。将此值设置为默认值 -1,将不会根据下限节流任何事件。

  • 这是一个必需的设置。
  • 值类型为字符串
  • 此设置没有默认值。

用于标识事件的键。具有相同键的事件被分组在一起。允许字段替换,因此您可以组合多个字段。

max_age

编辑
  • 值类型为数字
  • 默认值为3600

时间槽的最大年龄。较高的值允许更好地跟踪事件的异步流,但需要更多的内存。根据经验,您应该将此值设置为至少是周期的两倍。或者,将此值设置为周期 + 具有相同键的无序事件之间的最大时间偏移量。如果同时处理无序事件,则低于指定周期的值会产生意外的结果。

max_counters

编辑
  • 值类型为数字
  • 默认值为100000

在减少时间槽的最大年龄之前要存储的最大计数器数。将此值设置为 -1 将阻止上限,并且计数器数量没有约束。此配置值仅应用作内存控制机制,如果达到该值,则可能会导致计数器提前过期。建议保留默认值,并确保选择的键可以限制所需的计数器数量(即,不要使用 UUID 作为键)。

period

编辑

从事件第一次出现到创建新时间槽的周期(以秒为单位)。此周期按唯一的键和每个时间槽进行跟踪。此值中允许字段替换。这使您可以指定某些类型的事件在特定的时间段内进行节流。

通用选项

编辑

所有过滤器插件都支持这些配置选项

add_field

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

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

示例

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

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

add_tag

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

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

示例

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

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

enable_metric

编辑

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

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

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

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

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

periodic_flush

编辑

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

remove_field

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

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

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

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

remove_tag

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

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

示例

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

如果事件的字段为 "somefield" == "hello",则此过滤器在成功后,如果存在标签 foo_hello,则会将其删除。第二个示例也会删除一个令人不快、不想要的标签。