添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
通过OpenTelemetry上报.NET应用数据

通过OpenTelemetry上报.NET应用数据

通过 OpenTelemetry 为应用埋点并上报链路数据至 可观测链路 OpenTelemetry 版 后, 可观测链路 OpenTelemetry 版 即可开始监控应用,您可以查看应用拓扑、调用链路、异常事务、慢事务和 SQL 分析等一系列监控数据。本文介绍如何使用 OpenTelemetry 为.NET 应用进行自动或手动埋点并上报数据。

前提条件

获取接入点信息

  1. 登录 ARMS 控制台 ,在左侧导航栏单击 接入中心

  2. 服务端应用 区域单击 OpenTelemetry 卡片。

  3. 在弹出的 OpenTelemetry 面板中选择数据需要上报的地域。

    说明

    初次接入的地域将会自动进行资源初始化。

  4. 选择 连接方式 上报方式 ,然后复制接入点信息。

    • 连接方式:若您的服务部署在阿里云上,且所属地域与选择的接入地域一致,推荐使用阿里云内网方式,否则选择公网方式。

    • 上报方式:根据客户端支持的协议类型选择 HTTP gRPC 协议上报数据。

    image.png

背景信息

OpenTelemetry .NET 支持自动埋点和手动埋点。

  • 自动埋点

    • 支持自动埋点的.NET / .NET Framework 版本:

      • .NET SDK 6+

      • .NET Framework 暂不支持自动埋点

    • 支持的框架请参见 OpenTelemetry 官方文档

  • 手动埋点和半自动埋点

    • 支持的版本:

      • .NET ≥ 5.0

      • .NET Core ≥ 2.0

      • .NET Framework ≥ 4.6.1

    • 支持的框架:

      展开查看支持的框架版本

      框架名称

      是否支持.NET Framework(Windows 平台)

      是否支持.NET

      (跨平台,原.NET Core)

      支持的框架版本

      链接

      ASPNET

      支持

      ASP.NET (.NET Framework) MVC / WebApi 在.NET 上不支持

      -

      -

      ASPNETCORE

      /

      支持

      -

      -

      AZURE

      支持

      支持

      支持 2021 10 01 日之后发布的 Azure. 前缀的包。

      Azure SDK

      ELASTICSEARCH

      支持

      支持

      • Elastic.Clients.Elasticsearch 支持版本:[8.0.0, 8.10.0) 。

      • 版本≥8.10.0 由 Elastic.Transport instrumentation 支持。

      Elastic.Clients.Elasticsearch

      ELASTICTRANSPORT

      支持

      支持

      ≥0.4.16

      Elastic.Transport

      ENTITYFRAMEWORKCORE

      /

      支持

      ≥6.0.12

      Microsoft.EntityFrameworkCore

      GRAPHQL

      /

      支持

      ≥7.5.0

      GraphQL

      GRPCNETCLIENT

      支持

      支持

      [2.52.0, 3.0.0)

      Grpc.Net.Client

      HTTPCLIENT

      支持

      支持

      *

      System.Net.Http.HttpClient

      System.Net.HttpWebRequest

      QUARTZ

      .NET Framework 不支持≤ 4.7.1 的版本

      支持

      ≥3.4.0

      Quartz

      MASSTRANSIT

      /

      支持

      ≥8.0.0

      MassTransit

      MONGODB

      支持

      支持

      [2.13.3, 3.0.0)

      MongoDB.Driver.Core

      MYSQLCONNECTOR

      支持

      支持

      ≥2.0.0

      MySqlConnector

      MYSQLDATA

      /

      支持

      ≥8.1.0

      MySql.Data

      NPGSQL

      支持

      支持

      ≥6.0.0

      Npgsql

      NSERVICEBUS

      支持

      支持

      ≥8.0.0

      NServiceBus

      SQLCLIENT

      支持

      支持

      Microsoft.Data.SqlClient v3.*暂不支持

      STACKEXCHANGEREDIS

      /

      支持

      [2.0.405, 3.0.0)

      StackExchange.Redis

      WCFCLIENT

      支持

      支持

      -

      -

      WCFSERVICE

      支持

      /

      -

      -

示例 Demo

示例代码仓库地址: dotnet-demo

方法一:自动埋点

版本限制

  • .NET SDK 6+

  • .NET Framework 暂不支持自动埋点

  1. 使用 ASP.NET Core 编写 Web 应用。

    1. 创建 Demo 应用。

      mkdir dotnet-simple-demo
      cd dotnet-simple-demo
      dotnet new web
    2. Properties/launchSettings.json 文件中的内容替换成以下配置。

      {
        "$schema": "http://json.schemastore.org/launchsettings.json",
        "profiles": {
          "http": {
            "commandName": "Project",
            "dotnetRunMessages": true,
            "launchBrowser": true,
            "applicationUrl": "http://localhost:8080",
            "environmentVariables": {
              "ASPNETCORE_ENVIRONMENT": "Development"
      }
    3. 构建应用。

      dotnet build
  2. 为应用配置自动埋点.

    1. 下载并执行 OpenTelemetry .NET 自动埋点安装脚本。

      curl -L -O https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/otel-dotnet-auto-install.sh
      ./otel-dotnet-auto-install.sh
    2. 设置环境变量并运行 OpenTelemetry .NET 自动埋点脚本。

      请将 <serviceName> 替换为您的服务名,请将 <endpoint> <token> 替换为 前提条件 中获取的接入点和鉴权 Token。

      export OTEL_TRACES_EXPORTER=otlp \
        OTEL_METRICS_EXPORTER=none \
        OTEL_LOGS_EXPORTER=none \
        OTEL_SERVICE_NAME=<serviceName> \
        OTEL_EXPORTER_OTLP_PROTOCOL=grpc
        OTEL_EXPORTER_OTLP_ENDPOINT=<endpoint> \
        OTEL_EXPORTER_OTLP_HEADERS="Authentication=<token>"
      . $HOME/.otel-dotnet-auto/instrument.sh
      说明

      更多 OpenTelemetry .NET 自动埋点的环境变量配置,请参见 OpenTelemetry .NET 自动埋点环境变量

  3. 运行并访问应用。

    1. 运行应用。

      dotnet run
    2. 使用以下命令访问应用,生成的调用链会自动上报至 可观测链路 OpenTelemetry 版

      curl localhost:8080/

方法二:手动埋点

  1. 进入示例代码仓库的 dotnet-demo/opentelemetry-demo/manual-demo 路径,然后安装手动埋点所需的 OpenTelemetry 相关依赖。

    dotnet add package OpenTelemetry
    dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
    dotnet add package OpenTelemetry.Exporter.Console # 可选,在控制台导出数据
    dotnet add package OpenTelemetry.Extensions.Hosting
  2. OpentelemetryExporterDemo.cs 文件中创建 OpenTelemetry TracerProvider,并添加基于 HTTP 协议的 OtlpExporter,修改上报应用名和上报数据的 Endpoint。

    using System.Diagnostics;
    using OpenTelemetry;
    using OpenTelemetry.Trace;
    using OpenTelemetry.Resources;
    using OpenTelemetry.Exporter;
    namespace Demo
        internal static class OpentelemetryExporterDemo
            internal static void Run()
                Console.WriteLine("otlp running");
                // OpenTelemetry上报应用名
                var serviceName = "otlp-test";
                using var tracerProvider = Sdk.CreateTracerProviderBuilder()
                    .AddSource(serviceName)
                    .SetResourceBuilder(
                    ResourceBuilder.CreateDefault().AddService(serviceName))
                    .AddOtlpExporter(opt =>
                                         // 根据前提条件中获取的接入点信息进行修改
                                         opt.Endpoint = new Uri("<endpoint>");
                                         // 使用HTTP协议上报数据
                                         opt.Protocol = OtlpExportProtocol.HttpProtobuf;
                    .AddConsoleExporter() // 可选,在控制台导出数据
                    .Build();
                for(int i = 0; i<10; i++)
                    var MyActivitySource = new ActivitySource(serviceName);
                    using var activity = MyActivitySource.StartActivity("SayHello");
                    activity?.SetTag("bar", "Hello World");
    }
  3. 修改 Program.cs 文件内容,在 Main 方法中调用 OpentelemetryExporterDemo。

    using System.Diagnostics;
    using System.Net.Http;
    using OpenTelemetry;
    using OpenTelemetry.Resources;
    using OpenTelemetry.Trace;
    namespace Demo
        public class Otlp
            public static void Main(string[] args)
                OpentelemetryExporterDemo.Run();
    }
  4. 在当前路径下运行以下命令。

    dotnet run

方法三:半自动埋点

OpenTelemetry 支持自动上传数十种.NET 框架 Trace 的数据,详细的.NET 框架列表请参见 Supported Libraries

  1. 进入示例代码仓库的 dotnet-demo/opentelemetry-demo/auto-demo 路径,创建 ASP.NET Core 应用(Web 应用)。

    请将代码中的 <your-project-name> 替换为实际的应用名。

    mkdir <your-project-name>
    cd <your-project-name>
    dotnet new mvc
  2. 下载观测.NET 应用必备的 OpenTelemetry 依赖。

    dotnet add package OpenTelemetry.Exporter.Console # 在控制台导出采集的数据
    dotnet add package OpenTelemetry.Extensions.Hosting
    dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol # 以OTLP协议导出
  3. 下载自动埋点依赖。

    下载为 ASP.NET Core 框架自动埋点的依赖,当应用收到 HTTP 请求时,会自动生成 Span 并上报。如需为其他框架自动埋点,请参考 Supported Libraries 下载对应依赖。

    dotnet add package OpenTelemetry.Instrumentation.AspNetCore
  4. 修改 <your-project-name>/Program.cs 文件中的代码。

    1. 在源文件开头导入所需包。

      using System.Diagnostics;
      using OpenTelemetry.Exporter;
      using OpenTelemetry.Resources;
      using OpenTelemetry.Trace;
    2. 在源文件末尾添加 DiagnosticsConfig 类。

      请将代码中的 <your-service-name> <your-host-name> 替换为实际的服务名和主机名。

      public static class DiagnosticsConfig
          public const string ServiceName = "<your-service-name>";
          public const string HostName = "<your-host-name>";
          public static ActivitySource ActivitySource = new ActivitySource(ServiceName);
      }
    3. 添加 OpenTelemetry 初始化代码。

      • HTTP 协议上报

        请将以下代码中的 <http_endpoint> 替换成前提条件中获取的接入点信息。

        // ...
        builder.Services.AddOpenTelemetry()
            .WithTracing(tracerProviderBuilder =>
                tracerProviderBuilder
                    .AddSource(DiagnosticsConfig.ActivitySource.Name)
                    .SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder.CreateDefault()
                        .AddAttributes(new Dictionary<string, object> {
                            {"service.name", DiagnosticsConfig.ServiceName},
                            {"host.name",DiagnosticsConfig.HostName}
                    .AddAspNetCoreInstrumentation()
                    .AddConsoleExporter() // 在控制台导出Trace数据,可选
                    .AddOtlpExporter(opt =>
                        // 使用HTTP协议上报
                        opt.Endpoint = new Uri("<http_endpoint>");
                        opt.Protocol = OtlpExportProtocol.HttpProtobuf;
        // ...
      • 使用 gRPC 协议上报

        请将以下代码中的 <grpc_endpoint> <token> 替换成前提条件中获取的接入点信息和 Token。

        // ...
        builder.Services.AddOpenTelemetry()
            .WithTracing(tracerProviderBuilder =>
                tracerProviderBuilder
                    .AddSource(DiagnosticsConfig.ActivitySource.Name)
                    .SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder.CreateDefault()
                        .AddAttributes(new Dictionary<string, object> {
                            {"service.name", DiagnosticsConfig.ServiceName},
                            {"host.name",DiagnosticsConfig.HostName}
                    .AddAspNetCoreInstrumentation()
                    .AddConsoleExporter() // 在控制台导出Trace数据,可选
                    .AddOtlpExporter(opt =>
                        // 使用gRPC协议上报
                        opt.Endpoint = new Uri("<grpc_endpoint>");
                        opt.Headers = "Authentication=<token>";
                        opt.Protocol = OtlpExportProtocol.Grpc;
        // ...

    展开查看 Program.cs 完整示例代码

    // 引入所需包
    using System.Diagnostics;
    using OpenTelemetry.Exporter;
    using OpenTelemetry.Resources;
    using OpenTelemetry.Trace;
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllersWithViews();
    // OpenTelemetry 初始化
    builder.Services.AddOpenTelemetry()
        .WithTracing(tracerProviderBuilder =>
            tracerProviderBuilder
                .AddSource(DiagnosticsConfig.ActivitySource.Name)
                .SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder.CreateDefault()
                    .AddAttributes(new Dictionary<string, object> {
                        {"service.name", DiagnosticsConfig.ServiceName},
                        {"host.name",DiagnosticsConfig.HostName}
                .AddAspNetCoreInstrumentation()
                .AddConsoleExporter() // 在控制台输出Trace数据,可选
                .AddOtlpExporter(opt =>
                    // 使用HTTP协议上报
                    opt.Endpoint = new Uri("<http_endpoint>");
                    opt.Protocol = OtlpExportProtocol.HttpProtobuf;
                    // 使用gRPC协议上报
                    // opt.Endpoint = new Uri("<grpc_endpoint>");
                    // opt.Headers = "Authentication=<token>";
                    // opt.Protocol = OtlpExportProtocol.Grpc;
    var app = builder.Build();
    if (!app.Environment.IsDevelopment())
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthorization();
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    app.Run();
    // 创建DiagnosticsConfig类
    public static class DiagnosticsConfig
        public const string ServiceName = "<your-service-name>"; // 服务名
        public const string HostName = "<your-host-name>"; // 主机名
        public static ActivitySource ActivitySource = new ActivitySource(ServiceName);
                                
  5. 在终端执行以下命令运行项目。

    dotnet run

    返回示例:

    在返回信息中获取 URL,例如 http://localhost:5107

    Building...
    info: Microsoft.Hosting.Lifetime[14]
          Now listening on: http://localhost:5107
    info: Microsoft.Hosting.Lifetime[0]
          Application started. Press Ctrl+C to shut down.
    info: Microsoft.Hosting.Lifetime[0]
          Hosting environment: Development
    info: Microsoft.Hosting.Lifetime[0]
          Content root path: /path/to/<your-project-name>
  6. 在浏览器中访问 http://localhost:5107 ,返回以下页面则说明数据已上报至 可观测链路 OpenTelemetry 版 控制台。

    返回页面

查看监控数据

登录 ARMS 控制台 后,在 应用监控 > 应用列表 页面选择目标应用,查看链路数据。

说明

语言 列显示 image 图标的应用为接入应用监控的应用,显示 - 图标的应用为接入可观测链路 OpenTelemetry 版的应用。