Application Insights 中 .NET 的计数器

Azure MonitorApplication Insights 支持性能计数器和事件计数器。 本指南对这两个主题进行了概述,包括它们在 .NET 应用程序中的目的、配置和使用方法。

注意

我们建议新应用程序或客户使用 Azure Monitor OpenTelemetry 发行版来支持 Azure Monitor Application Insights。 Azure Monitor OpenTelemetry 发行版提供与 Application Insights SDK 类似的功能和体验。 可以使用 .NETNode.jsPython 的迁移指南从 Application Insights SDK 进行迁移,但我们仍在努力添加更多功能以实现后向兼容性。

概述

  • 性能计数器内置于 Windows 操作系统中,并提供预定义的指标,例如 CPU 使用率、内存消耗和磁盘活动。 这些计数器非常适合以最少的设置来监视标准性能指标。 它们可帮助在基于 Windows 的应用程序中跟踪资源利用率或排查系统级瓶颈问题,但不支持自定义特定于应用程序的指标。
  • 事件计数器跨多个平台工作,包括 Windows、Linux 和 macOS。 它们允许开发人员定义和监视轻型、可自定义的特定于应用程序的指标,从而提供比性能计数器更大的灵活性。 当系统指标不足以满足要求或跨平台应用程序中需要详细遥测时,事件计数器非常有用。 它们需要显式实现和配置,这使得设置更加费力。

配置计数器

Windows 提供了各种性能计数器,例如用于收集处理器、内存和磁盘使用统计信息的计数器。 你还可以定义自己的性能计数器。

如果应用程序在本地主机或具有管理访问权限的虚拟机上的 Internet 信息服务器 (IIS) 下运行,则应用程序支持性能计数器收集。 作为 Azure Web 应用运行的应用程序无法直接访问性能计数器,但 Application Insights 会收集一部分可用的计数器。

先决条件

通过将应用程序池服务帐户添加到性能监视器用户组来为其授予监视性能计数器的权限。

net localgroup "Performance Monitor Users" /add "IIS APPPOOL\NameOfYourPool"

查看计数器

“指标”窗格显示了一组默认的性能计数器。

ASP.NET Web 应用程序的默认计数器:

  • % 进程\处理器时间
  • % Process\Processor Time Normalized
  • Memory\可用字节
  • ASP.NET Requests/Sec
  • .NET Common Language Runtime (CLR) Exceptions Thrown / sec
  • ASP.NET 应用程序请求执行时间
  • 进程\私有字节
  • Process\IO Data Bytes/sec
  • ASP.NET Applications\Requests In Application Queue
  • Processor(_Total)\% Processor Time

ASP.NET Core Web 应用程序的默认计数器:

  • % Process\Processor Time
  • % Process\Processor Time Normalized
  • 内存\可用字节数
  • 进程\专用字节
  • Process\IO Data Bytes/sec
  • Processor(_Total)\% Processor Time

添加计数器

如果你需要的性能计数器未包括在指标列表中,则你可以添加它。

  1. 通过在本地服务器上使用此 PowerShell 命令,了解服务器中有哪些计数器可用:

    Get-Counter -ListSet *
    

    有关详细信息,请参阅 Get-Counter

  2. 打开 ApplicationInsights.config

    如果在开发期间将 Application Insights 添加到应用:

    1. 在项目中编辑 ApplicationInsights.config
    2. 将其重新部署到服务器。
  3. 编辑性能收集器指令:

    
        <Add Type="Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector.PerformanceCollectorModule, Microsoft.AI.PerfCounterCollector">
          <Counters>
            <Add PerformanceCounter="\Objects\Processes"/>
            <Add PerformanceCounter="\Sales(photo)\# Items Sold" ReportAs="Photo sales"/>
          </Counters>
        </Add>
    

备注

ASP.NET Core 应用程序没有 ApplicationInsights.config,因此上述方法对 ASP.NET Core 应用程序无效。

可以捕获标准计数器和自己实现的计数器。 \Objects\Processes 是标准计数器的一个示例,可在所有 Windows 系统上使用。 \Sales(photo)\# Items Sold 是自定义计数器的一个示例,可在 Web 服务中实现。

格式为 \Category(instance)\Counter,而对于不具有实例的类别,仅为 \Category\Counter

ReportAs 不匹配的计数器名称需要 [a-zA-Z()/-_ \.]+ 参数。

如果指定实例,它会成为所报告指标的 CounterInstanceName 维度。

为 ASP.NET Web 应用程序或 .NET/.NET Core 控制台应用程序收集代码中的性能计数器

若要收集系统性能计数器并将其发送到 Application Insights,可以改编以下代码片段:

    var perfCollectorModule = new PerformanceCollectorModule();
    perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
      @"\Process([replace-with-application-process-name])\Page Faults/sec", "PageFaultsPerfSec"));
    perfCollectorModule.Initialize(TelemetryConfiguration.Active);

或者,可以执行与所创建自定义指标相同的操作:

    var perfCollectorModule = new PerformanceCollectorModule();
    perfCollectorModule.Counters.Add(new PerformanceCounterCollectionRequest(
      @"\Sales(photo)\# Items Sold", "Photo sales"));
    perfCollectorModule.Initialize(TelemetryConfiguration.Active);

在 ASP.NET Core Web 应用程序的代码中收集性能计数器

Program.cs 中于 WebApplication.CreateBuilder() 方法之后配置 PerformanceCollectorModule

using Microsoft.ApplicationInsights.Extensibility.PerfCounterCollector;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddApplicationInsightsTelemetry();

// The following configures PerformanceCollectorModule.

builder.Services.ConfigureTelemetryModule<PerformanceCollectorModule>((module, o) =>
    {
        // The application process name could be "dotnet" for ASP.NET Core self-hosted applications.
        module.Counters.Add(new PerformanceCounterCollectionRequest(@"\Process([replace-with-application-process-name])\Page Faults/sec", "DotnetPageFaultsPerfSec"));
    });

var app = builder.Build();

ASP.NET 和 Application Insights 计数

后续各节讨论 ASP.NET 和 Application Insights 计数。

在 Azure 应用服务上的 Azure Web 应用和 Windows 容器中运行的应用程序的性能计数器

部署到 Azure Web 应用的 ASP.NET 和 ASP.NET Core 应用程序在特殊的沙盒环境中运行。 部署到 Azure 应用服务的应用程序可以利用 Windows 容器,也可以在沙盒环境中托管。 如果在 Windows 容器中部署应用程序,则可在容器映像中使用所有标准性能计数器。

沙盒环境不允许直接访问系统性能计数器。 但是,有限的一部分计数器将作为环境变量公开,如作为环境变量公开的性能计数器中所述。 在此环境中,只有一部分计数器可用。 有关完整列表,请参阅作为环境变量公开的性能计数器

适用于 ASP.NETASP.NET Core 的 Application Insights SDK 会检测代码是部署到 Web 应用还是非 Windows 容器。 这种检测决定了它是在沙盒环境中还是利用标准收集机制(在 Windows 容器或虚拟机上托管时)来收集性能计数器。

ASP.NET Core 应用程序中的性能计数器

对 ASP.NET Core 中性能计数器的支持是有限的:

  • 如果应用程序在 Azure Web 应用 (Windows) 中运行,SDK 2.4.1 及更高版本将收集性能计数器。
  • 如果应用程序在 Windows 中运行,并且面向 NETSTANDARD2.0 或更高版本,则 SDK 2.7.1 版和更高版本将收集性能计数器。
  • 对于面向 .NET Framework 的应用程序,所有版本的 SDK 都支持性能计数器。
  • SDK 2.8.0 和更高版本在 Linux 中支持 CPU/内存计数器。 在 Linux 中不支持其他计数器。 若要获取 Linux(和其他非 Windows 环境)中的系统计数器,请使用事件计数器。

Log Analytics 查询

可以在 Log Analytics 中搜索并显示性能计数器报告。

PerformanceCounters 架构公开每个性能计数器的 categorycounter 名称和 instance 名称。 在每个应用程序的遥测中,将仅看到该应用程序的计数器。 例如,若要查看哪些计数器可用:

performanceCounters | summarize count(), avg(value) by category, instance, counter

此处的 Instance 是指性能计数器实例,而不是角色或服务器计算机实例。 通常,性能计数器实例名称会按进程或应用程序的名称对计数器(如处理器时间)进行分段。

若要获取最近一段时间内可用内存的图表:

performanceCounters | where counter == "Available Bytes" | summarize avg(value), min(value) by bin(timestamp, 1h) | render timechart

与其他遥测一样,performanceCounters 也有一个列 cloud_RoleInstance ,用于指示您的应用正在其上运行的主机服务器实例的标识。 例如,要比较应用在不同计算机上的性能:

performanceCounters | where counter == "% Processor Time" and instance == "SendMetrics" | summarize avg(value) by cloud_RoleInstance, bin(timestamp, 1d)

警报

与其他指标一样,可以设置警报以便在计数器超出指定的限制时收到警报。

若要设置警报,请打开“警报”窗格并选择“添加警报”。

常见问题

异常率和异常指标之间的区别是什么?

  • Exception rate:“异常率”是系统性能计数器。 CLR 会对所有引发的已处理和未经处理异常进行计数,并将总采样间隔除以间隔长度。 Application Insights SDK 会收集此结果,并将其发送到门户。
  • Exceptions:异常指标根据图表的采样间隔对门户收到的 TrackException 报告进行计数。 它仅包括在代码中编写 TrackException 调用的已处理异常。 它不包括所有未经处理的异常