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

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

翁和颂
2023-03-14

我有在读取队列时创建段的代码。在第一个函数中(在同一个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执行时设置,但事实并非如此。这可能是我问题的根源。

共有1个答案

余歌者
2023-03-14

结果是过程。环境_AWS XRay SDK所需的x\u amzn\u trace\u id在调用处理程序之前不存在。这可能有助于其他人了解我所经历的:

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

注:本文件缺失:https://docs.aws.amazon.com/xray-sdk-for-nodejs/latest/reference/它表示“您可以随时检索当前段或子段”,而实际上有时您无法检索。很遗憾,没有合适的示例使用实际工作的NodeJS Lambda代码,而不是到处抛出孤立的代码行。

 类似资料:
  • 但是,问题是,我没有在日志部分得到任何消息,我没有找到如何自定义字段。 问题 这就是我的问题。是否可以将至少消息信息添加到事务日志(第一张图片),是否可以至少将自定义字段添加到日志部分(第二张图片),是否有方法使日志至少可点击?(也是第二张图片,我的意思是它只是纯文本,我必须去发现和使用这些信息,如ctrl c ctrl v)最后,为什么日志被标记为错误,如果它只是一个日志,并像日志一样使用?我试

  • 在微服务环境中,我看到了通过整个业务流程中的所有微服务实例跟踪请求的两个主要好处。 查找服务实例之间或服务实例中的延迟间隙 寻找失败的根源,无论是技术上的还是关于商业案例的 Zipkin提供了一个解决第一个问题的工具。但是,如何使用跟踪来揭示微服务环境中的故障呢?我当然想跟踪所有受错误影响的范围,但不是每个请求,因为它们没有出错。如本文所述,可以使用自定义采样器。 或者,您可以注册自己的采样器be

  • 问题内容: 我们正在使用 订阅主题。但是,我们经常遇到错误。我已经使用JavaScript客户端(mqttws31.js)测试了连接,效果很好。表示连接没有问题。 错误:- MQTT消息:- 配置 :- pom.xml: 在调试时:- 在上述方法中,有时会抛出。所以基于catch块,它使用 问题答案: 我只是想分享一下,以防万一。…我有相同的异常,并通过确保生成了唯一的客户端ID(使用 )来解决它

  • 问题内容: 在尝试学习如何从恐慌中调试堆栈跟踪时,我遇到了一些令人困惑的问题。 当我在附加的播放链接上运行它时,输出以下内容: 我无法解读第二个数字的含义(main.F(0x1,0x10436000)中的0x10436000)。如果有第二个int参数,或者作为第一个参数传递的其他内容,则不会出现(可以在第二个播放链接中看到)。 一个arg:https : //play.golang.org/p/3

  • 问题内容: 我正在从python开发C扩展,并且获得了一些段错误(在开发过程中不可避免…)。 我正在寻找一种显示段错误发生在哪一行代码的方法(一个想法就像跟踪每一行代码),我该怎么做? 问题答案: 这是一种输出代码运行的Python每行的文件名和行号的方法: 输出: (当然,您可能希望将跟踪输出写入文件。)

  • 跟踪行为控制着 Entity Framework Core 是否会在其变更跟踪器里维持实体实例的信息。如果实体是被跟踪的,任何检测到的该实体的变更都将在 SaveChanges() 时持久化到数据库中。Entity Framework Core 还会对已跟踪的、之前已加载到 DbContext 实例中的查询和实体进行相互的导航属性装配。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。