我正在尝试在我的 SailsJS 应用程序中使用 AWS X-Ray。我注意到缺少子段 - 我通过添加自定义跟踪AWSXRay.captureAsyncFunc
但注意到它们丢失了。经过更仔细的检查,我认为它们实际上以不同的轨迹结束。假设我稍后调用登录 API,然后调用另一个 API。我注意到我的登录 API 跟踪很奇怪
请注意,在请求应该结束后会有相当多的调用。
这些请求实际上应该在另一个段中:
我认为它们应该出现在find device
子段之后。为什么分段会这样乱码?
我的设置:在http.js
,
const AWSXRay = require('aws-xray-sdk');
const xrayEnabled = process.env.AWS_XRAY === 'yes'
module.exports.http = {
middleware: {
order: [
'startRequestTimer',
'cookieParser',
'session',
'myRequestLogger',
'bodyParser',
'handleBodyParserError',
'compress',
'methodOverride',
'poweredBy',
'awsXrayStart',
'router',
'awsXrayEnd',
'www',
'favicon',
'404',
'500',
],
awsXrayStart: xrayEnabled ? AWSXRay.express.openSegment(`cast-${process.env.NODE_ENV || 'noenv'}`) : (req, res, next) => next(),
awsXrayEnd: xrayEnabled ? AWSXRay.express.closeSegment() : (req, res, next) => next(),
然后我把我的承诺包装起来:
instrumentPromise(promise, name, metadata = {}) {
if (this.isXrayEnabled()) {
return new Promise((resolve, reject) => {
AWSXRay.captureAsyncFunc(name, (subsegment) => {
if (!subsegment) console.warn(`[XRAY] Failed to instrument ${name}`)
Object.keys(metadata).forEach(k => {
if (subsegment) subsegment.addMetadata(k, metadata[k])
})
console.time(`[XRAY TIME] ${name}`)
promise
.then((data) => {
if (subsegment) subsegment.close()
console.timeEnd(`[XRAY TIME] ${name}`)
resolve(data)
})
.catch(err => {
if (subsegment) subsegment.close()
console.timeEnd(`[XRAY TIME] ${name}`)
reject(err)
})
})
})
}
return promise
}
我在这里缺少任何信息吗?我究竟做错了什么?
我尝试了手动模式,它更可靠,但我必须手动传递段。自动模式有什么问题?我有点猜测它不适用于异步性质的nodejs?就像 SDK 无法区分各种异步请求?并且可能在错误的地方关闭或跟踪段?也就是说......它应该与express一起工作,为什么它没有按预期工作......
另一件事是 X-Ray 如何正确跟踪共享的 mysql 连接池?不同的段将使用相同的 mysql 池。我认为这根本无法正常工作?