跳转到: 导航, 搜索

SystemUsageData

注意:此页面及其通知可能已过时。 完整的旧版通知列表可以在 nova.rpc.LegacyValidatingNotifier 代码 中找到。Nova 已经迁移到发送版本化的通知,这些通知在开发者文档中描述:https://docs.openstack.org/developer/nova/notifications.html#versioned-notifications

总结

Nova 管理员希望获取系统使用情况数据,用于计费、成本核算或监控目的。

发布说明

系统使用情况数据以 Nova 的 通知系统 中的使用事件的形式从 Nova 发出。通知系统可以配置为通过 nova 的日志记录设施发出事件,或者将它们发送到一系列 AMQP 队列(每个通知优先级一个)。系统使用情况作为具有 INFO 优先级的通知事件发出。不同类型的使用事件通过通知的 event_type 进行区分,这是一个分层点状字符串,例如 *compute.instance.create*,这使得可以轻松地对使用情况进行分组以进行聚合。使用通知可以是即时的,在发生特定使用量增量(例如创建实例)时创建,也可以是周期性的,由周期性任务(例如 cron 作业)生成,并涵盖特定时间段的使用情况。除了标准的 Nova 通知优先级、通知时间戳和 event_type 之外,使用通知还包含一个数据负载,该负载因 event_type 而异。这表示为键值对的 json 格式哈希。某些键,例如 tenant_id 将始终存在于任何使用通知中,其他键将是与该 event_type 相关的数据(例如,与实例相关的通知将包含描述该实例的数据)。

有关更深入的示例,请参阅 NotificationEventExamples

有一个外部应用程序 (https://github.com/rackerlabs/yagi) 可用,它可以从 AMQP 队列读取通知并提供 Atom API。此应用程序生成通知的 Atom feed,并通过 PubSubHubbub (PSH) 发布 feed,以便有效地将数据分发给订阅者。

原理

作为系统集成商,我们需要能够让第三方系统查询 Nova 中的使用信息,以确定如何向客户收取平台使用费。

企业客户还需要能够确定使用数据,但原因不同。例如,云管理员可能希望确定几个月未使用的虚拟机,以便可以回收资源并重新分配资源。一些 IT 部门可能会为他们的用户实施配额系统。

请注意,Nova 本身不应关心计费,但它需要呈现一个使用数据 feed,外部应用程序可以使用该 feed 来聚合请求时间段的计费数据。

用户故事

  1. 作为系统集成商,我需要检索使用数据,以便能够正确地向我的客户收费。
  2. 作为系统集成商或企业云管理员,我希望随着时间的推移监控使用数据,以便优化我的资源利用率。
  3. 作为支持多个项目的企业或机构,我需要核算每个项目消耗的资源,以便正确满足会计和预算标准。
  4. 作为系统集成商,我需要向多个第三方系统提供使用数据,而无需为每个系统构建自定义接口,以便有效地利用我的劳动力。

前提条件

使用数据可以按租户 ID 聚合(如在 openstack-accounting 蓝图中定义)。(即,始终存在租户 ID)

有一个计费系统,它不是 OpenStack 的一部分。发票、计费和客户管理在 OpenStack/Nova 外部处理。Nova 仅了解“租户 ID”(如在 openstack-accounting 蓝图中定义)。

租户 ID 与 Keystone 中的租户 ID 概念相同,并在 Nova 内部称为“项目 ID”。

如果 Nova 安装在多个区域(也称为“zone”)中,使用数据将不会跨区域;即使在多个区域中使用相同的租户 ID,也必须在 Nova 外部聚合该数据。

设计与实现

对于每个活动都会生成两个事件。以前,事件仅在活动完成时生成,但现在在活动开始时会生成一个事件,并且像以前一样,在活动结束时生成一个事件。这些标记为“compute.instance.<activity>.start”和“compute.instance.<activity>.end”。“.end”事件与先前预期的事件相同。

事件类型和 Payload 数据

这里提供了一个大多数 Nova 事件的示例(已屏蔽值):http://paste.openstack.org/show/54140/

compute.instance.create.{start,error,end}

  • 创建新实例时生成的使用通知。
  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的实例类型(“flavor”)的名称。(字符串)
  • instance_type_id:此实例的实例类型(“flavor”)的 Nova ID。(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例创建自的 Glance 镜像 URL。(字符串)
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)
  • message:描述通知的高级消息。如果事件类型为“create.error”,则将包含错误详细信息。

compute.instance.delete.start/.end

  • 删除实例时生成的使用通知。
  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的实例类型(“flavor”)的名称。(字符串)
  • instance_type_id:此实例的实例类型(“flavor”)的 Nova ID。(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例创建自的 Glance 镜像 URL。(字符串)
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)

compute.instance.rebuild.start/.end

  • 重建实例时生成的使用通知。
  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的实例类型(“flavor”)的名称。(字符串)
  • instance_type_id:此实例的实例类型(“flavor”)的 Nova ID。(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例正在重建自的 Glance 镜像 URL。(字符串)
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)

compute.instance.resize.prep.start/.end

  • 开始实例调整/迁移时生成的使用通知。
  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的当前(调整前)实例类型(“flavor”)的名称。(字符串)
  • instance_type_id:此实例的当前(调整前)实例类型(“flavor”)的 Nova ID。(字符串)
  • new_instance_type:此实例的新(调整后)实例类型(“flavor”)的名称。(字符串)
  • new_instance_type_id:此实例的新(调整后)实例类型(“flavor”)的 Nova ID。(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例创建自的 Glance 镜像 URL。(字符串)
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)

compute.instance.resize.confirm.start/.end

  • 用户确认实例调整/迁移后生成的使用通知。
  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的当前实例类型(“flavor”)的名称。(即,它已调整到的类型。)(字符串)
  • instance_type_id:此实例的当前实例类型(“flavor”)的 Nova ID。(即,它已调整到的类型。)(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例创建自的 Glance 镜像 URL。(字符串)
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)

compute.instance.resize.revert.start/.end

  • 用户撤销实例调整/迁移后生成的使用通知。
  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的当前实例类型(“flavor”)的名称。(即,它已撤销回的类型。)(字符串)
  • instance_type_id:此实例的当前实例类型(“flavor”)的 Nova ID。(即,它已撤销回的类型。)(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例创建自的 Glance 镜像 URL。(字符串)
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)

compute.instance.exists

此活动没有 .start/.end 事件...只有“compute.instance.exists”事件。

  • 由 instance-usage-audit cron 作业生成的周期性使用通知。这些使用情况是为在指定审计期间处于活动状态的每个实例生成的。
  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的实例类型(“flavor”)的名称。(字符串)
  • instance_type_id:此实例的实例类型(“flavor”)的 Nova ID。(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例创建自的 Glance 镜像 URL。(字符串)
  • image_meta:表示从实例构建的镜像的元数据的键值对字典。
  • audit_period_begining:审计周期的开始时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • audit_period_ending:审计周期的结束时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • bandwidth:列出此实例连接的每个网络的使用的带宽的哈希。键将是网络标签,值将是包含键“bw_in”和“bw_out”的哈希,分别列出该实例在该网络上在该审计期间使用的传入和传出带宽。带宽以字节为单位报告。
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)

compute.instance.update

当服务器的 VM 或任务状态发生变化时,会生成此事件;例如,当服务器从 BUILDING 移动到 ACTIVE 或 ERROR 时。

默认情况下禁用此通知。

要启用 VM 状态更改时的通知,请将配置标志“notify_on_state_change”设置为“vm_state”。

要启用 VM 状态或任务状态更改时的通知,请将配置标志“notify_on_state_change”设置为“vm_and_task_state”。

  • tenant_id:拥有此实例的租户 ID(字符串)
  • user_id:拥有此实例的用户 ID(字符串)
  • instance_id:此实例的 Nova 实例 ID(字符串)
  • instance_type:此实例的实例类型(“flavor”)的名称。(字符串)
  • instance_type_id:此实例的实例类型(“flavor”)的 Nova ID。(字符串)
  • display_name:用户选择的实例显示名称。
  • created_at:在 Nova 中创建此实例记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • image_ref_url:此实例创建自的 Glance 镜像 URL。(字符串)
  • image_metadata:表示从实例构建的镜像的元数据的键值对数组(数组)
  • audit_period_begining:审计周期的开始时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • audit_period_ending:审计周期的结束时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • bandwidth:列出此实例连接的每个网络的使用的带宽的哈希。键将是网络标签,值将是包含键“bw_in”和“bw_out”的哈希,分别列出该实例在该网络上在该审计期间使用的传入和传出带宽。带宽以字节为单位报告。
  • old_state:实例的先前状态。(字符串,例如“active”或“deleted”)
  • state:实例的当前状态。(字符串,例如“active”或“deleted”)
  • state_description:实例当前状态的附加人类可读描述。
  • fixed_ips:分配给实例的 IP 地址列表,格式如下:[{"floating_ips": [], "meta": {}, "type": "fixed", "version": 4, "address": "10.0.0.9", "label": "public"}]。
  • memory_mb:此实例的内存分配(以 MB 为单位)
  • disk_gb:此实例的磁盘分配(以 GB 为单位)

volume.create.start/.end

  • 创建新卷时生成的使用通知。
  • tenant_id:拥有此卷的租户 ID(字符串)
  • user_id:拥有此卷的用户 ID(字符串)
  • volume_id:此卷的 Nova 卷 ID(字符串)
  • volume_type:此卷的卷类型名称。(字符串)
  • display_name:用户选择的卷显示名称。
  • created_at:在 Nova 中创建此卷记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • status:卷的当前状态。(字符串,例如“available”或“attached”)
  • size:此卷的磁盘分配大小。
  • snapshot_id:卷快照的 Nova ID。

volume.delete.start/.end

  • 删除卷时生成的使用通知。
  • tenant_id:拥有此卷的租户 ID(字符串)
  • user_id:拥有此卷的用户 ID(字符串)
  • volume_id:此卷的 Nova 卷 ID(字符串)
  • volume_type:此卷的卷类型名称。(字符串)
  • display_name:用户选择的卷显示名称。
  • created_at:在 Nova 中创建此卷记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • status:卷的当前状态。(字符串,例如“available”或“attached”)
  • size:此卷的磁盘分配大小。
  • snapshot_id:卷快照的 Nova ID。

volume.usage

此活动没有 .start/.end 事件...只有“volume.usage”事件。

  • 由 volume-usage-audit cron 作业生成的周期性使用通知。这些使用情况是为在指定审计期间处于活动状态的每个卷生成的。
  • tenant_id:拥有此卷的租户 ID(字符串)
  • user_id:拥有此卷的用户 ID(字符串)
  • volume_id:此卷的 Nova 卷 ID(字符串)
  • volume_type:此卷的卷类型名称。(字符串)
  • display_name:用户选择的卷显示名称。
  • created_at:在 Nova 中创建此卷记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • launched_at:此实例上次由 hypervisor 启动的时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • audit_period_begining:审计周期的开始时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • audit_period_ending:审计周期的结束时间戳。(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • status:卷的当前状态。(字符串,例如“available”或“attached”)
  • size:此卷的磁盘分配大小。
  • snapshot_id:卷快照的 Nova ID。

servergroup.create

此活动没有 .start/.end 事件...只有“servergroup.create”事件。

  • 服务器组创建通知。
  • server_group_id:刚创建的服务器组的 ID(字符串)
  • name:刚创建的服务器组的名称(字符串)

servergroup.delete

此活动没有 .start/.end 事件...只有“servergroup.delete”事件。

  • 服务器组删除通知
  • server_group_id:已删除的服务器组的 ID(字符串)

servergroup.update

此活动没有 .start/.end 事件...只有“servergroup.update”事件。

  • 服务器组更新通知。
  • server_group_id:刚更新的服务器组的 ID(字符串)
  • members:刚更新的服务器组的新成员(字符串)

servergroup.addmember

此活动没有 .start/.end 事件...只有“servergroup.addmember”事件。

  • 服务器组添加成员通知。
  • server_group_id:刚添加了一些新成员的服务器组的 ID(字符串)
  • instance_uuids:刚添加到服务器组的实例 UUID(字符串)

orchestration.stack.{create,update,delete,suspend,resume}.{start,error,end}

堆栈操作和状态更改时生成的使用通知。

  • tenant_id:拥有此堆栈的租户 ID(字符串)
  • user_id:拥有此实例的用户名(字符串)(已弃用:请使用 user_identityusername
  • user_identity:拥有此实例的用户 ID(字符串)
  • username:拥有此实例的用户名(字符串)
  • stack_identity:Heat 堆栈 ID(arn)(字符串)
  • stack_name:用户选择的堆栈显示名称。
  • created_at:在 Heat 中创建此堆栈记录的时间戳(字符串,格式为“YYYY-MM-DD hh:mm:ss.ssssss”)
  • state:堆栈的当前状态。(字符串,例如“CREATE_COMPLETE”或“DELETE_COMPLETE”)
  • state_reason: 状态原因。 (字符串)
  • outputs: 模板输出列表 (字典列表)
  • parameters: 用户提供的参数列表 (字典列表)

orchestration.autoscaling.{start,error,end}

除了以上信息外,当发生自动伸缩时会发送通知 

  • adjustment_type : ChangeInCapacity|ExactCapacity|PercentChangeInCapacity (字符串)
  • groupname : GroupInstance 的唯一名称 (例如 as1-WebServerGroup-nsdsvnlxzmdk) (字符串)
  • capacity : 组中的成员数量 (整数)
  • adjustment : 调整大小,负数表示缩减 (整数)

附加事件

这些事件用于操作监控/性能分析,不应直接影响使用/计费。它们都遵循与上述调用相同的签名。其中一些通知可能由上述操作调用 (例如,从删除操作触发的关机)。

compute.instance.shutdown.start/.end

compute.instance.power_off.start/.end

compute.instance.power_on.start/.end

compute.instance.snapshot.start/.end

compute.instance.resize.start/.end

compute.instance.finish_resize.start/.end

compute.instance.suspend.start/.end