对于一些复杂的场景,当qtrace还没有插件进行支持的场景我们提供了埋点的方式支持,业务可根据业务实际需要进行埋点

一: 下面是一个简单的使用场景 routes/index

 router.get('/', async function (ctx, next) {
    // 1: 用start方法注册(开启)一个span
     const { qtrace, parentSpan } = ctx
     const home = qtrace.start({
       qtype: 'http',
       desc: '首页',
       url: '/'
    },{
      childOf: parentSpan //childOf 是上下文信息,如果你是在根路由,上下文是ctx.parentSpan
    })
    // 2: 调用当前实例的log方法增加一个过程,不是必须的
    home.log('连接redis开始')
    await connectRedis(qtrace,home) // 把qtrace传进去使用,这里的home就是connectRedis要用的上下文
    await ctx.render('index', {
         title: 'duheng',
    });
    // 3: 调用当前实例的stop方法关闭此span,必须
    home.stop()
  })

  module.exports = router;

注⚠️: 一个start方法必须对应一个stop,start时候注册span,stop的时候才会被写入trace文件

二: 以下是一个复杂使用场景,涉及多层嵌套的复杂项目

以/routes/index.js中埋点为例子,为方便引导理解、以下demo会按照ABC...进行注解;

A - 在路由入口处通过ctx.qtrace获取实例化的trace,并用ctx.qtrace.start创建一个span
B - 此处调用了模拟的connectRedis连接redis方法,把ctx.qtrace和当前span的上下文传进去【重点】
C - 给connectRedis埋点,方法跟B处一样。
D - redis_log.log代表当前span的log记录,最后会在后台显示到时间线上的 过程 一列中显示
E - redis_log.stop代表当前span的结束。
F - 如果connectRedis中还会调用其他函数或者方法需要将当前redis的start实例作为上下文传下去
  var router = require('koa-router')();
  var jade = require('jade');

  router.get('/', async function (ctx, next) {
    /**home demo start**/
    /** A **/
    const { qtrace, parentSpan } = ctx
    const home = ctx.qtrace.start({
      qtype: 'http',
      desc: '首页',
      url: '/'
    },{
      childOf: parentSpan
    })
    /** B **/
    connectRedis(qtrace,home)
    ctx.render('index', {
         title: 'duheng'
    });
    home.stop()
    /**home demo end**/
  })

  const connectRedis = (qtrace, parent) => { // async mock
    /** C **/
     /**redis_log demo start**/
     const redis_log = qtrace.start({
       qtype: 'redis',
       desc: '链接redis',
       url: 'connectRedis',
     },{
       childOf: parent
     })
   /** D **/
     redis_log.log('连接redis开始')
     setTimeout(_=>{
        redis_log.log('连接redis成功')
   /** E **/
       redis_log.stop()
       connectRedisCallback(qtrace,redis_log)
     },1000)
    /**redis_log demo end**/
  }

  /** F **/
  const connectRedisCallback = (qtrace,redis_log) => {
    /**redisDIY_log demo start**/
      const redisDIY_log = qtrace.start({
        qtype: 'redis',
        desc: '链接redis 子节点',
        url: 'connectRedisDIY',
      },{
        childOf: redis_log
      })

      setTimeout(()=>{
       redisDIY_log.stop()
      },5000)
     /**redisDIY_log demo end**/
  }
  module.exports = router;

注⚠️: 埋点完成后还需要进行应用中心配置,配置完成后数据中台才能正常拉取到我们的trace日志