V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
suyuanhxx
V2EX  ›  分享发现

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

  •  
  •   suyuanhxx · 2017-01-11 10:52:38 +08:00 · 2072 次点击
    这是一个创建于 2856 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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

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

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

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

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

    想减少对主体代码的侵入性? 你可以打出来 log , 让运维流 log , 然后分析出有用的结果
    suyuanhxx
        4
    suyuanhxx  
    OP
       2017-01-11 12:59:31 +08:00
    @lgpqdwjh nginx 内部程序调用接口没法追踪吧,只能使用 log ,但 log 不怎么优雅啊,还有就是可以自己封装方法实现。其实就是业务监控能力,有什么好的建议框架吗
    @hpeng aop 是个好东西,大量使用 spring AOP 会影响接口的响应速度吧,用得比较少,在数据库读写有用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 06:26 · PVG 14:26 · LAX 22:26 · JFK 01:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.