节流过滤器插件编辑

  • 插件版本: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)
...

另一个示例是,如果您想限制事件,以便您每小时只收到 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(默认值)将导致基于下限不会节流任何事件。

key编辑

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

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

max_age编辑

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

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

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

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

id编辑

  • 值类型为 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(如果存在)。第二个示例还将删除一个令人沮丧的、不必要的标签。