AWS X-Ray (с SailsJS) не регистрирует вещи в правильном следе? - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь использовать AWS X-Ray в своем приложении SailsJS. Я заметил недостающие подсегменты - я добавил пользовательские трассировки через AWSXRay.captureAsyncFunc, но заметил, что они отсутствуют. После некоторой тщательной проверки, я думаю, что они на самом деле оказались в другом следе. Допустим, позже я вызываю API входа, затем другой API. Я заметил, что моя трассировка API входа в систему странная

Обратите внимание на то, что звонки прекращаются после того, как запрос должен был закончиться.

Эти запросы должны быть в другом сегменте:

enter image description here

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

1 Ответ

0 голосов
/ 14 августа 2018

Похоже, проблема, с которой вы сталкиваетесь, связана с тем, как CLS обрабатывает привязку контекста с Promise. В этом PR https://github.com/aws/aws-xray-sdk-node/pull/11. представлен патч с обещанием согласия, в котором подробно обсуждаются репродукции и исправления. Это должно решить проблему с подсегментами, прикрепленными к неправильному следу.

SDK поддерживает захват pool.query. Вы можете увидеть примеры здесь https://www.npmjs.com/package/aws-xray-sdk-mysql.

...