基于事件实现扩容水位超量告警

本文介绍如何基于E-HPC节点扩容事件,结合事件总线和函数计算实现扩容水位超量告警。

背景信息

E-HPC配合事件总线EventBridge,可以将E-HPC集群的操作投递到云服务专用事件总线。在此基础上,结合函数计算,可以更加灵活地将E-HPC事件进行二次定制投递,例如可以使用E-HPC节点扩容事件制定扩容水位告警策略,并通过自定义事件总线将告警通过钉钉进行通知。示例场景如下:

水位告警

准备工作

配置前,请完成以下准备工作:

步骤一:创建钉钉机器人

创建钉钉机器人后会生成专属的Webhook地址,通过Webhook地址可以关联到其他服务(如事件总线EventBridge)接收通知。

  1. 打开需要接收事件通知的钉钉群。

  2. 进入机器人设置页面。

    1. 单击钉钉群右上角的钉钉设置图标。

    2. 群设置页面,单击智能群助手

    3. 智能群助手面板,单击添加机器人

    4. 群机器人对话框中的添加机器人区域,单击钉钉添加机器人图标。

    5. 选择要添加的机器人区域,单击自定义

    6. 机器人详情对话框,单击添加

  3. 按页面提示完成机器人设置,单击完成

    您可以自定义设置机器人名称,安全设置请选择加签并复制加签密钥。钉钉机器人

  4. 复制并保存Webhook地址。钉钉机器人2

步骤二:创建自定义事件总线

创建自定义事件总线,用于接收函数计算投递的告警事件,并将告警信息推送到钉钉进行通知。

  1. 进入创建自定义事件总线面板。

    1. 登录事件总线控制台

    2. 在左侧导航栏选择事件总线

    3. 在顶部菜单栏选择地域。

    4. 在右上角的自定义事件总线区域,单击快速创建

  2. 总线配置页,输入名称和描述,单击下一步

  3. 事件源配置页,输入事件源名称,事件提供方选择自定义应用,然后单击下一步

  4. 规则配置页,输入规则名称,单击下一步

  5. 目标配置页,完成相关配置,然后单击创建

    配置目标时,需要注意的参数如下:

    • 服务类型:选择钉钉

    • 地址:填入步骤一保存的Webhook地址。

    • 密钥:填入步骤一保存的加签密钥。

    • 推送内容:请按以下示例配置。更多信息,请参见事件内容转换

      • 变量

        {
          "content": "$.data.content"
        }
      • 模板

        {
          "msgtype": "text", 
          "text": {
              "content": "${content}"
          }
        }

步骤三:创建函数

在函数计算服务中创建函数,用于接收云服务专用事件总线投递的E-HPC集群扩容事件,同时判断扩容数量是否超出设置的水位,如果超出,则将告警事件投递到自定义事件总线。

  1. 创建函数计算服务。

    具体操作,请参见创建服务。创建时,请在高级选项中配置服务角色,该角色需要具备访问事件总线EventBridge的权限,例如AliyunFcDefaultRole

  2. 创建函数。

    具体操作,请参见创建函数。创建时,请在函数代码处将运行环境请选择为Python 3.6,其他参数保持默认。

  3. 编写函数。

    1. 在函数详情页,单击函数代码页签。

    2. 在右下方的终端处,执行以下命令,安装EventBridge python SDK。

      pip install alibabacloud_eventbridge -t .
      pip install alibabacloud_tea_console -t .
    3. 在左侧资源管理器中,打开index.py,编写函数代码,编写完成后,单击部署代码

      index.py中默认为您创建函数时选择的示例代码,需替换为投递扩容水位超量事件的代码。

      代码示例如下,请根据实际配置替换代码中的参数。

      参数

      示例值

      说明

      MAX_COUNT

      5

      扩容水位。扩容数量超出该值时将投递告警事件。

      config.endpoint

      eventbridge.cn-hangzhou.aliyuncs.com

      事件总线的endpoint。

      event.source

      my.event

      自定义事件总线的事件源名称。

      aliyuneventbusname

      test

      自定义事件总线的名称。

      # -*- coding: utf-8 -*-
      import logging
      import json
      
      from alibabacloud_eventbridge.client import Client as EventBridgeClient
      from alibabacloud_eventbridge import models as event_bridge_models
      from alibabacloud_tea_console.client import Client as ConsoleClient
      from alibabacloud_tea_util.client import Client as UtilClient
      
      MAX_COUNT = 5
      
      def create_client(creds):
          """
          Create client初始化公共请求参数
          """
          config = event_bridge_models.Config()
          config.access_key_id = creds.access_key_id
          config.access_key_secret = creds.access_key_secret
          config.security_token = creds.security_token
          config.endpoint = "eventbridge.cn-hangzhou.aliyuncs.com"
          return EventBridgeClient(config)
      
      def put_events(client, content):
          """
          PutEvents 投递自定义总线事件
          """
          event = event_bridge_models.CloudEvent()
          data =  json.dumps(content)
      
          event.datacontenttype = "application/json"
          event.data = UtilClient.to_bytes(data)
          event.id = "a5074581-7e74-4e4c-868f-47e7afdf****"
          # 自定义事件总线的事件源
          event.source = "my.event"
          event.specversion = "1.0"
          event.type = "ui:Created:PostObject"
          event.time = "2022-08-30T03:48:37.492Z"
          event.subject = "my:subject"
          # 自定义事件总线的名称
          event.extensions = {
              "aliyuneventbusname": "test"
          }
          try:
              resp = client.put_events([event])
              ConsoleClient.log("--------------------Publish event to the aliyun EventBus--------------------")
              ConsoleClient.log(UtilClient.to_jsonstring(resp.to_map()))
          except Exception as error:
              ConsoleClient.log(error)
      
      def handler(event, context):
        logger = logging.getLogger()
        evt = json.loads(event)
        actual_count = evt['data']['Count']
        # 实际扩容数量超过预设水位,则投递告警事件到自定义总线事件
        if actual_count > MAX_COUNT:
          creds = context.credentials
          client = create_client(creds)
          content = { 'content': '您的集群 %s(%s) 于 %s 单次扩容数量为 %d,已超过您设置的水位 %d, 此次扩容请求ID为 %s' % 
              (evt['data']['ClusterName'], evt['data']['ClusterId'], evt['data']['CreateTime'], actual_count, MAX_COUNT, evt['data']['RequestId'])}
          put_events(client, content)
          return 'call putevent!'
        else:
          return 'do nothing!'

步骤四:配置云服务专用总线事件触发器

在云服务专用总线事件中创建规则,将E-HPC集群扩容事件投递到函数计算。

  1. 在事件总线控制台的事件总线页面,单击default

  2. 在左侧导航栏选择事件规则,然后单击创建规则

  3. 创建规则面板,完成规则配置。

    1. 配置基本信息页面,输入名称和描述,单击下一步

    2. 配置事件模式页面,参考参数说明完成配置,单击下一步

      参数说明如下,未提及的参数保持默认。

      • 事件源类型:选择阿里云官方事件源

      • 事件源:选择acs.ehpc

      • 事件类型:选择ehpc:NodeOperation:NodeCreate事件。

    3. 配置事件目标页面,参考参数说明完成配置,单击创建

      参数说明如下,未提及的参数保持默认。

      • 服务类型:选择函数计算

      • 服务:选择步骤三创建的函数计算服务。

      • 函数:选择步骤三创建的函数。

结果验证

本文采用的示例为E-HPC集群扩容超过5台时,通过钉钉发送告警通知,以下为验证步骤。

  1. 对某个集群进行手动扩容节点。具体操作,请参见扩容集群

  2. 查看钉钉群的消息通知。

    水位告警1