从 .NET Application Insights SDK 迁移到 Azure Monitor OpenTelemetry

本指南提供将各种 .NET 应用程序从 Application Insights 软件开发工具包 (SDK) 迁移到 Azure Monitor OpenTelemetry 的分步说明。

预期 Azure Monitor OpenTelemetry 检测与 Application Insights SDK 类似。 有关详细信息和功能比较,请参阅功能的发布状态

如果刚开始使用 Application Insights 且不需要从 Classic API 迁移,请参阅启用 Azure Monitor OpenTelemetry

注意

有关 Azure Function Apps,请参阅 将 OpenTelemetry 与 Azure Functions 配合使用

先决条件

  • 已使用 Application Insights 检测、无需进行任何自定义的 ASP.NET Core Web 应用程序
  • .NET 的主动支持版本

提示

我们的产品组正在积极寻求有关本文档的反馈。 向 otel@microsoft.com 提供反馈或查看“支持”部分。

删除 Application Insights SDK

注意

在继续执行这些步骤之前,应确认应用程序当前有备份。

  1. 删除 NuGet 包

    Microsoft.ApplicationInsights.AspNetCore 中删除 csproj 包。

    dotnet remove package Microsoft.ApplicationInsights.AspNetCore
    
  2. 删除初始化代码和自定义项

    删除对代码库中 Application Insights 类型的任何引用。

    提示

    删除 Application Insights 包后,可以重新构建应用程序以获取需要删除的引用列表。

    • 通过删除以下行从 ServiceCollection 中删除 Application Insights:

      builder.Services.AddApplicationInsightsTelemetry();
      
    • ApplicationInsights 中删除 appsettings.json 分区。

      {
          "ApplicationInsights": {
              "ConnectionString": "<Your Connection String>"
          }
      }
      
  3. 清理和构建

    检查 bin 目录,验证是否删除了对 Microsoft.ApplicationInsights.* 的所有引用。

  4. 测试应用程序

    验证应用程序是否没有意外的后果。

提示

我们的产品组正在积极寻求有关本文档的反馈。 向 otel@microsoft.com 提供反馈或查看“支持”部分。

启用 OpenTelemetry

建议按照以下说明创建开发资源并使用其连接字符串

屏幕截图显示 Application Insights 概述和连接字符串。

计划更新连接字符串,以便在确认迁移成功后将遥测数据发送到原始资源。

  1. 安装 Azure Monitor 发行版

    Azure Monitor 发行版通过包含用于收集跟踪、指标、日志和异常的 OpenTelemetry 检测库来实现自动遥测,并允许收集自定义遥测数据。

    安装 Azure Monitor 发行版时,系统会将 OpenTelemetry SDK 作为依赖项。

    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore
    
  2. 同时添加和配置 OpenTelemetry 和 Azure Monitor

    OpenTelemery SDK(通常位于 ServiceCollection 中)必须在应用程序启动时配置为 Program.cs的一部分。

    OpenTelemetry 有一个关于以下三个信号的概念:跟踪、指标和日志。 Azure Monitor 发行版配置其中每个信号。

Program.cs

下面的代码示例演示基础原理。

using Azure.Monitor.OpenTelemetry.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // Call AddOpenTelemetry() to add OpenTelemetry to your ServiceCollection.
        // Call UseAzureMonitor() to fully configure OpenTelemetry.
        builder.Services.AddOpenTelemetry().UseAzureMonitor();

        var app = builder.Build();
        app.MapGet("/", () => "Hello World!");
        app.Run();
    }
}

建议在环境变量中设置连接字符串:

APPLICATIONINSIGHTS_CONNECTION_STRING=<Your Connection String>

如要详细了解配置连接字符串的更多选项,请参阅配置 Application Insights 连接字符串

提示

我们的产品组正在积极寻求有关本文档的反馈。 向 otel@microsoft.com 提供反馈或查看“支持”部分。

安装和配置检测库

可以向项目添加检测库,以便自动收集有关特定组件或依赖项的遥测数据。

发行版中包含以下库。

自定义检测库

Azure Monitor 发行版包括适用于 ASP.NET CoreHttpClientSQLClient 的 .NET OpenTelemetry 检测。 可以使用 OpenTelemetry API 自定义这些包含的检测,或自行手动添加额外的检测。

下面是有关如何自定义检测的一些示例:

自定义 AspNetCoreTraceInstrumentationOptions
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<AspNetCoreTraceInstrumentationOptions>(options =>
{
    options.RecordException = true;
    options.Filter = (httpContext) =>
    {
        // only collect telemetry about HTTP GET requests
        return HttpMethods.IsGet(httpContext.Request.Method);
    };
});
自定义 HttpClientTraceInstrumentationOptions
builder.Services.AddOpenTelemetry().UseAzureMonitor();
builder.Services.Configure<HttpClientTraceInstrumentationOptions>(options =>
{
    options.RecordException = true;
    options.FilterHttpRequestMessage = (httpRequestMessage) =>
    {
        // only collect telemetry about HTTP GET requests
        return HttpMethods.IsGet(httpRequestMessage.Method.Method);
    };
});
自定义 SqlClientInstrumentationOptions

我们在包中提供 SQLClient 检测(仍为 beta 版)。 当它成为稳定版时,我们会将其作为标准包引用添加进去。 在此之前,若要自定义 SQLClient 检测,请将 OpenTelemetry.Instrumentation.SqlClient 包引用添加到项目并使用其公共 API。

dotnet add package --prerelease OpenTelemetry.Instrumentation.SqlClient
builder.Services.AddOpenTelemetry().UseAzureMonitor().WithTracing(builder =>
{
    builder.AddSqlClientInstrumentation(options =>
    {
        options.SetDbStatementForStoredProcedure = false;
    });
});

配置 Azure Monitor

Application Insights 通过 ApplicationInsightsServiceOptions 提供更多配置选项。

Application Insights 设置 OpenTelemetry 替代项
AddAutoCollectedMetricExtractor 空值
应用程序版本 在资源上设置“service.version”
ConnectionString 请参阅有关配置连接字符串的说明
依赖收集选项 不适用。 若要自定义依赖项,请查看适用的检测库的可用配置选项。
开发者模式 空值
启用主动遥测配置设置 空值
启用自适应采样 不适用。 仅支持固定速率采样。
启用应用服务心跳遥测模块 空值
启用身份验证跟踪JavaScript 空值
启用Azure实例元数据遥测模块 空值
启用依赖追踪遥测模块 请参阅有关筛选跟踪的说明。
启用诊断遥测模块 空值
启用事件计数器收集模块 空值
EnableHeartbeat 空值
启用性能计数器收集模块 空值
启用快速脉冲指标流 Azure监控选项.启用实时指标
启用请求跟踪遥测模块 (EnableRequestTrackingTelemetryModule) 请参阅有关筛选跟踪的说明。
终端地址 使用 ConnectionString。
仪表密钥 使用 ConnectionString。
请求集合选项 不适用。 请参阅 OpenTelemetry.Instrumentation.AspNetCore 选项。

删除自定义配置

以下方案是可选方案,仅适用于高级用户。

  • 如果对可用于TelemetryClient 的引用有任何多余,则应删除这些多余引用。

  • 如果以自定义 TelemetryProcessor 形式添加了任何TelemetryInitializer,则应将其删除。 可以在你的 ServiceCollection 中找到它们。

    builder.Services.AddSingleton<ITelemetryInitializer, MyCustomTelemetryInitializer>();
    
    builder.Services.AddApplicationInsightsTelemetryProcessor<MyCustomTelemetryProcessor>();
    
  • 删除 JavaScript 代码片段

    如果使用 Application Insights .NET SDK 提供的代码片段,则还必须将其删除。 有关要删除的内容的完整代码示例,请查看为 Web 应用程序启用客户端遥测数据指南。

    如果添加了 JavaScript SDK 以收集客户端遥测数据,也可以将其删除,尽管它会在不使用 .NET SDK 的情况下继续工作。 有关要删除的内容的完整代码示例,请查看 JavaScript SDK 的加入指南

  • 删除任何 Visual Studio 项目

    如果使用 Visual Studio 载入 Application Insights,则可以在项目中留下更多文件。

    • Properties/ServiceDependencies 目录可能引用 Application Insights 资源。

提示

我们的产品组正在积极寻求有关本文档的反馈。 向 otel@microsoft.com 提供反馈或查看“支持”部分。

后续步骤

提示

我们的产品组正在积极寻求有关本文档的反馈。 向 otel@microsoft.com 提供反馈或查看“支持”部分。

支持