AWS X-Ray 跟踪段丢失或未连接
AWS X-Ray trace segments are missing or not connected
我有代码在读取队列时创建段。在第一个函数中(在同一个 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,但图表并未将它们连接起来。
此外,我认为 _x_amzn_trace_id
应该在 lambda 执行时设置,但事实并非如此。这可能是我问题的根源。
事实证明,AWS XRay SDK 所需的 process.env._x_amzn_trace_id
在调用处理程序之前不存在。它可能会帮助其他人知道我经历了什么:
- 起初我试图在启动时(在调用处理程序之前)获取当前 lambda 的跟踪详细信息以连接我的新段,但它没有用。我在同一个项目中有很多处理程序,所以在启动时获取 lambda 段是我希望做的。
- 然后我继续创建一个主要的 lambda 段(认为我必须自己创建第一个段)但它所做的只是创建一个孤立的段。更糟糕的是,如果没有提供,每个段都会创建一个新的跟踪 ID,并且由于我无法从全局启动范围中获取跟踪 ID,所以没有任何连接。正确的跟踪 ID 对于每个请求从头到尾传递非常重要,以确保正确跟踪下游调用。
- 调用处理程序之前和之后的环境变量转储清楚地显示跟踪 ID,直到调用处理程序之前才提供。遗憾的是,大多数在线示例甚至都懒得对此发出警告。然后我将调用移动到 lambda 处理程序开始处的
AWSXRay.getSegment()
,然后将详细信息传递给子段。
- 不要在设置
context.callbackWaitsForEmptyEventLoop = false
的同时调用传递给 lambda 处理程序的 callback(error, response)
回调。这样做将终止 lambda,而无需等待段更新事件刷新到守护程序,从而导致孤立的段。 :(
注意:缺少此文档:https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/
它说 "You can retrieve the current segment or subsegment at any time" 而事实上有些时候你不能。太糟糕了,没有使用实际工作的 NodeJS Lambda 代码的适当示例,而不是到处抛出孤立的代码行。
我有代码在读取队列时创建段。在第一个函数中(在同一个 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,但图表并未将它们连接起来。
此外,我认为 _x_amzn_trace_id
应该在 lambda 执行时设置,但事实并非如此。这可能是我问题的根源。
事实证明,AWS XRay SDK 所需的 process.env._x_amzn_trace_id
在调用处理程序之前不存在。它可能会帮助其他人知道我经历了什么:
- 起初我试图在启动时(在调用处理程序之前)获取当前 lambda 的跟踪详细信息以连接我的新段,但它没有用。我在同一个项目中有很多处理程序,所以在启动时获取 lambda 段是我希望做的。
- 然后我继续创建一个主要的 lambda 段(认为我必须自己创建第一个段)但它所做的只是创建一个孤立的段。更糟糕的是,如果没有提供,每个段都会创建一个新的跟踪 ID,并且由于我无法从全局启动范围中获取跟踪 ID,所以没有任何连接。正确的跟踪 ID 对于每个请求从头到尾传递非常重要,以确保正确跟踪下游调用。
- 调用处理程序之前和之后的环境变量转储清楚地显示跟踪 ID,直到调用处理程序之前才提供。遗憾的是,大多数在线示例甚至都懒得对此发出警告。然后我将调用移动到 lambda 处理程序开始处的
AWSXRay.getSegment()
,然后将详细信息传递给子段。 - 不要在设置
context.callbackWaitsForEmptyEventLoop = false
的同时调用传递给 lambda 处理程序的callback(error, response)
回调。这样做将终止 lambda,而无需等待段更新事件刷新到守护程序,从而导致孤立的段。 :(
注意:缺少此文档:https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/ 它说 "You can retrieve the current segment or subsegment at any time" 而事实上有些时候你不能。太糟糕了,没有使用实际工作的 NodeJS Lambda 代码的适当示例,而不是到处抛出孤立的代码行。