背景
云监控的功能庞杂,涉及云产品众多, 对于企业用户来说,面对茫茫多的云上资源,建立监控体系时可能第一时间感到无从下手,本文将通过云监控的openAPI,利用 "应用分组" + "报警模板" 的功能,迅速为海量的资源搭建起基本的监控体系。
前置条件
- 首先你需要有一个阿里云账号
-
准备好
ak
(access_key_id
,access_key_secret
)- 建议使用子账号,安全性更好。(参见RAM访问控制)
- 使用子账号时确保已经授权了
AliyunCloudMonitorFullAccess
开始搭建监控体系啦
1. 设置联系人和联系人组
手动通过云监控控制台创建联系人和联系人组,设置正确的邮件,手机信息以便接受报警通知。
假设联系人组为"ops_group"
String contactGroups = "ops_group";
logger.info("manually create contact groups on CMS console...");
2. 创建应用分组
应用分组是云监控下资源管理的一个逻辑分组概念,可以将感兴趣的资源放在同一个分组下集中管理。具体划分逻辑可以根据业务需求灵活指定,比如将某一个服务的所有依赖资源放到一个分组。
更多信息参见:
云监控推出应用分组,帮你在阿云上跨地域、跨产品从业务角度管理资源,提高运维效率!
动态应用分组发布,实现从云资源生产到监控报警配置的全自动化
快速入门->应用分组
2.1 创建一个空的应用分组
CreateMyGroupsRequest request0 = new CreateMyGroupsRequest();
request0.setAcceptFormat(FormatType.JSON);
request0.setGroupName("demo-app-group");
request0.setContactGroups(contactGroups);
CreateMyGroupsResponse response0 = client.getAcsResponse(request0);
long groupId = response0.getGroupId();
logger.info("application group created, groupId = {}", groupId);
2.2 设置自动匹配ECS实例,批量管理ECS资源。
云监控暂时只支持动态添加ECS实例到应用分组,可根据ECS实例的自定义名称,通过startWith
, endWith
和contains
规则匹配,并结合and
和or
的逻辑控制符来设定。后续会支持更多资源类型。
PutGroupDynamicRuleRequest request1 = new PutGroupDynamicRuleRequest();
request1.setGroupId(groupId);
request1.setGroupRuleArrayJson("["
+ " {"
+ " \"category\": \"ecs\"," // 暂时只支持ECS
+ " \"filterRelation\": \"and\"," // 同时满足以下规则(或者使用or 来匹配以下任意规则)
+ " \"filters\": ["
+ " {"
+ " \"function\": \"contains\"," // 额外还支持startWith, endWith
+ " \"name\": \"hostName\"," // hostName代表ecs实例的自定义主机名称
+ " \"value\": \"test\"" // 实际匹配的值,本例表示ecs主机名称中包含test的实例
+ " }"
+ " ]"
+ " }"
+ "]");
client.getAcsResponse(request1);
logger.info("set dynamic rules for ECS instances");
2.3 添加ECS外的其他类型资源到应用分组
对于不支持动态添加到分组的资源类型,或者动态分组并不能满足需求,还可以显式的指定加入分组的资源。此方法适用于所有资源,前提是需要先通过调用各个云产品对应的接口,获取实例的instanceId
, category
和 reginId
AddMyGroupInstancesRequest request2 = new AddMyGroupInstancesRequest();
request2.setGroupId(groupId);
request2.setInstances("["
+ " {"
+ " \"instanceId\": \"<your_instance_id>\","
+ " \"category\": \"RDS\"," // 资源类型,比如ECS, RDS, SLS, SLB, ...
+ " \"regionId\": \"cn-qingdao\"" // 资源所在的regionId
+ " }"
+ "]");
client.getAcsResponse(request2);
至此,所有感兴趣的资源都可以被加入到分组中集中管理。
2.4 为应用分组设置子账号权限 (可选)
应用分组可以和子账号的授权体系结合,支持将某个子账号授权为指定应用分组的只读/读写权限,从而满足企业级客户的多样权限管理需求。
UpdateMyGroupMembersRequest request2 = new UpdateMyGroupMembersRequest();
request2.setGroupId(groupId);
// 授予子账号分组的管理员权限。
request2.setMasters("<sub_account_id_1>,<sub_account_id_2>");
// 授予子账号分组的只读权限。
request2.setReaders("<sub_account_id_3>,<sub_account_id_4>");
3. 创建报警模板
报警模板是预先定义好的一批报警规则,可以被批量应用到应用分组中,避免重复的创建大量相同报警规则。
更多信息参见:
当前暂不支持通过openAPI创建报警模板,为了更好的理解报警规则,建议通过云监控控制台手动创建报警模板,毕竟对于同一类需求的报警规则,通过报警模板只需要创建一次就好了。入口如下:
记录下报警模板的id,假设id = "12345"
String templateIds = "12345";
logger.info("manually create alarm templates, and get template ids");
4. 应用报警模板到应用分组
应用分组 + 报警模板 可以解决大部分的监控需求,一次创建,反复使用。
良好的分组和报警模板配置管理可以极大的简化监控的配置和维护,建议在创建和使用时综合考虑自己的业务场景合理配置。
ApplyTemplateRequest request3 = new ApplyTemplateRequest();
request3.setGroupId(groupId);
request3.setTemplateIds(templateIds); // 可以同时应用多个模板,用逗号分隔,e.g., "123,456"
request3.setApplyMode("ALARM_TEMPLATE_FIRST"); // 两种应用模式: 1) ALARM_TEMPLATE_FIRST代表模板优先,不管分组中是否有对应资源都会创建报警规则; 2) GROUP_INSTANCE_FIRST 代表分组实例优先,只会创建分组中存在对应资源的报警,如果不存在则不创建。
client.getAcsResponse(request3);
logger.info("apply templates to application groups");
5. 完成!
至此一个基本的监控体系就搭建完成了,资源被管理在一个应用分组中,报警规则通过模板应用到分组下的每个实例上,一旦有实例触发报警规则,报警就会通知给分组中设置的报警联系人组中的每一个联系人。
完整示例代码请参考:github
了解更多
上面示例只是一个最简单的场景,云监控的openAPI提供大量的参数满足各种不同的业务需求,具体api的使用请参见如下在线文档: