抢占式实例最佳实践--如何模拟中断事件

前言

由于抢占式实例天然具有被中断的风险,在实例中断前至少5分钟,系统会向您发送中断消息。此时您可以依据 抢占式实例接收中断消息指南 来进行中断消息的处理. 但在开发"中断处理程序"阶段, 由于您实例的中断是由阿里云触发, 概率极低且是非常随机的过程, 调试与验证中断处理程序可能会比较困难.

基于此, 我们目前提供了以下两种模拟中断事件的方式, 以便您进行程序调试:

抢占式实例最佳实践--如何模拟中断事件


方式1:使用云监控控制台模拟中断事件


具体请参见:抢占式实例接收中断消息指南一文。

方式2:调用OpenAPI进行调试

以云监控订阅中断事件, 并将事件投递到MQ消息队列为例

前提条件

在使用本教程之前,请确保已完成以下操作:

  • 使用Alibaba Cloud SDK for Java,您需要一个阿里云账号和访问密钥(AccessKey)。 请在阿里云控制台中的AccessKey管理页面查看您的访问密钥。
  • 确保您已经安装了Alibaba Cloud SDK for Java,准确的SDK版本号,请参见 阿里云开发工具包(SDK)
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>tea-openapi</artifactId>
  <version>0.0.13</version>
</dependency>

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>cms20190101</artifactId>
  <version>1.0.1</version>
</dependency>

第一步:创建云监控的事件报警规则

示范代码如下:

// This file is auto-generated, don't edit it. Thanks.
package com.aliyun.sample;

import com.aliyun.tea.*;
import com.aliyun.cms20190101.*;
import com.aliyun.cms20190101.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;

/**
 * 调用 PutEventRule
 * 创建或修改事件的报警规则
 */
public class Sample {

    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "metrics.cn-hangzhou.aliyuncs.com";
        return new com.aliyun.cms20190101.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret");
        PutEventRuleRequest.PutEventRuleRequestEventPattern eventPattern0 = new PutEventRuleRequest.PutEventRuleRequestEventPattern()
                .setEventTypeList(java.util.Arrays.asList(
                    "*"
                ))  //  事件报警规则的类型   
                .setLevelList(java.util.Arrays.asList(
                    "*"
                ))  //  事件报警规则的等级
                .setNameList(java.util.Arrays.asList(
                    "Instance:PreemptibleInstanceInterruption"
                ))  //  事件报警规则的名称
                .setProduct("ECS"); //  云服务类型
        PutEventRuleRequest putEventRuleRequest = new PutEventRuleRequest()
                .setRuleName("spot_release_event_test")  // 事件报警规则名称
                .setEventPattern(java.util.Arrays.asList(
                    eventPattern0
                ))
                .setEventType("SYSTEM")  //  事件报警规则的类型
                .setState("ENABLED");   //  事件报警规则的状态
        // 复制代码运行请自行打印 API 的返回值
        client.putEventRule(putEventRuleRequest);
    }
}


第二步:创建消息队列

具体请参见:消息服务MNS一文

第三步:添加规则的发送目标

示范代码如下:

// This file is auto-generated, don't edit it. Thanks.
package com.aliyun.sample;

import com.aliyun.tea.*;
import com.aliyun.cms20190101.*;
import com.aliyun.cms20190101.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;

/**
 * 调用 PutEventRuleTargets
 * 添加或修改规则的发送目标
 */
public class Sample {

    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "metrics.cn-hangzhou.aliyuncs.com";
        return new com.aliyun.cms20190101.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret");
        PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters mnsParameters0 = new PutEventRuleTargetsRequest.PutEventRuleTargetsRequestMnsParameters()
                .setRegion("cn-hangzhou")   //  消息服务对应的地域
                .setId("1") //  规则发送目标的唯一标识
                .setQueue("mq-test");   //  队列名称
        PutEventRuleTargetsRequest putEventRuleTargetsRequest = new PutEventRuleTargetsRequest()
                .setRuleName("spot_release_event_test") //  报警规则的名称
                .setMnsParameters(java.util.Arrays.asList(
                    mnsParameters0
                ));
        // 复制代码运行请自行打印 API 的返回值
        client.putEventRuleTargets(putEventRuleTargetsRequest);
    }
}

第四步:发送模拟系统事件

示范代码如下:

package com.aliyun.sample;

import com.aliyun.tea.*;
import com.aliyun.cms20190101.*;
import com.aliyun.cms20190101.models.*;
import com.aliyun.teaopenapi.*;
import com.aliyun.teaopenapi.models.*;
/**
 *调用 SendDryRunSystemEvent
 *调试云资源的系统事件
 *
 */
public class Sample {

    /**
     * 使用AK&SK初始化账号Client
     * @param accessKeyId
     * @param accessKeySecret
     * @return Client
     * @throws Exception
     */
    public static com.aliyun.cms20190101.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
        Config config = new Config()
                // 您的AccessKey ID
                .setAccessKeyId(accessKeyId)
                // 您的AccessKey Secret
                .setAccessKeySecret(accessKeySecret);
        // 访问的域名
        config.endpoint = "metrics.cn-hangzhou.aliyuncs.com";
        return new com.aliyun.cms20190101.Client(config);
    }

    public static void main(String[] args_) throws Exception {
        java.util.List<String> args = java.util.Arrays.asList(args_);
        com.aliyun.cms20190101.Client client = Sample.createClient("accessKeyId", "accessKeySecret");
        SendDryRunSystemEventRequest sendDryRunSystemEventRequest = new SendDryRunSystemEventRequest()
                .setProduct("ecs")  //  云服务名称
                .setEventName("Instance:PreemptibleInstanceInterruption")   //  事件名称
                .setEventContent("{\"product\":\"ECS\",\"resourceId\":\"acs:ecs:cn-shanghai:1331602849963181:instance/i-abcdef\",\"level\":\"WARN\",\"instanceName\":\"instanceName\",\"regionId\":\"cn-beijing\",\"name\":\"Instance:PreemptibleInstanceInterruption\",\"content\": {\"instanceId\":\"i-abcdefghijklmn\",\"action\":\"delete\"},\"status\":\"Normal\"}");  //  事件内容
        // 复制代码运行请自行打印 API 的返回值
        client.sendDryRunSystemEvent(sendDryRunSystemEventRequest);
    }
}

第五步:通过消息验证是否收到消息

具体请参见:消息服务MNS一文

上一篇:SLS新版告警入门-触发条件设置


下一篇:SLS新版告警入门-旧版告警升级