【发布时间】:2021-02-05 11:54:35
【问题描述】:
场景
我在 ASP .NET Core 中有一个容器化、事件驱动的微服务应用,刚刚迁移到 .NET 5。
所有项目都使用Microsoft.ApplicationInsights2.16.0,并且我检查了所有遥测数据都已发送并且采样不会影响结果(至少对于每个微服务单独)。
所有项目都向 RabbitMQ 发布和订阅事件。
我有自己的 rabbitmq nuget 包来简化对 RabbitMQ 的访问(它已经正常工作了一年多)。我添加了此代码以在发布事件时发送遥测标识符:
var operation = _telemetryClient.StartOperation<DependencyTelemetry>($"Publish {theEvent.EventName.Replace(".", "-")}");
operation.Telemetry.Type = "Azure Service Bus"; // Just because I like the icon shown in Azure.
operation.Telemetry.Data = JsonConvert.SerializeObject(theEvent);
_basicProperties.Headers["x-telemetry-operationid"] = operation.Telemetry.Context.Operation.Id;
_basicProperties.Headers["x-telemetry-parentOperationId"] = operation.Telemetry.Id;
_channelProvider
.GetChannel()
.BasicPublish(_configuration.Exchange, theEvent.EventName, _basicProperties, Encoding.UTF8.GetBytes(payload));
我使用此代码在收到事件时跟踪依赖关系:
var operation = _telemetryClient.StartOperation<RequestTelemetry>($"Received {eventName.Replace(".", "-")}");
operation.Telemetry.Context.Operation.Id = basicDeliverEventArgs.BasicProperties.Headers["x-telemetry-operationId"];
operation.Telemetry.Context.Operation.ParentId = basicDeliverEventArgs.BasicProperties.Headers["x-telemetry-operationId"];
// Handle the message...
_telemetryClient.StopOperation(operation);
当一个微服务收到一个 POST 请求时,它会触发一个事件。其他几个微服务正在订阅它,它们还可以发布新事件,这将再次影响另一组微服务。当我点击 POST 请求时,我希望在 End-to-end transaction details 页面中看到所有内容。
但不幸的是,这并没有发生 :(
您可以看到“event-one”是如何发布的,以及如何有一个微服务接收它。但没有别的了。
现在,如果我搜索事件名称,我不仅会找到发布跟踪,还可以找到更多反映微服务发布的事件的依赖项:
但是,这里仍然缺少很多东西:每个微服务执行的所有 SQL 调用,微服务在接收事件二、三和四时执行的所有操作。
这意味着所有遥测都正确!
问题
- 我做的一切都正确吗?
- 有没有办法在端到端中显示完整的事件链?
提前致谢
【问题讨论】:
-
您排除了网络延迟的可能吗先生?您的问题很难在其他方面重现,因此很难解决它。
-
是的,好点,所以现在我只在我的机器上测试它。遥测通常需要 3 到 5 分钟才能出现在 AI 中。我已经在这个问题上工作了几天,结果总是一样的。此外,应用程序地图显示所有服务调用。我将在原始问题中添加图表。
标签: .net azure rabbitmq azure-application-insights distributed-tracing