阿里云生产环境监控方案

2019-04-16  本文已影响0人  牛亦非

背景

监控告警系统的设计原则

  1. 全面性。

每一个环节的异常都可能对整个线上系统的运行产生威胁。所以监控告警需要全方位覆盖到系统链路上的每一个环节,如:

  1. 实时性。

一方面是数据采集监控的实时性,这个无论是云厂商的方案还是各种开源系统都可以解决。另一方面是告警的实时性,告警需要实时甚至提前将消息通知到位,方便开发/运维人员提前介入,避免系统不可用导致用户使用受到影响后才发现问题,降低故障持续时间,保证系统高可用性。

  1. 精确性。

每天底层服务和业务系统产生海量数据,缺少告警肯定无法保证系统稳定性,但如果告警过多,告警也失去了关键问题的提醒意义,所以要对海量告警进行过滤、去重、合并,做到不误告警,不漏告警,不多告警。告警主要功能需要包括:

  1. 易用性。

作为业务系统的支撑,监控告警系统自身需要保持高可用性,无需开发/运维过多关注和维护。目前云厂商方案更容易做到这点。同时要具备良好的可扩展性,新系统能够快捷无侵入式地接入告警,新的告警类型也可以快速配置。

阿里云监控告警配置参考

基于以上几个原则,同时考虑到维护成本和部署成本,Java项目可以考虑采用阿里云提供的功能(主要包括云监控、负载均衡和日志服务)作为监控告警服务的系统支撑,以及Cat(美团点评开源系统)作为Java Springboot微服务的监控告警。
阿里云自带监控告警服务的优势:

精确性要求的功能方面:

缺点:

下面以阿里云为例,列出常用的关键指标监控告警配置:

云主机基础监控告警

可以首先在云监控>应用分组中创建告警联系人组、告警模板,方便对监控告警资源进行统一管理


入口:配置云监控>主机监控:


配置云主机指标告警规则,主要关注CPU使用率,内存使用率,磁盘使用率:


可用性监控告警

入口:云监控>站点监控,各系统需要开发健康检查接口用于可用性检测:


MYSQL基础指标监控告警

入口:云监控>云服务监控>云数据库RDS版


配置Mysql指标告警规则:



主要关注CPU使用率、内存使用率、磁盘使用率、连接数使用率、IOPS使用率,如果有主从架构的话需要加入从库同步延迟监控

Redis基础指标监控告警

入口:云监控>云服务监控>云数据库Redis版
和mysql类似,主要关注连接数使用率和内存使用率

消息队列基础指标监控告警

以消息队列RocketMQ为例,可以配置消息堆积量阈值和消费延迟阈值告警


网关基础指标监控告警

入口:云监控>云服务监控>负载均衡
可选的指标比较多,可以选取关键指标进行告警,如7层协议QPS、RT、http 5xx status数据等。如果需要过滤无效url等可预见的请求,可以在日志服务中配置告警过滤规则,如:


Mysql慢查询告警

慢查询sql往往是系统性能和可用性的首要威胁,能够实时了解慢查询情况是监控系统的刚需。但是目前阿里云RDS只有查看功能,没有告警功能,这里只能通过在业务系统层面监控上报数据实现监控告警。
如果业务系统开发基于Java框架,可以使用druid连接池实现慢查询数据采集和上报:

  1. 引入阿里云日志服务相关jar包
<dependency>
   <groupId>com.google.protobuf</groupId>
   <artifactId>protobuf-java</artifactId>
   <version>2.5.0</version>
</dependency>
<dependency>
   <groupId>com.aliyun.openservices</groupId>
   <artifactId>aliyun-log-logback-appender</artifactId>
   <version>0.1.13</version>
</dependency>
<!-- 升级logback版本 -->
<dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-core</artifactId>
   <version>1.2.3</version>
</dependency>

参考来源:https://github.com/aliyun/aliyun-log-logback-appender/blob/master/README_CN.md

  1. druid相关配置

springboot配置中加入

spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.log-slow-sql=true
# 单位毫秒 超过该时间则记录
spring.datasource.druid.filter.stat.slow-sql-millis=1000
# 合并参数化统计sql
spring.datasource.druid.filter.stat.merge-sql=true
  1. logback配置
<!--为了防止进程退出时,内存中的数据丢失,请加上此选项-->
<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>

<appender name="aliyun" class="com.aliyun.openservices.log.logback.LoghubAppender">
    <!--必选项-->
    <!-- 账号及网络配置 -->
    <endpoint>cn-hangzhou-intranet.log.aliyuncs.com</endpoint>
    <accessKeyId>xxxxxx</accessKeyId>
    <accessKey>xxxxxxxx</accessKey>
    <!-- sls 项目配置 -->
    <projectName>xxxxxx</projectName>
    <logstore>druid-slow-query</logstore>
</appender>

<logger name="com.alibaba.druid.filter.stat.StatFilter" level="ERROR">
    <appender-ref ref="aliyun" />
</logger>

日志服务相关信息参考:https://help.aliyun.com/document_detail/29008.html?spm=5176.2020520112.108.2.3d6a34c0YhmO5s

正确配置后,可以在日志查询中看到类似如下信息:


在云监控>日志服务中,可以对该日志配置按写入行数告警:


业务系统异常监控告警

业务系统异常日志采集并上传到日志服务后,需要对信息进行过滤和抑制,否则告警会过于频繁。
首先需要在相应日志查询页面选择开启索引,在配置页关闭全文索引并根据业务系统异常日志格式配置字段,以springboot系统日志为例,我们这里配置了2个字段:


然后选择创建告警,例如我们在查询语句中过滤掉自定义异常和可预见的异常,每分钟扫描1次日志,如果某1分钟内系统发生5次异常就产生告警,可以按下面配置创建:


业务关键指标监控告警

和异常信息配置类似,通过采集关键数据指标并配置好告警规则即可实现

参考资料:
https://cloud.tencent.com/developer/article/1037231

上一篇 下一篇

猜你喜欢

热点阅读