启用适用于 ASP.NET Core 应用程序的 Application Insights

本文介绍如何启用作为 Azure Web 应用的适用于 ASP.NET Core 应用程序的 Application Insights。 此实现使用基于 SDK 的方法。 也可以使用自动检测方法

Application Insights 可以从你的 ASP.NET Core 应用程序收集以下遥测数据:

  • 请求
  • 依赖项
  • 异常
  • 性能计数器
  • 检测信号
  • 日志

对于示例应用程序,我们将使用面向 net6.0ASP.NET Core MVC 应用程序。 但是,这些说明适用于所有 ASP.NET Core 应用程序。 如果你使用的是辅助角色服务,请使用此处的说明。

注意

对检测密钥引入的支持将于 2025 年 3 月 31 日结束。 检测密钥引入功能将会继续工作,但我们将不再为该功能提供更新或支持。 转换为连接字符串,以利用新功能

支持的方案

无论在何处以何种方式运行你的应用程序,适用于 ASP.NET Core 的 Application Insights SDK 都可对其进行监视。 如果你的应用程序正在运行并且与 Azure 建立了网络连接,Application Insights 可以从该应用程序收集遥测数据。 只要支持 .NET Core,就能支持 Application Insights 监视。 支持以下方案:

  • 操作系统:Windows、Linux 或 Mac
  • 托管方法:进程内或进程外
  • 部署方法:框架依赖或自包含
  • Web 服务器:Internet Information Server (IIS) 或 Kestrel
  • 托管平台:Azure 应用服务的 Web 应用功能、Azure VM、Docker、Azure Kubernetes 服务 (AKS) 等
  • .NET Core 版本:所有正式支持的不在预览中的 .NET Core 版本
  • IDE:Visual Studio、Visual Studio Code 或命令行

先决条件

要完成本教程,需要:

  • Visual Studio 2022
  • 以下 Visual Studio 工作负载:
    • ASP.NET 和 Web 开发
    • 数据存储和处理
    • Azure 开发
  • .NET 6.0
  • Azure 订阅和用户帐户(能够创建和删除资源)

部署 Azure 资源

按照指导从其 GitHub 存储库部署示例应用程序

为了向某些资源提供全局唯一的名称,将在其名称中分配一个六字符后缀。 请记下此后缀,以供在本文后面使用。

Azure 门户中已部署的 Azure 资源列表的屏幕截图,其中突出显示了六字符后缀。

创建 Application Insights 资源

  1. Azure 门户中,选择“application-insights-azure-cafe”资源组。

  2. 从顶部工具栏菜单,选择“+ 创建”。

    Azure 门户中 application-insights-azure-cafe 资源组的屏幕截图,工具栏菜单中突出显示了“+ 创建”按钮。

  3. 在“创建资源”屏幕上的市场搜索文本框中,搜索并选择“Application Insights”。

    Azure 门户中的“创建资源”屏幕的屏幕截图。

  4. 在 Application Insights 资源概述屏幕上,选择“创建”。

    Azure 门户中的 Application Insights 概述屏幕的屏幕截图,其中突出显示了“创建”按钮。

  5. 在“Application Insights”屏幕上的“基本信息”选项卡中,根据下表所述填写窗体,然后选择“查看 + 创建”按钮。 下表中未指定的字段可以保留其默认值。

    字段
    名称 输入 azure-cafe-application-insights-{SUFFIX},将 {SUFFIX} 替换为之前记录的相应后缀值。
    区域 选择在部署项目资源时所选择的相同区域。
    Log Analytics 工作区 选择“azure-cafe-log-analytics-workspace”。 或者,可以创建新的 Log Analytics 工作区。

    Azure 门户中 Application Insights 屏幕的“基本信息”选项卡的屏幕截图,其中的窗体已填充上述值。

  6. 验证通过后,选择“创建”以部署资源。

    Azure 门户中 Application Insights 屏幕的屏幕截图。突出显示了指出已通过验证的消息和“创建”按钮。

  7. 部署资源后,返回到 application-insights-azure-cafe 资源组,然后选择已部署的 Application Insights 资源。

    Azure 门户中的 application-insights-azure-cafe 资源组的屏幕截图,其中突出显示了 Application Insights 资源。

  8. 在 Application Insights 资源的“概述”屏幕上,选择“复制到剪贴板”按钮以复制连接字符串值。 在本文的下一部分需要使用该连接字符串值。

    Azure 门户中 Application Insights“概述”屏幕的屏幕截图。

在 Web 应用服务中配置 Application Insights 连接字符串应用程序设置

  1. 返回到 application-insights-azure-cafe 资源组,打开“azure-cafe-web-{SUFFIX}”应用服务资源。

    Azure 门户中的 application-insights-azure-cafe 资源组的屏幕截图,其中突出显示了 azure-cafe-web-{SUFFIX} 资源。

  2. 在左侧菜单中的“设置”部分下,选择“配置”。 然后,在“应用程序设置”选项卡上的“应用程序设置”标题下,选择“+ 新建应用程序设置”。

    Azure 门户中的应用服务资源屏幕的屏幕截图。

  3. 在“添加/编辑应用程序设置”窗格中,按如下所示填写窗体并选择“确定”。

    字段
    名称 APPLICATIONINSIGHTS_CONNECTION_STRING
    粘贴在上一部分复制的 Application Insights 连接字符串值。

    Azure 门户中“添加/编辑应用程序设置”窗格的屏幕截图,其中的“名称”和“值”字段填充了前面的值。

  4. 在“应用服务配置”屏幕上的工具栏菜单中,选择“保存”按钮。 当系统提示保存更改时,选择“继续”。

    Azure 门户中“应用服务配置”屏幕的屏幕截图,其中突出显示了工具栏菜单中的“保存”按钮。

安装 Application Insights NuGet 包

我们需要将 ASP.NET Core MVC Web 应用程序配置为发送遥测。 这可使用适用于 ASP.NET Core Web 应用程序的 Application Insights NuGet 包来完成。

  1. 在 Visual Studio 中打开 1 - Starter Application\src\AzureCafe.sln

  2. 在 Visual Studio 的“解决方案资源管理器”面板中,右键单击“AzureCafe”项目文件并选择“管理 NuGet 包”。

    Visual Studio 解决方案资源管理器的屏幕截图,其中选择了“Azure Cafe”项目并突出显示了“管理 NuGet 包”上下文菜单项。

  3. 选择“浏览”选项卡,然后搜索并选择“Microsoft.ApplicationInsights.AspNetCore”。 选择“安装”,然后接受许可条款。 建议使用最新稳定版本。 有关 SDK 的完整发行说明,请参阅开源 GitHub 存储库

    Visual Studio 中 NuGet 包管理器用户界面的屏幕截图。

    在本文的下一部分中,使 Visual Studio 处于打开状态。

启用 Application Insights 服务器端遥测

适用于 ASP.NET Core Web 应用程序的 Application Insights NuGet 包封装了一些功能,用于将服务器端遥测发送到 Azure 中的 Application Insights 资源。

  1. 在 Visual Studio 解决方案资源管理器中,打开“Program.cs”文件。

    Visual Studio 解决方案资源管理器的屏幕截图,其中突出显示了 Program.cs 文件。

  2. builder.Services.AddControllersWithViews() 语句之前插入以下代码。 此代码会自动从配置中读取 Application Insights 连接字符串值。 AddApplicationInsightsTelemetry 方法将 ApplicationInsightsLoggerProvider 注册到内置的依赖项注入容器中,然后使用该容器来履行 ILoggerILogger<TCategoryName> 实现请求。

    builder.Services.AddApplicationInsightsTelemetry();
    

    Visual Studio 中代码窗口的屏幕截图,其中突出显示了上述代码片段。

    提示

    详细了解 ASP.NET Core 中的配置选项

为 Web 应用程序启用客户端遥测

完成前面所述的步骤足以开始收集服务器端遥测数据。 示例应用程序包含客户端组件。 按照后续步骤开始收集使用情况遥测数据

  1. 在 Visual Studio 解决方案资源管理器中打开 \Views\_ViewImports.cshtml

  2. 将下面的代码添加到现有文件的末尾。

    @inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet JavaScriptSnippet
    

    Visual Studio 中 _ViewImports.cshtml 文件的屏幕截图,其中突出显示了上述代码行。

  3. 若要为应用程序正确启用客户端监视,请在 Visual Studio 解决方案资源管理器中打开 \Views\Shared\_Layout.cshtml,并在 <\head> 结束标记之前插入以下代码。 必须将此 JavaScript 代码片段插入到你要监视的应用程序的每个页的 <head> 节中。

    @Html.Raw(JavaScriptSnippet.FullScript)
    

    Visual Studio 中 _Layout.cshtml 文件的屏幕截图,该文件的 head 节中突出显示了上述代码行。

    提示

    如果不使用 FullScript,可以改用 ScriptBody。 如果需要控制 <script> 标记以设置内容安全策略,请使用 ScriptBody

    <script> // apply custom changes to this script tag.
        @Html.Raw(JavaScriptSnippet.ScriptBody)
    </script>
    

注意

JavaScript 注入提供默认配置体验。 如果需要设置连接字符串以外的配置,需要删除上述自动注入并手动添加 JavaScript SDK

启用对数据库查询的监视

在调查性能下降的原因时,必须要包括对数据库调用的见解。 可以通过配置依赖项模块来启用监视。 默认会启用依赖项监视,包括 SQL。

按照以下步骤捕获完整的 SQL 查询文本。

注意

SQL 文本可能包含敏感数据,例如密码和 PII。 启用此功能时务必小心。

  1. 在 Visual Studio 解决方案资源管理器中,打开“Program.cs”文件。

  2. 在文件的顶部,添加以下 using 语句。

    using Microsoft.ApplicationInsights.DependencyCollector;
    
  3. 若要启用 SQL 命令文本检测,请紧接在 builder.Services.AddApplicationInsightsTelemetry() 代码之后插入以下代码。

    builder.Services.ConfigureTelemetryModule<DependencyTrackingTelemetryModule>((module, o) => { module.EnableSqlCommandTextInstrumentation = true; });
    

    Visual Studio 中代码窗口的屏幕截图,其中突出显示了上述代码。

运行 Azure Cafe Web 应用程序

部署 Web 应用程序代码后,遥测数据将流向 Application Insights。 Application Insights SDK 自动将传入的 Web 请求收集到应用程序。

  1. 在 Visual Studio 解决方案资源管理器中右键单击“AzureCafe”,并从上下文菜单中选择“发布”。

    Visual Studio 解决方案资源管理器的屏幕截图,其中已选择了 Azure 咖啡馆项目并突出显示了“发布”上下文菜单项。

  2. 选择“发布”将新代码推广到 Azure 应用服务。

    AzureCafe 发布配置文件的屏幕截图,其中突出显示了“发布”按钮。

    成功发布 Azure 咖啡馆 Web 应用程序后,新的浏览器窗口将打开转到 Azure 咖啡馆 Web 应用程序。

    Azure 咖啡馆 Web 应用程序的屏幕截图。

  3. 若要生成某些遥测数据,请在 Web 应用程序中按照这些步骤添加评价。

    1. 若要查看咖啡馆的菜单和评价,请选择咖啡馆旁边的“详细信息”。

      屏幕截图显示了 Azure 咖啡馆 Web 应用程序中的 Azure 咖啡馆列表的一部分,其中突出显示了“详细信息”按钮。

    2. 若要查看和添加评价,请在“咖啡馆”屏幕上选择“评价”选项卡。选择“添加评价”按钮可添加评价。

      Azure 咖啡馆 Web 应用程序中的“咖啡馆详细信息”屏幕的屏幕截图,其中突出显示了“添加评价”按钮。

    3. 在“创建评价”对话框中,为该评价输入姓名、评分、评论并上传照片。 完成后,选择“添加评价”。

      Azure 咖啡馆 Web 应用程序中的“创建评价”对话框的屏幕截图。

    4. 如果需要生成其他遥测数据,请添加其他评价。

实时指标

可以使用实时指标快速验证是否正确配置了 Application Insights 监视。 实时指标会准实时显示正在运行的进程的 CPU 使用率。 它还可以显示其他遥测数据,例如请求、依赖项和跟踪。 请注意,遥测数据可能需要在几分钟后才显示在门户和分析中。

查看应用程序映射

示例应用程序调用多个 Azure 资源,包括 Azure SQL、Azure Blob 存储和 Azure 语言服务(用于评价情绪分析)。

显示 Azure Cafe 示例 Web 应用程序体系结构的示意图。

Application Insights 对传入的遥测数据进行内省,并且能够生成它所检测到的系统集成的视觉映射。

  1. 登录到 Azure 门户

  2. 打开示例应用程序的资源组,即 application-insights-azure-cafe

  3. 从资源列表中,选择 azure-cafe-insights-{SUFFIX} Application Insights 资源。

  4. 在左侧菜单中的“调查”标题下,选择“应用程序映射”。 观察生成的应用程序映射。

    Azure 门户中 Application Insights 应用程序映射的屏幕截图。

查看 HTTP 调用和数据库 SQL 命令文本

  1. 在 Azure 门户中,打开 Application Insights 资源。

  2. 在左侧菜单中的“调查”标题下,选择“性能”。

  3. “操作”选项卡包含应用程序接收的 HTTP 调用的详细信息。 若要在数据的“服务器”和“浏览器”(客户端)视图之间切换,请使用“服务器”/“浏览器”切换控件。

    Azure 门户中“性能”屏幕的屏幕截图。

  4. 从表中选择“操作”,然后选择钻取到请求的示例。

    Azure 门户中 Application Insights“性能”屏幕的屏幕截图,其中列出了操作和示例操作。

    此时将显示所选请求的端到端事务。 本例中创建了一条包含图像的评论,因此包含了对 Azure 存储和语言服务(用于情绪分析)的调用。 它还包含对 SQL Azure 的数据库调用以保持该评论。 在此示例中,第一个选定的事件显示与 HTTP POST 调用相关的信息。

    Azure 门户中端到端事务的屏幕截图,其中选择了 HTTP Post 调用。

  5. 选择某个 SQL 项以查看向数据库发出的 SQL 命令文本。

    Azure 门户中端到端事务的屏幕截图,其中显示了 SQL 命令详细信息。

  6. (可选)选择对 Azure 存储或语言服务的依赖项(传出)请求。

  7. 返回到“性能”屏幕,然后选择“依赖项”选项卡来调查对外部资源的调用。 请注意,Operations 表包括对情绪分析、Blob 存储和 Azure SQL 的调用。

    Azure 门户中 Application Insights“性能”屏幕的屏幕截图,其中选择了“依赖项”选项卡,并突出显示了“操作”表。

使用 Application Insights 进行应用程序日志记录

日志记录概述

Application Insights 是一种可供 ASP.NET Core 应用程序使用的日志记录提供程序,当安装适用于 ASP.NET Core 的 Application Insights NuGet 包并且启用了服务器端遥测收集时,它对应用程序可用。

提醒一下,Program.cs 中的以下代码将 ApplicationInsightsLoggerProvider 注册到内置的依赖项注入容器中。

builder.Services.AddApplicationInsightsTelemetry();

ApplicationInsightsLoggerProvider 注册为日志记录提供程序后,应用就可以结合使用构造函数注入和 ILogger 或使用替代的泛型 ILogger<TCategoryName> 将日志记录到 Application Insights。

注意

默认情况下,日志记录提供程序配置为自动捕获严重级别为 LogLevel.Warning 或更高的日志事件。

考虑以下示例控制器。 该控制器演示 ILogger 的注入,该注入使用向依赖项注入容器注册的 ApplicationInsightsLoggerProvider 进行解析。 在 Get 方法中观察记录的“参考性”、“警告”和“错误”消息。

注意

默认情况下,不会记录“参考性”级别的跟踪。 仅捕获“警告”及以上级别。

using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
    private readonly ILogger _logger;

    public ValuesController(ILogger<ValuesController> logger)
    {
        _logger = logger;
    }

    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        //Info level traces are not captured by default
        _logger.LogInformation("An example of an Info trace..");
        _logger.LogWarning("An example of a Warning trace..");
        _logger.LogError("An example of an Error level message");

        return new string[] { "value1", "value2" };
    }
}

有关详细信息,请参阅 Logging in ASP.NET Core(ASP.NET Core 中的日志记录)。

在 Application Insights 中查看日志

上面的 ValuesController 与示例应用程序一起部署,并位于项目的 Controllers 文件夹中。

  1. 使用 Internet 浏览器打开示例应用程序。 在地址栏中,追加 /api/Values 并按 Enter

    浏览器窗口的屏幕截图,其中 /api/Values 已追加到地址栏中的 URL。

  2. Azure 门户中稍等片刻,然后选择“azure-cafe-insights-{SUFFIX}”Application Insights 资源。

    Azure 门户中的 application-insights-azure-cafe 资源组的屏幕截图,其中突出显示了 Application Insights 资源。

  3. 从 Application Insights 资源的左侧菜单中的“监视”部分下,选择“日志”。

  4. 在“表”窗格中的“Application Insights”树下,双击“traces”表。

  5. 如下所示修改查询以检索值控制器的跟踪,然后选择“运行”以筛选结果。

    traces 
    | where operation_Name == "GET Values/Get"
    

    结果将显示控制器中存在的日志记录消息。 日志严重性为 2 表示警告级别,日志严重性为 3 表示错误级别。

  6. 或者,也可以编写查询以根据日志的类别检索结果。 默认情况下,类别是 ILogger 注入到的类的完全限定名称。 在本例中,类别名称为 ValuesController(如果存在与类关联的命名空间,则该名称将以 namespace 为前缀)。 重新编写并运行以下查询以根据类别检索结果。

    traces 
    | where customDimensions.CategoryName == "ValuesController"
    

控制发送到 Application Insights 的日志级别

ILogger 实现具有内置机制,可应用日志筛选。 通过此筛选可以控制发送到每个已注册的提供程序(包括 Application Insights 提供程序)的日志。 可以在配置(使用 appsettings.json 文件)或代码中使用筛选。 有关日志级别的详细信息,以及有关如何正确使用日志级别的指导,请参阅日志级别文档。

以下示例显示如何将筛选规则应用于 ApplicationInsightsLoggerProvider,以控制发送到 Application Insights 的日志级别。

使用配置创建筛选规则

在配置中,ApplicationInsightsLoggerProvider 的别名为 ApplicationInsights。 appsettings.json 文件的以下部分将所有提供程序的默认日志级别设置都为 LogLevel.Warning。 对于 ApplicationInsights 提供程序(具体而言,对于以“ValuesController”开头的类别)的配置,请使用 LogLevel.Error 或更高级别替代此默认值。

{
  //... additional code removed for brevity
  "Logging": {
    "LogLevel": { // No provider, LogLevel applies to all the enabled providers.
      "Default": "Warning"
    },
    "ApplicationInsights": { // Specific to the provider, LogLevel applies to the Application Insights provider.
      "LogLevel": {
        "ValuesController": "Error" //Log Level for the "ValuesController" category
      }
    }
  }
}

使用 appsettings.json 中的上述代码部署示例应用程序将只生成在与 ValuesController 交互时发送到 Application Insights 的错误跟踪。 这是因为 ValuesController 类别的 LogLevel 设置为 Error。 因此会抑制 Warning(警告)跟踪。

关闭对 Application Insights 的日志记录

若要使用配置禁用日志记录,请将所有 LogLevel 值设置为“None”。

{
  //... additional code removed for brevity
  "Logging": {
    "LogLevel": { // No provider, LogLevel applies to all the enabled providers.
      "Default": "None"
    },
    "ApplicationInsights": { // Specific to the provider, LogLevel applies to the Application Insights provider.
      "LogLevel": {
        "ValuesController": "None" //Log Level for the "ValuesController" category
      }
    }
  }
}

同样,在代码中,将 ApplicationInsightsLoggerProvider 的默认级别和任何后续日志级别设置为 None。

var builder = WebApplication.CreateBuilder(args);
builder.Logging.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.None);
builder.Logging.AddFilter<Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider>("ValuesController", LogLevel.None);

开源 SDK

有关最新的更新和 bug 修补程序,请参阅发行说明

后续步骤