Neutron 计量系统

Neutron 计量服务使操作员能够统计 OpenStack 环境的进出流量。该概念非常简单,操作员可以创建计量标签,并决定这些标签是应用于所有项目(租户)还是应用于特定项目。然后,操作员需要在计量标签中创建流量规则。流量规则用于匹配进出 OpenStack 环境的流量,并将数据包和字节的统计信息发送到通知队列,由 Ceilometer(或其他消耗该队列的系统)进行进一步处理。发送到队列中的消息类型为 event。因此,需要在 Ceilometer 中添加/启用事件处理配置。

计量代理程序具有以下配置

  • driver:用于实现计量规则的驱动程序。默认值为 neutron.services.metering.drivers.noop,这意味着我们在网络主机中不执行任何操作。目前仅实现了一个驱动程序 neutron.services.metering.drivers.iptables.iptables_driver.IptablesMeteringDriver。因此,目前仅支持 iptables

  • measure_interval:用于从网络层面收集字节和数据包信息的秒数间隔。默认值为 30 秒;

  • report_interval:用于生成数据报告(消息)的秒数间隔。默认值为 300 秒。

  • granular_traffic_data:定义计量代理驱动程序是否应以粒状方式呈现流量数据,而不是将所有项目的流量数据和标签分配到的所有路由器的流量数据分组在一起。默认值为 False,以保持向后兼容性。

非粒状流量消息

非粒状(granular_traffic_data = False)流量消息(此处也称为遗留)的格式如下;请记住,如果共享标签,则计数器是应用标签的所有项目和所有路由器的总计数器。

{
 "pkts": "<the number of packets that matched the rules of the labels>",
 "bytes": "<the number of bytes that matched the rules of the labels>",
 "time": "<seconds between the first data collection and the last one>",
 "first_update": "timeutils.utcnow_ts() of the first collection",
 "last_update": "timeutils.utcnow_ts() of the last collection",
 "host": "<neutron metering agent host name>",
 "label_id": "<the label id>",
 "tenant_id": "<the tenant id>"
 }

first_updatelast_update 时间戳表示报告间隔内首次和最后一次数据收集发生的时间。另一方面,time 表示这两个时间戳之间的差值。

当标签未共享时,tenant_id 才保持一致。否则,它将包含代理程序启动时处理的最后一个路由器和最后一个项目的项目 ID。换句话说,在处理共享标签时,最好不要使用它。

以这种配置模式生成的所有消息都作为 l3.meter 事件发送到消息总线。

粒状流量消息

粒状(granular_traffic_data = True)流量消息允许操作员获取共享计量标签的粒状信息。因此,当配置为 shared=True 并应用于环境中的所有项目/路由器时,单个标签将以粒状方式生成数据。

它(计量代理程序)将按以下粒度计算流量计数器数据。

  • label – 给定标签的所有流量计数器。必须记住,一个标签可以分配给多个路由器。因此,此粒度代表应用标签的所有项目和所有路由器的所有数据的总和。

  • router – 分配给路由器的所有标签的所有流量计数器。

  • project – 项目拥有的所有标签的所有路由器的所有流量计数器。

  • router-label – 路由器和给定标签的所有流量计数器。

  • project-label – 项目的所有路由器具有给定标签的所有流量计数器。

此处呈现的每个粒度都以不同的事件类型发送到消息总线。粒度和事件类型之间的映射如下所示。

  • label – 事件类型 l3.meter.label

  • router – 事件类型 l3.meter.router

  • project – 事件类型 l3.meter.project

  • router-label – 事件类型 l3.meter.label_router

  • project-label – 事件类型 l3.meter.label_project

此外,我们还有附加到消息的元数据,具体取决于粒度。以下是粒度和可用元数据之间的映射。

  • labelrouter-labelproject-label 粒度 – 具有元数据 label_idlabel_namelabel_sharedproject_id(如果共享,此值将对 label 粒度显示 all)和 router_id(仅用于 router-label 粒度)。

  • router 粒度 – 具有 router_idproject_id 元数据。

  • project 粒度仅具有 project_id 元数据。

该消息还将包含一些可以在遗留模式中找到的属性,例如 bytespktstimefirst_updatelast_updatehost。以下是包含所有可能属性的 JSON 消息示例。

{
    "resource_id": "router-f0f745d9a59c47fdbbdd187d718f9e41-label-00c714f1-49c8-462c-8f5d-f05f21e035c7",
    "project_id": "f0f745d9a59c47fdbbdd187d718f9e41",
    "first_update": 1591058790,
    "bytes": 0,
    "label_id": "00c714f1-49c8-462c-8f5d-f05f21e035c7",
    "label_name": "test1",
    "last_update": 1591059037,
    "host": "<hostname>",
    "time": 247,
    "pkts": 0,
    "label_shared": true
}

resource_id 是正在监视的“资源”的唯一标识符。在这里,我们将资源视为我们处理的任何粒度。

计量代理程序.ini 示例

以下是计量代理程序 init 文件中可以使用的所有可能的配置。

默认值

ovs_use_veth
类型:

布尔值

默认值:

False

是否使用 veth 作为 OVS 接口。支持内核有限的命名空间支持(例如 RHEL 6.5)以及路由器网关端口上的速率限制,只要将 ovs_use_veth 设置为 True。

interface_driver
类型:

字符串

默认值:

openvswitch

用于管理虚拟接口的驱动程序。

rpc_response_max_timeout
类型:

整数

默认值:

600

等待 RPC 调用响应的最大秒数。

driver
类型:

字符串

默认值:

neutron.services.metering.drivers.noop.noop_driver.NoopMeteringDriver

计量驱动程序

measure_interval
类型:

整数

默认值:

30

两次计量测量之间的间隔

report_interval
类型:

整数

默认值:

300

两次计量报告之间的间隔

granular_traffic_data
类型:

布尔值

默认值:

False

定义计量代理驱动程序是否应以粒状方式呈现流量数据,而不是将所有项目的流量数据和标签分配到的所有路由器的流量数据分组在一起。默认值为 False,以保持向后兼容性。

debug
类型:

布尔值

默认值:

False

可变:

此选项可以在不重启的情况下更改。

如果设置为 true,日志级别将被设置为 DEBUG,而不是默认的 INFO 级别。

log_config_append
类型:

字符串

默认值:

<None>

可变:

此选项可以在不重启的情况下更改。

日志配置文件的名称。此文件将附加到任何现有的日志配置文件。有关日志配置文件的详细信息,请参阅 Python 日志模块文档。请注意,当使用日志配置文件时,所有日志配置都设置在配置文件中,并且其他日志配置选项将被忽略(例如,log-date-format)。

已弃用的变体

Group

名称

DEFAULT

log-config

DEFAULT

log_config

log_date_format
类型:

字符串

默认值:

%Y-%m-%d %H:%M:%S

定义日志记录中的 %(asctime)s 的格式字符串。默认值:上述值。如果设置了 log_config_append,则此选项将被忽略。

log_file
类型:

字符串

默认值:

<None>

(可选) 将日志输出发送到的日志文件名。如果没有设置默认值,日志将输出到 stderr,如 use_stderr 中定义的那样。如果设置了 log_config_append,则此选项将被忽略。

已弃用的变体

Group

名称

DEFAULT

logfile

log_dir
类型:

字符串

默认值:

<None>

(可选) 用于相对 log_file 路径的基本目录。如果设置了 log_config_append,则此选项将被忽略。

已弃用的变体

Group

名称

DEFAULT

logdir

watch_log_file
类型:

布尔值

默认值:

False

使用设计为监视文件系统的日志记录处理程序。当日志文件被移动或删除时,此处理程序将立即使用指定的路径打开新的日志文件。只有在指定了 log_file 选项并且使用 Linux 平台时才有意义。如果设置了 log_config_append,则此选项将被忽略。

警告

此选项已弃用,将来可能会被静默忽略。

原因:

已知此功能长期存在问题,并且依赖于未维护的库

use_syslog
类型:

布尔值

默认值:

False

使用 syslog 进行日志记录。现有的 syslog 格式已弃用,以后将更改为符合 RFC5424。如果设置了 log_config_append,则此选项将被忽略。

use_journal
类型:

布尔值

默认值:

False

启用 journald 进行日志记录。如果正在 systemd 环境中运行,您可能希望启用 journal 支持。这样做将使用 journal 本机协议,其中包括结构化元数据以及日志消息。如果设置了 log_config_append,则此选项将被忽略。

syslog_log_facility
类型:

字符串

默认值:

LOG_USER

接收日志行的 syslog facility。如果设置了 log_config_append,则此选项将被忽略。

use_json
类型:

布尔值

默认值:

False

使用 JSON 格式进行日志记录。如果设置了 log_config_append,则此选项将被忽略。

use_stderr
类型:

布尔值

默认值:

False

将日志输出记录到标准错误。如果设置了 log_config_append,则此选项将被忽略。

log_color
类型:

布尔值

默认值:

False

(可选) 根据日志级别设置“color”键。此选项仅在将日志记录到 stderr 或 stdout 时生效。如果设置了 log_config_append,则此选项将被忽略。

log_rotate_interval
类型:

整数

默认值:

1

日志文件轮换前的时间量。如果未设置 log_rotation_type 为“interval”,则此选项将被忽略。

log_rotate_interval_type
类型:

字符串

默认值:

days

有效值:

秒、分钟、小时、天、星期几、午夜

轮换间隔类型。在安排下一次轮换时,使用上次文件更改时间(或服务启动时间)。

max_logfile_count
类型:

整数

默认值:

30

最大轮换日志文件数。

max_logfile_size_mb
类型:

整数

默认值:

200

日志文件最大大小(MB)。如果“log_rotation_type”未设置为“size”,则此选项将被忽略。

log_rotation_type
类型:

字符串

默认值:

none

有效值:

interval, size, none

日志轮换类型。

可能的值

interval

以预定义的时间间隔轮换日志。

size

当日志达到预定义的大小后轮换日志。

none

不轮换日志文件。

logging_context_format_string
类型:

字符串

默认值:

%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(global_request_id)s %(request_id)s %(user_identity)s] %(instance)s%(message)s

用于带有上下文的日志消息的格式字符串。由 oslo_log.formatters.ContextFormatter 使用

logging_default_format_string
类型:

字符串

默认值:

%(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s

当上下文未定义时,用于日志消息的格式字符串。由 oslo_log.formatters.ContextFormatter 使用

logging_debug_format_suffix
类型:

字符串

默认值:

%(funcName)s %(pathname)s:%(lineno)d

当消息的日志级别为 DEBUG 时,附加到日志消息的额外数据。由 oslo_log.formatters.ContextFormatter 使用

logging_exception_prefix
类型:

字符串

默认值:

%(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s

将此格式作为异常输出的每一行的前缀。由 oslo_log.formatters.ContextFormatter 使用

logging_user_identity_format
类型:

字符串

默认值:

%(user)s %(project)s %(domain)s %(system_scope)s %(user_domain)s %(project_domain)s

定义 logging_context_format_string 中使用的 %(user_identity)s 的格式字符串。由 oslo_log.formatters.ContextFormatter 使用

default_log_levels
类型:

列表

默认值:

['amqp=WARN', 'amqplib=WARN', 'boto=WARN', 'qpid=WARN', 'sqlalchemy=WARN', 'suds=INFO', 'oslo.messaging=INFO', 'oslo_messaging=INFO', 'iso8601=WARN', 'requests.packages.urllib3.connectionpool=WARN', 'urllib3.connectionpool=WARN', 'websocket=WARN', 'requests.packages.urllib3.util.retry=WARN', 'urllib3.util.retry=WARN', 'keystonemiddleware=WARN', 'routes.middleware=WARN', 'stevedore=WARN', 'taskflow=WARN', 'keystoneauth=WARN', 'oslo.cache=INFO', 'oslo_policy=INFO', 'dogpile.core.dogpile=INFO']

包日志级别列表,格式为 logger=LEVEL 对。如果设置了 log_config_append,则此选项将被忽略。

publish_errors
类型:

布尔值

默认值:

False

启用或禁用错误事件的发布。

instance_format
类型:

字符串

默认值:

"[instance: %(uuid)s] "

与日志消息一起传递的实例的格式。

instance_uuid_format
类型:

字符串

默认值:

"[instance: %(uuid)s] "

与日志消息一起传递的实例 UUID 的格式。

rate_limit_interval
类型:

整数

默认值:

0

日志速率限制的间隔,秒数。

rate_limit_burst
类型:

整数

默认值:

0

每 rate_limit_interval 允许记录的最大消息数。

rate_limit_except_level
类型:

字符串

默认值:

CRITICAL

有效值:

CRITICAL, ERROR, INFO, WARNING, DEBUG, ‘’

速率限制使用的日志级别。日志级别大于或等于 rate_limit_except_level 的日志不会被过滤。空字符串表示所有级别都不会被过滤。

fatal_deprecations
类型:

布尔值

默认值:

False

启用或禁用弃用信息的致命状态。

agent

report_interval
类型:

浮点数

默认值:

30

节点向服务器报告状态的秒数;应小于 agent_down_time,最好是 agent_down_time 的一半或更少。

log_agent_heartbeats
类型:

布尔值

默认值:

False

记录 agent 心跳。

ovs

ovsdb_connection
类型:

字符串

默认值:

tcp:127.0.0.1:6640

OVSDB 后端的连接字符串。将用于所有 OVSDB 命令和 ovsdb-client 监控时使用

ssl_key_file
类型:

字符串

默认值:

<None>

与 OVSDB 交互时要使用的 SSL 私钥文件。在使用 “ssl:” 前缀的 ovsdb_connection 时需要

ssl_cert_file
类型:

字符串

默认值:

<None>

与 OVSDB 交互时要使用的 SSL 证书文件。在使用 “ssl:” 前缀的 ovsdb_connection 时需要

ssl_ca_cert_file
类型:

字符串

默认值:

<None>

与 OVSDB 交互时要使用的证书颁发机构 (CA) 证书。在使用 “ssl:” 前缀的 ovsdb_connection 时需要

ovsdb_debug
类型:

布尔值

默认值:

False

启用 OVSDB 调试日志

ovsdb_timeout
类型:

整数

默认值:

10

OVSDB 命令的超时时间(秒)。如果超时到期,OVSDB 命令将因 ALARMCLOCK 错误而失败。

bridge_mac_table_size
类型:

整数

默认值:

50000

Neutron OVS 代理管理的桥接上可以学习的最大 MAC 地址数。超出合理范围的值(10 到 1,000,000)可能会被 Open vSwitch 根据文档覆盖。

igmp_snooping_enable
类型:

布尔值

默认值:

False

启用集成桥接的 IGMP 侦听。如果将此选项设置为 True,则将在集成桥接中启用对 Internet 组管理协议 (IGMP) 的支持。

igmp_flood
类型:

布尔值

默认值:

False

多播数据包(报告除外)无条件地转发到桥接逻辑网络与物理网络之间的端口。

igmp_flood_reports
类型:

布尔值

默认值:

True

多播报告无条件地转发到桥接逻辑网络与物理网络之间的端口。

igmp_flood_unregistered
类型:

布尔值

默认值:

False

此选项启用或禁用将未注册的多播数据包广播到所有端口。如果为 False,则交换机仅将未注册的多播数据包发送到连接到多播路由器的端口。