【问题标题】:Azure Application Insights not showing the whole chain of events (in event-driven app), but all telemetry is thereAzure Application Insights 未显示整个事件链(在事件驱动的应用程序中),但所有遥测数据都存在
【发布时间】: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 页面中看到所有内容。

但不幸的是,这并没有发生 :(

我在事务搜索中查找了 POST 请求:

然后点击它:

您可以看到“event-one”是如何发布的,以及如何有一个微服务接收它。但没有别的了。

现在,如果我搜索事件名称,我不仅会找到发布跟踪,还可以找到更多反映微服务发布的事件的依赖项:

如果我点击请求上方的那个,那么我可以更全面地了解整个交易:

但是,这里仍然缺少很多东西:每个微服务执行的所有 SQL 调用,微服务在接收事件二、三和四时执行的所有操作。

实际上,所有这些都可以在应用程序地图中使用:

这意味着所有遥测都正确!

问题

  1. 我做的一切都正确吗?
  2. 有没有办法在端到端中显示完整的事件链?

提前致谢

【问题讨论】:

  • 您排除了网络延迟的可能吗先生?您的问题很难在其他方面重现,因此很难解决它。
  • 是的,好点,所以现在我只在我的机器上测试它。遥测通常需要 3 到 5 分钟才能出现在 AI 中。我已经在这个问题上工作了几天,结果总是一样的。此外,应用程序地图显示所有服务调用。我将在原始问题中添加图表。

标签: .net azure rabbitmq azure-application-insights distributed-tracing


【解决方案1】:

好的,我找到了。

问题

  1. 我试图告诉 AppInsights 在我自己的 rabbitmq 客户端库的小包装器中执行操作。
  2. 执行此操作时,我没有正确传递 OperationId(不需要父级)。

现在看来您不应该使用StartOperation() 方法,而应该只使用TraceDependency() 方法。

正确的概念

但实际上正确的方法是向您要跟踪的组件添加检测。此检测是通过 System.Diagnostics 命名空间(ActivitiesDiagnosticListeners)完成的。

需要明确的是,RabbitMQ .NET client 是应该被检测的库,以便框架中的其他组件可以跟踪它在做什么。

此外,您将需要 IOBservers 告诉 Application Insights 如何将这些 Activities 发送到 Azure。

修复

  1. 我在自己的包装器中删除了所有与 Application Insights 相关的代码。
  2. 我下载了Microsoft.Azure.ServiceBus的源码。
  3. 我下载了Microsoft.ApplicationInsights的源码。
  4. 我在自己的包装器中添加了一个RabbitMQDiagnosticListener 类,其中包含方法 StartSendStartReceiveStop。该类中的代码是 实际上是Microsoft.Azure.ServiceBus自己的复制粘贴 DiagnosticListeners
  5. 经过反复试验(调整属性),我得到了它的工作,现在请求正确显示了所有嵌套的依赖调用。

如你所见,我没有做观察者部分。这是因为我基本上是在复制Microsoft.Azure.ServicesBus 如何发布Activities。由于 Application Insights 会自动跟踪 Microsoft.Azure.ServicesBus,因此它会处理我的呼叫,并且在 Azure 中它实际上显示为 Azure ServiveBus,即使包含“队列中的时间花费”部分也是如此。

微软需要改进很多自己的文档,似乎很不完整而且没有更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2020-01-08
    • 2022-01-11
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多