指标 API 比较

向 .NET 应用或库添加新指标检测时,有多种不同的 API 可供选择。 本文将帮助你了解可用的内容以及所涉及的一些使用上的权衡。

API 有两个主要类别,即非特定于供应商的和特定于供应商的。 特定于供应商的 API 的优势在于供应商可以快速迭代其设计、添加专用功能并在其检测 API 与其后端系统之间实现紧密集成。 例如,如果你使用 Application Insights 提供的指标 API 来检测你的应用,那么在使用他们的分析工具时,你可能会发现他们提供了集成良好的功能和 Application Insight 的所有最新功能。 但现在,库或应用也将与此供应商关联,这样的话,如果要在以后改用其他的,就需要重写这些检测项。 对于库,这种关联可能尤其麻烦,因为库开发人员可能会使用一个供应商的 API,而引用库的应用开发人员则可能需要使用其他供应商的产品。 为了解决此关联问题,则有了非特定于供应商的产品选择,它提供了标准化的 API 外观和扩展点,可根据配置将数据路由到不同的供应商后端系统。 但是,非特定于供应商的 API 提供的功能可能较少,而且仍需要选择一个与相关外观的可扩展性机制集成的供应商。

.NET API

在 .NET 的 20 多年发展历史中,我们对指标 API 的设计进行过几次迭代,各时期的设计都是受支持的,并且是非特定于供应商的:

System.Diagnostics.Metrics

System.Diagnostics.Metrics API 是最新的跨平台 API,是通过与 OpenTelemetry 项目的密切合作设计的。 对于下面介绍的旧版 API 之一,如果你没有特别的原因去使用它,那么对于新工作来说,System.Diagnostics.Metrics 是一个不错的默认选择。 它面向 .NET 6 提供,或通过添加对 .NET System.Diagnostics.DiagnosticsSource 6.0 NuGet 包的引用,在旧版 .NET Core 和 .NET Framework 应用中使用。 除了实现广泛兼容的目标,此 API 还支持旧版 API 中缺少的许多功能,例如:

  • 直方图和百分位数
  • 多维指标
  • 强类型高性能侦听器 API
  • 多个同时使用的侦听器
  • 侦听器对未聚合度量值的访问

尽管此 API 旨在与 OpenTelemetry 及其不断增长的可插入供应商集成库生态系统很好地协同运行,但应用程序也可以选择直接使用 .NET 的内置侦听器 API。 利用此 API,可以创建自定义指标工具,而无需采用任何外部库依赖项。

PerformanceCounter

System.Diagnostics.PerformanceCounter API 是最早的指标 API。 它们仅在 Windows 上受支持,并为 Windows 操作系统性能计数器技术提供托管包装器。 它们可在所有受支持的 .NET 版本中使用。

提供这些 API 主要是为了实现兼容性;.NET 团队将其视为稳定的领域,除了 bug 修复之外,不太可能有进一步的改进。 除非项目是仅 Windows 的,并且需要使用 Windows 性能计数器工具,否则不建议为新的开发项目使用这些 API。

有关详细信息,请参阅 .NET Framework 中的性能计数器

EventCounters

接着,在 PerformanceCounters 之后推出了 EventCounters API。 此 API 旨在提供统一的跨平台体验。 此 API 面向 .NET Core 3.1+ 提供,其中一小部分可在 .NET Framework 4.7.1 及更高版本上使用。 这些 API 具有完全的支持,并频繁被关键的 .NET 库使用,但其功能比更新的 System.Diagnostics.Metrics API 要少一些。 EventCounters 能够报告更改率和平均值,但不支持直方图和百分位数。 此外,也不支持多维度指标。 可通过 EventListener API 获取自定义工具,但它不是强类型化的,仅提供对聚合值的访问,并且在需要同时使用多个侦听器的情况下具有局限性。 EventCounters 由 Visual StudioApplication Insightsdotnet-countersdotnet-monitor 直接提供支持。 有关第三方工具支持,请查看供应商或项目文档,了解是否提供相关支持。

.NET 团队不希望在今后对此 API 进行大量的新投资,但与 PerformanceCounters 一样,仍会为所有当前和未来用户提供针对此 API 的积极支持。

第三方 API

大多数应用程序性能监视 (APM) 供应商,如 AppDynamicsApplication InsightsDataDogDynaTraceNewRelic,都包含了指标 API 作为其检测库的一部分。 PrometheusAppMetrics 也是常见的 .NET OSS 项目。 若要了解有关这些项目的详细信息,请查看各项目的网站。