Я пытаюсь использовать AWS X-Ray в своем приложении SailsJS. Я заметил недостающие подсегменты - я добавил пользовательские трассировки через 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. Я полагаю, это не будет работать хорошо работать вообще?