跳转到: 导航, 搜索

Monasca/Message Schema

概述

Monasca 支持两种主要的消息分类,这些消息通过 MessageQ 发布和消费

  1. 值对象,例如指标和事件,这些对象从外部数据源(例如 Monasca Agent)发送到 API。
  2. 域事件,表示系统中某个实体的变化,如下所示
    1. 告警定义被 API 创建、更新或删除。
    2. 告警被 API 更新或删除。
    3. 告警状态由阈值引擎转换。

目前,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