节流过滤器插件

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

其他版本,请参见 版本化插件文档

获取帮助

编辑

如有任何关于插件的问题,请在 Discuss 论坛中发帖提问。如发现错误或有功能请求,请在 Github 中提交问题。如需查看 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)
...

另一个例子是,如果您想节流事件,以便每小时只接收一个事件,则可以使用以下配置

    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

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

max_counters

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

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

period

编辑

事件第一次出现后到创建新时间段之前的秒数。此时间段针对每个唯一键和每个时间段进行跟踪。此值中允许字段替换。这允许您指定某些类型的事件在特定时间段内节流。

常用选项

编辑

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

add_field

编辑
  • 值类型为 hash
  • 默认值为 {}

如果此过滤器成功,则将任意字段添加到此事件。字段名称可以是动态的,并使用 %{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

编辑
  • 值类型为 array
  • 默认值为 []

如果此过滤器成功,则将任意标签添加到事件。标签可以是动态的,并使用 %{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

编辑
  • 值类型为 boolean
  • 默认值为 true

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

  • 值类型为 string
  • 此设置没有默认值。

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

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

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

periodic_flush

编辑
  • 值类型为 boolean
  • 默认值为 false

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

remove_field

编辑
  • 值类型为 array
  • 默认值为 []

如果此过滤器成功,则从此事件中删除任意字段。字段名称可以是动态的,并使用 %{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

编辑
  • 值类型为 array
  • 默认值为 []

如果此过滤器成功,则从事件中删除任意标签。标签可以是动态的,并使用 %{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。第二个示例还将删除一个令人不快的、不需要的标签。