在 Azure 中使用 Insights SDK for .NET 配置依赖项收集
介绍
Application Insights SDK for .NET 提供强大的依赖项收集功能。但是,有时它可能会记录过多的信息。由于 Application Insights 和 Azure Monitor 按每 GB 数据引入收费,因此如果应用程序的依赖项收集配置不正确,则每月的 Azure 账单可能会比应有的金额高得多。
在本指南中,您将学习如何自定义 Application Insights SDK for .NET 以切换不同的依赖项收集功能,并编写自定义TelemetryProcessor来过滤遥测,这可以减少应用程序发出的遥测量并降低数据提取成本。
.NET 应用程序中依赖项收集的工作原理
.NET 提供了两个强大的功能来收集有关应用程序的数据。这些包括:
- 诊断源,此功能允许库发布其他包可以侦听甚至修改的消息(例如检测)。由于这些库实现了诊断源发布者,因此 Application Insights 可以自动跟踪对受支持目标的依赖关系。使用此钩子,它可以读取消息、用额外数据丰富消息并记录消息。
- 事件源,一项类似的功能,可以发布其他工具和库可以使用的低级事件。这些工具无法像诊断源一样在应用程序上下文中修改数据。可以收集的事件源数据的一些示例包括 SQL 请求、垃圾收集 (GC) 统计信息和内存分配。
Azure Application Insights SDKs for .NET 使用这两个功能来跟踪和记录来自支持的目标的应用程序依赖项信息。
自定义依赖项集合
如果您将 ASP.NET Core 与Microsoft.ApplicationInsights.AspnetCore包一起使用,则可以配置一些全局选项来自定义要记录的信息。
services.ConfigureTelemetryModule<DependencyTrackingTelemetryModule>((module, options) =>
{
// disable all dependency collection
module.DisableDiagnosticSourceInstrumentation = false;
// disable command text
module.EnableSqlCommandTextInstrumentation = false;
});
您可以使用ConfigureTelementryModule全局禁用 SQL 文本捕获和所有依赖项收集。SQL 文本可能总计包含大量数据,尤其是当您的应用程序与数据库非常频繁时。
注意: SDK 2.14.0版本已默认关闭命令文本收集功能。
创建遥测处理器以有条件地过滤遥测
您可以使用遥测处理器有条件地过滤遥测,而不是全局定制依赖项收集。
此功能允许您检查应用程序内的所有遥测数据并决定是否应记录。
如果您的应用程序轮询另一项服务,因为它实现了运行状况检查或需要检查以维护单例锁或与队列的活动连接,那么您将向 Application Insights 发布大量无意义的依赖日志。
/// filters out dependencies like polling queues that are not attached to any larger operation.
public class AzureDependencyFilterTelemetryProcessor : ITelemetryProcessor
{
private readonly ITelemetryProcessor _inner;
public AzureDependencyFilterTelemetryProcessor(ITelemetryProcessor inner)
{
_inner = inner;
}
public void Process(ITelemetry item)
{
if (item is Microsoft.ApplicationInsights.DataContracts.DependencyTelemetry dependency
&& dependency.Success == true
&& dependency.Context.Operation.Name == null
&& (dependency.Type == "Azure Service Bus"
|| dependency.Type == "Azure table"
|| dependency.Type == "Azure blob"
|| dependency.Type == "Azure queue"))
{
return;
}
_inner.Process(item);
}
}
上面的代码片段演示了如何过滤掉这些低价值依赖事件。如果您的应用程序正在轮询队列以检查新消息,则此任务将不属于操作的一部分。您可以使用operation.Context.Operation.Name == null来检查依赖项是否在处理传入 HTTP 请求或后台消息的上下文中被调用。如果依赖项是操作的一部分,那么您可能希望保留这些依赖项跟踪。
最后,您需要向 IoC 容器注册您的TelemetryProcessor 。
services.AddApplicationInsightsTelemetryProcessor<AzureDependencyFilterTelemetryProcessor>();
如果您的应用程序订阅了许多不同的队列,通过过滤这些依赖关系跟踪,您可以减少收集的数十万个事件的数量。
结论
Application Insights 提供了一组丰富的功能,用于监视、日志记录和诊断。如果您对一些低级细节感到好奇,可以通过阅读Azure 的 Application Insights 如何关联遥测来了解更多信息。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~