AWS XRay Tracing - не отображается карта трассировки или подсегменты - PullRequest
1 голос
/ 28 января 2020

Я пытаюсь отследить безсерверную express лямбда-функцию, используя AWSXRay. Я пробовал несколько разных подходов к этому, и, похоже, ничего не работает.

Если я опущу промежуточное ПО aws-xray-sdk-express, я увижу все свои сегменты на временной шкале и увижу, что моя функция Lambda дважды появляется в Trace Карта. Если я включу промежуточное программное обеспечение express, я увижу сегмент промежуточного программного обеспечения («Функция трассировки Super Dooper») на карте трассировки и только первый подсегмент («MyFirstTrace») на временной шкале (не на карте трассировки).

Я пытаюсь заставить все Subsegments появиться в Timelines и Node Graphs

const AWSXray = require('aws-xray-sdk');
const xrayExpress = require('aws-xray-sdk-express');
const express = require('express');
const awsServerlessExpress = require('aws-serverless-express');


module.exports.handler = async (event, context) => {
    const app = express();
    app.use(xrayExpress.openSegment('Super Dooper Trace Function'));

    app.get('/test', async (req, res) => {
        const result = await doWork();
        res.send(result); 
    });

    app.use(xrayExpress.closeSegment());

    const server = awsServerlessExpress.createServer(app);
    return awsServerlessExpress.proxy(server, event, context, 'PROMISE').promise;

}

const doWork = async () => {
    const res1 =  await traceMyFunction('MyFirstTrace', 3000)
    const res2 = await traceMyFunction('MySecondTrace', 3000);
    const res3 = await traceMyFunction('MyThirdTrace', 2000);
    return [res1, res2, res3];
}


const traceMyFunction = (name, delayMs) => {
    return trace(name, async () => {
        return delay(delayMs)
    });
}


function trace(name, promiseFunction) {
    return new Promise((resolve, reject) => {
        AWSXray.captureAsyncFunc(name, (subSegment) => {
            promiseFunction(subSegment)
                .then((result) => {
                    resolve(result);
                    subSegment.close();
                }).catch((e) => {
                    subSegment.close();
                    reject(e)
                });
        });     
    });
}

const delay = (ms) => {
    return new Promise((res, rej) => {
        setTimeout(() => res({ time: ms }), ms)
    });
};

Это результирующее XRay Trace

А это След Raw Data

{
    "Duration": 8.278,
    "Id": "1-5e2f6cc3-a99e6c08f02ce0aec7ab7121",
    "Segments": [
        {
            "Document": {
                "id": "87ca46b60ded68e1",
                "name": "Super Dooper Trace Function",
                "start_time": 1580166338.92,
                "end_time": 1580166347.198,
                "http": {
                    "request": {
                        "url": "http://localhost/test",
                        "method": "GET",
                        "user_agent": "",
                        "client_ip": ""
                    },
                    "response": {
                        "status": 200
                    }
                },
                "aws": {
                    "xray": {
                        "sdk": "X-Ray for Node.js",
                        "sdk_version": "2.5.0",
                        "package": "aws-xray-sdk"
                    }
                },
                "service": {
                    "version": "unknown",
                    "runtime": "node",
                    "runtime_version": "v12.13.0",
                    "name": "unknown"
                },
                "trace_id": "1-5e2f6cc3-a99e6c08f02ce0aec7ab7121",
                "subsegments": [
                    {
                        "id": "98e9f32273700e6e",
                        "name": "MyFirstTrace",
                        "start_time": 1580166339.078,
                        "end_time": 1580166342.082
                    }
                ]
            },
            "Id": "87ca46b60ded68e1"
        }
    ]
}

1 Ответ

1 голос
/ 29 января 2020

Безсерверный Express имеет известные несовместимости с текущим X-Ray SDK - из-за того, что Lambda генерирует свой собственный сегмент, затем промежуточное программное обеспечение Express также пытается его создать. Мы планируем решить эту проблему в ближайшем будущем.

https://github.com/aws/aws-xray-sdk-node/issues/45

Полное объяснение см. В этой теме: https://github.com/aws/aws-xray-sdk-node/issues/30

...