我有多个web服务,它们通过SignalR连接到一组远程.Net Core应用程序,允许它们通过Signal R通道接收消息。消息包含一个数据结构,该数据结构包含在web服务上设置的跟踪ID。我有Jaeger的设置和远程和web服务报告,从web服务到DB等,跟踪看起来都很好。
然而,在收到SignalR消息时,我无法从远程服务跟踪它。然而,如果我向Web API发出请求,则可以在Jaeger中看到Traces。
电流:
- 对web服务的请求-例如HTTP POST
- 网络服务通过集线器通过SignalR发送消息
- 远程服务收到消息
- 删除消息中的服务操作
- 远程服务可以向网络服务发送信息
从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
。