gpt4 book ai didi

amazon-web-services - AWS X-Ray 跟踪段丢失或未连接

转载 作者:行者123 更新时间:2023-12-04 15:40:52 30 4
gpt4 key购买 nike

我有代码在读取队列时创建一个段。在第一个函数中(在同一个 lambda 中)我有这个:

import * as AWSXRay from 'aws-xray-sdk'; // (using TypeScrpt)
AWSXRay.enableManualMode();
var segment1 = new AWSXRay.Segment("A");

在从第一个调用的第二个函数(在同一个 lambda 中)中,我有这样的东西:

var segment2 = new AWSXRay.Segment("B", segment1.trace_id, segment1.id);

而不是看到

*->A->B

在 AWS 图(在网站上)上,我看到:

*->A
*->B

...它们甚至没有关联,即使它们具有相同的跟踪 ID,并且父 ID 已正确设置。我似乎遗漏了什么但不确定是什么......?

我什至尝试从 API 请求中提取 X-Amzn-Trace-Id 以将其用作所有内容的根跟踪 ID,但这也不起作用。

这是第一段 (A) 的 JSON:

{
"Duration": 0.808,
"Id": "1-5d781a08-d41b49e35c3c0f38cdbd4912",
"Segments": [
{
"Document": {
"id": "74c99567f73185ce",
"name": "router",
"start_time": 1568152071.979,
"end_time": 1568152072.787,
"parent_id": "ef34fc0bcf23bbbe",
"aws": {
"xray": {
"sdk": "X-Ray for Node.js",
"sdk_version": "2.3.6",
"package": "aws-xray-sdk"
}
},
"service": {
"version": "unknown",
"runtime": "node",
"runtime_version": "v10.16.3",
"name": "unknown"
},
"trace_id": "1-5d781a08-d41b49e35c3c0f38cdbd4912"
},
"Id": "74c99567f73185ce"
}
]
}

这是第二个片段 (B) 的 JSON:

{
"Duration": 0.801,
"Id": "1-5d781a08-d9626abbab1cfbbfe4ff0dff",
"Segments": [
{
"Document": {
"id": "e2b4faaa6538bbb2",
"name": "handleCreateLoad",
"start_time": 1568152071.98,
"end_time": 1568152072.781,
"parent_id": "74c99567f73185ce",
"aws": {
"xray": {
"sdk": "X-Ray for Node.js",
"sdk_version": "2.3.6",
"package": "aws-xray-sdk"
}
},
"service": {
"version": "unknown",
"runtime": "node",
"runtime_version": "v10.16.3",
"name": "unknown"
},
"trace_id": "1-5d781a08-d9626abbab1cfbbfe4ff0dff",
"subsegments": [
{
"id": "08ccf2f374364066",
"name": "...-CreateLoad",
"start_time": 1568152071.981,
"end_time": 1568152072.781
}
]
},
"Id": "e2b4faaa6538bbb2"
}
]
}

很明显,“B”的父 ID (74c99567f73185ce) 指向“A”的 ID,但图表并未将它们连接起来。

enter image description here

此外,我认为 _x_amzn_trace_id 应该在 lambda 执行时设置,但事实并非如此。这可能是我问题的根源。

最佳答案

事实证明,AWS XRay SDK 所需的 process.env._x_amzn_trace_id 在调用处理程序之前不存在。它可能会帮助其他人了解我的经历:

  1. 起初我试图在启动时(在调用处理程序之前)获取当前 lambda 的跟踪详细信息以连接我的新段,但它没有用。我在同一个项目中有很多处理程序,所以在启动时获取 lambda 段是我希望做的。
  2. 然后我继续创建一个主要的 lambda 段(认为我必须自己创建第一个段)但它所做的只是创建一个孤立的段。更糟糕的是,如果没有提供,每个段都会创建一个新的跟踪 ID,并且由于我无法从全局启动范围中获取跟踪 ID,所以没有任何连接。正确的跟踪 ID 对于每个请求从头到尾传递非常重要,以确保正确跟踪下游调用。
  3. 在调用处理程序之前转储环境变量并清楚地显示跟踪 ID,直到调用处理程序之前才提供。遗憾的是,大多数在线示例甚至都懒得对此发出警告。然后,我将调用移动到 lambda 处理程序开头的 AWSXRay.getSegment(),然后将详细信息传递给子段。
  4. 不要设置 context.callbackWaitsForEmptyEventLoop = false 同时调用传递给 lambda 处理程序的 callback(error, response) 回调。这样做将终止 lambda,而无需等待段更新事件刷新到守护程序,从而导致孤立的段。 :(

注意:缺少此文档:https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/它声明“您可以随时检索当前段或子段”,而实际上有时您不能。太糟糕了,没有使用实际工作的 NodeJS Lambda 代码的适当示例,而是到处抛出孤立的代码行。

关于amazon-web-services - AWS X-Ray 跟踪段丢失或未连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57867044/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com