被产品经理怼了,线上出Bug为啥你不知道
前言
前几天跟读者聊天,他说被产品经理给怼了。原因是线上出 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为啥你不知道的更多相关文章
- 线上出bug了?别怕,这么定位!
摘要: Source Map还是很神奇的. 原文:线上出bug了?别怕,这么定位! 公众号:前端小苑 Fundebug经授权转载并修改,版权归原作者所有. 工作中,生产环境代码是编译后代码,搜集到报错 ...
- 关于线上的bug什么时候修复的思考
这里系统专门指的是那种用户量大的系统,比如有几百万或者上千万的注册会员.因为小系统因为用户量少,不存在这种思考,考虑有时候是多余的.另外还有内部系统,给自己公司内部人员使用的,即便是出现了问题,也不会 ...
- 一个线上程序bug,由通用补数程序引起
下游发现接口可用率非100%,马上线上查看,发现数据在有些情况下通用补数的数据是空, 有20%的用户是没有相应偏好等的数据的,需要通用补数来补数,结果通用补数没有数据. 通用补数数据的检查报警时必须要 ...
- 线上调试bug
在以往的工作中,线上一有bug,就需要把文件弄到本地来改,但经常会碰见本地环境又和线上不一样,导致调试困难,闭着眼睛改好之后传到线上去看对不对,不对的话又要改,循环往复,要多麻烦就有多麻烦啊. 今天给 ...
- 互联网IT当线上出现 bug 时,是怎么处理的?
线上BUG说处理方法:1.关于线上BUG问题,目前公司有一整套线上故障流程规范,包括故障定义.定级.处理流程.故障处理超时升级机制.故障处理小组.故障处罚(与故障存在时长有关)等:2.最主要的是,线上 ...
- 不停机不更新代码线上调试BUG的工具
如果你有以下痛点,请你查看本文章: 1.我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 2.遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 3.线上遇到某个用户的 ...
- 线上应用bug跟踪查找-友盟统计
线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...
- 10W年薪和30W+年薪的产品经理差距在哪?
举办到今年第六届壹佰案例峰会,认识的“程序猿/媛”朋友越来越多,时间长了就发现,程序员的世界一点也不单调,外界传说的不善言辞.最大的乐趣就是买“机械键盘”都是不对的.你见过周末组团去山里骑哈雷的研发经 ...
- 人人都是产品经理?关于PM你不知道的还有很多
产品经理的职称最早出现在P&G宝洁公司,因效果非常显著,许多企业纷纷仿而效尤.硅谷知名的产品管理大师Marty Cagan在<Inspired: How To Create Produc ...
随机推荐
- MongoDB联表查询
表A: id name --------------------------- 1 Tom 2 Roger 3 Mars 4 Brent 表B: id result ----------------- ...
- Centos7 yum安装Python3.6环境,超简单
原文链接:https://blog.51cto.com/wenguonideshou/2083301 配置好Python3.6和pip3安装EPEL和IUS软件源 yum install epel-r ...
- 软工团队项目之团队展示&选题(OnTime——S.L.N)
软工团队项目之团队展示&选题(OnTime——S.L.N) 一.团队展示 队名:『S.L.N』即Seigelion——乃“攻城狮”之意. 队员学号: 团队项目描述:(项目名称:OnTime) ...
- latex在线帮助文档
1.ctex官方网站 http://www.ctex.org/HomePage 2.在线帮助文档 http://www.ctex.org/OnlineDocuments
- 8个必备的Python GUI库
Python GUI 库有很多,下面给大家罗列常用的几种 GUI 库.下面介绍的这些GUI框架,能满足大部分开发人员的需要,你可以根据自己的需求,选择合适的GUI库. 很多人学习python,不知道从 ...
- 【学习中】Unity插件之NGUI 完整视频教程
课程 章节 内容 签到 Unity插件之NGUI 完整视频教程 第一章 NGUI基础控件和基础功能学习 1.NGUI介绍和插件的导入 6月29日 2.创建UIRoot 6月29日 3.学习Label控 ...
- Unity坑之 加了Rigidbody后主角反而朝天上飞?
今儿在做项目的时候,给主角加上一个Rigidbody组件,设置如下图: 然后问题来了,我本来是想让主角通过重力控制,掉到地上,但是加上之后,主角反而朝着天上飞! 这TM什么鬼? 经过多番探查,发现是A ...
- Funny Positive Sequence (思维+前缀)
There are n integers a 1,a 2,…,a n-1,a n in the sequence A, the sum of these n integers is larger th ...
- Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头
一.HSSFWorkbook与SXSSFWorkbook的区别: HSSFWorkbook是对Excel2003以前的版本进行操作的,即后缀名为.xls SXSSFWorkbook时对Excel200 ...
- 【Gin-API系列】守护进程和平滑重启(八)
生产环境的API服务我们都会部署在Linux服务器上,为了不受终端状态的影响,启动服务的时候会让服务在后台运行.那么如何让服务在后台运行呢,目前有2种常见的方法. 1.nohub 运行 表示忽略SIG ...