Monasca/Architecture Details
目录
概述
Monasca 是一个开源的、多租户的、高度可扩展的、高性能的、容错的监控即服务解决方案,它与 OpenStack 集成。它使用 REST API 进行高速指标处理和查询,并具有流式告警引擎和通知引擎。
以下内容来自维基的旧版本,约2015年,为了历史参考而保留。
架构 (约2015年)
- 监控代理 (monasca-agent):一个现代的基于 Python 的监控代理,由几个子组件组成,支持系统指标,例如 CPU 利用率和可用内存,Nagios 插件,statsd 以及许多内置的服务检查,例如 MySQL、RabbitMQ 等。
- 监控 API (monasca-api):一个定义良好且文档完善的 RESTful API,用于监控,主要关注以下概念和领域
- 指标:实时存储和查询大量指标。
- 统计信息:查询指标的统计信息。
- 告警定义:创建、更新、查询和删除告警定义。
- 告警:查询和删除告警历史记录。
- 用于创建由告警子表达式和逻辑运算符组成的复合告警的简单表达语法。
- 可以将告警严重性与告警关联。
- 存储完整的告警状态转换历史记录并可查询,以便进行后续的根本原因分析 (RCA) 或高级分析。
- 通知方法:创建和删除通知方法,并将它们与告警关联,例如电子邮件。支持在告警状态转换发生时直接通过电子邮件通知用户。
- Monasca API 具有 Java 和 Python 实现。
- 持久化器 (monasca-persister):从 MessageQ 消费指标和告警状态转换,并将它们存储在指标和告警数据库中。
- 持久化器具有 Java 和 Python 实现。
- 转换和聚合引擎 (monasca-transform):转换指标名称和值,例如 delta 或基于时间的导数计算,并创建发布到 Message Queue 的新指标。转换引擎尚未可用。
- 异常和预测引擎:评估预测和异常,并生成预测指标以及异常可能性和异常分数。异常和预测引擎目前处于原型状态。
- 阈值引擎 (monasca-thresh):计算指标上的阈值,并在超过阈值时将告警发布到 MessageQ。基于 Apache Storm,一个免费且开放的分布式实时计算系统。
- 通知引擎 (monasca-notification):从 MessageQ 消费告警状态转换消息,并发送通知,例如告警的电子邮件。通知引擎基于 Python。
- 分析引擎 (monasca-analytics):从 MessageQ 消费告警状态转换和指标,并进行异常检测和告警聚类/关联。
- 消息队列:一个第三方组件,主要接收从监控 API 发布的大量指标和从阈值引擎发布告警状态转换消息,这些消息由其他组件(例如持久化器和通知引擎)消费。消息队列还用于发布和消费系统中的其他事件。目前,支持基于 Kafka 的消息队列。Kafka 是一个高性能、分布式、容错且可扩展的消息队列,内置了持久性。我们将研究其他替代方案,例如 RabbitMQ,事实上在我们的先前实现中支持 RabbitMQ,但由于 RabbitMQ 的性能、规模、持久性和高可用性限制,我们已迁移到 Kafka。
- 指标和告警数据库:一个第三方组件,主要存储指标和告警状态历史记录。目前,支持 Vertica 和 InfluxDB。Cassandra 的支持正在进行中。
- 配置数据库:一个第三方组件,用于存储系统中许多配置和其他信息。目前,支持 MySQL。PostgreSQL 的支持正在进行中。
- 监控客户端 (python-monascaclient):一个 Python 命令行客户端和库,用于通信和控制监控 API。监控客户端使用 OpenStack Heat Python 客户端作为框架编写。监控客户端还具有一个 Python 库“monascaclient”,类似于其他 OpenStack 客户端,可用于快速构建其他功能。监控客户端库由监控 UI、Ceilometer 发布者和其他组件使用。
- 监控 UI:一个 Horizon 仪表板,用于可视化 OpenStack 云的整体健康状况和状态。
- Ceilometer 发布者:一个 Ceilometer 的多发布者插件,未显示,它将样本转换为并发布到监控 API。
大多数组件在其各自的存储库中都有描述。但是,没有用于使用的第三方组件的存储库,因此我们在此描述一些相关详细信息。
消息模式
消息队列
一个分布式、高性能、可扩展、高可用性的消息队列,用于在监控系统中分发指标、告警和事件。目前,基于 Kafka。
消息
有几个消息通过 MessageQ 由 Monasca 的各个组件发布和消费。请参阅 消息模式。
指标和告警数据库
一个高性能的分析数据库,可以实时存储大量的指标和告警,并支持交互式查询。目前支持 Vertica 和 InfluxDB。
Vertica 使用的 SQL 模式如下
- MonMetrics.Measurements:存储发送的实际测量值。
- id:测量值的整数 ID。
- definition_dimensions_id:对 DefinitionDimensions 的引用。
- time_stamp
- value
- MonMetrics.DefinitionDimensions
- id:(defintion_id, dimension_set_id) 的 sha1 哈希值
- definition_id:对 Definitions.id 的引用
- dimension_set_id:对 Dimensions.dimension_set_id 的引用
- MonMetrics.Definitions
- id:(name, tenant_id, region) 的 sha1 哈希值
- name:指标名称。
- tenant_id:提交指标的 tenant_id。
- region:提交指标的区域。
- MonMetric.Dimensions
- dimension_set_id:指标的一组维度的 sha1 哈希值。
- name:维度名称。
- value:维度值。
配置数据库
配置数据库存储所有配置信息。目前基于 MySQL。
SQL 模式如下
- alarm
- id
- tenant_id
- name
- description
- expression
- state
- actions_enabled
- created_at
- updated_at
- deleted_at
- alarm_action
- alarm_id
- alarm_state
- action_id
- notification_method
- id
- tenant_id
- name
- type
- address
- created_at
- updated_at
- sub_alarm
- id
- alarm_id
- function
- metric_name
- operator
- threshold
- period
- periods
- state
- created_at
- updated_at
- sub_alarm_dimension
- sub_alarm_id
- dimension_name
- value
事件
Monasca 中对实时事件流处理的支持正在进行中。有关更多详细信息,请参阅链接 Monasca/Events。
日志记录
Monasca 中对日志记录的支持正在讨论中。有关更多详细信息,请参阅链接 Monasca/Logging。
转换和聚合引擎
有关更多详细信息,请参阅链接 Monasca/Transform。
分析
对异常检测和告警聚类/关联的支持正在进行中。有关更多详细信息,请参阅链接 Monasca/Analytics。
监控
启用和使用监控 Monasca 的状态正在讨论中。有关更多详细信息,请参阅链接 Monasca/Monitoring_Of_Monasca
UI/UX 支持
正在讨论添加更多对常见 UI/UX 查询的支持。有关更多详细信息,请参阅链接 Monasca/UI_UX_Support
Keystone 要求
Monasca 依赖于 keystone 运行,并且存在关于必须存在的 keystone 配置的要求。
- API 的端点必须在 keystone 中注册为“monasca”服务。
- API 必须具有用于验证其收到的 keystone 令牌的管理员令牌。
- 对于使用 Monasca 的每个项目,必须存在两个用户,一个将位于“monasca-agent”角色中,并由机器上运行的 monasca-agent 使用。另一个不应位于该角色中,可用于登录 UI、使用 CLI 或直接查询 API。
指标序列之后
本节描述了将指标发布到 Monasca API 所涉及的操作序列。
- 将指标发布到 Monasca API。
- Monasca API 验证请求并将其发布到 Message Queue。
- 持久化器从 Message Queue 消费指标并将其存储在指标存储中。
- 转换引擎从 Message Queue 消费指标,对指标执行转换和聚合操作,并将创建的指标发布回 Message Queue。
- 阈值引擎从 Message Queue 消费指标并评估告警。如果告警状态发生变化,则将“alarm-state-transitioned-event”发布到 Message Queue。
- 通知引擎从 Message Queue 消费“alarm-state-transitioned-events”,评估它们是否具有关联的通知方法,并发送适当的通知,例如电子邮件。
- 持久化器从 Message Queue 消费“alarm-state-transitioned-event”并将其存储在告警状态历史记录存储中。
告警管理器
本节描述了包括告警分组、抑制和静默的新功能。
示例
- 静默
SilenceRule1 = '{"alarm-silencing-definition-created": {"name": "silence_rule_1", "matchers": {"severity": "LOW"}, "start_time": "2017-02-21 20:00:00", "end_time": "2017-02-21 22:00:00"}}' 两个告警转换:AT1 和 AT2 AT1_severity = HIGH AT2_severity = LOW
输出:AT2 被静默,AT1 发送通知。SilenceRule1 在 "end_time"="2017-02-21 22:00:00" 后过期。
- 抑制
InhibitionRule1 = '{"alarm-inhibition-definition-created": {"name": "inhibit_rule_1","source":{"severity":"HIGH"},"target":{"severity":"LOW"}, "equals":["tenantId"], "exclusions": {"alarm_name": "vm is dead"}}}' 三个告警转换:AT1、AT2 和 AT3 AT1_tenantId = "d42bc" AT2_tenantId = "d42bc" AT3_tenantId = "d42bc" AT1_severity = HIGH AT2_severity = LOW AT3_severity = LOW AT1_alarm_name = "cpu high" AT2_alarm_name = "memory high" AT3_alarm_name = "vm is dead" AT1_state = ALARM AT2_state = ALARM AT3_state = ALARM
输出:AT1 是源告警,将发送通知。AT2 是目标告警,将被抑制。AT3 匹配排除项,将立即发送通知。
- 分组场景 1
GroupingRule1 = '{"alarm-grouping-definition-created": {"name": "group_rule_1", "matchers": ["hostname"], "id": "b7163","repeat_interval": "2h", "group_wait": "30s", "exclusions": {"alarm_name": "cpu_percent_high"}, "tenantId": " d42bc", "alarm_actions": ["cd892"], "ok_actions": ["ad892"], "undetermined_actions": ["cf892"]}}'
三个告警转换:AT1、AT2 和 AT3
AT1_hostname = host1 AT2_hostname = host1 AT3_hostname = host2 AT1_alarm_name = cpu_percent_high AT2_alarm_name = cpu_system_perc_high AT3_alarm_name = cpu_percent_high AT1_state = ALARM AT2_state = ALARM AT3_state = ALARM
输出:AT1 和 AT3 匹配排除项并立即发送通知。生成分组通知“group_notification_rule_1_host1_alarm[1]”并使用 alarm_actions ["cd892"] 发送。AT1、AT2、AT3 告警定义与 alarm_actions、ok_actions 或 undermined_actions 没有关联。
- 分组场景 2
GroupingRule2 = '{"alarm-grouping-definition-created": {"name": "group_rule_2", "matchers": ["hostname"], "id": "b7163","repeat_interval": "2h", "group_wait": "30s", "tenantId": " d42bc", "alarm_actions": ["cd892"], "ok_actions": ["ad892"], "undetermined_actions": ["cf892"]}}'
三个告警转换:AT1 具有 "alarm_actions": ["123ab"],AT2 具有 "alarm_actions": ["cd839"] 和 AT3
AT1_hostname = host1 AT2_hostname = host1 AT3_hostname = host2 AT1_state = ALARM AT2_state = ALARM AT3_state = ALARM
输出:生成两个分组通知“group_notification_rule_2_host1_alarm[2]”和“group_notification_rule_2_host2_alarm[1]”。两者都使用 alarm_actions ["cd892"]。由于 AT1 和 AT2 具有与其关联的自己的 alarm_actions,因此还将发送另外两个通知。
- 静默和分组
SilenceRule1 = '{"alarm-silencing-definition-created": {"name": "silence_rule_1", "matchers": {"severity": "LOW"}, "start_time": "1487269470498", "end_time": "1587269470498"}}'
GroupingRule2 = '{"alarm-grouping-definition-created": {"name": "group_rule_2", "matchers": ["hostname"], "id": "b7163","repeat_interval": "2h", "group_wait": "30s", "tenantId": " d42bc", "alarm_actions": ["cd892"], "ok_actions": ["ad892"], "undetermined_actions": ["cf892"]}}'
四个告警转换:AT1、AT2、AT3 和 AT4
静默规则:AT1_severity = HIGH AT2_severity = LOW AT3_severity = HIGH AT4_severity = HIGH
分组规则:AT1_hostname = host1 AT2_hostname = host1 AT3_hostname = host2 AT4_hostname = host1 AT1_state = ALARM AT2_state = ALARM AT3_state = OK AT4_state = ALARM
输出:生成两个分组通知“group_notification_rule_2_host1_alarm[2]”使用 alarm action "cd892" 和“group_notification_rule_2_host2_ok[1]”使用 ok action "ad892"。AT2 被静默,因此不包含在 group_notification_rule_2_host1 计数中。AT1、AT2、AT3、AT4 告警定义与 alarm_actions、ok_actions 或 undermined_actions 没有关联。
- 静默和抑制(源告警被静默)
SilenceRule2 = '{"alarm-silencing-definition-created": {"name": "silence_rule_2", "matchers": {"severity": "HIGH, "hostname": "host1"}, "start_time": "2017-02-21 15:00:00", "end_time": "2017-02-21 21:00:00"}}'
InhibitionRule1 = '{"alarm-inhibition-definition-created": {"name": "inhibit_rule_1","source":{"severity":"HIGH"},"target":{"severity":"LOW"}, "equals":["tenantId"]}}'
告警转换:AT1、AT2
抑制规则:AT1_state = ALARM AT2_state = ALARM AT1_tenantId = "d42bc" AT2_tenantId = "d42bc" AT1_severity = HIGH AT2_severity = LOW
静默规则:AT1_hostname = host1 AT2_hostname = host2 AT1_severity = HIGH AT2_severity = LOW
输出:未发送任何通知。对于抑制,AT1 是源告警,AT2 是目标告警。但同时,AT1 由于匹配静默规则而被静默。
- 抑制和分组
InhibitionRule1 = '{"alarm-inhibition-definition-created": {"name": "inhibit_rule_1","source":{"severity":"HIGH"},"target":{"severity":"LOW"}, "equals":["tenantId"]}}'
GroupingRule1 = '{"alarm-grouping-definition-created": {"name": "group_rule_1", "matchers": ["hostname"], "id": "b7163", "repeat_interval": "2h", "group_wait": "30s", "tenantId": " d42bc", "alarm_actions": ["cd892"], "ok_actions": ["ad892"], "undetermined_actions": ["cf892"]}}'
警报转换:AT1, AT2, AT3
抑制规则:AT1_tenantId = "d42bc" AT2_tenantId = "d42bc" AT3_tenantId = "d42bc" AT1_severity = HIGH AT2_severity = LOW AT3_severity = HIGH AT1_state = OK AT2_state = ALARM AT3_state = ALARM
分组规则:AT1_hostname = host1 AT2_hostname = host2 AT3_hostname = host1 AT1_state = OK AT2_state = ALARM AT3_state = ALARM
输出:AT2 由于其严重性较低而被抑制。AT3 是源警报。由于 AT1 处于 OK 状态,因此它不是源警报。对于分组,AT1 和 AT3 具有相同的 hostname 但状态不同。因此,将发送两个分组通知:“group_notification_rule_1_host1_ok[1]”和“group_notification_rule_1_host1_alarm[1]”。
- 已静默、抑制和分组
SilenceRule2 = '{"alarm-silencing-definition-created": {"name": "silence_rule_2", "matchers": {"severity": "HIGH, "hostname": "host1"}, "start_time": "2017-02-21 15:00:00", "end_time": "2017-02-21 21:00:00"}}'
InhibitionRule1 = '{"alarm-inhibition-definition-created": {"name": "inhibit_rule_1","source":{"severity":"HIGH"},"target":{"severity":"LOW"}, "equals":["tenantId"]}}'
GroupingRule1 = '{"alarm-grouping-definition-created": {"name": "group_rule_1", "matchers": ["hostname"], "id": "b7163", "repeat_interval": "2h", "group_wait": "30s", "tenantId": " d42bc", "alarm_actions": ["cd892"], "ok_actions": ["ad892"], "undetermined_actions": ["cf892"]}}'
警报转换:AT1, AT2, AT3 和 AT5
静默规则:AT1_severity = HIGH AT1_hostname = host1 (已静默) AT2_severity = LOW AT2_hostname = host2 AT3_severity = HIGH AT3_hostname = host1(已静默) AT5_severity = HIGH AT5_hostname = host3
抑制规则:AT1_tenantId = "d42bc" AT2_tenantId = "d42bc" AT3_tenantId = "d42bc" AT5_tenantId = "d42bc" AT1_state = ALARM AT2_state = ALARM AT3_state = OK AT5_state = UNDETERMINED AT1_severity = HIGH (源) AT2_severity = LOW (目标) AT3_severity = HIGH AT5_severity = HIGH
分组规则:AT1_hostname = host1 AT2_hostname = host2 AT3_hostname = host1 AT5_hostname = host3
输出:AT1 位于“group_notification_rule_1_host1_alarm”组中并被静默。AT3 位于“group_notification_rule_1_host1_ok”组中并被静默。AT2 位于“group_notification_rule_1_host2_alarm”组中并被抑制。AT5 位于“group_notification_rule_1_host3_undetermined”组中,并将使用 undetermined action "cf892" 发送通知“group_notification_rule_1_host3_undetermined[1]”。
开发环境
- Monasca DevStack 插件
- DevStack 是 OpenStack 的主要开发环境。
- Monasca DevStack 插件安装 Monasca 服务、Agent、Horizon 监控面板和 Grafana
- README 在,https://github.com/openstack/monasca-api/tree/master/devstack
- 最佳入门方式是使用 Vagrant 和 Vagrantfile,地址为:https://github.com/openstack/monasca-api/blob/master/devstack/Vagrantfile。
- Monasca 在 LaunchPad 上。https://launchpad.net/monasca
- Monasca 项目源代码。https://git.openstack.org/cgit/?q=monasca
编码规范
- Python:所有 Python 代码均符合 OpenStack 标准,地址为:https://docs.openstack.org/developer/hacking/。
- 注意,Monasca 中的所有组件,除了阈值引擎,都已移植到 Python。
- Java:Monasca 的几个组件可作为 Java 提供。OpenStack 没有 Java 编码标准。我们采用了 Google Java Style,地址为:https://ggdocs.cn/styleguide/javaguide.html。
- 标准规定行长为 80 或 100。我们采用了 100。
技术
Monasca 使用许多第三方技术
- Apache Kafka (http://kafka.apache.org):Apache Kafka 是一种重新构想的发布-订阅消息传递系统,作为分布式提交日志。Kafka 是一种高性能、分布式、容错且可扩展的消息队列,内置了持久性。
- Apache Storm (http://storm.incubator.apache.org/):Apache Storm 是一个免费且开源的分布式实时计算系统。Storm 使可靠地处理无界数据流变得容易,就像 Hadoop 对批处理所做的那样,对实时处理一样。
- ZooKeeper (https://zookeeper.net.cn/):Kafka 和 Storm 使用。
- MySQL:MySQL 支持作为配置数据库。
- POSTgres:通过 Hibernate 和 SQLAlchemy 支持 POSTgres,用于配置数据库。
- Vagrant (http://www.vagrantup.com/):Vagrant 提供易于配置、可重现且可移植的工作环境,建立在行业标准技术之上,并由单个一致的工作流程控制,以帮助最大限度地提高您和您的团队的生产力和灵活性。
- Dropwizard (https://dropwizard.github.io/dropwizard/):Dropwizard 将 Java 生态系统中稳定、成熟的库组合到一个简单、轻量级的包中,让您可以专注于完成工作。Dropwizard 具有开箱即用的复杂配置、应用程序指标、日志记录、操作工具等支持,让您和您的团队能够在最短的时间内交付高质量的 Web 服务。
- InfluxDB (http://influxdb.com/):一个开源分布式时间序列数据库,没有外部依赖。InfluxDB 支持指标数据库。
- Vertica (http://www.vertica.com):一个商业企业级 SQL 分析数据库,具有高度可扩展性。它提供内置的自动高可用性,并在数据库内分析以及压缩和存储大量数据方面表现出色。可在 https://my.vertica.com/community/ 处获得免费社区版 Vertica,该版本可以存储高达 1 TB 的数据,没有时间限制。Vertica 支持指标数据库。
- Cassandra:对 Cassandra 的指标数据库的支持正在进行中。
许可
版权所有 (c) 2014, 2015 Hewlett-Packard Development Company, L.P。
根据 Apache 许可证 2.0(“许可证”)获得许可;您不得在不遵守许可证的情况下使用此文件。您可以从以下位置获取许可证的副本:
https://apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,根据许可证分发的软件以“原样”基础分发,不提供任何形式的保证或条件,无论是明示的还是暗示的。请参阅许可证以获取管理权限和限制的具体语言。

