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 在调用处理程序之前不存在。它可能会帮助其他人知道我经历了什么:

  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/ 它说 "You can retrieve the current segment or subsegment at any time" 而事实上有些时候你不能。太糟糕了,没有使用实际工作的 NodeJS Lambda 代码的适当示例,而不是到处抛出孤立的代码行。