背景

  • 在大家测试联调的过程中,以及线上bug的排查中,有的人喜欢根据报错直接取排查代码,这样导致治标不治本,即只能定位当前问题,诶有办法确定问题的根源,导致项目中依然存在其他的隐患

排查问题的步骤

  • 首先通过自测或者用户反馈,暴露出系统的问题
  • 当运营或者开发收到问题反馈的时候,联系问题提出人提供参数进行复现,当可以稳定复现的时候,说明是必有缺陷,如果不能稳定复现,在下文说明
  • 当可以稳定复现的时候,可以通过参数进行debug,日志,以及返回提示快速定位问题
  • 确定问题之后,解决问题
  • 解决问题之后联系问题提出人进行验证
  • 以上就是公认的排查问题的通常步骤

复现把requirement全部下了 复现步骤是什么意思_解决方案

不能稳定复现的场景

  • 在实际生产环境中,有时会出现不能稳定复现的以下场景
  • 部分用户的存在问题
  • 只有某些时刻存在问题
  • 刚才有问题,现在没问题
  • 只有某些机器有问题,其他机器没问题

小结

  • 以上的列出的场景,虽然体现出系统的缺陷性,但是对于排查成本是极高的,在实际生产中,除非是核心的业务,基本上大家是忽略的
  • 接下来会针对不能稳定复现的场景进行整理和思考,提出一般性的解决方式

不能稳定复现-排查成本高的原因

  • 由于分布式的服务,请求链路长,日志分散
  • 由于系统的qps比较高,打的日志特别多,找起来费事
  • 由于代码里没有使用try-catch异常捕获,导致被全部异常拦截器捕获,异常堆栈不全
  • 问题提出人无法提供有效的复现参数,导致无法定位日志

解决方案

  • elk日志系统
  • 代码返回增加异常捕获

不能稳定复现-场景和可能的原因

 场景

原因 

解决方案 

 备注

 部分用户的存在问题

 通常是数据问题

 修复数据库的数据

 只有某些时刻存在问题

 通常是链路问题,如scf调用量过大,被抛弃

 提升调用量,排查调用链路

 只有某些机器有问题,其他机器没问题

 通常是缓存问题,如不安全的容器类

 排查代码里使用的缓存类

最坏的情况-马上就要定位,来不及加日志了

  • 推荐使用arhtas ,Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。  https://arthas.aliyun.com/doc/#
  • 针对这种场景可以使用watch命令和throwExp参数,以及-e
watch com.xxx.web.controller.XXXXController xxxMethod {params,returnObj,throwExp} -e  -x 6

参数说明

  • watch命令可以查看返回值和入参
  • throwExp 等于 Exception对象
  • -e 表示只有在异常的时候才会输出,减少数据量

总结

  • 复现对于解决问题,相当于debug对于开发,是事半功倍的利器
  • 准确的掌握复现的工具使用,可以极大的提升问题的解决质量和解决效率