0

我正在尝试在我的 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 池。我认为这根本无法正常工作?

4

1 回答 1

0

您遇到的问题似乎与 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

于 2018-08-14T19:46:26.840 回答