
1,使用基于名称自动匹配的分组监控 云监控控制台>应用分组>创建分组>选择'智能实例规则创建'。后续只要对实例命名符合条件,即可自动加入对应的应用分组,自动被监控。 2,使用系统预留TAG 在redis控制台,对实例打上tagkey:cloudmonitor-group任意的value,即可创建一个应用分组cloudmonitor-group-$value的应用分组,并关联默认的监控模板(常用基础模板),发送报警给默认的报警联系人组(云账号报警联系人)。后续只要对实例打上该tagkey,即可自动加入对应的应用分组,自动被监控 3,使用自定义TAG, 在redis控制台,对实例打上任意TAG;然后在云监控控制台>应用分组>创建分组>选择'智能标签同步创建'>选择对应的tagkey,即可将该tagkey对应的所有value都创建对应的分组(分组名为:$tagkey-$tagvalue)。后续只要对实例打上该tagkey,即可自动加入对应的应用分组,自动被监控
使用场景 为了避免由于未自主设置云监控报警,造成云产品关键监控指标异常无法及时知晓,导致影响服务正常运转的情况。云监控上线了主动报警功能。 旨在不进行您无需进行任何操作,主要云产品关键指标出现严重问题时,发送报警告知问题。如果您需要更细粒度的报警管理,请在云监控进行相关报警配置。 该功能不占用任何云监控相关的用量配额。 操作方法 订阅方法 通知默认开启,无需专门订阅 取消订阅 登录阿里云控制台,进入消息中心-基本接收管理页面 取消“故障消息”中的“云监控主动报警”勾选即可 报警范围 目前针对已经安装云监控插件,ECS 磁盘使用率达到100%的磁盘进行报警,陆续会上线更多关键指标的主动报警。 产品 监控项 主动报警策略 ECS 磁盘使用率 持续10分钟100%时发送报警,如果持续100%,则每24小时重复通知一次
使用场景 云监控的应用分组,旨在帮助用户按照业务维护管理监控报警。这次推出的报警规则定时暂停功能,可以在您的业务执行变更、升级,造成指标符合预期的波动时,定时关闭报警,不发送报警通知。 操作方法 Step 1 登录云监控控制台,进入应用分组列表页 Step2 点击列表中的暂停通知,选择需要暂停的时间段。 选择“10分钟”、“15分钟”等相对时间时,会从当前时间开始,暂停发送分组内所有报警规则产生的报警通知。 选择自定义时间时,可以指定具体的时间段 Step3 如何取消暂停设置 点击对应分组的“取消暂停通知”,即可立刻取消暂停设置。
云监控用Go语言重构了插件,且较目前的Java版本在资源消耗方面有很大节省。您可以根据如下步骤升级插件,升级后版本号为2.1.47。 新版本插件资源消耗情况 CmsGoAgent进程占用15~20M左右内存和单核1~2%的CPU。(Java版本内存消耗在70M左右) CmsGoAgent是便携的无额外依赖Agent,程序大小在15M左右,视处理器不同实际尺寸相差2~3M。(Java版本安装包70M,解压后大小200M) 本地日志最多占用40M空间,超过40M会进行清除。 每15秒发送一次监控数据,约占用内网网络带宽10KB。 每3分钟发送一次心跳数据,约占用内网网络带宽2KB左右。 ECS安装GoAgent 1.1 准备工作 确定需要安装GoAgent的ECS地域ID(RegionID)查询地域的ID 1.2 Linux下安装GoAgent 远程登录ecs,将下面命令中的${REGION_ID}以实际的region id替换并执行 VERSION=2.1.47 /bin/bash -c "$(curl -s http://cms-agent-${REGION_ID}.oss-${REGION_ID}-internal.aliyuncs.com/cms-go-agent/cms_go_agent_install.sh)" 1.3 Windows下安装GoAgent 在如下路径新建文件夹cloudmonitor C:\Program Files\Alibaba 根据系统情况,将云监控Agent 64位版本Agent或32位版本Agent 下载到上一步创建的cloudmonitor文件夹中。 使用管理员权限启动命令行(cmd),并在cmd下运行如下命令 cd C:\Program Files\Alibaba\cloudmonitor CmsGoAgent.windows-amd64.exe install CmsGoAgent.windows-amd64.exe start 安装完成后,可以通过Windows服务面板来查看、启动、停止云监控服务(Cloud Monitor Application)。 非ECS安装GoAgent 2.1 准备工作 准备accesskey.properties文件。accesskey信息请登录阿里云控制台后,点击页面上方 非阿里云主机安装按钮查询。 Linux下在Terminal中可通过如下命令在当前目录下生成accesskey.properties文件: echo 'cms.agent.accesskey=$your_accesskey' > accesskey.properties echo 'cms.agent.secretkey=$your_secretkey' >> accesskey.properties 2.1 Linux 执行下面命令前,请确保当前目录下存在accesskey.properties文件 /bin/bash -c "$(curl -s http://cms-download.aliyun.com/cms-go-agent/cms_go_agent_install_none_ecs.sh)" Windows下可在文本编辑器中完成。 2.2 Windows 参见 1.3 Windows下安装GoAgent 安装验证 安装完成后,稍等几分钟,在阿里云控制台查看版本号,变为2.1.47,即升级成功。 卸载 4.1 Linux Linux下进入Agent所在目录。 ./CmsGoAgent.linux-${ARCH} stop ./CmsGoAgent.linux-${ARCH} uninstall 其中${ARCH}是您的处理器架构,有两种:386和amd64。执行完成后,退到上级目录,删除cloudmonitor目录即可。 4.2 Windows 使用Windows服务面板停止云监控服务。 到安装目录删除整个目录 C:\Program Files\Alibaba\cloudmonitor
云监控发布新feature,打通事件中心和函数服务,可以实现秒级故障恢复。 试想这样一个场景: 当ecs宕机时,在几秒内实现eip自动迁移至另一个健康的ecs实例,快速故障恢复,避免损失。 如何做到? 云监控之前推出了事件中心,定位于,将阿里云上发生的对用户有影响的事件,集中起来,统一展示,统一管理;同时,__可以实现在云产品异常事件发生的第一时间,对用户广播通知,同时打通了事件与函数服务,在事件发生时触发函数计算的执行,快速实现诸如eip迁移,slb带宽扩容,slb摘掉故障服务器等操作,以实现故障的快速恢复__。 架构示意图 在这个架构中,云产品提供各类事件,使得整个场景能够有米下锅;云监控在这个链路中,起到了枢纽的作用,有效串联了各云产品的事件和函数计算,再通过函数计算串联到各云产品的管控API,使云产品之间可以有效的联动。 故障发生>云产品事件>云监控广播>触发函数计算>云产品管控api>故障恢复 关键组件:云产品异常事件和运维Api ecs作为先锋产品,率先开放了12个对于用户极其重要的运维事件,使得基于事件的自动故障恢复可行。8月份,ecs还将继续开放更多的事件。 ECS目前开放的系统事件 事件名称 事件含义 状态 事件等级 Instance:InstanceFailure.Reboot 因实例错误实例重启开始 Executing CRITICAL Instance:InstanceFailure.Reboot 因实例错误实例重启结束 Executed CRITICAL Instance:SystemFailure.Reboot 因系统错误实例重启开始 Executing CRITICAL Instance:SystemFailure.Reboot 因系统错误实例重启结束 Executed CRITICAL Instance:SystemMaintenance.Reboot 因系统维护实例计划重启 Scheduled CRITICAL Instance:SystemMaintenance.Reboot 因系统维护实例计划重启已规避 Avoided CRITICAL Instance:SystemMaintenance.Reboot 因系统维护实例计划重启执行中 Executing CRITICAL Instance:SystemMaintenance.Reboot 因系统维护实例计划重启已完成 Executed CRITICAL Instance:SystemMaintenance.Reboot 因系统维护实例计划重启已取消 Canceled CRITICAL Instance:SystemMaintenance.Reboot 因系统维护实例计划重启已失败 Failed CRITICAL Disk:Stalled 磁盘性能受到严重影响开始 Executing CRITICAL Disk:Stalled 磁盘性能受到严重影响结束 Executed CRITICAL 更多事件详情:https://help.aliyun.com/document_detail/66940.html 关键组件:云监控 云监控是阿里云的核心基础服务之一,服务了近百万企业用户。云监控产品的核心目标是,帮助企业用户提升服务可用率。降低MTTR-平均故障时间。 关键组件:函数计算 阿里云函数计算(Function Compute)是一个事件驱动的全托管计算服务。通过函数计算,您无需管理服务器等基础设施,只需编写代码并上传。函数计算会为您准备好计算资源,以弹性、可靠的方式运行您的代码。更棒的是,您只需要为代码实际运行消耗的资源付费 - 代码未运行则不产生费用。 关于可用率 可用率的定义(百度百科):计算机有效性的表示,它是在一段相当长的时间内, 计算机的可用时间与故障时间,维修时间及可用时间总和比。 简单理解就是:MTTR(平均故障恢复时间)/MTBF(平均故障间隔)的比值。 如何有效提升可用率 如上所示,提升可用率,一是降低MTTR,二是提升MTBF。降低MTBF和提升MTTR的效果一样,但是代价却很不一样。尤其是在云时代,单点的错误非常常见,故障难以避免。一方面用户需要自己设计高可用架构,提供适当的容错,另一方面,也需要快速的故障发现和快速的故障恢复。 如何降低MTTR 1,及时的发现故障,并广播通知2,在可控范围内,快速的自动化的恢复故障, 通过事件中心的广播,快速发现故障,并广播给用户 云监控作为阿里云的基础服务,推出了事件中心。 产品定位于,将阿里云上发生的对用户有影响的事件,集中起来,统一展示,统一管理,让用户可以方便的了解这些事件,这些事件通常都是对用户有比较严重影响的事件,比如:ecs宕机,hang机,rds主备切换,slb证书过期,slb丢包等。事件发生后,可以在秒级内对外广播通知。让用户及时的了解故障发生,以便作出迅速反应。 故障自动恢复的风险和可行性 自动化的故障恢复通常伴随着相当高的风险,要非常谨慎;但是,通常大部分的故障都有相似性,符合28原则,80%的故障是由于20%的常原因导致, 对于这20%的高度一致的故障,迅速采集自动化的恢复措施,将有助于帮助用户快速的恢复故障。 当然,自定义的可编程的故障恢复将有助于用户定义自己的healing action。基于阿里云的函数计算服务,可以轻松实现这一灵活性。同时,函数计算服务,也会提供诸多标准化的模板,比如,slb带宽调整,eip迁移等,用户只要套用,轻点几下鼠标,即可以轻松实现。完成以下场景的自动化运维:ecs宕机时,几秒内完成eip迁移到另一台ecs;在业务高峰时,迅速的调整带宽,以适应业务的需求。 以上场景,基于'云产品事件>云监控>函数计算'这个链路,可以秒级的完成,从而快速的恢复故障,从而提升用户服务的可用率。 事件中心效果图 说了半天,看一下事件中心的真面目 未来规划: 未来,不只是系统事件,业务自己的异常事件, 也可以支持触发函数计算,这将大大拓展函数服务的价值边界,带来更多的可能性。 这一切,都是为了更好的可用性。 注:该功能已经灰度上线,感兴趣的同学,可以申请公测。钉钉扫描二维码: <div id="8ozdzz" data-type="image" data-display="block" data-align="left" data-src="https://cdn.nlark.com/lark/0/2018/png/32463/1533527800957-d1aef80d-c9e1-4827-9bd6-f2da75636724.png" data-width="273"> <img src="https://cdn.nlark.com/lark/0/2018/png/32463/1533527800957-d1aef80d-c9e1-4827-9bd6-f2da75636724.png" width="273" /> </div>
背景 系统事件监控为用户提供各类云产品产生的系统事件的统一统计和查询入口,使得用户明确知晓云产品的使用状态,让云更透明。 事件监控详细介绍 ECS 事件介绍及应对建议 本月的新版本,支持在这些产品的系统事件发生时,分发给您的消息服务队列、函数计算,以便后续自动化处理这些异常。 原理解读 事件发生时,云产品会将事件推送给云监控,云监控收到事件后,检查您是否配置了报警规则,如果有相关配置,会根据报警规则的配置将事件分发到相应渠道。 最佳实践分享 如何在ECS宕机时,通过函数计算将EIP迁移到另一台机器上。并且发送事件到消息服务的队列中。 创建函数计算 登录函数计算控制台:https://fc.console.aliyun.com/overview/cn-shanghai 新建服务 新建函数 选择空白函数,不创建触发器,以Java8运行环境为例上传一段EIP从机器A解绑后,绑定到机器B的代码逻辑,jar包中的代码见文章结尾分享。 函数入口为com.aliyun.cms.fc.driver.FCDriver::handleRequest无需其他权限设置,点击创建后保存函数 创建消息服务的队列 登录消息服务控制台:https://mns.console.aliyun.com/#/list/cn-hangzhou 创建队列 创建云监控系统事件报警 登录云监控事件监控控制台:https://cloudmonitor.console.aliyun.com/#/eventmonitoring/alarmrules 创建事件报警规则 点击按钮进入创建报警规则页面 首次使用先点击授权,允许云监控向您的队列和函数发送事件。 授权后,选择上一步创建好的队列和函数,保存设置。 调试事件 您可以使用系统事件的调试功能,模拟系统事件的发生,以便验证报警规则中设置的消息服务队列是否能正常接收时间、函数计算的函数是否能正常被触发。 点击报警规则列表的调试操作,进入调试页面 选择需要调试的事件,内容中会显示相应的事件内容,可以根据实际情况修改内容中的实例id等字段。 点击确定按钮,将根据内容发送一个事件,触发函数计算的逻辑、向消息服务队列中写一个事件。 查看结果 查看消息服务的队列信息在消息服务队列的列表页点击接收消息,可以看到队列里收到了调试发出的事件。 在弹性公网IP控制台查看IP已经从一台实例解绑后,重新绑定到另一台实例。 在函数计算的代码执行模块,可以查询执行结果。 示例代码 maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.aliyun.cms</groupId> <artifactId>drive-fc</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.aliyun.fc.runtime</groupId> <artifactId>fc-java-core</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-ecs</artifactId> <version>4.9.4</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-slb</artifactId> <version>3.2.6</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.0.3</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.48</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <appendAssemblyId>false</appendAssemblyId> <!-- this is used for not append id to the jar name --> </configuration> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project> Java 代码 示例包含EIP的解绑、绑定,SLB后端ESC实例的绑定、解绑,磁盘的挂载。试用时请将实例id、AK、SK等信息替换成您的具体信息,示例仅供演示参考,具体事件发生时应做的处理,需要根据您的实际业务决定。 package com.aliyun.cms.fc.driver; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.aliyun.fc.runtime.Context; import com.aliyun.fc.runtime.FunctionComputeLogger; import com.aliyun.fc.runtime.StreamRequestHandler; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.ecs.model.v20140526.*; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.slb.model.v20140515.AddBackendServersRequest; import com.aliyuncs.slb.model.v20140515.AddBackendServersResponse; import com.aliyuncs.slb.model.v20140515.RemoveBackendServersRequest; import com.aliyuncs.slb.model.v20140515.RemoveBackendServersResponse; import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; public class FCDriver implements StreamRequestHandler private static final String ak = "*"; private static final String aks = "*"; /** * * @param inputStream * @param outputStream * @param context * @throws IOException */ @Override public void handleRequest( InputStream inputStream, OutputStream outputStream, Context context) throws IOException { String input = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name()); JSONObject event = JSON.parseObject(input, JSONObject.class); context.getLogger().info("receive event message: " + event); String product = event.getString("product"); if ("ECS1".equalsIgnoreCase(product)) { handleECS(context.getLogger(), event); } outputStream.write("ok".getBytes()); } public void handleECS(FunctionComputeLogger logger, JSONObject event) { JSONObject content = event.getJSONObject("content"); String ecsInstanceId = content.getString("ecsInstanceId"); String regionId = event.getString("regionId"); String name = event.getString("name"); String eipId = "eip-*"; if ("Disk:Stalled:Executing".equalsIgnoreCase(name)){ unassociateEipAddress(regionId, ecsInstanceId, eipId, logger); try { TimeUnit.SECONDS.sleep(30); } catch (InterruptedException e) { } associateEipAddress(regionId, "i-****", eipId, logger); }else if ("Disk:Stalled:Executed".equalsIgnoreCase(name)){ unassociateEipAddress(regionId, "i-****", eipId, logger); try { TimeUnit.SECONDS.sleep(30); } catch (InterruptedException e) { } associateEipAddress(regionId, ecsInstanceId, eipId, logger); }else if ("Instance:SystemFailure.Reboot:Executing".equalsIgnoreCase(name)){ unassociateEipAddress(regionId, ecsInstanceId, eipId, logger); try { TimeUnit.SECONDS.sleep(30); } catch (InterruptedException e) { } associateEipAddress(regionId, "i-****", eipId, logger); }else if ("Instance:SystemFailure.Reboot:Executed".equalsIgnoreCase(name)){ unassociateEipAddress(regionId, "i-****", eipId, logger); try { TimeUnit.SECONDS.sleep(30); } catch (InterruptedException e) { } associateEipAddress(regionId, ecsInstanceId, eipId, logger); } } private void associateEipAddress(String regionId, String ecsInstanceId, String eipId, FunctionComputeLogger logger ) { DefaultProfile profile = DefaultProfile.getProfile(regionId, ak, aks); IAcsClient client = new DefaultAcsClient(profile); try { for (int count=0;count<5;count++) { DescribeEipAddressesRequest describeEipAddressesRequest = new DescribeEipAddressesRequest(); describeEipAddressesRequest.setAllocationId(eipId); describeEipAddressesRequest.setRegionId(regionId); DescribeEipAddressesResponse describeEipAddressesResponse = client.getAcsResponse(describeEipAddressesRequest); if (describeEipAddressesResponse!=null&&describeEipAddressesResponse.getEipAddresses()!=null&&"vailable".equalsIgnoreCase(describeEipAddressesResponse.getEipAddresses().get(0).getStatus())){ AssociateEipAddressRequest request = new AssociateEipAddressRequest(); request.setInstanceId(ecsInstanceId); request.setAllocationId(eipId); try { AssociateEipAddressResponse response = client.getAcsResponse(request); logger.info(String.format("Associate eip %s to ecs %s, requestId:%s, ", eipId, ecsInstanceId, response.getRequestId())); } catch (ClientException e) { logger.info(String.format("Failure of associate eip %s to ecs %s, errorMsg:%s", eipId, ecsInstanceId, e.getLocalizedMessage())); } return; } TimeUnit.SECONDS.sleep(5); } } catch (InterruptedException | ClientException e) { logger.info(String.format("Failure of describe eip %s, errorMsg:%s", eipId, e.getLocalizedMessage())); } } private void unassociateEipAddress(String regionId, String ecsInstanceId, String eipId, FunctionComputeLogger logger) { DefaultProfile profile = DefaultProfile.getProfile(regionId, ak, aks); IAcsClient client = new DefaultAcsClient(profile); UnassociateEipAddressRequest request = new UnassociateEipAddressRequest(); request.setInstanceId(ecsInstanceId); request.setAllocationId(eipId); try { UnassociateEipAddressResponse response = client.getAcsResponse(request); logger.info(String.format("Unassociate eip %s to ecs %s, requestId:%s, ", eipId, ecsInstanceId, response.getRequestId())); } catch (ClientException e) { logger.info(String.format("Failure of unassociate eip %s to ecs %s, errorMsg:%s", eipId, ecsInstanceId, e.getLocalizedMessage())); } } private void addBackendServer(String regionId, String ecsInstanceId, FunctionComputeLogger logger) { DefaultProfile profile = DefaultProfile.getProfile(regionId, ak, aks); IAcsClient client = new DefaultAcsClient(profile); String lb = "lb-****"; AddBackendServersRequest request = new AddBackendServersRequest(); request.setBackendServers(String.format("[{\"ServerId\":\"%s\",\"Weight\":50}]",ecsInstanceId)); request.setLoadBalancerId(lb); try { AddBackendServersResponse response = client.getAcsResponse(request); logger.info(String.format("add backend server %s to lb %s, requestId:%s, ", ecsInstanceId, lb, response.getRequestId())); } catch (ClientException e) { logger.info(String.format("failure of add backend server %s to lb %s, errorMsg:%s", ecsInstanceId, lb, e.getLocalizedMessage())); } } private void removeBackendServer(String regionId, String ecsInstanceId, FunctionComputeLogger logger) { DefaultProfile profile = DefaultProfile.getProfile(regionId, ak, aks); IAcsClient client = new DefaultAcsClient(profile); String lb = "lb-****"; RemoveBackendServersRequest request = new RemoveBackendServersRequest(); request.setBackendServers(String.format("[\"%s\"]",ecsInstanceId)); request.setLoadBalancerId(lb); try { RemoveBackendServersResponse response = client.getAcsResponse(request); logger.info(String.format("remove backend server %s to lb %s, requestId:%s, ", ecsInstanceId, lb, response.getRequestId())); } catch (ClientException e) { logger.info(String.format("failure of remove backend server %s to lb %s, errorMsg:%s", ecsInstanceId, lb, e.getLocalizedMessage())); } } private void mountDisk(String regionId, String ecsInstanceId, String diskId, FunctionComputeLogger logger) { logger.info("prepare mount diskId:"+diskId); AttachDiskRequest request = new AttachDiskRequest(); request.setDiskId(diskId); request.setInstanceId(ecsInstanceId); IClientProfile profile = DefaultProfile.getProfile(regionId, ak, aks); IAcsClient client = new DefaultAcsClient(profile); try { AttachDiskResponse response = client.getAcsResponse(request); logger.info("mount disk result:" + JSON.toJSONString(response)); } catch (ClientException e) { logger.error("mount failure, diskId:" + diskId + e.getMessage()); } } private void unmountDisk(String regionId, String ecsInstanceId, String diskId, FunctionComputeLogger logger) { logger.info("prepare mount diskId:"+diskId); DetachDiskRequest request = new DetachDiskRequest(); request.setDiskId(diskId); request.setInstanceId(ecsInstanceId); IClientProfile profile = DefaultProfile.getProfile(regionId, ak, aks); IAcsClient client = new DefaultAcsClient(profile); try { DetachDiskResponse response = client.getAcsResponse(request); logger.info("unmount disk result:" + JSON.toJSONString(response)); } catch (ClientException e) { logger.error("unmount failure, diskId:" + diskId); } } } 欢迎扫描下方二维码,加入云监控用户支持群。
如何在云监控控制台查询监控数据 购买ECS的GPU计算型实例后,安装GPU驱动和云监控插件的1.2.28版本,即可在主机监控查看GPU相关监控数据、配置报警规则,或在Dashboard中配置监控图表, 在主机监控中查看监控图表:在Dashboard中自定义监控大盘 如何设置报警规则 新增的GPU监控项添加报警规则方式同ECS的其他指标一样。推荐通过创建模板后将模板应用于分组的方式批量添加GPU报警。查看报警模板最佳实践。 监控项说明 GPU相关监控指标提供3个维度的数据 GPU维度监控项 GPU维度的指标,采集每个GPU层面的监控数据。 MetricName 单位 名称 dimensions gpu_memory_freespace Bytes GPU维度显存空闲量 instanceId,gpuId gpu_memory_totalspace Bytes GPU维度显存总量 instanceId,gpuId gpu_memory_usedspace Bytes GPU维度显存使用量 instanceId,gpuId gpu_gpu_usedutilization % GPU维度GPU使用率 instanceId,gpuId gpu_encoder_utilization % GPU维度编码器使用率 instanceId,gpuId gpu_decoder_utilization % GPU维度解码器使用率 instanceId,gpuId gpu_gpu_temperature ℃ GPU维度GPU温度 instanceId,gpuId gpu_power_readings_power_draw W GPU维度GPU功率 instanceId,gpuId gpu_memory_freeutilization % GPU维度显存空闲率 instanceId,gpuId gpu_memory_useutilization % GPU维度显存使用率 instanceId,gpuId 实例维度监控项 实例维度指标对单个ECS实例上的多个GPU监控数据做最大值、最小值、平均值的聚合。便于查看实例层面的整体使用情况。 MetricName 单位 名称 dimensions instance_gpu_decoder_utilization % 实例维度GPU解码器使用率 instanceId instance_gpu_encoder_utilization % 实例维度GPU编码器使用率 instanceId instance_gpu_gpu_temperature ℃ 实例维度GPU温度 instanceId instance_gpu_gpu_usedutilization % 实例维度GPU使用率 instanceId instance_gpu_memory_freespace Bytes 实例维度GPU显存空闲量 instanceId instance_gpu_memory_freeutilization % 实例维度GPU显存空闲率 instanceId instance_gpu_memory_totalspace Bytes 实例维度GPU显存总量 instanceId instance_gpu_memory_usedspace Bytes 实例维度GPU显存使用量 instanceId instance_gpu_memory_usedutilization % 实例维度GPU显存使用率 instanceId instance_gpu_power_readings_power_draw W 实例维度GPU功率 instanceId 分组维度监控项 分组维度指标对单个应用分组里的多个ECS 实例的监控数据做最大值、最小值、平均值的聚合。便于查看集群层面的整体使用情况。 MetricName 单位 名称 dimensions group_gpu_decoder_utilization % 分组维度GPU解码器使用率 groupId group_gpu_encoder_utilization % 分组维度GPU编码器使用率 groupId group_gpu_gpu_temperature ℃ 分组维度GPU温度 groupId group_gpu_gpu_usedutilization % 分组维度GPU使用率 groupId group_gpu_memory_freespace Bytes 分组维度GPU显存空闲量 groupId group_gpu_memory_freeutilization % 分组维度GPU显存空闲率 groupId group_gpu_memory_totalspace Bytes 分组维度GPU显存总量 groupId group_gpu_memory_usedspace Bytes 分组维度GPU显存使用量 groupId group_gpu_memory_usedutilization % 分组维度GPU显存使用率 groupId group_gpu_power_readings_power_draw W 分组维度GPU功率 groupId 如何通过API查询GPU监控数据? 查询监控数据文档:https://help.aliyun.com/document_detail/51936.html 参数说明:Project=acs_ecs_dashboard,Metric及Dimensions参考上述表格中的GPU指标。
现状 当前的监控报警体系里,用户生成新的ECS服务器后,需要手工将这些ECS归类到各个应用分组中,才能关联报警规则。 但是随着上云越来越深入,机器的创建次数越来越频繁,单次创建数量越来越多,相应手工操作的时间成本就会越来越高。因此云监控推出了动态配置应用分组的功能,可以在机器创建之初,通过维护好实例名称,自动匹配监控报警。 原理解读 首先在创建应用分组时,配置ECS名称的匹配规则。 创建机器的时候命名好实例名称,云监控便会按如下流程判断新创建的机器是否应该添加到相应分组中、关联相关报警规则。 操作说明 登录云监控控制台。 选择页面左侧菜单的应用分组,进入应用分组页面。 单击页面右上角的创建组,进入创建应用分组页面。 填写基本信息 填写应用分组名称。 选择联系人组。联系人组用于接收报警通知。 选择监控报警配置 选择报警模板(可选)。用于对组内的实例初始化报警规则。 开通初始化安装监控插件。即在新生成ECS 实例后,会对实例安装云监控插件,以便采集监控数据。 添加实例:通过制定动态匹配规则添加ECS实例。支持根据ECS实例名称进行字段的“包含”、“前缀”、“后缀”匹配,符合匹配规则的实例会加入应用分组(包含后续新创建的实例)。最多可以添加三条动态匹配规则,规则之间可以是“与”、“或”关系。其他产品实例可在完成应用分组的创建后添加。 点击“创建应用分组” 按钮,即完成创建。 创建完成后,进入分组详情页,即可看到符合匹配规则的实例已添加到分组内。 已经创建了很多静态的应用分组,如何升级成动态匹配的应用分组? 如果您的ECS实例名称维护的比较好,可以直接把静态添加方式改为动态匹配。例如如下ElasticSearch集群,点击“改为动态匹配”按钮,并且配置规则为实例名称包含“ESNode”。 如果您的实例名称没有按照业务维护好,建议先整理实例名称。 如果您在使用ECS 标签管理实例,敬请期待动态匹配的功能更新。我们近期将与标签服务打通,提供基于标签的动态分组配置。
云监控为用户提供了丰富的云产品监控数据,很多监控项在控制台开放前,可以优先通过OpenAPI查询数据并设置报警,下面分享一下如何通过白屏化的OpenAPI工具设置MongoDB单节点实例和云企业网实例的报警规则。 传送>>>>>> OpenAPI Explore 白屏化工具 最佳实践一:设置MongoDB的单节点实例报警规则 1.首先进入控制台MongoDB单节点列表页面,查询实例ID 2.在OpenAPI Explore报警页面,输入相关入参,并点击“发送请求”,即可创建报警规则。 Namespace固定为acs_mongodb,其余参数根据实际情况填写即可。联系人组信息,可以登录控制台后在报警服务中查询。 代码示例如下 import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.cms.model.v20180308.*; class Test { public static void main(String[] args) { // 初始化 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>","<accessSecret>"); IAcsClient client = new DefaultAcsClient(profile); //设置参数 CreateAlarmRequest createAlarm = new CreateAlarmRequest(); createAlarm.setNamespace("acs_mongodb"); createAlarm.setName("mongodb单节点报警测试"); createAlarm.setMetricName("MemoryUtilization"); createAlarm.setDimensions("[{"instanceId":"dds-bp1067053aea2604"}]"); createAlarm.setStatistics("Average"); createAlarm.setComparisonOperator(">"); createAlarm.setThreshold("0"); createAlarm.setContactGroups("["jiangmitest"]"); createAlarm.setNotifyType(1); // 发起请求 try { CreateAlarmResponse response = client.getAcsResponse(createAlarm); }catch (Exception e) { e.printStackTrace(); } } } 附1:MongoDB单节点监控项说明 MongoDB单节点监控项说明 MetricName 含义 单位 Dimensions Statistics SingleNodeCPUUtilization 实例的CPU使用率 % instanceId Average 、Minimum 、Maximum SingleNodeMemoryUtilization 实例的内存使用率 % instanceId Average 、Minimum 、Maximum SingleNodeDiskUtilization 实例的磁盘使用率 % instanceId Average 、Minimum 、Maximum SingleNodeIOPSUtilization 实例的IOPS使用率 % instanceId Average 、Minimum 、Maximum SingleNodeConnectionUtilization 已经使用的连接数百分率 % instanceId Average Minimum 、Maximum SingleNodeQPS Mongodb实例的平均每秒SQL查询数 个 instanceId Average 、Minimum 、Maximum SingleNodeConnectionAmount 当前应用程序连接到Mongodb实例的数量 个 instanceId Average 、Minimum 、Maximum SingleNodeInstanceDiskAmount 实例实际使用的磁盘空间总量 Bytes instanceId Average 、Minimum 、Maximum SingleNodeDataDiskAmount 数据占用的磁盘空间容量 Bytes instanceId Average 、Minimum 、Maximum SingleNodeLogDiskAmount 日志占用磁盘空间量 Bytes instanceId Average 、Minimum 、Maximum SingleNodeIntranetIn 实例的网络流入流量 Bytes instanceId、role Average 、Minimum 、Maximum SingleNodeIntranetOut 实例的网络流出流量 Bytes instanceId Average 、Minimum 、Maximum SingleNodeNumberRequests 发送到服务端的请求总量 个 instanceId Average 、Minimum 、Maximum SingleNodeOpInsert 从mongodb实例最近一次启动到现在累计接收到的insert命令的次数 次 instanceId Average 、Minimum 、Maximum SingleNodeOpQuery 从mongodb实例最近一次启动到现在累计接收到的query命令的次数 次 instanceId Average 、Minimum 、Maximum SingleNodeOpUpdate 从mongodb实例最近一次启动到现在累计接收到的update命令的次数 次 instanceId Average 、Minimum 、Maximum SingleNodeOpDelete 从mongodb实例最近一次启动到现在累计执行delete的操作次数 次 instanceId Average 、Minimum 、Maximum SingleNodeOpGetmore 从mongodb实例最近一次启动到现在累计执行getmore的操作次数 次 instanceId Average 、Minimum 、Maximum SingleNodeOpCommand 从mongodb实例最近一次启动到现在向数据库发出的command的累计次数 次 instanceId Average 、Minimum 、Maximum 最佳实践二:设置云企业网的报警规则 云企业网提供三个层面监控数据,区域层面、地域层面、边缘路由器健康检查。具体指标见文章结尾。 1.首先进入控制台云企业网实例列表页面 ,查询云企业网实例ID 查询边缘路由器信息 2.在OpenAPI Explore报警页面,输入相关入参,并点击“发送请求”,即可创建报警规则。 Namespace固定为acs_cen,其余参数根据实际情况填写即可。点击发送后,创建成功即可在云监控控制台查看。 代码示例如下 import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.cms.model.v20180308.*; class Test { public static void main(String[] args) { // 初始化 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>","<accessSecret>"); IAcsClient client = new DefaultAcsClient(profile); //设置参数 CreateAlarmRequest createAlarm = new CreateAlarmRequest(); createAlarm.setNamespace("acs_cen"); createAlarm.setName("云企业网路由器丢包报警"); createAlarm.setDimensions("[{"cenId":"cen-wqixsotyw9itjgxsjm","vbrInstanceId":"vrt-rj9sqlbbmui8993f931tv"}]"); createAlarm.setMetricName("VBRInternetInRate"); createAlarm.setStatistics("Value"); createAlarm.setComparisonOperator(">"); createAlarm.setThreshold("0"); createAlarm.setContactGroups("["jiangmitest"]"); createAlarm.setNotifyType(1); // 发起请求 try { CreateAlarmResponse response = client.getAcsResponse(createAlarm); }catch (Exception e) { e.printStackTrace(); } } } 附 云企业网监控指标说明 Metric 监控项含义 单位 Dimensions Statistics InternetOutRatePercentByConnectionArea 区域流出带宽百分比 % cenId、geographicSpanId Value InternetOutRatePercentByConnectionRegion 地域流出带宽百分比 % cenId、geographicSpanId、localRegionId、oppositeRegionId Value InternetOutRateByConnectionArea 区域流出带宽 bits/s cenId、geographicSpanId Value InternetOutRateByConnectionRegion 地域流出带宽 bits/s cenId、geographicSpanId、localRegionId、oppositeRegionId Value LatencyByConnectionRegion 地域延时 ms src_region_id、dst_region_id Value VBRHealthyCheckLatency 边缘路由器延时 ms cenId、vbrInstanceId Value VBRHealthyCheckLossRate 边缘路由器丢包率 % cenId、vbrInstanceId Value VBRInternetOutRate 边缘路由器流出带宽 bits/s cenId、vbrInstanceId Value VBRInternetInRate 边缘路由器流入带宽 bits/s cenId、vbrInstanceId Value geographicSpanId列表 可以通过查询CEN的DescribeCenBandwidthPackages接口,通过GeographicRegionBId和GeographicRegionAId获取互通区域的Id。示例如下: RegionId列表 localRegionId、oppositeRegionId、src_region_id、dst_region_id与阿里云RegionId一样,可以通过 DescribeRegions接口来查询RegionId。
问题背景 云监控为RDS用户提供了默认报警功能,每创建1个RDS实例,云监控会自动生成4到5条RDS的云监控报警规则。这样存在以下几个问题: 用户无法选择是否需要自动创建报警规则,也无法选择对哪些指标设置、发送给何人。 生成过多的规则,用户修改规则时(调整消息接受者、调整阈值等),需要逐条修改,耗时耗力 发送的邮箱是注册云账号时填写的邮箱,这类邮箱通常是账号管理者所有、甚至无法查收邮件的无效邮箱。很难及时有效让一线运维、开发直销数据库报警。 云监控4月2日正式商用后,报警规则数量是计费项之一,需要帮助您对监控报警进行成本优化。查看计费规则 如何解决 基于以上问题,云监控提供了如下快捷优化方案。 第一步:设置RDS一键报警 登录云监控报警服务,进入一键报警页面。 开启RDS的一键报警。开启后会为您创建如下5条规则,并且不再为新生成的实例创建在单实例上创建报警规则。而这5条规则作用于您当前的所有RDS实例以及后续新增的RDS实例。 如果您需要修改报警阈值、报警通知的接收人、发送报警通知的方式,只需要点击修改,修改相关配置,即可作用于全部实例。 第二步:删除当前创建在单实例上的报警规则 登录云监控报警服务,进入报警规则页面。 在报警规则列表的“维度”上选择“实例维度”,产品选择“云数据库RDS版”,过滤出所有设置在单个RDS实例上的报警规则。 勾选报警规则,进行批量删除。 如需帮助,可钉钉搜索群号338149737,加入云监控用户支持群。
前言 作为一个云上运维的新人,面对阿里云上复杂的生态系统,ECS、RDS、负载均衡、各种数据库等等,每一个服务下面都有无数的指标需要了解,那么如此高的学习成本,要花费多少时间才能完成准确建立起基本的云上监控报警体系,避免遗漏重要指标的报警呢? 业务快速迭代的过程中,购买的大量服务器如何快速被现有监控体系覆盖呢? 面对云监控应用分组、报警规则、各种云产品监控等等一系列高级功能,如何在学习过程中先对运维监控快速兜底呢? 如果你有以上烦恼,那么请继续阅读本文。10秒中让您的服务拥有最低成本的基础保护。在业务出问题时,让云监控通知你,而不是让你的老板或者客户通知你。 操作步骤 登录云监控,进入报警服务--一键报警功能,对需要设置报警的云产品开启一键报警按钮,完成设置! 点击服务右侧的下拉按钮,可能快速查看<一键告警>给您自动生成的规则,当然这些规则都是我们的运维工程师千锤百炼出来的精华。如图示例ECS:请注意:一键告警提供的规则针对您名下的所有资源生效。也就是说您名下所有的ECS均已开启相应的指标监控,而仅仅只消耗4条报警规则! 当然,这些报警规则您可以进行修改、删除、禁用等操作,以满足您业务中的个性化需求。您也可以在报警服务的报警规则列表中检索到这些规则。 一键报警功能详情 当前已接入一键告警的服务,以及默认规则如下所示: 服务名称 指标名称 规则描述 ECS CPUUtilization(CPU使用率) 一分钟内最大值>90%,连续五次,沉默时间1小时,邮件通知 vm.DiskUtilization(磁盘使用率) 一分钟内最大值>90%,连续五次,沉默时间1小时,短信、邮件通知 vm.MemoryUtilization(内存使用率) 一分钟内最大值>90%,连续五次,沉默时间1小时,邮件通知 InternetOutRate_Percent(公网流出带宽使用率) 一分钟内最大值>90%,连续五次,沉默时间1小时,邮件通知 RDS CpuUsage(CPU使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 DiskUsage(磁盘使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,短信、邮件通知 IOPSUsage(IOPS使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 ConnectionUsage(连接数使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时, 邮件通知 DataDelay(只读实例延迟) 五分钟内最大值>5,连续五次,沉默时间1小时,邮件通知 SLB DropConnection (监听每秒丢失连接数) 一分钟内最大值>0,连续五次,沉默时间1小时,邮件通知 DropTrafficRX(监听每秒丢失入bit数) 一分钟内最大值>0,连续五次,沉默时间1小时,邮件通知 DropTrafficTX(监听每秒丢失出bit数 ) 一分钟内最大值>0,连续五次,沉默时间1小时,邮件通知 Redis CpuUsage(CPU使用率 ) 一分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 ConnectionUsage(连接数使用率) 一分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 MemoryUsage(内存使用率) 一分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 IntranetInRatio(写入带宽使用率) 一分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 IntranetOutRatio(读取带宽使用率) 一分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 MongoDB(副本集) CPUUtilization(CPU使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 MemoryUtilization(内存使用百分比) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 DiskUtilization(磁盘使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 IOPSUtilization(IOPS使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 ConnectionUtilization(连接数使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 MongoDB (分片集群) ShardingCPUUtilization (CPU使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 ShardingMemoryUtilization(内存使用百分比) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 ShardingDiskUtilization(磁盘使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 ShardingIOPSUtilization(IOPS使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 ShardingConnectionUtilization(连接数使用率) 五分钟内最大值>80%,连续五次,沉默时间1小时,邮件通知 HBase LoadPerCpu 五分钟内最大值>3,连续三次,沉默时间1小时,邮件通知 cpu_idle 五分钟内最大值<10,连续三次,沉默时间1小时,邮件通知 compactionQueueSize 五分钟内最大值>2000,连续三次,沉默时间1小时,邮件通知 rs_handlerQueueSize 五分钟内最大值>1000,连续三次,沉默时间1小时,邮件通知 CapacityUsedPercent 五分钟内最大值>0.8,连续三次,沉默时间1小时,邮件通知 zookeeper_tcp_count 五分钟内最大值>2000,连续三次,沉默时间1小时,邮件通知 ElasticSearch ClusterStatus(集群状态) 一分钟内最大值>2,连续十次,沉默时间1小时,邮件通知 NodeDiskUtilization (节点磁盘使用率 ) 一分钟内最大值>75%,连续十次,沉默时间1小时,邮件通知 NodeHeapMemoryUtilization(节点HeapMemory使用率) 一分钟内最大值>85%,连续十次,沉默时间1小时,邮件通知 Opensearch开放搜索 DocSizeRatiobyApp (存储容量使用率) 十分钟内最大值>85%,连续一次,沉默时间1小时,邮件通知 ComputeResourceRatiobyApp(计算资源使用率) 十分钟内最大值>85%,连续一次,沉默时间1小时,邮件通知 一键报警相关OpenAPI介绍 maven依赖 <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-cms</artifactId> <version>5.2.2</version> </dependency> 查询已开启产品列表 查询Actionproduct:Cmsversion: 2017-03-01action: ListProductOfActiveAlert返回值 { "Datapoints": "mongodb,ecs,slb,rds", "Success": true, "Code": "200" } 查询告警规则列表 查询Actionproduct:Cmsversion: 2017-03-01action: ListActiveAlertRule 查询参数 字段 类型 是否必须 描述 product string 是 云服务器ECS(ecs)、HBase(hbase)、云数据库MongoDB(mongodb)、云数据库MongoDB集群版(mongodb_sharding)、云数据库RDS版(rds)、云数据库Redis版(redisa)、负载均衡(slb)、ES(elasticseearch)、OpenSearch(opensearch)。参数为括号内值。 例子: "product":"mongodb" 返回值 { "Datapoints": { "Alarm": [ { "Uuid": "", "Period": 60, "Statistics": "Average", "Webhook": "null", "RuleName": "", "EvaluationCount": 5, "Name": "SystemDefault_acs_mongodb_MemoryUtilization", "MetricName": "MemoryUtilization", "State": "OK", "Threshold": "80", "Enable": false, "SilenceTime": 86400, "NotifyType": 0, "Namespace": "acs_mongodb", "ContactGroups": "["云账号报警联系人"]", "EndTime": 24, "StartTime": 0, "ComparisonOperator": ">" } ] }, "Success": true, "Code": "200" } 启用一键报警 查询Actionproduct:Cmsversion: 2017-03-01action: EnableActiveAlert 查询参数 字段 类型 是否必须 描述 product string 否 产品名 ecs/slb/mongodb/hbase/mongodb_sharding/rds/redisa等 例子: "product":"ecs" 返回值 { "Message": "", "Success": true, "Code": "200" } 错误码信息 206 PartiallySuccessful Partially successful。Possible reason: quota limit。 422 CreateAlarmError Possible reason: quota limit。 500 InternalError The request processing has failed due to some unknown error. 禁用一键报警 查询Actionproduct:Cmsversion: 2017-03-01action: DisableActiveAlert 查询参数 字段 类型 是否必须 描述 product string 否 产品名 ecs/slb/mongodb/hbase/mongodb_sharding/rds/redisa等 例子: "product":"ecs" 返回值 { "Message": "", "Success": true, "Code": "200" } 错误码信息 200 成功 400 参数错误或缺失 403 校验失败、限速、没有授权 500 服务内部错误
背景 有几个客户在使用自定义监控,通过脚本方式上报数据时,反馈我们的文档不细致,对于aliyuncli的配置不熟,对于自定义指标的部分字段的含义不理解。 因此有必要再整理一个stepbystep的文档,描述清楚每一步的具体含义。 希望能够根据这个文档,能够快速的完成一个自定义的监控脚本。 前置条件 你需要有一个阿里云官网账号 生成ak(accesskeyid, accesskeysecrret) 建议使用子账号accesskeyid, accesskeysecrret,安全性更好。 创建子账号 为子账号生成accesskeyid, accesskeysecrret 为子账号授权:cloudmonitorfullaccess 安装aliyuncli工具 前提条件 • 系统要求:Linux、UNIX 或 Mac OS。 • 环境要求:已安装 Python 2.7.x。 安装 Python • 若您的设备已安装 Python 2.7.x 版本,请跳过此步骤。 • 若您的设备没有安装 Python 2.7.x 版本,请在命令行窗口中执行下列命令,安装 Python。 • 注意:请确保您的设备中已安装了 wget。 1. wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz (或者通过其他方式下载后放在某个路径下) 2. tar -zxvf Python-2.7.8.tgz 3. cd Python-2.7.8 4. ./configure 5. make 6. sudo make install 安装 pip • 若您的设备已安装 pip,请跳过此步骤。 • 若您的设备没有安装 pip,在命令行窗口中执行如下命令,安装 pip。 1. curl "https://bootstrap.pypa.io/get-pip.py" -o "pip-install.py" 2. sudo python pip-install.py • 系统显示如下类似信息,则表明安装成功。 1. Successfully installed pip-7.1.2 setuptools-18.7 wheel-0.26.0 安装命令行工具 如果系统内的 pip 版本过低,会造成 CLI 安装出错。用户可以使用如下指令先对 pip 软件进行升级后再进行相关操作。请使用 pip 7.x 或更高版本。若已是最新版本的 pip,请跳过此步骤。 在命令行窗口中执行如下命令,升级 pip。 1. sudo pip install -U pip 系统显示如下类似信息,则表明升级成功。 1. Successfully uninstalled pip-7.1.2 2. Successfully installed pip-8.1.2 2. 执行如下命令,安装阿里云命令行工具。 1. sudo pip install aliyuncli 系统显示如下类似信息,则表明安装成功。 1. Successfully installed aliyuncli-2.1.2 colorama-0.3.3 jmespath-0.7.1 配置命令行工具 ~ sudo aliyuncli configure Aliyun Access Key ID [*******************a]: youraccesskeyid Aliyun Access Key Secret [*******************b]: youraccesskeysecret Default Region Id [cn-hangzhou]: cn-hangzhou Default output format [json]: json 安装云监控sdk Windows安装方式: 在命令行窗口输入如下命令 1. cd C:\Python27\Scripts 2. pip install aliyun-python-sdk-cms 如果需要更新SDK,则使用如下命令: 1. pip install --upgrade aliyun-python-sdk-cms Linux 安装方式: 1. sudo pip install aliyun-python-sdk-cms 如果需要升级SDK,则使用如下命令: 1. sudo pip install —upgrade aliyun-python-sdk-cms 上报数据 上报自定义事件数据 使用PutEvent接口。 Windows上报示例: 1. aliyuncli.exe cms PutEvent --EventInfo "[{'content':'helloworld','time':'20171013T170923.456+0800','name':'ErrorEvent','groupId':'27147'}]" Linux 上报示例: 1. aliyuncli cms PutEvent --EventInfo "[{'content':'helloworld','time':'20171023T180923.456+0800','name':'ErrorEvent','groupId':'27147'}]" 上报成功后,返回200状态码 1. { 2. "Code":"200" 2. } 上报自定义指标数据 使用PutCustomMetric接口 Linux 上报示例: 1. aliyuncli cms PutCustomMetric --MetricList "[{groupId': 101,'metricName': 'hearteate','dimensions': {'name': '127.0.0.1','sex': 'hosta'},'type': 0,'values': {'value': 10.5}}]" 参数解释: 1. groupId,就填你创建的$groupid, 如果没有分组,也可以直接填入0,表示没有分组。 2. metricName是你自己命名的一个指标的名称。 3. dimensions是一组{"K1":v1,"k2":v2},也是一组json结构的tag, 用来描述指标的维度或者属性,根据业务填写, 也可以为空, 比如,如果metricName:heartbeate(一个人的心跳), 那么dimensions应该是用来描述人是谁, {'name':'waitaminitue','sex':'male'},也可以{'name':'waitaminitue'} , 也可以{'id':'370283xxxxxxxx'}。具体根据业务确定。每组不同的dimensions会形成一个时间序列,即形成这个指标的一条线。 4. type:0, 表示是原始数据上报,这个不用动, 5. value:就填具体的心跳的次数。 6. 整个MetricList是一个json格式的string字符串,需要由""双引号包括,里面的key需要由''包括。 上报成功后,返回200状态码: 1. { 2. "Code":"200" 3. } 错误编码 错误代码 含义 200 正常 400 客户端请求中的语法错误 403 校验失败、限速、没有授权 500 服务器内部错误 通过cron定时执行脚本。 sudo crontab -e 添加以下到cron里,每分钟执行一次。 * * * * * heartbeate.sh 参考 自定义指标监控详细介绍: * https://help.aliyun.com/document_detail/63767.html?spm=a2c4g.11186623.6.626.efTsCt 自定义事件监控详细介绍: * https://help.aliyun.com/document_detail/60724.html?spm=a2c4g.11186623.6.573.FCla0R 云监控官网地址: * https://www.aliyun.com/product/jiankong 云监控自定义监控优势: • 开箱即用,不需要安装zabbix, • 不需要注册,直接上报 • 上报指标支持按业务分组, • 支持对指标配置大屏和报警, • 自定义指标可以和其他的基础监控一起,形成关联性分析,更利于故障分析定位。
云监控赶在春节前推出了一键报警功能,希望能帮助对云上监控运维还不太熟悉的小伙伴们,快速建立起基础的初级监控报警解决方案,安心过个好年。 知道你们着急过年,废话不多说,上干货。 如何设置一键报警 登录阿里云-云监控控制台后,可以在【报警服务】下找到【一键报警】菜单。 点击“一键报警”按钮,即开启了一键报警功能,就这么简单。 以ECS为例,开启一键报警后,您账号下所有的实例以及后续新生成的实例,只要监控项满足图中报警规则设置的条件,就会收到邮件形式的报警通知。邮件地址为您注册云账号时填写的邮箱。 更多小技巧 如果初始化的配置不合我心意怎么办? 点击上图中的修改按钮,进入如下页面修改配置。 通道沉默时间:如果一个实例的某个监控项报警一直没恢复,多久再发送一次报警通知 生效时间:报警通知只在指定的生效时间内发送 一键报警默认发送邮件通知,如果您还想收到短信通知、钉钉群通知,可以在通知方式中修改。 附送如何设置通过钉钉机器人接收报警通知。 如何修改接收报警的联系人? 一键报警默认将报警通知发送给您在注册云账号时填写的邮箱上,如果您需要修改邮件,可以按如下步骤修改: 进入报警服务-报警联系人页面,找到所属报警组为“云账号报警联系人”的联系人,然后点击编辑即可。如下图: 恭喜跨过云上监控初级阶段! 想要玩的更666可以阅读以下文档: 如何进行服务器监控及进程监控 如何对业务异常事件进行监控及报警 如何对收集到日志服务中的数据进行监控和报警? 如何跨产品跨地域从业务角度管理云资源、构建监控体系? 更欢迎钉钉扫码加入用户支持群,云监控小伙伴帮你解答监控困扰
背景 任何服务都避免不了出现以下问题,你的用户访问不了你的服务或者站点,用户偶尔碰到5xx,服务响应延迟比较慢,某台应用进程挂掉,导致访问时好时坏。问题在于,你是否要等你的用户来告诉你,你的程序是问题了。 出问题的原因很多,应用进程挂了,java应用大GC导致应用不响应,应用依赖的rds,redis响应慢或者干脆不响应。应用依赖的其他http服务响应慢或者不响应等。 困难 然而,当企业上云后,应用程序的运行环境也变得复杂。也许你的应用程序跑在了ecs上,可能是在vpc的内网环境里,无法有效的触达到你的应用程序。也许你的应用程序跑在docker容器里。也许你的应用程序是直接run在serverless架构里。也许你懒于自己维护了一个zabbix,需要付出较大的维护成本。以上这些,都让应用程序的运行时可用性监控变得困难。 另外,出问题的原因很多,应用进程挂了,java应用大GC导致应用不响应,应用依赖的rds,redis响应慢或者干脆不响应。应用依赖的其他http服务响应慢或者不响应等。如何用一个方案,简单的把这些全部监控起来?出问题的时候及时的告诉应用开发人员? 解决方案 可用性监控 云监控推出了应用可用性监控,可以通过在控制台创建一个可用性监控任务,从分组内选择部分机器,发起到本地127.0.0.1或者到内网组件(rds,oss,redis等),或者是远程api的探测任务,并将探测结果反馈到云监控,同时用户可以对探测结果设置一个报警, 当探测不通或者不符合预期时,通过短信,邮件,钉钉,消息,回调等方式,在出问题的第一时间通知给你,让你在第一时间作出反应。目前支持的探测类型包括:ping,telnet,http(s)三种,其中http支持对返回结果做简单检验,判断是否包括某些关键字等。 可用性探测示意图 具体步骤 创建分组,实例资源加入分组,并给分组指定相关人(管理分组,接收报警通知) 创建应用本身的可用性监控 创建应用对rds/redis的依赖监控前提是,需要将依赖也加入到本应用分组内。 这个监控只能对应用分组的资源进行监控。 报警通知 目前云监控支持短信,钉钉,邮件,消息MNS,公网http回调等多种通知方式。同时支持报警后静默多长时间再次通知,在哪个时间段内生效(也许白天你上班时间自己盯着,不希望白天发短信)。另外,云监控提供每月1000条短信免费使用。在下个版本,大概3月底,云监控还将支持电话报警。到这里, 安全可靠的应用可用性监控就配置好了, 如果应用发生问题,比如进程挂掉,端口不响应,响应延迟等,就可以及时得到通知了。 彩蛋 同时, 云监控还支持 主机监控(提供秒级的丰富的监控指标,支持非阿里云主机,打通线上线下) 云服务监控(包括阿里云上30+商业化产品), 站点监控 日志监控 自定义监控 事件监控(上报异常事件并报警) 丰富灵活的Dashboard(自定义监控大盘) 支持跨产品跨地域的应用资源分组等丰富完善的端到端的监控功能栈。相信一定可以解决您的云上监控需求。 更多详情可查看云监控产品手册:https://www.aliyun.com/product/jiankong 产品咨询与支持,欢迎扫描钉钉二维码加入云监控用户支持群
SRE中关于监控Action的定义 监控系统是 SRE 团队监控服务质量和可用性的一个主要手段。所以监控系统的设计和策略值得着重讨论。最普遍和传统的报警策略是针对某个特定的情况或者监控值,一旦出现情况或者监控值超过阈值就触发 E-mail 报警。但是这样的报警并不是非常有效:一个需要人工阅读邮件和分析报警来决定目前是否需要采取某种行动的系统从本质上是错误的。监控系统不应该依赖人来分析信息进行报警,而是应该由系统自动分析,仅仅当需要用户执行某种操作时,才需要通知用户。 监控不做任何事情是不可能的,有三种有效的监控输出: 警报 意味着收到警报的用户需要立即执行某种操作,目标是解决某种已经发生的问题,或者是避免即将要发生的问题。 工单 意味着接受工单的用户应该执行某种操作,但是并非立即执行。系统并不能自动解决目前的情况,但是如果一个用户在几天内执行这项操作,系统不会受到任何影响。 日志 平时没有人需要关注日志信息,但是日志信息依然被收集起来以备调试和事后分析时使用。正确的做法是平时没有人主动阅读日志,除非处理其他请求的时候被要求这么做。 如何使用云监控实现 默认报警 云监控报警服务提供第一个报警能力就是发送报警信息,为此我们作了多种报警配置 支持多种渠道的通知方式 多种报警抑制策略:通道沉默/报警条件次数/生效时间 支持全部资源/应用分组/单个实例等多不同level的报警设置 具体使用方法参考 使用报警服务 使用报警模板 通过云监控控制台/OpenAPI/SDK三种方式,可以在云监控设置报警。 新的问题 从SRE的实践来看,设置报警规则不会是一锤定音的事情,需要长期维护,当前的某一个常见的自动化困难的警报,可能很快就会变成一个经常触发的问题,这时最好能一个临时的自动化处理的脚本来应对。 实际上SRE也是这么定义的 没有不需要采取行动的警报。如果您遇到一个自己认为不需要执行操作的警报,您需要采用自动化的手段来修复该警报。 那么问题来了,在云监控中,如何实现自动化修复/生成工单/记录日志这几个Action呢。 云监控提供了报警回调(webhook)的能力,可以用来打通云监控报警服务与你的业务系统,完成更多的运维管理可能,如何报警回调,下面进行详细说明,并且提供了回调服务的demo供你选择。 使用云监控控制台使用报警回调 设置报警回调 从以下入口创建报警规则时都可以设置报警回调:报警服务/主机监控/日志监控/云服务监控 注意事项: 仅支持http post,不支持的http服务会报错 不要设置常见网站地址,会出现未知错误 该http服务需要公网可访问 定义回调的HTTP服务 基本调用方式 云监控回调时会将报警相关参数以content-type:application/json的格式post到你的http服务,因此你的服务需要使用json格式来解析,回调传入的参数,请参考文档使用报警回调 JSON代码示例 #!/usr/bin/env python2.7 # -*- coding: utf-8 -*- VERSION = '0.1' import argparse import BaseHTTPServer import cgi import logging import os import sys import json def make_request_handler_class(opts): ''' Factory to make the request handler and add arguments to it. It exists to allow the handler to access the opts.path variable locally. ''' class MyRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): ''' Factory generated request handler class that contain additional class variables. ''' m_opts = opts def do_POST(self): ''' Handle POST requests. ''' logging.debug('POST %s' % (self.path)) ctype, pdict = cgi.parse_header(self.headers['content-type']) result = {} if ctype == 'application/json': length = int(self.headers['content-length']) result = json.loads(self.rfile.read(length)) logging.info('post json: %s'% result) # Get the "Back" link. back = self.path if self.path.find('?') < 0 else self.path[:self.path.find('?')] # Print out logging information about the path and args. logging.debug('TYPE %s' % (ctype)) logging.debug('PATH %s' % (self.path)) logging.debug('ARGS %d' % (len(result))) if len(result): i = 0 for key in sorted(result): logging.debug('ARG[%d] %s=%s' % (i, key, result[key])) i += 1 # Tell the browser everything is okay and that there is # HTML to display. self.send_response(200) # OK self.send_header('Content-type', ctype) self.end_headers() # Display the POST variables. self.wfile.write('{message:"called by cms success."}') return MyRequestHandler def err(msg): ''' Report an error message and exit. ''' print('ERROR: %s' % (msg)) sys.exit(1) def getopts(): ''' Get the command line options. ''' # Get the help from the module documentation. this = os.path.basename(sys.argv[0]) description = ('description:%s' % '\n '.join(__doc__.split('\n'))) epilog = ' ' rawd = argparse.RawDescriptionHelpFormatter parser = argparse.ArgumentParser(formatter_class=rawd, description=description, epilog=epilog) parser.add_argument('-d', '--daemonize', action='store', type=str, default='.', metavar='DIR', help='daemonize this process, store the 3 run files (.log, .err, .pid) in DIR (default "%(default)s")') parser.add_argument('-H', '--host', action='store', type=str, default='localhost', help='hostname, default=%(default)s') parser.add_argument('-l', '--level', action='store', type=str, default='info', choices=['notset', 'debug', 'info', 'warning', 'error', 'critical',], help='define the logging level, the default is %(default)s') parser.add_argument('--no-dirlist', action='store_true', help='disable directory listings') parser.add_argument('-p', '--port', action='store', type=int, default=8080, help='port, default=%(default)s') parser.add_argument('-r', '--rootdir', action='store', type=str, default=os.path.abspath('.'), help='web directory root that contains the HTML/CSS/JS files %(default)s') parser.add_argument('-v', '--verbose', action='count', help='level of verbosity') parser.add_argument('-V', '--version', action='version', version='%(prog)s - v' + VERSION) opts = parser.parse_args() opts.rootdir = os.path.abspath(opts.rootdir) if not os.path.isdir(opts.rootdir): err('Root directory does not exist: ' + opts.rootdir) if opts.port < 1 or opts.port > 65535: err('Port is out of range [1..65535]: %d' % (opts.port)) return opts def httpd(opts): ''' HTTP server ''' RequestHandlerClass = make_request_handler_class(opts) server = BaseHTTPServer.HTTPServer((opts.host, opts.port), RequestHandlerClass) logging.info('Server starting %s:%s (level=%s)' % (opts.host, opts.port, opts.level)) try: server.serve_forever() except KeyboardInterrupt: pass server.server_close() logging.info('Server stopping %s:%s' % (opts.host, opts.port)) def get_logging_level(opts): ''' Get the logging levels specified on the command line. The level can only be set once. ''' if opts.level == 'notset': return logging.NOTSET elif opts.level == 'debug': return logging.DEBUG elif opts.level == 'info': return logging.INFO elif opts.level == 'warning': return logging.WARNING elif opts.level == 'error': return logging.ERROR elif opts.level == 'critical': return logging.CRITICAL def daemonize(opts): ''' Daemonize this process. ''' if os.path.exists(opts.daemonize) is False: err('directory does not exist: ' + opts.daemonize) if os.path.isdir(opts.daemonize) is False: err('not a directory: ' + opts.daemonize) bname = 'webserver-%s-%d' % (opts.host, opts.port) outfile = os.path.abspath(os.path.join(opts.daemonize, bname + '.log')) errfile = os.path.abspath(os.path.join(opts.daemonize, bname + '.err')) pidfile = os.path.abspath(os.path.join(opts.daemonize, bname + '.pid')) if os.path.exists(pidfile): err('pid file exists, cannot continue: ' + pidfile) if os.path.exists(outfile): os.unlink(outfile) if os.path.exists(errfile): os.unlink(errfile) if os.fork(): sys.exit(0) # exit the parent os.umask(0) os.setsid() if os.fork(): sys.exit(0) # exit the parent print('daemon pid %d' % (os.getpid())) sys.stdout.flush() sys.stderr.flush() stdin = file('/dev/null', 'r') stdout = file(outfile, 'a+') stderr = file(errfile, 'a+', 0) os.dup2(stdin.fileno(), sys.stdin.fileno()) os.dup2(stdout.fileno(), sys.stdout.fileno()) os.dup2(stderr.fileno(), sys.stderr.fileno()) with open(pidfile, 'w') as ofp: ofp.write('%i' % (os.getpid())) def main(): ''' main entry ''' opts = getopts() if opts.daemonize: daemonize(opts) logging.basicConfig(format='%(asctime)s [%(levelname)s] %(message)s', level=get_logging_level(opts)) httpd(opts) if __name__ == '__main__': main() # this allows library functionality HTTP服务回调校验 在使用云监控控制台和SDK创建带有报警回调的报警规则时,会触发一次回调校验,因此需要注意两点 在创建报警规则之前,被回调HTTP服务必须可正常使用 创建的这个报警规则时,云监控Mock了一组数据来校验HTTP服务是否可以正常接收请求,你要确保接收到这样的请求不做任何业务处理。你可以判断userId为test-userId就不处理 ## MOCK的数据 {"alertName":"test-alertName","alertState":"-1","curValue":"4","dimensions":"[{}]","expression":"$Maximum>=85","metricName":"test-metricName","metricProject":"test-metricProject","timestamp":"1507618020731","userId":"test-userId"} 如何使用SDK定义报警回调 sdk的使用方式请参考JavaSDK使用手册 在sdk5.0.6以上版本,开始支持报警回调 <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-cms</artifactId> <version>5.0.6</version> </dependency> 创建方式 import com.aliyuncs.cms.model.v20170301.CreateAlarmRequest; import com.aliyuncs.cms.model.v20170301.CreateAlarmResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; public class WebhookTest{ public void init() throws ClientException { IClientProfile profile = DefaultProfile.getProfile("<RegionId>", "<AccessKey>", "<AccessKeySecret>"); client = new DefaultAcsClient(profile); } public void createAlarm() throws Exception{ CreateAlarmRequest request = new CreateAlarmRequest(); request.setName("test_3"); request.setNamespace("acs_ocs"); request.setMetricName("UsedQps"); request.setDimensions("[{userId:*****,instanceId:\"****\"}]"); request.setPeriod(60); request.setStatistics("Average"); request.setComparisonOperator(">="); request.setThreshold("0"); request.setEvaluationCount(1); request.setContactGroups("[\"云账号报警联系人\"]"); request.setWebhook("{url:\"http://*****\"}"); request.setNotifyType(0); CreateAlarmResponse response = client.getAcsResponse(request); } } 报警回调最佳实践 报警规则中关于报警抑制的设置对于报警回调同样有效,为了使报警回调更好的服务,需要一些不同于普通报警规则的最佳实践。 报警沉默期时间尽量调低 报警沉默期间,报警回调同样会不触发,所以这个报警规则的沉默期要尽量短 至少连续3次超过阈值才触发 这么做避免监控信息一次偶然的抖动,对你的业务系统造成影响 生效期要00:00-23:59 报警规则不在生效期,报警回调同样会不触发,而报警回调可以让你在熟睡中把故障自动处理掉,所以还是保持默认设置吧 报警回调可以实现的能力 弹性计算,目前阿里云多个产品均使用报警回调的方式实现弹性伸缩,如ESS/容器服务 工单流程处理系统,如SRE的规则所述,对于不能短期定位的问题,你可以根据不同的实例分配工单给不同的处理的人,可以方便的进行问题跟踪 事件分析,每次报警都可以在你自己的系统中记录事件,以便进行整体故障定位分析/故障复盘,关于事事件,云监控同样提供了整体方案,请参考使用事件监控 自动故障处理,如SRE所述,应该尽可能的使用自动化手段处理报警。比如硬盘空间使用监控,你可以在接收到回调之后,调用一个自动清理日志的脚本。 报警回调推荐使用的监控项 云服务器ECS操作系统级别监控项:cpu_user/memory_usedutilization/load_5m/diskusage_utilization/ 云数据库RDS监控项:ConnectionUsage 使用日志监控定义的可用性监控,比如统计nginx日志中的RT,如果平均RT超过阈值就进行新实例部署
背景: 从罗辑同学那里收到信息, 他们正在做一个容器服务上所有实例的各种指标的热力图。希望能够整体展示所有容器实例的负载情况。 这个需求不是个例,恰好,云监控的dashboard和容器服务监控两者结合可以满足这个需求场景。 具体步骤如下: 使用云账号登录云监控控制台: https://cms.console.aliyun.com/#/home/ecs 从左侧菜单栏进入dashboard: https://cms.console.aliyun.com/#/dashboard 创建容器实例热力图 添加云产品监控图表 效果图概览
背景: 从罗辑同学那里收到信息, 他们正在做一个容器服务上所有实例的各种指标的热力图。希望能够整体展示所有容器实例的负载情况。 这个需求不是个例,恰好,云监控的dashboard和容器服务监控两者结合可以满足这个需求场景。 具体步骤如下: 使用云账号登录云监控控制台: https://cms.console.aliyun.com/#/home/ecs 从左侧菜单栏进入dashboard: https://cms.console.aliyun.com/#/dashboard 创建容器实例热力图 添加云产品监控图表 效果图概览
应用场景 随着越来越多的用户从经典网络迁移到更安全、更可靠的VPC网络环境,如何监控VPC内部服务是否正常响应就成为需要关注的问题。下面通过具体案例说明如何监控VPC内ECS上的服务是否可用、VPC内ECS到RDS、Redis的连通性如何、VPC内SLB是否正常响应。 原理说明 首先需要您在服务器上安装云监控插件,然后通过控制台配置监控任务,选择已安装插件的机器作为探测源,并配置需要探测的目标URL或端口。完成配置后,作为探测源的机器会通过插件每分钟发送一个HTTP请求或Telnet请求到目标URL或端口,并将响应时间和状态码收集到云监控进行报警和图表展示。 操作说明 使用前提 作为探测源的服务器需要安装云监控插件。 需要创建应用分组,并将作为探测源的机器加入分组。 使用步骤 登录云监控控制台,选择页面左侧菜单的应用分组,进入应用分组页面。 选择需要创建可用性监控的应用分组,进入应用分组详情页面。 选择页面左侧菜单的可用性监控,进入可用性监控页面。 点击页面右上角的新建配置按钮,进入编辑页面。 需要监控VPC内ECS本地进程是否响应正常时,可在探测源中选中所有需要监控的ECS,在探测目标中填写“localhost:port/path”格式的地址,进行本地探测。 需要监控VPC内SLB是否正常响应时,可选择与SLB在同一VPC网络内的ECS作为探测源,在探测目标中填写SLB的地址进行探测。 需要监控VPC内ECS后端使用的RDS或Redis是否正常响应时,可将与ECS在统一VPC网络内的RDS或Redis添加到应用分组,并在探测源中选择响应的ECS,在探测目标中选择RDS或Redis实例。 点击确定后,可以在任务对应的监控图表中查看探测结果,并在探测失败时收到报警通知。点击任务列表中的监控图表,可查看监控详情。
背景: 从某个客户那里收到信息, 他们正在做一个容器服务上所有实例的各种指标的热力图。希望能够整体展示所有容器实例的负载情况。 随着上云不断深入,越来越多的企业级用户选择将服务直接部署在容器服务里,容器实例越来越多,用户期望能够有一个大图显示所有容器实例的热力负载情况。便于随时掌握全局情况。 所以这个需求不是个例,恰好,云监控的dashboard和容器服务监控两者结合可以满足这个需求场景。 具体步骤如下: 使用云账号登录云监控控制台: https://cms.console.aliyun.com/#/home/ecs 从左侧菜单栏进入dashboard: https://cms.console.aliyun.com/#/dashboard 创建容器实例热力图 添加云产品监控图表 指定监控项 指定控件类型 指定监控对象 效果图概览 全屏效果 其他 另外, 云监控的dashboard监控大盘,支持添加多个图表,每个图表相对独立,因此可以添加多个产品(ecs,rds,slb等)的监控图表(比如热力图)到一个大盘里,然后对大盘进行投屏。一个简单实用的全局监控大屏就完成了,也许可以在双11的护航中,发挥作用。
应用场景 服务在运行过程中,难免出现异常情况,有些异常通过重试等手段可以自动恢复,有些则不能,严重异常甚至会中断客户业务。所以我们需要一个系统来记录这些异常,并且在满足特定的条件时触发报警。传统方法是打印文件日志,通过收集日志到特定的系统,例如开源的ELK(ElasticSearch, Logstash, Kibana)中。 这些开源的系统往往是由多个复杂的分布式系统组成,自行维护面临着技术门槛高、时间和人力成本高的问题。 云监控提供了一个开箱即用的事件监控功能,能很好解决这些问题。 下面通过几个例子简单说明下如何使用事件监控功能。 实战案例 第一步:上报异常 事件监控提供了JAVA SDK和Open API两种上报数据的方式,这里介绍通过JAVA SDK 上报数据。 Step1 添加 Maven 依赖 <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-cms</artifactId> <version>0.1.2</version> </dependency> Step2 初始化SDK // 这里的118代表云监控的应用分组ID,可以以应用的角度来对事件归类, 可以到云监控应用分组列表中查看分组的ID。 CMSClientInit.groupId = 118L; // 这里的地址是事件系统上报的入口,目前是公网地址。accesskey和secretkey用于身份识别。 CMSClient c = new CMSClient("https://metrichub-cms-cn-hangzhou.aliyuncs.com", accesskey, secretkey); Step3 考虑是否异步上报数据 云监控事件默认提供了同步的上报策略。 好处是编写代码简单、 保证每次上报事件的可靠,不丢失数据。 但是同步策略也带来一些问题。因为要在业务代码中嵌入事件上报代码,如果网络出现波动,可能会出现阻塞代码执行,影响正常的业务。有很多业务场景并不需要100%要求事件可靠不丢,所以我们需要一个简单的异步上报封装。将事件写到一个LinkedBlockingQueue中,然后通过ScheduledExecutorService异步在后台批量上报。 //初始化queue与Executors: private LinkedBlockingQueue<EventEntry> eventQueue = new LinkedBlockingQueue<EventEntry>(10000); private ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor(); //上报事件: //每一个事件都包含事件的名称与事件的内容,名称用于识别事件,内容是事件的详细信息,支持全文搜索。 public void put(String name, String content) { EventEntry event = new EventEntry(name, content); // 这里事件队列满后将直接丢弃,可以根据自己的情况调整这个策略。 boolean b = eventQueue.offer(event); if (!b) { logger.warn("事件队列已满,丢弃事件:{}", event); } } //异步提交事件,初始化定时任务,每秒执行run方法批量上报事件。可以根据自己的情况调整上报间隔。 schedule.scheduleAtFixedRate(this, 1, 1, TimeUnit.SECONDS); public void run() { do { batchPut(); } while (this.eventQueue.size() > 500); } private void batchPut() { // 从队列中取出99条事件,用于批量上报 List<CustomEvent> events = new ArrayList<CustomEvent>(); for (int i = 0; i < 99; i++) { EventEntry e = this.eventQueue.poll(); if (e == null) { break; } events.add(CustomEvent.builder().setContent(e.getContent()).setName(e.getName()).build()); } if (events.isEmpty()) { return; } // 批量上报事件到云监控, 这里并未重试, SDK也没有重试, 如果对事件可靠度要求高需要自己加重试策略。 try { CustomEventUploadRequestBuilder builder = CustomEventUploadRequest.builder(); builder.setEventList(events); CustomEventUploadResponse response = cmsClient.putCustomEvent(builder.build()); if (!"200".equals(response.getErrorCode())) { logger.warn("上报事件错误:msg: {}, rid: {}", response.getErrorMsg(), response.getRequestId()); } } catch (Exception e1) { logger.error("上报事件异常", e1); } } Step4 事件上报Demo Demo1:http controller的异常监控 主要目的是监控http请求是否有大量异常,如果每分钟异常次数超过一定数量就报警。 实现原理是通过spring的拦截器或者servlet filter等技术对HTTP请求拦截,如果出现异常就记录日志,最后通过配置报警规则来达到报警的目的。 上报事件的demo如下: // 每个事件应该有丰富的信息来帮助我们搜索和定位问题,这里使用的map来组织事件, 最后转成Json格式作为事件的content。 Map<String, String> eventContent = new HashMap<String, String>(); eventContent.put("method", "GET"); // http 请求方法 eventContent.put("path", "/users"); // http path eventContent.put("exception", e.getClass().getName()); //异常类名,方便搜索 eventContent.put("error", e.getMessage()); // 异常报错信息 eventContent.put("stack_trace", ExceptionUtils.getStackTrace(e)); // 异常堆栈,方便定位问题 // 最后使用前面封装好的异步上报方法提交事件,这里是异步上报,并且没有重试,可能会小概率丢事件,但是已经能很好的满足http未知异常报警这个场景了。 put("http_error", JsonUtils.toJson(eventContent)); Demo2:后台定时任务执行情况的监控与消息消费情况的监控 同上面的http事件,有很多类似的业务场景需要报警,例如后台任务与消息队列消费等,都可以通过类似的方式上报事件达到监控的目的。当异常发生时,第一时间收到报警。 //消息队列的事件组织: Map<String, String> eventContent = new HashMap<String, String>(); eventContent.put("cid", consumerId); // 代表消费者的身份 eventContent.put("mid", msg.getMsgId()); // 消息的id eventContent.put("topic", msg.getTopic()); // 消息的主题, eventContent.put("body", body); // 消息的主体 eventContent.put("reconsume_times", String.valueOf(msg.getReconsumeTimes())); // 消息失败重试的次数 eventContent.put("exception", e.getClass().getName()); // 发生异常时的异常类名 eventContent.put("error", e.getMessage()); // 异常信息 eventContent.put("stack_trace", ExceptionUtils.getStackTrace(e)); // 异常堆栈 // 最后上报事件 put("metaq_error", JsonUtils.toJson(eventContent)); 上报后查看事件: 对队列消息消费异常设置报警: Demo 3:记录重要事件 事件还有一种使用场景是用来记录一些重要的业务发生,但是不需要报警,方便日后翻看。 例如重要业务的操作日志,改密码,修改订单,异地登录等。
今天分享一篇开发小哥哥如何使用云监控和日志服务快速发现故障定位问题的经历。 事件起因 小哥哥正在Coding,突然收到云监控报警,说他的API调用RT过高,小哥哥的业务主要为线上服务提供数据查询,RT过高可能会导致大量页面数据空白,这还了得,赶紧查。 排查过程 收到报警后查看指标趋势,发现突然RT突然增高。 查看单台机器维度的指标,发现30.239这台机器RT延时非常大。 具体机器的RT走势图:  查看存储在日志服务的原始数据,查看发生问题时的原始日志,发生某一次请求的rt突然变的很大,之后的rt都变的很大。  同时也收到了健康检查发出的30.239机器的业务java进程hang,端口telnet监控不通的报警。 于是去主机监控看这台机器到底出了什么问题。 cpu,load,内存都在波动,网络有明显变化,流量暴增,tcp连接数先增先减 再看进程监控:发现机器上的主要的业务进程-java进程,指标变化异常, 登录服务器后,查看GC日志 发现在事发时,有大量的fullgc。导致进程hang住。出现以上一系列的现象 排查结果 故障结果 结合nginx日志和应用gc日志,再结合实际的业务场景,定位到在某一次大查询时,在内存hold住太多数据,导致内存爆掉,系统不断gc,进程hang住,进一步导致系统指标和进程指标的现象。 进一步发现和优化 通过jstat -gcutil pid1000查看,发现是perm区的fullgc非常多。通过jmap−permstatpid (要谨慎,不要线上做),发现google avaiator相关的类很多,想起使用了google的表达式引擎,看代码发现在compile的时候,没有加cache。 加上cache发布后,经过几天的观察,查询前端服务器的内存更加平稳,后台5xx的比例也更低。 我也想用小哥哥在用的监控! 日志监控,零代码对日志服务数据分析处理和报警,最佳实践 主机监控,秒级监控服务器指标波动,文档介绍 Dashboard,自定义构建业务大盘,文档介绍
应用场景 定期探测本地指定路径或端口是否正常响应,当出现响应超时或状态码错误时,发送报警通知。快速发现进程存活但不再正常响应的情况。 偷偷告诉你对进程挂掉、不响应假死特别有效果。 使用步骤 首先要按照业务创建应用分组哦,这样可以快速将散乱的资源有序管理起来。友情传送》》如何创建应用分组? 进入云监控应用分组的“可用性监控”页面,  点击页面右上角的新建配置按钮,进入编辑页面。选择HTTP请求填写探测路径或者选择Telnet请求填写端口号。  点击确认保存任务,探测不通发生报警时,就会给应用分组关联的报警联系人组发送报警通知啦。 健康检查结果 有机器探测不通时,您会立刻收到报警通知:  分组内的可用性列表,也会显示出异常机器数及详细信息:  点击异常数量,查看异常机器详情  是不是很简单,快去试试吧
目的 统计业务日志中关键字的数量,并在统计数量达到一定条件时报警是业务日志的常见需求之一。本教程的目的是通过一个具体案例介绍如何对存储在日志服务产品中的数据进行关键字统计和报警。参照本教程的介绍,您可以快速走通日志的关键字统计、查询图表可视化和设置报警流程。 实战案例 使用前提 首先需要您将本地日志收集到日志服务(Log Service)中,如果您未使用过阿里云日志服务产品,可查看日志服务快速入门了解产品。 需要确保主账号的AccessKey是激活状态。AccessKey保持激活状态后您才能授权云监控读取您的日志数据。 激活方法:登录阿里云控制台,将鼠标移至页面右上角您的用户名上方,在显示的菜单中单击 "AccessKeys" 。在弹出的确认对话框中单击“继续使用AccessKey”以进入 AccessKey管理页面 。创建密钥对(Access Key),确认状态已设置为“启用”。 ## 统计日志关键字在使用日志监控前,需要您确保收集到日志服务中的日志已经被切分为Key-Valve格式。参考常见日志格式的处理方法。 日志样例 2017-06-21 14:38:05 [INFO] [impl.FavServiceImpl] execute_fail and run time is 100msuserid= 2017-06-21 14:38:05 [WARN] [impl.ShopServiceImpl] execute_fail, wait moment 200ms 2017-06-21 14:38:05 [INFO] [impl.ShopServiceImpl] execute_fail and run time is 100ms,reason:user_id invalid 2017-06-21 14:38:05 [INFO] [impl.FavServiceImpl] execute_success, wait moment ,reason:user_id invalid 2017-06-21 14:38:05 [WARN] [impl.UserServiceImpl] execute_fail and run time is 100msuserid= 2017-06-21 14:38:06 [WARN] [impl.FavServiceImpl] execute_fail, wait moment userid= 2017-06-21 14:38:06 [ERROR] [impl.UserServiceImpl] userid=, action=, test=, wait moment ,reason:user_id invalid 切分成如下字段 Key Value content 2017-06-21 14:38:05 [INFO] [impl.FavServiceImpl] execute_fail and run time is 100msuserid= content 2017-06-21 14:38:05 [WARN] [impl.ShopServiceImpl] execute_fail, wait moment 200ms content 2017-06-21 14:38:06 [ERROR] [impl.ShopServiceImpl] execute_success:send msg,200ms content ... ... 1. 授权云监控只读权限。 进入云监控首页,选择日志监控功能。 按照页面提示,点击“这里”进行授权。初次使用日志监控功能时需要授权,后续不再需要授权。授权后云监控会获得读取您日志数据的权限,并且仅用于按照您配置的处理规则进行日志数据处理的用途。 2. 配置统计方式 授权后可进入如下日志监控列表页面。 点击“新建日志监控”,进入创建页面。 关联资源,选择您需要进行关键字统计的日志服务资源。  预览数据:如果您选择的日志服务中已经写入数据,可以在第二步分析日志的预览框中查看到原始的日志数据。 分析日志,本步骤用于定义如何处理日志数据。不支持日志的字段名称为中文。这里以统计ERROR关键字数量为例,统计日志每分钟出现的ERROR关键字数量。通过“日志筛选”过滤出content中包含“ERROR”关键字的日志记录,并通过“统计方法”中的计数(Count)方法计算筛选后的记录数。 点击“确定”按钮后保存配置。 3. 查看统计数据 创建完日志监控以后,等待3-5分钟即可查看统计数据。查看方法是进入日志监控的指标列表页面,点击“操作”中的“监控图表”查看监控图。 4. 设置报警规则 设置方法是进入日志监控的指标列表页面,点击“操作”中的“报警规则”进入报警规则列表页面。 然后点击页面右上角的“新建报警规则”按钮,进入创建报警规则页面。 为报警规则命名,并在规则描述中配置需要报警的情况。 选择需要报警的联系人组和通知方式并确认保存,便完成了报警规则的设置。
我有一个小愿望,监控Apache的错误日志文件,一旦出现ERROR关键字就报警。我有一个小愿望,监控Nginx日志,status>499的数量很多就报警。 我有一个小愿望,监控线上业务日志,出现“下单失败”就报警。 你是怎么实现愿望的?用Zabbix? ELK? 岂不是实现这个小愿望,要自己搭建和运维从采集、分析、存储到可视化、通知的全套服务,心累orz。 万能的阿里云,我该怎么办?Duang~!云监控的日志监控功能,鼠标轻轻点几下,立刻拥有完整的日志监控与报警服务,想想还有点小激动呢。 使用过程简单到飞起,先把日志收集到日志服务,再通过云监控定义日志关键字监控项,最后创建一条报警规则即可。背后复杂的实现对你全部透明,尽情享受工程师gg们的开发成果就好。 说到这里就一定要安利一下日志服务这款产品,专业解决日志的采集、消费、投递以及查询分析等功能,帮助提升运维、运营效率,建立DT时代海量日志处理能力。如果你那关键时刻能救命的线上日志还没存到日志服务,就太out了。 下面举例说明如何快速创建日志关键字报警,睁大眼睛掐好表,操作真的只要3分钟。1.登录云监控日志监控页面,授权后点击页面右上角的“新建日志监控” 2.进入监控项定义页面,先选择日志源,再定义统计日志关键字的监控项。 3.对新定义的监控项添加一条报警规则 完成以上三步,就可以坐等线上出现异常时收报警了。 其实,我们怎么可能只单纯做报警,监控图表和应用分组管理一起打包服务你~ 是不是很有兴趣使用~点击使用手册了解更多详情~
主机监控功能上线啦 排查这些问题,你还在用命令行查询服务器各项指标吗?历史快照怎么拿?想要预警怎么办?烦死宝宝啦。 云监控为阿里云用户提供主机监控功能,一键安装插件后,即可查看30余个监控项的监控图表,设置报警更是天然支持~~也可以安装在非 ECS 的服务器上,有没有很开心~ 立刻使用主机监控 进程监控介绍 进程监控默认为您采集最近一段时间内活跃进程消耗的CPU使用率、内存使用率,以及进程的文件打开数。如果您添加了进程关键字,还会采集包含关键字的进程个数。 如果您查询的时间范围内,Top5的进程不固定,进程列表中会展示这段时间内全部进入过Top5的进程,列表中的时间表示该进程最后一次进入Top5的时间。 只有进入Top5 的进程才会采集进程的CPU使用率、内存使用率和打开文件数,所以如果该进程在查询的时间范围内未持续进入Top5,会出现监控图中数据点不连续的情况,数据点的密集程度则表明了该进程在服务器上的活跃程度。 监控项说明 CPU 相关监控项 以下为CPU使用率相关监控指标,可参考Linux的top命令来理解各项指标含义。 监控项名称 监控项含义 单位 说明 Host.cpu.idle 当前空闲CPU百分比 % Host.cpu.system 当前内核空间占用CPU百分比 % 指系统上下文切换的消耗,该监控项数值比较高,说明服务器开了太多的进程或者线程 Host.cpu.user 当前用户空间占用CPU百分比 % 用户进程对CPU的消耗 Host.cpu.iowait 当前等待IO操作的CPU百分比 % 该项数值比较高说明有很频繁的IO操作 Host.cpu.other 其他占用CUP百分比 % 其他消耗,计算方式为(Nice + SoftIrq + Irq + Stolen)的消耗 Host.cpu.total 当前消耗的总CPU百分比 % 指以上各项CPU消耗的总和,通常用于报警 内存相关监控项 以下为内存相关监控项,可参考free命令来理解各项指标含义。 监控项名称 监控项含义 单位 说明 Host.mem.total 内存总量 bytes 服务器的内存总量 Host.mem.used 已用内存量 bytes 用户程序使用的内存 + buffers + cached,buffers为缓冲区占用的内存空间,cached为系统缓存占用的内存空间 Host.mem.actualused 用户实际使用的内存 bytes 计算方法为(used - buffers - cached) Host.mem.free 剩余内存量 bytes 计算方法为(内存总量-已用内存量) Host.mem.freeutilization 剩余内存百分比 % 计算方法为(剩余内存量/内存总量*100%) Host.mem.usedutilization 内存使用率 % 计算方法为( Actual used/total*100%) 系统平均负载监控项 以下为系统平均负载相关监控项,可参考Linux top命令来理解各项指标含义。监控项数值越高代表系统越繁忙。 监控项名称 监控项含义 单位 Host.load1 过去1分钟的系统平均负载,Windows操作系统没有此指标 无 Host.load5 过去5分钟的系统平均负载,Windows操作系统没有此指标 无 Host.load15 过去15分钟的系统平均负载,Windows操作系统没有此指标 无 磁盘相关监控项 磁盘使用率与inode使用率可参考Linux df命令。 磁盘读写指标可参考Linux iostat命令。 监控项名称 监控项含义 单位 Host.diskusage.used 磁盘的已用存储空间 bytes Host.disk.utilization 磁盘使用率 % Host.diskusage.free 磁盘的剩余存储空间 bytes/s Host.diskussage.total 磁盘存储总量 bytes Host.disk.readbytes 磁盘每秒读取的字节数 bytes/s Host.disk.writebytes 磁盘每秒写入的字节数 bytes/s Host.disk.readiops 磁盘每秒的读请求数量 次/秒 Host.disk.writeiops 磁盘每秒的写请求数量 次/秒 文件系统监控项 监控项名称 监控项含义 单位 说明 Host.fs.inode inode使用率,UNIX/Linux系统内部使用inode号码来识别文件,磁盘还未存满,但inode已经分配完时会出现无法在磁盘新建文件的情况,Windows操作系统没有此指标 % inode数量代表文件系统文件数量,大量小文件会导致inode使用率过高 网络相关监控项 以下为网络相关指标,可参考Linux iftop。TCP连接数的采集,可参考Linux ss命令。 TCP连接数会默认采集 TCP_TOTAL(总连接数)、ESTABLISHED(正常连接状态),NON_ESTABLISHED(非连接的状态连接数,ESTABLISHED以外的所有状态),如果您需要获取各个状态连接数的数量,请按如下说明操作: Linux操作系统 您可以将cloudmonitor/config/conf.properties配置文件的netstat.tcp.disable改为false来开启采集。修改配置后请重启Agent。 Windows操作系统 您可以在C:\”Program Files”\Alibaba\cloudmonitor\config的配置文件中,将netstat.tcp.disable改为false来开启采集。修改配置后请重启Agent。 监控项名称 监控项含义 单位 Host.netin.rate 网卡每秒接收的比特数,即网卡的上行带宽 bits/s Host.netout.rate 网卡每秒发送的比特数,即网卡的下行带宽 bits/s Host.netin.packages 网卡每秒接收的数据包数 个/秒 Host.netout.packages 网卡每秒发送的数据包数 个/秒 Host.netin.errorpackage 设备驱动器检测到的接收错误包的数量 个/秒 Host.netout.errorpackages 设备驱动器检测到的发送错误包的数量 个/秒 Host.tcpconnection 各种状态下的TCP连接数包括LISTEN、SYN_SENT、ESTABLISHED、SYN_RECV、FIN_WAIT1、CLOSE_WAIT、FIN_WAIT2、LAST_ACK、TIME_WAIT、CLOSING、CLOSED 个 进程相关监控项 进程的CPU使用率、内存使用率可参考Linux top命令,CPU使用率为多核使用情况。 Host.process.openfile 可参考Linux lsof命令。 Host.process.number 可参考Linux ps aux |grep '关键字' 命令。 监控项名称 监控项含义 单位 Host.process.cpu 某个进程消耗的CPU百分比 % Host.process.memory 某个进程消耗的内存百分比 % Host.process.openfile 当前进程打开文件数 个 Host.process.number 指定关键字的进程数 个 立刻使用主机监控 更多了解欢迎阅读文档:使用文档
云监控 应用分组功能上线啦 宝宝家大业大,业务遍布大江南北,又是阿里云的铁杆粉丝,购买了一大堆各式各样的云产品,可是却不能按照业务管理资源,实例经常找不到,改个报警规则更是只能一条条改,好烦啊! (╯‵□′)╯︵┻━┻ 功能速览 应用分组可以跨产品、跨地域,真正从业务角度管理您的云上资源 一条报警管全组,迅速提升运维效率,告别单个实例设置报警规则的旧时代 新增故障列表,快速定位故障实例 自定义监控图表,你的页面你做主 所以宝宝不哭!云监控推出的应用分组功能,就是帮你解决这些让你抓狂的管理问题的! 应用分组可以跨地域、跨产品将相关云产品全部放入同一分组。真正从业务角度出发管理云上资源。 实例加入分组,立刻帮你创建常用报警规则。 推出报警模板概念,在分组级别设置1条报警规则,可以作用在组内所有实例上,管理报警不再是噩梦。 哪些实例在报警?故障列表告诉你。 功能还不够?还能快速一键禁用或启用分组的全部报警,再也不用担心停服维护的时候手机被报警通知duang~duang~duang的炸个不停 T_T 更多小惊喜,等你自己发现~ 迫不及待点我使用应用分组~ 页面速览 应用分组到底长啥样?先一睹为快吧~! 应用分组概览 故障列表 报警现场 分组内的监控图表,可以自定义监控项和展现方式哦 想系统了解应用分组??快来看下面的文档吧~ 应用分组概览 创建应用分组 查看应用分组 修改应用分组 管理报警规则 迫不及待点我使用应用分组~
还在苦恼自己有一堆ECS实例,却不知道它们有没有闲着不干活,白白浪费money吗? Dugang~Duang~Duang~可以使用阿里云监控Dashboard盯着它们~! Dashboard是阿里云监控最新推出的监控数据聚合与展示解决方案。通过在Dashboard中添加监控大盘,可以在更多维度查看ECS监控数据。 本次为大家介绍的是如何通过添加图表查看ECS实例使用情况,了解哪些资源没有物尽其用,哪些资源急需扩容。 如何查看ECS实例的整体资源消耗? 进入云监控Dashboard页面。云监控会默认为您生成一张ECS全局监控大盘,展示您名下所有ECS实例各个指标的平均值。例如您有5个ECS实例,则该大盘展示了5个ECS实例整体的CPU使用率、网络带宽等相关指标的平均值,让您了解ECS的整体资源消耗水位。 通过热力图查看全部实例的内存实例率 您可以新建一张监控大盘,也可以在现有大盘基础上添加新的图表。如需新建大盘,点击“创建监控大盘“即可。 使用热力图查看全部实例的内存使用率,即可快速找到使用率偏高和偏低的实例,也可以整体了解使用率水位。 点击“添加云产品指标”。 选择实例的地域、图表类型选择“热力图”、过滤条件选择“实例维度”并选择全部实例、Group by选择“实例维度”,即可获得全部实例的内存使用率热力图。每个色块代表一个实例,最多可展示1000个色块。 添加后的表格效果如下图可以快速得知众多实例的内存使用率分布在1.18%至60.09%,色块浅的实例内存使用率低,色块越深使用率越高。 多唠叨一句:内存使用率、磁盘使用率等指标,需要安装云监控的ECS插件才能获取,可以直接登录云监控的ECS监控页面,在ECS列表选中实例后点击安装。如果自动安装不成功,可以尝试手工安装。 通过表格查看全部实例的CPU使用率 觉得色块不够直观,更喜欢和数据直接打交道?表格帮您解决这个问题! 点击“添加云产品指标” 选择实例的地域、图表类型选择“表格”、过滤条件选择“实例维度”并选择全部实例、Group by选择“实例维度”,即可获得全部实例的CPU使用率由高到低的表格展示。表格最多展示100个实例,如果您的实例个数超过100个,可以使用ECS分组或分批添加。 添加后的表格效果如下图。 老板也想看?大盘还能更炫酷! 点击全屏后,监控大盘会变换为黑色背景,更适合大屏展示给老板呦~ 这么帮您省钱的服务居然是免费的,还等什么? 更多Dashboard用法和介绍:点我点我快点我
手里一坨机器,想一眼看尽相关主机的CPU、网络、内存、磁盘性能怎么办?! 人手不够,缺想做大屏展示,24小时动态监控机器性能怎么办?! 老板骂我浪费资源,如何证明我真的物有所用? 来来来~!所有这些问题云监控Dashboard帮你解! 没图没真相,话不多说先上大屏! 普通视角: 全屏视角: 功能和特点: Dashboard的功能包括但不限于: 1. 自定义查看监控数据:打破云产品监控数据无法集中呈现在一张页面的限制,在一张大盘中可以添加主要云产品的任意实例监控数据。 2. 数据聚合:可以聚合多个实例的监控数据,计算多实例监控数据的平均值、求和值等。从而了解业务的整体资源使用情况。 3. 全景盯屏,监控数据自动刷新。 4. 丰富的图表展现形式:支持折线图、面积图。饼图、热力图、TopN表格也已发布~ 这么好的服务居然是免费的~!是不是也想拥有一张自己的监控大盘,点我点我 更详细操作请参考文档云监控Dashboard 你的监控你做主,你最期待Dashboard提供什么功能,咱们留言区见~
是不是没有安装云监控插件或者插件没有正常运行?可以参考https://help.aliyun.com/knowledge_detail/38859.html
可以使用云监控的进程监控哦~登录云监控控制台的ECS监控页面,https://cms.console.aliyun.com/#/cloud/ecs/cn-qingdao后,点击实例名称进入实例监控详情页面。在“进程数”监控项图表上点击“添加进程监控”,在弹出框中填写进程名称。名称可以只填写进程关键字。可参考Linux ps aux|grep ‘关键字’ 命令。
云监控的进程监控可以支持设置关键字哦~ 加进程时可以只填写进程关键字。可参考Linux ps aux|grep ‘关键字’ 命令。
另外,进程监控本周会全网升级,提供更强大的功能,可以点击链接提前了解https://help.aliyun.com/document_detail/47500.html ~
亲,您可以提工单将手机号告诉客服,帮你查询手机号绑定的云账号的~