从 .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

先决条件

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

提示

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

删除 Application Insights SDK

注意

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

  1. 删除 NuGet 包

    csproj 中删除 Microsoft.ApplicationInsights.AspNetCore 包。

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

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

    提示

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

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

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

      {
          "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(通常位于 Program.cs 中)必须在应用程序启动时配置为 ServiceCollection的一部分。

    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 空值
ApplicationVersion 在资源上设置“service.version”
ConnectionString 请参阅有关配置连接字符串的说明
DependencyCollectionOptions 不适用。 若要自定义依赖项,请查看适用的检测库的可用配置选项。
DeveloperMode 空值
EnableActiveTelemetryConfigurationSetup 空值
EnableAdaptiveSampling 不适用。 仅支持固定速率采样。
EnableAppServicesHeartbeatTelemetryModule 空值
EnableAuthenticationTrackingJavaScript 空值
EnableAzureInstanceMetadataTelemetryModule 空值
EnableDependencyTrackingTelemetryModule 请参阅有关筛选跟踪的说明。
EnableDiagnosticsTelemetryModule 空值
EnableEventCounterCollectionModule 空值
EnableHeartbeat 空值
EnablePerformanceCounterCollectionModule 空值
EnableQuickPulseMetricStream AzureMonitorOptions.EnableLiveMetrics
EnableRequestTrackingTelemetryModule 请参阅有关筛选跟踪的说明。
EndpointAddress 使用 ConnectionString。
InstrumentationKey 使用 ConnectionString。
RequestCollectionOptions 不适用。 请参阅 OpenTelemetry.Instrumentation.AspNetCore 选项。

删除自定义配置

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

  • 如果对可用于手动记录遥测数据TelemetryClient 的引用有任何多余,则应删除这些多余引用。

  • 如果以自定义 TelemetryProcessorTelemetryInitializer 形式添加了任何自定义筛选或扩充,则应将其删除。 可以在你的 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 提供反馈或查看“支持”部分。

常见问题解答

本部分适用于使用遥测初始值设定项或处理器的客户,或者针对经典 Application Insights API 编写自定义代码以创建自定义遥测数据的客户。

SDK API 如何映射到 OpenTelemetry 概念?

OpenTelemetry 是供应商中性可观测性框架。 OpenTelemetry SDK 或库中没有 Application Insights API。 在迁移之前,请务必了解一些 OpenTelemetry 的概念。

  • 在 Application Insights 中,所有遥测数据都通过单个 TelemetryClientTelemetryConfiguration 管理。 在 OpenTelemetry 中,三个遥测信号(跟踪、指标和日志)都有其自己的配置。 无需外部库即可通过 .NET 运行时手动创建遥测数据。 有关详细信息,请参阅有关分布式跟踪指标日志记录的 .NET 指南。

  • Application Insights 使用 TelemetryModules 自动收集应用程序的遥测数据。 相反,OpenTelemetry 使用检测库从特定组件(例如用于请求的 AspNetCore 和用于依赖项的 HttpClient)收集遥测数据。

  • Application Insights 使用 TelemetryInitializers 通过其他信息丰富遥测数据或重写属性。 可使用 OpenTelemetry 编写处理器,从而自定义特定信号。 此外,许多 OpenTelemetry 检测库提供了 Enrich 方法来自定义该特定组件生成的遥测数据。

  • Application Insights 使用 TelemetryProcessors 筛选遥测数据。 OpenTelemetry 处理器还可用于对特定信号应用筛选规则。

Application Insights 遥测类型如何映射到 OpenTelemetry?

此表将 Application Insights 数据类型映射到 OpenTelemetry 概念及其 .NET 实现。

Azure Monitor 表 Application Insights DataType OpenTelemetry DataType .NET 实现
customEvents EventTelemetry 空值 空值
customMetrics MetricTelemetry 指标 System.Diagnostics.Metrics.Meter
dependencies DependencyTelemetry 范围(客户端、内部、使用者) System.Diagnostics.Activity
exceptions ExceptionTelemetry 异常 System.Exception
请求 RequestTelemetry 范围(服务器、生成者) System.Diagnostics.Activity
traces TraceTelemetry 日志 Microsoft.Extensions.Logging.ILogger

以下文档提供了更多信息。

Application Insights 采样概念如何映射到 OpenTelemetry?

虽然 Application Insights 提供了多个用于配置采样的选项,但 Azure Monitor 导出程序或 Azure Monitor 发行版仅提供固定速率采样。 只能采样请求依赖项OpenTelemetry 跟踪)。

有关如何配置采样的代码示例,请参阅我们的启用采样指南

遥测处理器和初始值设定项如何映射到 OpenTelemetry?

在 Application Insights .NET SDK 中,使用遥测处理器筛选和修改或放弃遥测数据。 使用遥测初始值设定项添加或修改自定义属性。 有关详细信息,请参阅 Azure Monitor 文档。 OpenTelemetry 将这些概念替换为活动或日志处理器,从而丰富和筛选遥测数据。

筛选跟踪

若要在 OpenTelemetry 中筛选遥测数据,可以采用活动处理器。 此示例等效于 Application Insights 示例,用于筛选遥测数据,如 Azure Monitor 文档中所述。 该示例说明了筛选不成功的依赖项调用的位置。

using System.Diagnostics;
using OpenTelemetry;

internal sealed class SuccessfulDependencyFilterProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (!OKtoSend(activity))
        {
            activity.ActivityTraceFlags &= ~ActivityTraceFlags.Recorded;
        }
    }

    private bool OKtoSend(Activity activity)
    {
        return activity.Kind == ActivityKind.Client && activity.Status == ActivityStatusCode.Ok;
    }
}

若要使用此处理器,需要在 AddAzureMonitorTraceExporter 之前创建 TracerProvider 并添加处理器。

using OpenTelemetry.Trace;

public static void Main()
{
    var tracerProvider = Sdk.CreateTracerProviderBuilder()
        .AddProcessor(new SuccessfulDependencyFilterProcessor())
        .AddAzureMonitorTraceExporter()
        .Build();
}

筛选日志

ILogger 实现具有内置机制,可应用日志筛选。 通过此筛选,可以控制发送到每个已注册提供程序(包括 OpenTelemetryLoggerProvider)的日志。 “OpenTelemetry”是用于配置筛选规则的 OpenTelemetryLoggerProvider别名

以下示例将“Error”定义为默认 LogLevel,并将“Warning”定义为用户定义的类别的最小 LogLevel。 定义的这些规则仅适用于 OpenTelemetryLoggerProvider

builder.AddFilter<OpenTelemetryLoggerProvider>("*", LogLevel.Error);
builder.AddFilter<OpenTelemetryLoggerProvider>("MyProduct.MyLibrary.MyClass", LogLevel.Warning);

有关详细信息,请阅读关于日志的 OpenTelemetry .NET 文档

将自定义属性添加到跟踪

在 OpenTelemetry 中,可以使用活动处理器通过更多属性丰富遥测数据。 这类似于在 Application Insights 中使用遥测初始值设定项,你可在前者中修改遥测属性。

默认情况下,Azure Monitor 导出程序会将响应代码为 400 或更高的任何 HTTP 请求标记为失败。 但是,如果要将 400 视为成功,可以添加一个扩充活动处理器来设置活动的成功,并添加一个标签以包含更多遥测属性。 这类似于在 Application Insights 中使用初始值设定项添加或修改属性,如 Azure Monitor 文档中所述。

以下示例说明如何添加自定义属性并替代特定响应代码的默认行为:

using System.Diagnostics;
using OpenTelemetry;

/// <summary>
/// Custom Processor that overrides the default behavior of treating response codes >= 400 as failed requests.
/// </summary>
internal class MyEnrichingProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (activity.Kind == ActivityKind.Server)
        {
            int responseCode = GetResponseCode(activity);

            if (responseCode >= 400 && responseCode < 500)
            {
                // If we set the Success property, the SDK won't change it
                activity.SetStatus(ActivityStatusCode.Ok);

                // Allow to filter these requests in the portal
                activity.SetTag("Overridden400s", "true");
            }

            // else leave the SDK to set the Success property
        }
    }

    private int GetResponseCode(Activity activity)
    {
        foreach (ref readonly var tag in activity.EnumerateTagObjects())
        {
            if (tag.Key == "http.response.status_code" && tag.Value is int value)
            {
                return value;
            }
        }

        return 0;
    }
}

若要使用此处理器,需要在 AddAzureMonitorTraceExporter 之前创建 TracerProvider 并添加处理器。

using OpenTelemetry.Trace;

public static void Main()
{
    var tracerProvider = Sdk.CreateTracerProviderBuilder()
        .AddSource("Company.Product.Name")
        .AddProcessor(new MyEnrichingProcessor())
        .AddAzureMonitorTraceExporter()
        .Build();
}

如何使用 OpenTelemetry 手动跟踪遥测数据?

发送跟踪 - 手动

Application Insights 中的跟踪存储为 RequestTelemetryDependencyTelemetry。 在 OpenTelemetry 中,跟踪通过 Activity 类建模为 Span

OpenTelemetry .NET 利用跟踪的 ActivitySourceActivity 类,这些类是 .NET 运行时的一部分。 此方法很独特,因为 .NET 实现将跟踪 API 直接集成到运行时本身。 System.Diagnostics.DiagnosticSource 包可让开发者用 ActivitySource 创建和管理 Activity 实例。 此方法可让你无需依赖外部库即可无缝将跟踪添加到 .NET 应用程序,从而应用 .NET 生态系统的内置功能。 有关更多详细信息,请参阅分布式跟踪检测演练

下面介绍如何迁移手动跟踪:

注意

在 Application Insights 中,可以在每个遥测级别设置角色名称和角色实例。 但是,使用 Azure Monitor 导出程序时,无法在每个遥测级别进行自定义。 角色名称和角色实例是从 OpenTelemetry 资源中提取的,并应用于所有遥测数据。 有关详细信息,请阅读以下文档:设置云角色名称和云角色实例

DependencyTelemetry

Application Insights DependencyTelemetry 用于为传出请求建模。 下面介绍如何将其转换为 OpenTelemetry:

Application Insights 示例:

DependencyTelemetry dep = new DependencyTelemetry
{
   Name = "DependencyName",
   Data = "https://www.example.com/",
   Type = "Http",
   Target = "www.example.com",
   Duration = TimeSpan.FromSeconds(10),
   ResultCode = "500",
   Success = false
};

dep.Context.Cloud.RoleName = "MyRole";
dep.Context.Cloud.RoleInstance = "MyRoleInstance";
dep.Properties["customprop1"] = "custom value1";
client.TrackDependency(dep);

OpenTelemetry 示例:

var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
  .SetResourceBuilder(resourceBuilder)
  .AddSource(activitySource.Name)
  .AddAzureMonitorTraceExporter()
  .Build();

// Emit traces
using (var activity = activitySource.StartActivity("DependencyName", ActivityKind.Client))
{
  activity?.SetTag("url.full", "https://www.example.com/");
  activity?.SetTag("server.address", "www.example.com");
  activity?.SetTag("http.request.method", "GET");
  activity?.SetTag("http.response.status_code", "500");
  activity?.SetTag("customprop1", "custom value1");
  activity?.SetStatus(ActivityStatusCode.Error);
  activity?.SetEndTime(activity.StartTimeUtc.AddSeconds(10));
}

RequestTelemetry

Application Insights RequestTelemetry 对传入请求建模。 下面介绍如何将其迁移到 OpenTelemetry:

Application Insights 示例:

RequestTelemetry req = new RequestTelemetry
{
   Name = "RequestName",
   Url = new Uri("http://example.com"),
   Duration = TimeSpan.FromSeconds(10),
   ResponseCode = "200",
   Success = true,
   Properties = { ["customprop1"] = "custom value1" }
};

req.Context.Cloud.RoleName = "MyRole";
req.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackRequest(req);

OpenTelemetry 示例:

var activitySource = new ActivitySource("Company.Product.Name");
var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
  .SetResourceBuilder(resourceBuilder)
  .AddSource(activitySource.Name)
  .AddAzureMonitorTraceExporter()
  .Build();

// Emit traces
using (var activity = activitySource.StartActivity("RequestName", ActivityKind.Server))
{
  activity?.SetTag("url.scheme", "https");
  activity?.SetTag("server.address", "www.example.com");
  activity?.SetTag("url.path", "/");
  activity?.SetTag("http.response.status_code", "200");
  activity?.SetTag("customprop1", "custom value1");
  activity?.SetStatus(ActivityStatusCode.Ok);
}

自定义操作跟踪

在 Application Insights 中,使用 StartOperationStopOperation 方法跟踪自定义操作。 在 OpenTelemetry .NET 中使用 ActivitySourceActivity 实现此目的。 对于包含 ActivityKind.ServerActivityKind.Consumer 的操作,Azure Monitor 导出程序将生成 RequestTelemetry。 对于 ActivityKind.ClientActivityKind.Producer以及 ActivityKind.Internal,它将生成 DependencyTelemetry。 有关自定义操作跟踪的详细信息,请参阅 Azure Monitor 文档。 有关在 .NET 中使用 ActivitySourceActivity 的详细信息,请参阅 .NET 分布式跟踪检测演练

下面是有关如何为自定义操作启动和停止活动的示例:

using System.Diagnostics;
using OpenTelemetry;

var activitySource = new ActivitySource("Company.Product.Name");

using var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .AddSource(activitySource.Name)
    .AddAzureMonitorTraceExporter()
    .Build();

// Start a new activity
using (var activity = activitySource.StartActivity("CustomOperation", ActivityKind.Server))
{
    activity?.SetTag("customTag", "customValue");

    // Perform your custom operation logic here

    // No need to explicitly call Activity.Stop() because the using block automatically disposes the Activity object, which stops it.
}

发送日志

Application Insights 中的日志存储为 TraceTelemetryExceptionTelemetry

TraceTelemetry

在 OpenTelemetry 中,日志记录通过 ILogger 接口集成。 下面介绍如何迁移 TraceTelemetry

Application Insights 示例:

TraceTelemetry traceTelemetry = new TraceTelemetry
{
   Message = "hello from tomato 2.99",
   SeverityLevel = SeverityLevel.Warning,
};

traceTelemetry.Context.Cloud.RoleName = "MyRole";
traceTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
client.TrackTrace(traceTelemetry);

OpenTelemetry 示例:

var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var loggerFactory = LoggerFactory.Create(builder => builder
   .AddOpenTelemetry(logging =>
   {
       logging.SetResourceBuilder(resourceBuilder);
       logging.AddAzureMonitorLogExporter();
   }));

// Create a new instance `ILogger` from the above LoggerFactory
var logger = loggerFactory.CreateLogger<Program>();

// Emit log: This uses the logger instance to write a new log
logger.FoodPrice("tomato", 2.99);

internal static partial class LoggerExtensions
{
    [LoggerMessage(LogLevel.Warning, "Hello from `{name}` `{price}`.")]
    public static partial void FoodPrice(this ILogger logger, string name, double price);
}
ExceptionTelemetry

Application Insights 使用 ExceptionTelemetry 记录异常。 下面介绍如何迁移到 OpenTelemetry:

Application Insights 示例:

ExceptionTelemetry exceptionTelemetry = new ExceptionTelemetry(new Exception("Test exception"))
{
    SeverityLevel = SeverityLevel.Error
};

exceptionTelemetry.Context.Cloud.RoleName = "MyRole";
exceptionTelemetry.Context.Cloud.RoleInstance = "MyRoleInstance";
exceptionTelemetry.Properties["customprop1"] = "custom value1";
client.TrackException(exceptionTelemetry);

OpenTelemetry 示例:

var resourceAttributes = new Dictionary<string, object>
{
   { "service.name", "MyRole" },
   { "service.instance.id", "MyRoleInstance" }
};

var resourceBuilder = ResourceBuilder.CreateDefault().AddAttributes(resourceAttributes);

using var loggerFactory = LoggerFactory.Create(builder => builder
   .AddOpenTelemetry(logging =>
   {
       logging.SetResourceBuilder(resourceBuilder);
       logging.AddAzureMonitorLogExporter();
   }));

// Create a new instance `ILogger` from the above LoggerFactory.
var logger = loggerFactory.CreateLogger<Program>();

try
{
    // Simulate exception
    throw new Exception("Test exception");
}
catch (Exception ex)
{
    // Emit exception: This uses the logger instance to write a new exception
    logger?.LogError(ex, "An error occurred");
}

发送指标

Application Insights 中的指标存储为 MetricTelemetry。 在 OpenTelemetry 中,指标从 System.Diagnostics.DiagnosticSource 包作为 Meter 进行建模。

Application Insights 同时具有非预聚合 (TrackMetric()) 和预聚合 (GetMetric().TrackValue()) 指标 API。 与 OpenTelemetry 不同,Application Insights 没有检测的概念。 对于所有指标情况,Application Insights 具有相同的 API。

另一方面,OpenTelemetry 要求用户首先根据指标的实际语义选择合适的指标检测。 例如,如果打算计算某些内容(例如收到的服务器请求总数等),则应使用 OpenTelemetry Counter。 如果打算计算各种百分位数(如服务器延迟的 P99 值),则应使用 OpenTelemetry 直方图检测。 由于 Application Insights 和 OpenTelemetry 之间的这一基本差异,没有对它们进行直接比较。

与 Application Insights 不同,OpenTelemetry 不提供用于扩充或筛选指标的内置机制。 在 Application Insights 中,遥测处理器和初始值设定项可用于修改或放弃指标,但 OpenTelemetry 中不提供此功能。

此外,OpenTelemetry 不支持直接发送原始指标,因为没有 Application Insights 中发现的 TrackMetric() 功能的等效项。

从 Application Insights 迁移到 OpenTelemetry 涉及将所有使用的 Application Insights 指标 API 替换为 OpenTelemetry API。 你需要了解各种 OpenTelemetry 检测及其语义。

提示

直方图是最通用且最接近 Application Insights GetMetric().TrackValue() API 的等效项。 可以将 Application Insights 指标 API 替换为直方图,以实现相同的目的。

其他遥测数据类型

CustomEvents

OpenTelemetry 中不支持。

Application Insights 示例:

TelemetryClient.TrackEvent()
AvailabilityTelemetry

OpenTelemetry 中不支持。

Application Insights 示例:

TelemetryClient.TrackAvailability()
PageViewTelemetry

OpenTelemetry 中不支持。

Application Insights 示例:

TelemetryClient.TrackPageView()

我是否可以获取控制台和辅助角色服务应用程序的实时指标?

我们建议对控制台和辅助角色服务应用程序使用 Azure Monitor OpenTelemetry Exporter,它不包含实时指标。

后续步骤

提示

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

支持