当前位置: 首页 > 知识库问答 >
问题:

如何使用AWS X射线追踪lambda调用lambda?

戚逸清
2023-03-14

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

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

被调用的Lambda使用节点。js aws sdk调用另一个lambda。如果我理解正确,则必须将跟踪ID传递给下一次调用,以便在X射线中也显示此Lambda。在SDK的API中,我没有找到此选项。

const result = await lambda
        .invoke(lambdaParamsCreateUser)
        .promise()

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

使用@Balu Vyamajala的提示,我将AWS-SDK导入更改为以下内容:

import AWS from "aws-sdk";

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

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

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

我会犯错吗?

共有1个答案

汲时铭
2023-03-14

如果我们为两个Lambda函数启用X射线,跟踪id将自动传递,并且两个Lambda的跟踪id将相同。

在代码中,我们可以通过简单地将其包裹在aws-sdk周围来启用X-Ray

JavaScript:

const AWSXRay = require("aws-xray-sdk-core");
const AWS = AWSXRay.captureAWS(require("aws-sdk"));    

类型脚本:

import AWSXRay from 'aws-xray-sdk';
import aws from 'aws-sdk';
const AWS = AWSXRay.captureAWS(aws)

这是一个要确认的样本测试。

巴卢测试

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";
};

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);
    }
  });
};

TraceId是相同的,对于两个Lambda调用,X-Ray指向相同的图。当从Api-Gateway调用第一个api时,会发生同样的事情。第一次生成trace-id并作为超文本传输协议标头传递给下游进程。

 类似资料:
  • 在微服务场景下,我们会拆分出来很多的服务,也就意味着一个业务请求,少则跨越 3-4 个服务,多则几十个甚至更多,在这种架构下我们需要对某一个问题进行 Debug 的时候是极其困难的一件事情,那么我们就需要一个调用链追踪系统来帮助我们动态地展示服务调用的链路,以便我们可以快速地对问题点进行定位,亦可根据链路信息对服务进行调优。 在 Hyperf 里我们提供了 hyperf/tracer 组件来对各个

  • 当想知道一个进程在做什么事情的时候,可以通过strace命令跟踪一个进程的所有系统调用。 1、运行 php start.php status 能看到workerman相关进程的信息 如下: Hello admin ---------------------------------------GLOBAL STATUS-----------------------------------------

  • 1. 功能说明 Dorado是分布式通信框架,并不包括性能监控系统,但更细粒度服务性能数据必须来自于框架的数据采集。通常使用监控系统的API上报数据的做法是,在起始和结束的位置埋点,由监控服务来计算耗时做数据统计,但我们平时在运维时经常遇到的一个问题就是,“为什么我的请求调用端比服务端耗时高出那么多”、“为什么框架上报耗时与我在接口实现中的耗时差异很大”。其实一个请求从发起到收到返回,中间经历了好

  • 如何使用Spring Cloud sleuth跟踪基于Kafka的事件?我看到的例子都是RESTAPI。我在找Kafka客户图书馆。 另外,使用Spring cloud sleuth是一个好主意还是应该手动通过标头传递我的TraceID?

  • 我有一个用NodeJS编写的AWS lambda函数,在这个函数上我启用了活动跟踪,现在每次调用它时都会看到X射线跟踪。但是-Lambda函数也会发布到SNS,并且SNS不会出现在X射线轨迹中。我是否需要添加代码才能查看SNS跟踪? (lambda和SNS都使用相同的角色,所以我认为这不是问题)。 谢谢

  • 我有一些启用了跟踪的Python Lambda函数,它们是这样开始的: 有了这个跟踪,每个Lambda函数本身都可以工作,我可以看到通过boto3对DynamoDB或Kinesis的子服务调用。 但是如何在一个跟踪中将各种Lambda函数连接在一起呢?我正在考虑在第一个函数中生成一个唯一的字符串,并将其写入存储在Kinesis中的消息中。然后,另一个函数将从动觉信息中提取字符串并再次跟踪它。 如何