跳转到: 导航, 搜索

Ceilometer/blueprints/configurable-event-definitions

简介

Ceilometer 的事件目前比较有限,因为添加的特征非常基础,转换是硬编码的,这给部署 Ceilometer 的用户带来了困难,他们可能对想要处理和存储的数据有不同的需求。

为了更容易地允许用户提取他们需要的内容,我们应该添加一种从配置文件驱动的将通知转换为事件的方法。 这将包括描述如何将通知主体中的字段映射到特征,以及用于执行任何程序化转换(拆分字符串、强制大小写等)的可选插件。 通知到事件的映射将针对每个 event_type 定义,并且可以使用通配符。 如果通知中存在相应的字段且非空,则将特征添加到事件中。(作为特殊情况,对于非文本特征,空字符串被视为 null。 这是由于一些 OpenStack 项目(主要是 Nova)使用空字符串表示 null 日期。)

保留当前行为:如果未找到定义文件,将记录警告,但将假定为空定义集。 默认情况下,任何没有在定义文件中为其定义事件定义的通知都将被转换为具有一组最小默认特征的事件。 可以通过在 ceilometer.conf 文件中设置一个标志来更改此设置。 如果设置为 True,则文件中没有为其定义事件的任何通知都将被丢弃。 这可能是你想要的,通知系统设计上非常健谈(通知理念是“告诉我们一切,我们会忽略我们不需要的”),所以你可能希望忽略那些嘈杂的通知,如果你不使用它们的话。

有一组默认特征(所有类型均为 TEXT)如果通知包含相关数据,则将将其添加到所有事件中

  • message_id: (所有通知都应该有此项) 通知的 UUID
  • service: (所有通知都应该有此项) 通知发布者
  • tenant_id
  • request_id

这些不必在事件定义中指定,它们会自动添加,但可以为给定的 event_type 覆盖它们的定义。

配置设置

ceilometer.conf 中有两个配置设置会影响事件转换

  • allow_dropping_of_notifications: (默认值: False) 如果设置为 True,则没有匹配事件定义的通知将被丢弃。(通知当此值为 True 时才会被丢弃)
  • event_definitions_cfg_file: (默认值: "event_definitions.yaml") 事件定义配置文件名(YAML 格式)

定义文件格式

事件定义文件采用 YAML 格式。 它由一个事件定义列表组成,这些定义是映射。 顺序很重要,定义列表将以反向顺序(文件中最后一个定义到第一个)扫描,以找到与通知的 event_type 匹配的定义。 该定义将用于生成事件。 反向排序的原因是通常希望拥有更通用的通配符定义(例如 compute.instance.*)以及所有这些事件的通用特征集,然后是几个更具体的事件定义(例如 compute.instance.exists),它们具有所有上述特征,以及一些额外的特征。 这允许你首先放置通用定义,然后放置特定定义,并使用 YAML 映射包含语法来避免复制所有特征定义。

事件定义

每个事件定义都是一个映射,包含两个键(两者都是必需的)

  • event_type: 这是一个列表(或者一个字符串,将被视为一个 1 元素列表),该列表指定此定义将处理的 event_type。 这些可以使用 Unix shell glob 语法进行通配符匹配。 以“!” 开头的排除列表将排除任何列出的类型进行匹配。 如果仅列出排除项,则该定义将匹配任何不匹配排除项的内容。
  • traits: 这是一个映射,键是特征名称,值是特征定义。

特征定义

每个特征定义都是一个映射,包含以下键

  • type (可选): 此特征的数据类型(字符串)。 有效选项是:textintfloatdatetime。 如果未指定,则默认为 text
  • fields: 用于指定要从此通知中提取的特征的字段的路径规范。 规范可以编写为匹配多个可能的字段,特征的值将从存在的且在通知中具有非空值的匹配字段派生。 默认情况下,该值将是第一个这样的字段。(插件可以更改此设置,如果他们希望的话)。 这通常是一个字符串,但是,为了方便起见,它可以指定为规范列表,这将匹配所有这些字段。(有关此语法,请参阅字段路径规范。)
  • plugin (可选): 这是一个映射(为了方便起见,此值也可以指定为字符串,该字符串被解释为要加载的插件的名称,不带任何参数),包含以下键
    • name: (字符串) 要加载的插件的名称
    • parameters: (可选) 要传递给插件初始化器的关键字参数的映射。(请参阅每个插件的文档,以了解它接受哪些参数。)

字段路径规范

路径规范定义了从 JSON 通知主体中提取哪些字段来提供给定特征的值。 路径可以使用点语法(例如 payload.host)指定。 还支持方括号语法(例如 payload[host])。 在任何一种情况下,如果查找的字段的键包含特殊字符,例如“.”,则需要用引号(单引号或双引号)括起来,如下所示

         payload.image_meta.'org.openstack__1__architecture'

用于字段规范的语法是 JSONPath 的变体,并且非常灵活。(请参阅:https://github.com/kennknowles/python-jsonpath-rw 了解更多信息)

示例定义文件

---
- event_type: compute.instance.*
  traits: &instance_traits
    user_id:
      fields: payload.user_id
    instance_id:
      fields: payload.instance_id
    host:
      fields: publisher_id
      plugin:
        name: split
        parameters:
          segment: 1
          max_split: 1
    service_name:
      fields: publisher_id
      plugin: split
    instance_type_id:
      type: int
      fields: payload.instance_type_id
    os_architecture:
      fields: payload.image_meta.'org.openstack__1__architecture'
    launched_at:
      type: datetime
      fields: payload.launched_at
    deleted_at:
      type: datetime
      fields: payload.deleted_at
- event_type: 
    - compute.instance.exists
    - compute.instance.update
  traits:
    <<: *instance_traits
    audit_period_beginning:
      type: datetime
      fields: payload.audit_period_beginning
    audit_period_ending:
      type: datetime
      fields: payload.audit_period_ending

特征插件

特征插件可用于对通知字段中的值执行简单的程序化转换,例如拆分字符串、将值小写、将混乱的日期转换为 ISO 格式等。 它们使用特征定义中的参数初始化(如果有),这些参数可以自定义其行为以用于给定的特征。 它们将使用来自通知的所有匹配字段调用,因此它们可以从多个字段派生一个值。 即使未找到匹配字段路径的字段,也会调用该插件,这允许插件设置默认值(如果需要)。 插件还可以通过返回 None 来拒绝一个值,这将导致不添加该特征。 如果插件返回任何其他内容,则特征的值将设置为插件返回的内容(强制转换为特征的适当类型)。