如何解决C#Lambdas中的自定义AWS X-Ray跟踪
我最近尝试在NodeJS和C#Lambdas中使用AWS X-Ray。我的信息对象通过这两种类型的Lambda,因此我想构建一个表示为对象跟踪的完整生命周期。因此,为了实现这一点,我需要将当前段连接到父traceId。 我喜欢关闭NodeJS Lambdas的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射线。如果打开,parentId或traceId似乎不会被覆盖,也不会添加注释。
我知道这不是使用C#Lambda的标准方法,因为我应该改用子段。但是,这适用于NodeJS!我需要一种将当前段连接到先前上下文的方法。您是否知道有任何技巧可以帮助重现与NodeJS相同的行为,并且同时比使用纯X-Ray API(在PutTraceSegmentsAsync中手动编写的JSON对象)更好。
我的C#代码段:
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();
}
解决方法
我认为理想情况下,lambda中不允许创建段。我不确定为什么您可以在Node SDK中看到跟踪。我认为这不是在lambda中使用X-Ray SDK的推荐方法。如果要跟踪整个生命周期,则可以解析跟踪标头中的跟踪ID,并在另一端使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。