活动Opentelemetry跟踪.Net Core远程服务



我有多个web服务,它们通过SignalR连接到一组远程.Net Core应用程序,允许它们通过Signal R通道接收消息。消息包含一个数据结构,该数据结构包含在web服务上设置的跟踪ID。我有Jaeger的设置和远程和web服务报告,从web服务到DB等,跟踪看起来都很好。

然而,在收到SignalR消息时,我无法从远程服务跟踪它。然而,如果我向Web API发出请求,则可以在Jaeger中看到Traces。

电流:

  1. 对web服务的请求-例如HTTP POST
  2. 网络服务通过集线器通过SignalR发送消息
  3. 远程服务收到消息
  4. 删除消息中的服务操作
  5. 远程服务可以向网络服务发送信息

从Jaeger我可以看到最初的HTTPPOST和一些DB请求,但这最终是它的结束。

在远程服务端,我阅读了消息,然后用TraceId创建了一个新的"活动"。

private ActivitySource CurrentSource { get; set; }
private Activity CurrentActivity { get; set; }
public void StartWithParentId(string name, string parentTraceId)
{
if (string.IsNullOrWhiteSpace(parentTraceId))
{
Start(name);
return;
}
Debug.WriteLine($"TRACE INFORMATION Name:{name.GetLogQuoteString()} " +
$"TraceID:{parentTraceId.GetLogQuoteString()}");
CurrentSource = _accSourcesService.Get();
CurrentActivity = CurrentSource?.StartActivity(name);
CurrentActivity?.SetParentId(parentTraceId);
CurrentActivity?.SetIdFormat(ActivityIdFormat.W3C);
}

然后我在活动中添加一些标签和行李

public static void CreateTaggingAndBaggageFromJob(IActivityService activityService, 
ISignalRBaseJob job)
{
activityService.AddBaggage("job.id", job.Id);
activityService.AddTag("job.id", job.Id);
activityService.AddBaggage("RId", job.RID);
activityService.AddTag("RId", job.RID);
}

然后,一旦所有工作完成:

public void Stop()
{
CurrentActivity?.Stop();
CurrentActivity?.Dispose();
CurrentActivity = null;
}

来自SetParentId:的文档

此方法仅用于从"活动"构造函数创建的"活动"。通过调用CreateActivity或StartActivity创建的活动已经设置了父ID,调用此方法无效。

在您的情况下,对SetParentId的调用无效,因为StartActivity已经设置了一个父上下文,以后无法覆盖。

如果使用StartActivity,则需要指定父活动上下文作为此调用的一部分,例如使用StartActivity的重载。

可以使用ActivityContext.TryParse从W3C跟踪上下文标头创建ActivityContext

相关内容

  • 没有找到相关文章

最新更新