Application Insights 中的系统性能计数器

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

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

注意

以下文档依赖于 Application Insights 经典 API。 Application Insights 的长期计划是使用 OpenTelemetry 收集数据。 有关详细信息,请参阅为 .NET、Node.js、Python 和 Java 应用程序启用 Azure Monitor OpenTelemetry我们的 OpenTelemetry 路线图。 迁移指导适用于 .NETNode.jsPython

先决条件

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

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

查看计数器

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

显示 Application Insights 中报告的性能计数器的屏幕截图。

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

  • % Process\Processor Time
  • % Process\Processor Time Normalized
  • Memory\Available Bytes
  • ASP.NET Requests/Sec
  • .NET CLR Exceptions Thrown/sec
  • ASP.NET ApplicationsRequest Execution Time
  • Process\Private Bytes
  • 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
  • Memory\Available Bytes
  • Process\Private Bytes
  • 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

[a-zA-Z()/-_ \.]+ 不匹配的计数器名称需要 ReportAs 参数。 也就是说,这些名称包含不属于以下字符集的字符:字母、圆括号、正斜杠、连字符、下划线、空格和句点。

如果指定实例,它以所报告指标的维度 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.csWebApplication.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();

Log Analytics 中的性能计数器

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

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

显示 Application Insights 分析中的性能计数器的屏幕截图。

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

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

显示 Application Insights 分析中的内存时间图表的屏幕截图。

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

显示 Application Insights 分析中按角色实例分段的性能的屏幕截图。

ASP.NET 和 Application Insights 计数

接下来的部分将介绍 ASP.NET 和 Application Insights 计数。

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

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

在 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 环境)中的系统计数器,请使用 EventCounters

警报

与其他指标一样,可以设置警报以便在性能计数器超出指定的限制时收到警报。 若要设置警报,请打开“警报”窗格并选择“添加警报”。

后续步骤