tho*_*paw 2 amazon-web-services node.js aws-lambda aws-xray
我有一个由 API 网关事件触发的 AWS Lambda 函数。API 网关配置为使用 X-Ray。
由于 Lambda 跟踪配置默认为 PassTrough,它也显示在 X-Ray(服务地图等)中。
调用的 Lambda 使用 node.js aws-sdk 调用另一个 lambda。如果我理解正确,则必须将跟踪 ID 传递到下一个调用,以便在 X 射线中也显示此 Lambda。在SDK 的 API中我没有找到这方面的选项。
const result = await lambda
.invoke(lambdaParamsCreateUser)
.promise()
Run Code Online (Sandbox Code Playgroud)
我怎样才能实现这个目标?我怎样才能跟踪原始请求的调用?
根据 @Balu Vyamajala 的提示,我将 AWS-SDK 导入更改为以下内容:
const result = await lambda
.invoke(lambdaParamsCreateUser)
.promise()
Run Code Online (Sandbox Code Playgroud)
当我为第二个函数开发票时,我会使用它,如下所示:
import AWS from "aws-sdk";
import AwsXRay from "aws-xray-sdk-core";
const aws = AwsXRay.captureAWS(AWS);
export default aws;
Run Code Online (Sandbox Code Playgroud)
但在 X-Ray 中没有调用链:-(
https://i.stack.imgur.com/8FsWT.jpg
我犯错了吗?
如果我们为两个 Lambda 函数启用 X-Ray,trace-id 会自动传递,并且对于两个 Lambda 来说都是相同的。
在代码中,我们只需将 X-Ray 包裹在 aws-sdk 上即可启用它
JavaScript:
const AWSXRay = require("aws-xray-sdk-core");
const AWS = AWSXRay.captureAWS(require("aws-sdk"));
Run Code Online (Sandbox Code Playgroud)
打字稿:
import AWSXRay from 'aws-xray-sdk';
import aws from 'aws-sdk';
const AWS = AWSXRay.captureAWS(aws)
Run Code Online (Sandbox Code Playgroud)
这是一个样本测试来确认。
balu-测试 >> 样本测试
Lambda 1(balu 测试):
const AWSXRay = require("aws-xray-sdk-core");
const AWS = AWSXRay.captureAWS(require("aws-sdk"));
const lambda = new AWS.Lambda();
exports.handler = async function (event, context) {
var params = {
FunctionName: "sample-test",
InvocationType: "RequestResponse",
Payload: '{ "name" : "foo" }',
};
const response = await lambda.invoke(params).promise();
console.log('response',response);
return "sucess";
};
Run Code Online (Sandbox Code Playgroud)
Lambda 2(样本测试):
const AWSXRay = require("aws-xray-sdk-core");
const AWS = AWSXRay.captureAWS(require("aws-sdk"));
let region = "us-east-1"
let secretName = "SomeSecret"
let secret
let decodedBinarySecret
var client = new AWS.SecretsManager({
region: region,
});
exports.handler = (event, context, callback) => {
client.getSecretValue({ SecretId: secretName }, function (err, data) {
if (err) {
callback(err);
} else {
if ("SecretString" in data) {
secret = data.SecretString;
} else {
let buff = new Buffer(data.SecretBinary, "base64");
decodedBinarySecret = buff.toString("ascii");
}
callback(null, secret);
}
});
};
Run Code Online (Sandbox Code Playgroud)
对于两个 Lambda 调用,TraceId 相同,X-Ray 指向相同的图表。当从 Api-Gateway 调用第一个 api 时,也会发生同样的情况。第一次生成 trace-id 并作为 http 标头传递到下游进程。
| 归档时间: |
|
| 查看次数: |
2505 次 |
| 最近记录: |