前言

前几天跟读者聊天,他说被产品经理给怼了。原因是线上出 Bug 了,最后是客户反馈才知道的。

我就问他:你们是不是没做监控?

读者:我们是刚成立的创业团队,目前最重要的就是堆功能,很多基础设施都没时间做。

正所谓有多大的碗吃多少的饭,不要盲目追求规模大,很牛的那种方案,合适的就可以。监控亦是如此,小方案只要够用,能解决问题,也是非常不错的选择。

下面给大家介绍一些常用的异常监控方式:

最小成本化

如果是刚成立的创业团队,可以用最小的实现成本来对系统的异常进行实时监控。所谓最小的实现成本,就是可以不用依赖任何三方的框架就可以实现。

可以采用手动埋点的方式将异常进行告警,这种方式最好是在全局异常处理的地方进行告警,才能统一管理。

如代码所示:

@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseData<Object> defaultErrorHandler(HttpServletRequest req, Exception e) {
// 记录异常
// 钉钉或者短信告警
}

当我们的项目中有了全局异常处理,当底层报错的时候,异常都会进入到 ExceptionHandler 进行处理,在 ExceptionHandler 中我们可以通过 HttpServletRequest 来获取响应的请求信息和异常信息,然后进行告警。

异常告警信息

异常告警信息一定要详细,当线上出现异常后,第一时间要去修复这个问题。如果没有详细的信息根本就无法复现这个问题,就不好去定位和解决了。

告警信息需要有下面的内容:

告警服务:mobile-gateway
负责人:yinjihuan
请求地址:http://xxx.com/xxx/xxx?id=xxx
请求体:{ "name": "xxx" }
请求头:key=value
异常码:500
异常类型:RuntimeException
异常堆栈:java.lang.RuntimeException: com.xxx.exception.ApplicationException: 获取XXX信息失败!

最重要的就是请求参数了,有了参数才能复现错误。需要注意的是通过 HttpServletRequest 获取请求体的时候会报错,因为流只能读取一次。

等到了全局异常处理类的时候已经被读取过了,所以我们需要特殊处理一下,写个过滤器将请求体的值缓存起来,可以 org.springframework.web.util.ContentCachingRequestWrapper 对 HttpServletRequest 进行装饰,然后通过 ContentCachingRequestWrapper 获取请求体。

最小成本化+兼顾性能

手动埋点的方式对异常进行实时告警,然后直接发送短信等告警信息,这个过程是同步的,或多或少会加大响应的时间,不过请求进入到异常处理这里的话就证明这个请求已经失败了,影响不大。

虽然影响不大,但还是可以稍微优化一下。最常见的优化方式就是将同步转成异步操作,比如丢到单独的线程池中进行告警,丢到内存队列中,单独用一个线程去获取进行告警。

本地异步可能出现丢失的情况,对于这类监控的信息丢失几条问题也不大,如果不想丢失,可以使用外部的消息队列来存储告警信息,有单独的消费者进行消费,告警操作。

统一日志监控

最小化成本的方式,只需要稍微写几十行代码就可以搞定。不好的点在于每个项目中都要有这样一份代码,告警的逻辑也是耦合在了代码中。。

什么 EFK,ELK 相信大家都听过,将日志统一进行收集,集中管理。每个系统中在出错的时候需要往本地日志中写入异常信息即可,不需要单独对异常进行告警,告警的动作可以由单独的告警系统来做,告警系统根据收集过来的日志进行判断,是否需要告警,告警频次等。

统一日志监控需要搭建日志平台,成本相对来说高一点。当然也可以用开源的方案,也有商业的方案。

商业的可以用云服务,使用简单,快速接入,支持各种维度的告警规则,就是有点费钱。

如果只是想对异常进行监控,我推荐一款开源的错误追踪系统,Sentry 是一个开源的实时错误追踪系统,可以帮助开发者实时监控并修复异常问题,当然 Sentry 也有商业版。

APM 监控

apm(Application Performance Management) 除了对服务的调用链,性能进行详情的监控,同时对异常信息也有较好的监控。

常见的 apm 有 skywalking,pinpoint,cat 等,以 cat 来举例,problem 报表中展示的就是应用的错误信息,而且在 cat 的首页大盘中会按分钟展示各个应用的错误情况,如果有大量错误,大盘的颜色的就是红色,当你看到一片飘红的时候,那就是异常太多了。

当然 cat 也具备告警功能,靠人为的定时去看大盘不现实,当有错误后,及时的告警才有意义。想要详细了解 cat 的可以看下我这篇文章:https://mp.weixin.qq.com/s/3mqmySr2nv4Xpd6nZlfsVg

总结

做一个最小成本化的异常监控,估计也就一天搞定了。如果你不做,那就只能等着被怼啦。要控制不出 bug 几乎不可能,是程序就肯定会有 bug。我们需要做的就是在出 bug 的第一时间内及时发现这个 bug,然后消灭它。

码字不易,可以的话来个三连击,感谢!

关于作者: 尹吉欢,简单的技术爱好者,《Spring Cloud微服务-全栈技术与案例解析》, 《Spring Cloud微服务 入门 实战与进阶》作者, 公众号 猿天地 发起人。

我整理了一份很全的学习资料,感兴趣的可以微信搜索 「猿天地 」,回复关键字 「学习资料 」获取我整理好了的Spring Cloud,Spring Cloud Alibaba,Sharding-JDBC分库分表,任务调度框架XXL-JOB,MongoDB,爬虫等相关资料。

被产品经理怼了,线上出Bug为啥你不知道的更多相关文章

  1. 线上出bug了?别怕,这么定位!

    摘要: Source Map还是很神奇的. 原文:线上出bug了?别怕,这么定位! 公众号:前端小苑 Fundebug经授权转载并修改,版权归原作者所有. 工作中,生产环境代码是编译后代码,搜集到报错 ...

  2. 关于线上的bug什么时候修复的思考

    这里系统专门指的是那种用户量大的系统,比如有几百万或者上千万的注册会员.因为小系统因为用户量少,不存在这种思考,考虑有时候是多余的.另外还有内部系统,给自己公司内部人员使用的,即便是出现了问题,也不会 ...

  3. 一个线上程序bug,由通用补数程序引起

    下游发现接口可用率非100%,马上线上查看,发现数据在有些情况下通用补数的数据是空, 有20%的用户是没有相应偏好等的数据的,需要通用补数来补数,结果通用补数没有数据. 通用补数数据的检查报警时必须要 ...

  4. 线上调试bug

    在以往的工作中,线上一有bug,就需要把文件弄到本地来改,但经常会碰见本地环境又和线上不一样,导致调试困难,闭着眼睛改好之后传到线上去看对不对,不对的话又要改,循环往复,要多麻烦就有多麻烦啊. 今天给 ...

  5. 互联网IT当线上出现 bug 时,是怎么处理的?

    线上BUG说处理方法:1.关于线上BUG问题,目前公司有一整套线上故障流程规范,包括故障定义.定级.处理流程.故障处理超时升级机制.故障处理小组.故障处罚(与故障存在时长有关)等:2.最主要的是,线上 ...

  6. 不停机不更新代码线上调试BUG的工具

    如果你有以下痛点,请你查看本文章: 1.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 2.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 3.线上遇到某个用户的 ...

  7. 线上应用bug跟踪查找-友盟统计

    线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...

  8. 10W年薪和30W+年薪的产品经理差距在哪?

    举办到今年第六届壹佰案例峰会,认识的“程序猿/媛”朋友越来越多,时间长了就发现,程序员的世界一点也不单调,外界传说的不善言辞.最大的乐趣就是买“机械键盘”都是不对的.你见过周末组团去山里骑哈雷的研发经 ...

  9. 人人都是产品经理?关于PM你不知道的还有很多

    产品经理的职称最早出现在P&G宝洁公司,因效果非常显著,许多企业纷纷仿而效尤.硅谷知名的产品管理大师Marty Cagan在<Inspired: How To Create Produc ...

随机推荐

  1. arp_ignore与arp_announce

    arp_ignore:定义接收到ARP请求时的响应级别0:只要本地设置的有相应的地址,就给予响应.(默认)1:仅回应目标IP地址是本地的入网地址的arp请求.2:仅回应目标IP地址是本地的入网地址,而 ...

  2. 操作系统-存储管理(5)IA-32/Linux的地址转换

    IA-32/Linux按字节编址:在保护模式下,IA-32采用段页式虚拟存储管理方式,存储地址采用逻辑地址.线性地址和物理地址来进行描述. 逻辑地址由48位组成,包含16位段选择符(高13位为段表项的 ...

  3. 个人项目 源程序特征统计程序(C++)

    零.GitHub地址 https://github.com/King-Authur/Word-count 一.项目的相关要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这 ...

  4. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统五 | 完善业务自动创建数据库

    教程预览 01 | 前言 02 | 简单的分库分表设计 03 | 控制反转搭配简单业务 04 | 强化设计方案 05 | 完善业务自动创建数据库 说明 这节来把基础的业务部分完善一下. 因为 IQue ...

  5. Salesforce LWC学习(二十一) Error浅谈

    本篇参考:https://developer.salesforce.com/docs/component-library/documentation/en/lwc/data_error https:/ ...

  6. Shell编程—控制脚本

    1处理信号 1.1信号表 编号 信号名称 缺省操作 解释 1 SIGHUP Terminate 挂起控制终端或进程 2 SIGINT Terminate 来自键盘的中断 3 SIGQUIT Dump ...

  7. 网站被K或者降权后应该如何恢复

    http://www.wocaoseo.com/thread-133-1-1.html     网站被K后应该如何恢复,深圳SEO和大家一起研究一下,其实这类的问题大家经常会遇到,而且这类的文章铺天盖 ...

  8. 【Pod Terminating原因追踪系列之一】containerd中被漏掉的runc错误信息

    前一段时间发现有一些containerd集群出现了Pod卡在Terminating的问题,经过一系列的排查发现是containerd对底层异常处理的问题.最后虽然通过一个短小的PR修复了这个bug,但 ...

  9. 前端修仙之路---一、如何用gulp搭建一套web前端开发框架

    引言 相信从事web前端开发的朋友都知道,现在流行的Vue.AngularJS等框架中,它们都有独立的脚手架来创建项目,比如Vue有vue-cli,Angular有angula-cli.脚手架可以一键 ...

  10. LuaBridge相关

    http://www.cppblog.com/sunicdavy/archive/2013/12/07/204648.html https://segmentfault.com/a/119000000 ...