【问题标题】:Custom AWS X-Ray Tracing in C# LambdasC# Lambda 中的自定义 AWS X-Ray 跟踪
【发布时间】:2020-10-06 22:24:40
【问题描述】:

我最近尝试在 NodeJS 和 C# Lambdas 中使用 AWS X-Ray。我的信息对象会通过这两种类型的 Lambda,因此我想构建一个完整的生命周期,表示为对象的跟踪。因此,为了实现这一点,我需要将当前段连接到父 traceId。 我喜欢关闭 NodeJS Lambda 的 Active Tracing 标志并实现自定义跟踪逻辑的选项,效果很好:

const segment = new Segment(segmentName);
const traceHeaderStr = sqsRecord?.attributes?.AWSTraceHeader;
if (traceHeaderStr) {
  const traceHeader = AWSXRay.utils.processTraceData(sqsRecord?.attributes?.AWSTraceHeader);
  segment.trace_id = traceHeader["root"];
  segment.parent_id = traceHeader["parent"];
}

await AWSXRay.getNamespace().runPromise(async function () {
  AWSXRay.setSegment(segment);

  try {
    // do some work here
  } catch (error) {
    segment.addError(error);
    throw error;
  } finally {
    segment.close();
  }
});

相同的方法不适用于 C# Lambda,因为它们使用的是 Facade Segment,而不允许覆盖 parentId 或 traceId。我试图重现 NodeJS 逻辑,但如果关闭 Active Tracing 标志,则根本没有任何东西传递给 X-Ray。如果它已打开,则 parentId 或 traceId 似乎不会被覆盖 + 注释也不会被添加。

我知道这不是使用 C# Lambdas 的标准方式,因为我应该使用子段来代替。但是,这适用于 NodeJS!而且我需要一种将当前段连接到先前上下文的方法。你知道有什么技巧可以帮助重现与 NodeJS 相同的行为,同时比使用纯 X-Ray API(在 PutTraceSegmentsAsync 中手动编写的 JSON 对象)更好吗?
我的 C# sn-p:

Segment segment = new Segment(_serviceName);
string traceHeaderStr = sqsMessage.Attributes.TryGetValue("AWSTraceHeader");
if (!string.IsNullOrEmpty(traceHeaderStr))
{
    TraceHeader traceHeader = TraceHeader.FromString(traceHeaderStr);
    segment.TraceId = traceHeader.RootTraceId;
    segment.ParentId = traceHeader.ParentId;
}

AWSXRayRecorder.Instance.SetEntity(segment);
try
{
    segment.AddAnnotation("MyNote", "test");
    // do some work here
}
catch (Exception ex)
{
    segment.AddException(ex);
    throw;
}
finally
{
    segment.Release();
}

【问题讨论】:

    标签: c# node.js amazon-web-services aws-xray


    【解决方案1】:

    我认为理想情况下,lambda 中不允许创建分段。我不确定您为什么能够在 Node SDK 中看到跟踪。我认为这不是在 lambda 中使用 X-Ray SDK 的推荐方式。如果您想跟踪整个生命周期,那么您可能可以从跟踪标头中解析跟踪 id 并在另一端使用它。

    【讨论】:

    • 我同意你的观点,这就是为什么我最初的好奇。我与 AWS 进行了交谈,结果发现 Node 是一种特殊情况,因为它具有动态行为,这在具有更多限制的语言中是不可能实现的。我能想到的最佳选择是使用 X-Ray 的 API,您可以在其中创建您想要的任何片段。无论如何,由于 X-Ray 报告的非灵活性,我将使用另一种追踪产品。
    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 1970-01-01
    • 2020-07-08
    • 2023-02-01
    • 2021-06-21
    相关资源
    最近更新 更多