在接口代码中加入调用追踪 Id 和接口返回时间

2017-01-11 10:52:38 +08:00
 suyuanhxx

现在公司业务代码写的比较混乱,框架也不咋地,总是出现一些玄学的问题,为了避免相互甩锅,我自己想在代码中加入追踪,同时输出接口响应时间。大家有没有什么好的框架或者想法,对代码的侵入最小。


  1. 接口——输出被调用接口返回时间,调用接口(调用线程) Id 方法名
  2. dao 层输出数据库操作时间, sql 查询所用时间, redis 缓存操作所用时间。
  3. 特别是对于多线程总是容易出现一些莫名其妙的问题,有什么方案能够了解多线程执行的内部细节,有什么比打印日志优雅的方式不。多线程推送特别容易出问题,漏推,多推,延迟,真是蛋疼。
  4. 项目采用分布式部署,有时一个请求打印好几条同样的日志,我认为架构(或者 nginx 部署)有问题,架构师要我给出更实际一点的证据,我只能在不同的服务器日志中找到同一个请求打印两条同样的日志,时间相隔 1s ,我能够肯定只发出了一次请求。

<font color="red">重点就是有没有什么优雅或者好的框架,实现输出接口的响应时间,调用链的追踪,同时尽可能少的对主体代码的入侵</font>

2075 次点击
所在节点    分享发现
4 条回复
suyuanhxx
2017-01-11 10:53:19 +08:00
字体颜色失败了......
hpeng
2017-01-11 11:33:57 +08:00
减少入侵用 aop 呗。 sql 有点麻烦, java 的话可以用带监控功能的链接池比如阿里的那个 Druid 。其他就没什么建议了
lgpqdwjh
2017-01-11 12:00:59 +08:00
首先, 如果是只想要接口时间, nginx 的 log 是可以获取到的, 如果你需要接口 线程 id 方法名等, 这里需要业务监控等能力支持, 当然, 你仍然可以做简单点, 写个通用方法纪录即可。

至于 dao 也是一个道理, 要么看数据库 log (不建议), 要么程序上能支持

最后你提到可能一个请求 打了好几次, 目测应该是请求重试导致的, 值得一提的是 同一个 upstream 下有多个实例, 当请求失败了, 会尝试请求下一个, 这也是 ngx 的特性, 尽可能的保证 upstream 下有实例可用.

想减少对主体代码的侵入性? 你可以打出来 log , 让运维流 log , 然后分析出有用的结果
suyuanhxx
2017-01-11 12:59:31 +08:00
@lgpqdwjh nginx 内部程序调用接口没法追踪吧,只能使用 log ,但 log 不怎么优雅啊,还有就是可以自己封装方法实现。其实就是业务监控能力,有什么好的建议框架吗
@hpeng aop 是个好东西,大量使用 spring AOP 会影响接口的响应速度吧,用得比较少,在数据库读写有用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/333790

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX