首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AWS X-Ray跟踪lambda调用lambda?

如何使用AWS X-Ray跟踪lambda调用lambda?
EN

Stack Overflow用户
提问于 2021-03-13 21:06:13
回答 1查看 709关注 0票数 1

我有一个由API网关事件触发的AWS Lambda函数。API网关配置为使用X射线。

由于Lambda跟踪配置默认为PassTrough,因此它也会显示在X射线中(服务映射等)。

被调用的lambda使用node.js aws-sdk来调用另一个Lambda。如果我理解正确的话,为了在X-Ray中显示这个Lambda,必须将跟踪ID传递给下一次调用。在API of the SDK中,我找不到解决此问题的选项。

代码语言:javascript
复制
const result = await lambda
        .invoke(lambdaParamsCreateUser)
        .promise()

我如何才能做到这一点?我如何跟踪原始请求的调用?

根据@Balu Vyamajala的提示,我将AWS-SDK导入更改为:

代码语言:javascript
复制
import AWS from "aws-sdk";

import AwsXRay from "aws-xray-sdk-core";
const aws = AwsXRay.captureAWS(AWS);
export default aws;

我在开具第二个函数的发票时使用它,如下所示:

代码语言:javascript
复制
import AWS from "aws";
const Lambda = AWS.Lambda;
// ...
const lambda = new Lambda({ region: "eu-central-1" });
const lambdaPromise = lambda
        .invoke({
            FunctionName: AUTH_CREATE_USER_FUNC,
            InvocationType: "RequestResponse",
            Qualifier: AUTH_CREATE_USER_FUNC_VERSION,
            Payload: JSON.stringify({
                eMail: eMail,
                device: device,
                customerId: customerId,
            }),
            LogType: "Tail",
        })
        .promise()

但在X-Ray中没有调用链:-(

https://imgur.com/wDMlNzb

我做错了吗?

EN

回答 1

Stack Overflow用户

发布于 2021-03-13 21:59:53

如果我们为两个Lambda函数都启用了X-Ray,trace-id就会自动传递,并且对于两个Lambda都是一样的。

在代码中,我们可以简单地通过包装aws-sdk来启用X-Ray

JavaScript:

代码语言:javascript
复制
const AWSXRay = require("aws-xray-sdk-core");
const AWS = AWSXRay.captureAWS(require("aws-sdk"));    

打字:

代码语言:javascript
复制
import AWSXRay from 'aws-xray-sdk';
import aws from 'aws-sdk';
const AWS = AWSXRay.captureAWS(aws)

这里有一个样本测试来确认。

balu-测试>>样本-测试

Lambda 1 (balu-test):

代码语言:javascript
复制
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";
};

Lambda 2(样本测试):

代码语言:javascript
复制
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);
    }
  });
};

对于两个Lambda调用,TraceId是相同的,并且X射线指向相同的图形。当从Api-Gateway调用第一个api时,也会发生同样的事情。第一次跟踪-id被生成并作为http报头被传递到下游进程。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66613871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档