项目监控的一点总结
文章目录
总结下做监控的一些经验,以备查用。
1. 为什么做监控?
监控是为了查看项目的运行情况,及早发现问题。
2. 监控什么?
项目的执行是为了产生业务的结果,那么什么样的结果会让用户不满意呢? 一是得到了错误的结果,比如在网上买东西提交了订单结果看不到生成的订单。二是项目运行太慢,一个商品详情页面半天打不开。就此,我认为可以做如下监控:
- 性能监控:关注程序的响应速度。
- 业务监控:关注程序的执行输出结果。
- 基础设施监控:关注程序运行的环境是否正常。
3. 如何做监控?
- 监控要有指标。要对监控的事务进行指标化,可以是成功、失败的判断,可以是是否超过阈值的判断,可以是根据大量数据判断其波动、趋势。要对监控的事务进行多维度的分析,宏观上关注运行结果,微观上关注内部细节。
- 每个监控要有具体的负责人。谁对监控关注,谁来负责跟进解决。只有明确的负责人才能推荐问题的解决,避免有了监控却没人管。
- 监控要有优先级。可以根据问题的影响范围,指标的的大小确定优先级。
- 监控要有报警。监控发现问题后要及时、准确的报警,通过短信、im、邮件等手段通知,并根据优先级选择报警手段和频度。
4. 监控的措施
根据监控的选择维度有不同的监控目标和措施,只有多种措施相结合才能完成更好的监控。
4.1 性能监控
关注程序的响应速度。
4.1.1 宏观监控
- HTTP服务:可以使用Nginx或者框架输出的每个请求处理时间监控。
- 定时任务:关注任务的执行时长或者时长的波动情况,通常任务管理工具都会提供相关数据,如若没有需要自己抓取,并对数据进行分析。
- 消息队列处理速度:可在消息开始和结束时输出日志,对日志进行分析。
4.1.2 微观监控
微观上关注每一步的性能,分析每一步的耗时,以及究竟有多少步骤。
- 过程埋点监控:一个任务可以拆解成多个执行过程,在每个片段输出日志,分析日志。缺点这需要具体任务具体分析,根据任务优先级逐个添加。有点是可以定制化、有更明确的关注点。
- 框架级监控:web服务是I/O密级型服务,通常耗时在数据库读写请求、外部API请求等网络请求。需要改造调用外部的包,统一打出日志。优缺点和人工埋点正好相反,一次改造处处受益,但是需要研发人员对大量的日志分析找到问题所在。同时,可以打通跨服务的调用链,以分析业务的整体性能。另外,可以接入第三方APM,如Elastic APM。
- 基础设施监控:监控各种基础设施中有用的性能指标,如MySQL中的慢查询日志、网关服务记录的请求处理时长等,发现问题。
4.2 业务监控
4.2.1 宏观监控
宏观上关注业务的执行结果,这需要和产品、运营等同学沟通确定业务指标,并根据业务情况不断调整,同一个业务也可能有不同维度的监控指标。这些可能是一组服务共同执行的结果,并且原因可能是产品功能逻辑上的,可能是程序bug。常见方式:
- 报表型结果:通过是业务专家根据整体业务分析给出的指标,需要编写业务逻辑分析数据。比如新注册用户一定时间的购买成功率。
- 执行任务结果:对每项任务落日志或落数据库的方式记录结果,监控结果。比如拨打营销电话,可能产生接通、拒接、失败等情况,可能是线路问题,也可能是程序bug,也可能是用户选取问题等。
- 数值类结果:对关键指标进行数值监控,可能需要结合同比、环比波动情况。比如发送营销短信,昨天发了10000条,今天就发了200条,可能是因为某项运营设置有问题或者程序bug。
4.2.2 微观监控
微观上关注每个服务、每个脚本的、每个接口的成功情况和内部执行情况。
- 从单个任务的执行情况讲:
- HTTP服务:可以监控响应码,主要是监控5XX响应码表示的服务器错误。同时注意4XX响应码,如果4XX过多可能也有情况,这个需要具体服务具体情况设置阈值。
- 定时任务:既要整体上关注任务是否执行了、是否执行了。
- 消息队列处理进程:可以在框架层面记录每条日志程序的处理结果。
- 从任务内部代码讲,要多打日志,记录业务数据,业务结果,方便监控与分析问题。
- 同时框架上也可以做很多事情:
- 如在中间件记录未捕获的异常,结合Sentry(https://sentry.io)这样的工具进行异常收集、显示、报警。
- 对外部调用记录结果,类似性能监控降到的框架级监控,在这关注调用的响应结果是否出错。
基础设施监控
对项目使用的各种基础设施进行监控,关心程序是岁月安好还是在水深火热中。大致分为以下:
- 服务器监控:监控服务器的cpu占用率、内存占用率等等。同时如果是容器化的话,要关注编排工具如k8s给出的各种指标。
- 基础组件监控:监控数据库、配置中心等的相应情况,同时针对性的关注其内部指标,如MySQL错误日志、队列积压数量、Redis内存使用率等。
- 任务进程监控:关注进程是否存活,如使用supervisor托管关注运行状态,在openshift里关注pod是否存活。
5. 监控大盘
最好要有一个或多个监控大盘,显示关键指标和概况数据。方便整体上关注项目运行情况,以及快速定位大致问题。可以使用Grafana(https://grafana.com/)这样的展示工具或自定义开发。
文章作者 ladder1984
上次更新 2019-12-01