演练系统事件处理程序? So Easy~

简介: 演练事件处理程序有点难 ECS实例系统事件是影响实例运行状态的有计划或非预期事件。为了ECS实例上的业务平稳运行,最佳的做法是通过程序自动化地处理事件。您可以参考这篇文章:使用OpenAPI自动化处理ECS系统事件但这里有一个问题,程序写完了不好测试。

演练事件处理程序有点难

ECS实例系统事件是影响实例运行状态的有计划或非预期事件。为了ECS实例上的业务平稳运行,最佳的做法是通过程序自动化地处理事件。您可以参考这篇文章:使用OpenAPI自动化处理ECS系统事件
但这里有一个问题,程序写完了不好测试。系统事件是系统在特定场景下生成的,不一定能人工触发;ECS实例跑的很稳定,总是不出问题,几个月也没等到一个事件。我们需要一种方式来方便地演练事件处理程序。

ECS演练OpenAPI

ECS提供了一对用来演练事件处理程序的OpenAPI:CreateSimulatedSystemEvents和CancelSimulatedSystemEvents,分别用来创建和取消模拟系统事件。
什么是模拟系统事件?模拟系统事件是专门用来演练系统事件处理程序的。通过设置一个模拟系统事件,您可以从OpenAPI、控制台、云监控等等事件消费渠道中看到和真实事件一样的数据。
除了产生事件数据,模拟事件还会模拟事件的生命周期变化。

  • 在用户设置了模拟系统事件后,该事件处于待执行(Scheduled)状态
  • 在到达计划执行时间(NotBefore)后,事件将转变为执行中(Executing)状态,然后很快变成已执行(Executed)状态
  • 模拟事件也会响应用户操作,比如对于SystemMaintenance.Reboot事件,用户在计划执行时间(NotBefore)之前重启实例,事件将变为已避免(Avoided)状态
  • 用户可以在事件未完结前,调用CancelSimulatedSystemEvents取消事件,事件将变为已取消(Canceled)状态

模拟事件的生命周期如下:

演练系统事件流程图.png | center | 747x483

代码示例

以下以SystemMaintenance.Reboot为例,创建了两个模拟系统事件,随即又取消了其中的一个事件:

#  coding=utf-8

# make sure the sdk version is 4.10.0 or upper, you can use command 'pip show aliyun-python-sdk-ecs' to check
# if the python sdk is not installed, use 'sudo pip install aliyun-python-sdk-ecs'
# if the python sdk is installed, use 'sudo pip install --upgrade aliyun-python-sdk-ecs'

import json
import logging

from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.CancelSimulatedSystemEventsRequest import CancelSimulatedSystemEventsRequest
from aliyunsdkecs.request.v20140526.CreateSimulatedSystemEventsRequest import CreateSimulatedSystemEventsRequest

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S')

# your access key Id
ak_id = "YOU_ACCESS_KEY_ID"
# your access key secret
ak_secret = "YOU_ACCESS_SECRET"
region_id = "cn-beijing"

client = client.AcsClient(ak_id, ak_secret, region_id)


# send open api request
def _send_request(request):
    request.set_accept_format('json')
    try:
        response_str = client.do_action_with_exception(request)
        logging.info(response_str)
        response_detail = json.loads(response_str)
        return response_detail
    except Exception as e:
        logging.error(e)


def build_create_request(event_type, not_before, instance_ids):
    request = CreateSimulatedSystemEventsRequest()
    request.set_EventType(event_type)
    request.set_NotBefore(not_before)
    request.set_InstanceIds(instance_ids)
    return request


def print_created_event_id(response):
    error_code = response.get('Code')
    if error_code is None:
        event_id_list = response.get('EventIdSet').get('EventId')
        print("Created %s simulated events: %s", len(event_id_list), event_id_list)
    else:
        print("Creating failed, error code: %s", error_code)


def get_created_event_id(response):
    error_code = response.get('Code')
    if error_code is None:
        event_id_list = response.get('EventIdSet').get('EventId')
        return event_id_list
    else:
        return []


def build_cancel_request(event_id):
    request = CancelSimulatedSystemEventsRequest()
    request.set_EventIds([event_id])
    return request


if __name__ == '__main__':
    request = build_create_request("SystemMaintenance.Reboot", "2018-09-01T00:00:00Z", ["i-2zegswzznxbp168sc5c9", "i-2zeimxypwhnj04sbgf5t"])
    response = _send_request(request)
    event_ids = get_created_event_id(response)
    if event_ids:
        print("Created %s simulated events: %s"%(len(event_ids), event_ids))
        cancel_event_id = event_ids[0]
        print("Now we cancel one event %s" % (cancel_event_id))
        cancel_request = build_cancel_request(cancel_event_id)
        cancel_response = _send_request(cancel_request)
        if not cancel_response.get('Code'):
            print("Cancel succeeded")

代码执行后的输出:

Created 2 simulated events: [u'e-2zec65b85gi9zwcv1kpz', u'e-2zec65b85gi9zwcv1kq0']
Wed, 22 Aug 2018 18:39:49 simulate_system_event.py[line:35] INFO {"EventIdSet":{"EventId":["e-2zec65b85gi9zwcv1kpz","e-2zec65b85gi9zwcv1kq0"]},"RequestId":"C1762464-CCC2-46EC-B233-92A4D9C1782C"}
Now we cancel one event e-2zec65b85gi9zwcv1kpz
Cancel succeeded
Wed, 22 Aug 2018 18:39:49 simulate_system_event.py[line:35] INFO {"RequestId":"44286901-1BC3-4BA0-AAAF-C3CF20578E0F"}

限制和注意事项

  • 用户只能在自己拥有的实例上设置和取消系统事件
  • 单用户设置的处于Scheduled状态的模拟系统事件不能超过1000个
相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
云安全 监控 安全
|
11月前
|
存储 运维 数据可视化
运维过程记录工具深度解析:从原理到实操,一文掌握核心功能与应用场景
运维过程记录是保障系统稳定的关键,缺失记录会导致问题难定位、重复发生及协作低效。通过自动化工具实现操作实时记录、集中管理与可回溯分析,可大幅提升故障排查、安全审计与团队协作效率。未来,记录工具将更智能,助力运维向高效、可控、可预测方向演进。
|
11月前
|
传感器 运维 数据可视化
AR眼镜巡检系统在工业互联网的应用:AR+IoT
AR与IoT融合构建虚实闭环,IoT采集实时数据,AR直观呈现并交互,形成感知-分析-决策-行动高效闭环,提升运维效率。
|
12月前
|
存储 消息中间件 NoSQL
体育赛事直播系统中基于 WebSocket 实现的聊天室与弹幕模块设计与实践
本文详解东莞梦幻网络科技体育直播系统中「聊天室+弹幕」模块的实时通信技术实现,涵盖 WebSocket 架构、连接池管理、多房间逻辑、消息转发与并发控制等核心要点,助力构建高并发、低延迟的直播互动体验。
|
10月前
|
人工智能 运维 中间件
CTI中间件:现代呼叫中心的核心开发平台
乐科CTI中间件助力企业高效构建智能呼叫中心,集成通信与业务系统,支持多协议、AI融合、高可用部署,广泛应用于客服、营销等场景,降低开发成本,提升运维效率。
|
10月前
|
传感器 机器学习/深度学习 算法
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
【室内导航通过视觉惯性数据融合】将用户携带的智能手机收集的惯性数据与手机相机获取的视觉信息进行融合研究(Matlab代码实现)
309 2
|
12月前
|
JavaScript 前端开发 数据安全/隐私保护
文字跳转链接怎么做
文字跳转链接的三大技术实现方案 一、HTML原生锚点跳转
|
自动驾驶 5G 网络性能优化
5G标准化背后的江湖:技术规范如何塑造未来通信
5G标准化背后的江湖:技术规范如何塑造未来通信
1026 19
|
数据采集 存储 供应链
Pandas数据应用:库存管理
本文介绍Pandas在库存管理中的应用,涵盖数据读取、清洗、查询及常见报错的解决方法。通过具体代码示例,讲解如何处理多样数据来源、格式不一致、缺失值和重复数据等问题,并解决KeyError、ValueError等常见错误,帮助提高库存管理效率和准确性。
472 72
|
云安全 运维 监控
客户案例 | EF实现本土化服务,构建完整客户360
EF Education First 借助阿里云上的 Salesforce 的 CRM 产品,构建高性能、本地化的完整客户360解决方案,实现全面的客户关系管理。同时通过 Salesforce 互联网关 (Connected Experiences Gateway) ,EF 成功打造了智能呼叫中心,并实现营销自动化,大幅降低了托管和运维成本。Salesforce 互联网关整合多个本地渠道,并与 CRM 无缝衔接,能更加快捷地支持 EF 的数字化转型业务需求。

热门文章

最新文章