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文件
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日志