Monasca/Message Schema
概述
Monasca 支持两种主要的消息分类,这些消息通过 MessageQ 发布和消费
- 值对象,例如指标和事件,这些对象从外部数据源(例如 Monasca Agent)发送到 API。
- 域事件,表示系统中某个实体的变化,如下所示
- 告警定义被 API 创建、更新或删除。
- 告警被 API 更新或删除。
- 告警状态由阈值引擎转换。
目前,Monasca 发布和消费的消息格式仅供内部使用。这些消息采用 JSON 格式,在很大程度上是在没有充分考虑对外部或第三方组件、应用程序和服务提供支持的情况下开发的。虽然当前的 message 格式对于内部使用来说是可以的,并且外部应用程序也可以轻松使用,但这样做存在风险。
因此,我们正在审查 Monasca 使用的消息,并创建一个正式的消息模式规范,该规范由 Monasca 使用,以便外部第三方组件、应用程序和服务可以轻松地从 MessageQ 发布和消费,而不必担心未来的更改。我们计划定义消息模式,并将其视为外部规范,以便第三方可以与 Monasca 合作,而不必担心未来的更改。这样做的一个用例是启用第三方数据分析应用程序。
目前,Monasca 系统中的各个组件通过 MessageQ 发布和消费的消息如下
| 消息 | 由谁生成 | 由谁消费 | Kafka Topic | 描述 |
|---|---|---|---|---|
| AlarmDefinitionCreatedEvent | API | 阈值引擎 | events | 当 API 创建告警定义时,AlarmDefinitionCreatedEvent 会发布到 MessageQ。 |
| AlarmDefinitionDeletedEvent | API | 阈值引擎 | events | 当 API 删除告警定义时,AlarmDefinitionDeletedEvent 会发布到 MessageQ。 |
| AlarmDefinitionUpdatedEvent | API | 阈值引擎 | events | 当 API 更新告警定义时,AlarmDefinitionUpdatedEvent 会发布到 MessageQ。 |
| AlarmDeletedEvent | API | 阈值引擎 | events | 当 API 删除告警时,AlarmDeletedEvent 会发布到 MessageQ。 |
| AlarmUpdatedEvent | API | 阈值引擎 | events | 当 API 更新告警时,AlarmUpdatedEvent 会发布到 MessageQ。 |
| AlarmStateTransitionedEvent | 阈值引擎 | 通知引擎、持久化器 | alarm-state-transitions | 当告警状态转换时,例如从 OK 变为 Alarm 或 Alarm 变为 OK,AlarmStateTransitionedEvent 会发布到 MessageQ,并由持久化器持久化,并由通知引擎处理。API 可以查询 AlarmStateTransitionedEvent 的历史记录。 |
| AlarmNotification | 通知引擎 | 持久化器 | alarm-notifications | 当前不支持。当通知引擎处理告警并发送通知时,此事件会发布到 MessageQ。告警通知由持久化器持久化,并可由 API 查询。数据库维护所有事件的历史记录。 |
| 指标 | API、转换和聚合引擎 | 持久化器、阈值引擎 | metrics | 发送到 API 或由转换引擎、事件引擎或异常引擎创建的指标会发布到 MessageQ。 |
| 事件 | API、转换引擎、事件引擎 | 持久化器、事件引擎 | raw-events, transformed-events | 发送到 API 或由转换引擎或事件引擎创建的事件会发布到 MessageQ。 |
告警定义事件
当告警定义被 API 创建、删除或更新时,会创建告警定义事件。这些事件主要由阈值引擎消费,以维护系统中告警定义的同步内存模型,而无需查询或轮询配置数据库。当阈值引擎启动时,它会查询配置数据库以获取所有告警定义,以初始化其内部的告警定义模型。随后,阈值引擎会消费 AlarmDefinitionEvents 以更新其内部的告警定义模型。
我们应该考虑重命名成员。例如,AlarmDefinitionCreatedEvent 具有成员 alarmName。
所有 AlarmDefinition*Event 目前仅包含阈值引擎所需的数据。它们应该更新为包含有关更改的所有数据,例如操作
AlarmDefinitionCreatedEvent
- String tenantId
- String alarmDefinitionId
- String alarmName
- String alarmDescription
- String alarmExpression
- Map<String, AlarmSubExpression> alarmSubExpressions
- List<String> matchBy
示例
{
"alarm-definition-created": {
"tenantId": "69a6aeb64a5f4704b88dcf1985d43184",
"alarmDefinitionId": "0fe0b88f-8b06-459a-8bed-50d114c4f07b",
"alarmName": "example-alarm-definition",
"alarmDescription": "example-alarm-definition-description",
"alarmExpression": "max(cpu.user_perc) > 100",
"alarmSubExpressions": {
"7b790964-67de-4f70-b625-cca5da0119d3": {
"function": "MAX",
"metricDefinition": {
"name": "cpu.user_perc",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "devstack"
},
"operator": "GT",
"threshold": 100,
"period": 60,
"periods": 1,
"expression": "max(cpu.user_perc) > 100.0"
}
},
"matchBy": [
"hostname"
]
}
}
AlarmDefinitionDeletedEvent
- String alarmDefinitionId
- Map<String, MetricDefinition> subAlarmMetricDefinitions
示例
{
"alarm-definition-deleted": {
"alarmDefinitionId": "19afaacf-35ad-44c0-a02f-96a0a20d6e6d",
"subAlarmMetricDefinitions": {
"c5fa8686-597b-420b-97ed-648637c1f702": {
"name": "cpu.user_perc",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "devstack"
}
}
}
}
}
AlarmDefinitionUpdatedEvent
- String tenantId
- String alarmDefinitionId
- String alarmName
- String alarmDescription
- String alarmExpression
- String severity
- List<String> matchBy
- boolean alarmActionsEnabled
- Map<String, AlarmSubExpression> oldAlarmSubExpressions
- Map<String, AlarmSubExpression> changedSubExpressions
- Map<String, AlarmSubExpression> unchangedSubExpressions
- Map<String, AlarmSubExpression> newAlarmSubExpressions
示例
{
"alarm-definition-updated": {
"tenantId": "69a6aeb64a5f4704b88dcf1985d43184",
"alarmDefinitionId": "0fe0b88f-8b06-459a-8bed-50d114c4f07b",
"alarmName": "example-alarm-definition",
"alarmDescription": "example-alarm-definition-description",
"alarmExpression": "max(cpu.user_perc) > 100",
"severity": "HIGH",
"matchBy": [
"hostname"
],
"alarmActionsEnabled": true,
"oldAlarmSubExpressions": {},
"changedSubExpressions": {},
"unchangedSubExpressions": {
"7b790964-67de-4f70-b625-cca5da0119d3": {
"function": "MAX",
"metricDefinition": {
"name": "cpu.user_perc",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "devstack"
}
},
"operator": "GT",
"threshold": 100,
"period": 60,
"periods": 1,
"expression": "max(cpu.user_perc) > 100.0"
}
},
"newAlarmSubExpressions": {}
}
}
告警事件
告警由阈值引擎在响应发送到系统并匹配告警定义的新指标时创建。目前,阈值引擎在发生这种情况时不会创建 AlarmCreatedEvents。请注意,告警不是由 API 创建的。
当告警被 API 删除或更新时,会创建 AlarmDeletedEvent 和 AlarmUpdatedEvent。AlarmDeletedEvents 和 AlarmUpdateEvents 主要由阈值引擎消费,以便在 API 更新或删除告警时删除或更新其内部的内存告警模型。
AlarmCreatedEvent
AlarmCreatedEvent 过去是由 API 在创建新告警时发布的。在我们添加告警定义功能后,告警不再由 API 创建,而是由阈值引擎创建。但是,阈值引擎不会发布 AlarmCreatedEvent,因为它曾经是唯一的消费者。我们可能应该考虑将来在阈值引擎中发布 AlarmCreatedEvent。
- String tenantId
- String alarmId
- String alarmName
- String alarmExpression
- Map<String, AlarmSubExpression> alarmSubExpressions
示例
{
"metric": {
"name": "cpu.user_perc",
"timestamp": 1418844000,
"value": 100
},
"meta": {
"tenantId": "69a6aeb64a5f4704b88dcf1985d43184",
"region": "useast"
},
"creation_time": 1418844001
}
AlarmDeletedEvent
- String tenantId
- String alarmId
- List<MetricDefinition> alarmMetrics
- String alarmDefinitionId
- Map<String, AlarmSubExpression> subAlarms
示例
{
"alarm-deleted": {
"tenantId": "69a6aeb64a5f4704b88dcf1985d43184",
"alarmId": "04def1c4-b6ee-4d05-8da8-39559a8e2a9e",
"alarmMetrics": [
{
"name": "net.in_errors",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"device": "eth0",
"hostname": "mini-mon"
}
},
{
"name": "net.out_errors",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"device": "eth0",
"hostname": "mini-mon"
}
},
{
"name": "net.in_errors",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"device": "eth1",
"hostname": "mini-mon"
}
},
{
"name": "net.out_errors",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"device": "eth1",
"hostname": "mini-mon"
}
}
],
"alarmDefinitionId": "64938145-91de-470f-85b5-2f03730c8560",
"subAlarms": {
"df171878-3bcf-4d02-9cbc-d7a7fe2f9965": {
"function": "MAX",
"metricDefinition": {
"name": "net.in_errors",
"dimensions": {}
},
"operator": "GT",
"threshold": 5,
"period": 60,
"periods": 1,
"expression": "max(net.in_errors) > 5.0"
},
"c5f550a6-0382-4a74-969b-4c92b73e0446": {
"function": "MAX",
"metricDefinition": {
"name": "net.out_errors",
"dimensions": {}
},
"operator": "GT",
"threshold": 5,
"period": 60,
"periods": 1,
"expression": "max(net.out_errors) > 5.0"
}
}
}
}
AlarmUpdatedEvent
- String alarmId
- String tenantId
- String alarmDefinitionId
- List<MetricDefinition> alarmMetrics
- Map<String, AlarmSubExpression> subAlarms
- AlarmState alarmState
- AlarmState oldAlarmState
示例
{
"alarm-updated": {
"alarmId": "2a913e31-36a0-4ef7-88c0-4aaa5392273b",
"tenantId": "69a6aeb64a5f4704b88dcf1985d43184",
"alarmDefinitionId": "fef92344-7c20-4c83-ae47-e613224b3503",
"alarmMetrics": [
{
"name": "monasca.collection_time_sec",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "mini-mon"
}
}
],
"subAlarms": {
"82c23ead-352b-42a9-aa7f-dff3bf5c30f8": {
"function": "AVG",
"metricDefinition": {
"name": "monasca.collection_time_sec",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "mini-mon"
}
},
"operator": "GT",
"threshold": 5,
"period": 60,
"periods": 3,
"expression": "avg(monasca.collection_time_sec) > 5.0 times 3"
}
},
"alarmState": "UNDETERMINED",
"oldAlarmState": "OK"
}
}
AlarmStateTransitionedEvent
当告警状态更改时,会创建 AlarmStateTransitionedEvent。这些事件主要由 ThresholdEngine 发布,并由 Persister 和 Notification Engine 消费。AlarmStateTransitionEvent 包含以下内容
- String tenantId
- String alarmId
- String alarmDefinitionId
- List<MetricDefinition> metrics
- String alarmName
- String alarmDescription
- AlarmState oldState
- AlarmState newState
- boolean actionsEnabled
- String stateChangeReason
- String severity
- long timestamp
示例
{
"alarm-transitioned": {
"tenantId": "8ada618268ec43709a2ab8eb8ea7996c",
"alarmId": "80e0426e-3a32-4166-ad2a-d28e4a7bc34b",
"alarmDefinitionId": "609c2c1a-2e1d-4b0b-9b3a-21ea7f649e1b",
"metrics": [
{
"name": "cpu.system_perc",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "devstack"
}
},
{
"name": "load.avg_1_min",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "mini-mon"
}
},
{
"name": "cpu.system_perc",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "mini-mon"
}
}
],
"alarmName": "high cpu and load",
"alarmDescription": "System CPU Utilization exceeds 1% and Load exceeds 3 per measurement period",
"oldState": "UNDETERMINED",
"newState": "ALARM",
"actionsEnabled": true,
"stateChangeReason": "Thresholds were exceeded for the sub-alarms: [max(cpu.system_perc) > 0.0, max(load.avg_1_min{hostname=mini-mon}) > 0.0]",
"severity": "LOW",
"timestamp": 1421258195
}
}
AlarmNotification
当前不支持。这是未来开发的一个占位符,当我们添加对存储已发送的通知的支持时。
指标消息
发送到 API 或由转换引擎、事件引擎或异常引擎创建的指标会发布到 MessageQ 作为 MetricsMessage。MetricsMessage 具有以下字段
- MetricDefinition metric
- meta
- String tenantId
- String region: 应该删除“region”,因为它没有被使用。
- creation_time
示例
{
"metric": {
"name": "monasca.collection_time_sec",
"dimensions": {
"component": "monasca-agent",
"service": "monitoring",
"hostname": "devstack"
},
"timestamp": 1421259363,
"value": 8.01378607749939
},
"meta": {
"tenantId": "8ada618268ec43709a2ab8eb8ea7996c",
"region": "useast"
},
"creation_time": 1421259371
}
请注意,指标消息与其他消息不一致,因为它不包含消息类型。今天这没关系,因为它在不同的主题上,而且有很多,但可能应该解决这个问题。
事件消息
TBD。目前,Monasca 中事件有一个概念验证实现,但细节尚未正式确定。
类型
本节描述了消息中使用的特定类型。
AlarmSubExpression
- AggregateFunction function
- MetricDefinition metricDefinition
- AlarmOperator operator
- double threshold threshold
- int period
- int periods
MetricDefinition
- String name
- Map<String, String> dimensions
枚举
AlarmState
- UNDETERMINED
- OK
- ALARM
AggregateFunction
- MIN
- MAX
- SUM
- COUNT
- AVG
AlarmOperator
- LT("<")
- LTE("<=")
- GT(">")
- GTE(">=")
AlarmSeverity
- LOW
- MEDIUM
- HIGH
- CRITICAL
Avro Schema
使用 Avro 的原型模式实现位于 https://github.com/roland-hochmuth/monasca-schema