AWS X-Ray с Node.JS Express и запросом - PullRequest
0 голосов
/ 12 июня 2019

Итак, я пытаюсь реализовать X-Ray с моим экспресс-приложением. У меня есть файл app.js и внутренняя ссылка на файл маршрутизатора.

структура моего проекта:
project/ routes/ index.js app.js

app.js:

var indexRouter = require("./routes/index")
...
app.use("/", indexRouter)
...

index.js:

const AWSXRay = require("aws-xray-sdk")
const request = require("request")

router.post("/xray", async function(req, res, next) {
    let app = req.app
    app.use(AWSXRay.express.openSegment("MyApp"))

    try {
        console.log(AWSXRay.getSegment()) // this succesfully gets segment
        AWSXRay.captureAsyncFunc("send", function(subsegment) {
            request.get("http://www.google.com", { XRaySegment: subsegment }, function() {
                res.json({
                    success: "success"
                })
                subsegment.close()
        })
    } catch (err) {
        next(err)
    }
    app.use(AWSXRay.express.closeSegment())
})

Я следую примерам автоматического режима: захват с помощью вызовов асинхронных функций из документации AWS (https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/index.html),, но я получаю сообщение об ошибке: "Не удалось получить текущий суб / сегмент из контекста."


Может кто-нибудь сообщить мне, что я делаю не так?

1 Ответ

1 голос
/ 12 июня 2019

Вы должны переместить код app.use(AWSXRay.express.openSegment("MyApp")) на app.js над app.use("/", indexRouter)

Затем переместите app.use(AWSXRay.express.closeSegment()) ниже app.use("/", indexRouter).

Если вы посмотрите на код, указанный в приведенной ссылке, вы заметите, что openSegment и closeSegment находятся вне маршрута, а не внутри (как они у вас есть в настоящее время)

Код в ссылке для справки:

var app = express();

//...

var AWSXRay = require('aws-xray-sdk');

app.use(AWSXRay.express.openSegment('defaultName'));               //required at the start of your routes

app.get('/', function (req, res) {
  res.render('index');
});

app.use(AWSXRay.express.closeSegment());   //Required at the end of your routes / first in error handling routes
...