前言

前几天跟读者聊天,他说被产品经理给怼了。原因是线上出 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. java基础-01:dos命令

    进入cmd方式 win + r 输入 cmd 随便进入一个文件夹 在导航栏输入cmd,回车即进入命令行 命令 盘符切换:直接输入 E: ,回车即可 查看文件夹下所有目录:dir 切换目录: cd 跨盘 ...

  2. 高德地图marker事件监听-高德地图marker绑定事件就执行了[解决立即执行]

    官方的demo是这样的:地址:[http://lbs.amap.com/api/javascript-api/example/infowindow/add-infowindows-to-multipl ...

  3. 修改Markdown神器[Typora]的主题样式

    修改Markdown神器[Typora]的主题样式 Typora是一款专注写作的工具,基于markdown标记语言来完成写作.出于以下原因决定替换主题样式: 1.自带的样式比较low,想替换一款高大上 ...

  4. java调用C# webService发布的接口

    java调用C# webService发布的接口 java调用C# webService方式有很多种我这里只介绍一种 首先需要引入axis的jar包 axis的maven坐标如下 <depend ...

  5. 万字长文,一篇文章带你入门Python

    注释 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家提供 ...

  6. PHP check 的一些绕过技术

    绕过空格 $_GET[str]=str_replace(" ","",$_GET[str]); ${IFS}  但不能写作 $IFS $IFS$ % 绕过ech ...

  7. ASP调用WEBSERVICE并对返回结果进行解析时遇到的问题

    项目上用动易平台做新闻发布网站,动易平台是用ASP做的,期间需要根据当前登录的用户,取其他系统比如OA的待办事项进行列表展示,OA组的同事给了我一个WSDL接口,百度了很多ASP调用webservic ...

  8. 将大量数据批量插入Oracle表的类,支持停止续传

    之前用create table select * from XXTable无疑是创建庞大表的最快方案之一,但是数据重复率是个问题,且数据难以操控. 于是我在之前批量插数据的基础上更新了一个类,让它具有 ...

  9. PHP 安装 扩展时 抛出 /usr/local/Cellar/php@7.1/7.1.25/pecl 异常解决

    liugx@MacBook-Pro  ~/work/php/ext_source/php-xhprof-extension   master  make installmkdir: /usr/ ...

  10. LAMP环境之编译安装httpd服务

    “Apache HTTP Server”是开源软件项目的杰出代表,它基于标准的 HTTP 网络协议提供网页浏览服务. 在配置 Apache 网站服务之前,需要正确安装好 httpd 服务器软件.htt ...