通过OpenTelemetry上报.NET应用数据

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

背景信息

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

步骤一:获取接入点信息

  1. 登录云监控2.0控制台,选择目标工作空间,在左侧导航栏选择接入中心 > 接入中心

  2. 服务端应用区域单击.NET卡片,然后选择接入协议类型Opentelemetry

  3. 参数配置区域单击LicenseKey右侧的点击获取,然后根据需求选择埋点方式连接方式上报方式,并输入应用名称版本号部署环境

    页面下方将会根据配置参数生成相应的接入代码,代码中包含了Endpoint、LicenseKey等接入点信息。

    image

步骤二:设置依赖库

自动埋点(推荐)

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

    # Download the bash script
    curl -sSfL https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/releases/latest/download/otel-dotnet-auto-install.sh -O
    
    # Install core files
    sh ./otel-dotnet-auto-install.sh
    
    # Enable execution for the instrumentation script
    chmod +x $HOME/.otel-dotnet-auto/instrument.sh
    
    # Setup the instrumentation for the current shell session
    . $HOME/.otel-dotnet-auto/instrument.sh
  2. 配置以下环境变量,然后启动应用程序。

    HTTP上报

    步骤一获取到的接入点信息替换到以下代码中。

    # Run your application with instrumentation
    OTEL_SERVICE_NAME=<service name> \
    OTEL_RESOURCE_ATTRIBUTES=service.name=<service name>,acs.cms.workspace=<workspace>,service.version=<service version>,deployment.environment=<environment> \
    OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=<traces.endpoint> \
    OTEL_EXPORTER_OTLP_METRICS_ENDPOINT=<metrics.endpoint> \
    OTEL_EXPORTER_OTLP_HEADERS="x-arms-license-key=<license-key>,x-arms-project=<arms-project>,x-cms-workspace=<workspace>" \
    OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf \
    OTEL_LOGS_EXPORTER=none \
    ./MyNetApp

    gRPC上报

    步骤一获取到的接入点信息替换到以下代码中。

    # Run your application with instrumentation
    OTEL_SERVICE_NAME=<service name> \
    OTEL_RESOURCE_ATTRIBUTES=service.name=<service name>,acs.cms.workspace=<workspace>,service.version=<service version>,deployment.environment=<environment> \
    OTEL_EXPORTER_OTLP_ENDPOINT=<endpoint> \
    OTEL_EXPORTER_OTLP_HEADERS="x-arms-license-key=<license-key>,x-arms-project=<arms-project>,x-cms-workspace=<workspace>" \
    OTEL_EXPORTER_OTLP_PROTOCOL=grpc \
    OTEL_LOGS_EXPORTER=none \
    ./MyNetApp

    如要添加更多 OpenTelemetry 环境变量,请查看OpenTelemetry .NET 自动埋点配置

手动埋点

  1. 添加依赖包。

    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 文件,将下述代码复制到该文件。

    HTTP上报

    步骤一获取到的接入点信息替换到以下代码中。

    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 = ""; // 应用名
                using var tracerProvider = Sdk.CreateTracerProviderBuilder()
                    .AddSource(serviceName)
                    .SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder.CreateDefault()
                    .AddAttributes(new Dictionary<string, object> {
                        {"service.name", "<service name>"},  // 应用名
                        {"service.version", "<service version>"},  // 版本号
                        {"deployment.environment", "<environment>"},  // 部署环境
                        {"host.name", "${hostName}"} // 请将 ${hostName} 替换为实际的主机名
                    }))
                     .AddOtlpExporter(opt =>
                         {
                             opt.Headers = "x-arms-license-key=<license-key>,x-arms-project=<arms-project>,x-cms-workspace=<workspace>"; // 请将 <license-key>、<arms-project>、<workspace> 替换为步骤一中获取的接入点信息
                             opt.Endpoint = new Uri("<endpoint>");  // 请将<endpoint>替换为步骤一中获取的接入点信息
                             opt.Protocol = OtlpExportProtocol.HttpProtobuf; // 使用HTTP协议上报数据
                         })
                    .AddConsoleExporter() // 可选,在控制台打印 Trace 数据
                    .Build();
                for(int i = 0; i<10; i++)
                {
                    var MyActivitySource = new ActivitySource(serviceName);
                    using var activity = MyActivitySource.StartActivity("SayHello");
                    activity?.SetTag("bar", "Hello World");
                }
            }
        }
    }

    gRPC上报

    步骤一获取到的接入点信息替换到以下代码中。

    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 = "";  // 应用名
                using var tracerProvider = Sdk.CreateTracerProviderBuilder()
                    .AddSource(serviceName)
                    .SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder.CreateDefault()
                    .AddAttributes(new Dictionary<string, object> {
                        {"service.name", ""},  // 应用名
                        {"service.version", ""},  // 版本号
                        {"deployment.environment", ""},  // 部署环境
                        {"host.name", "${hostName}"} // 请将 ${hostName} 替换为实际的主机名
                    }))
                     .AddOtlpExporter(opt =>
                         {
                             opt.Headers = "x-arms-license-key=<license-key>,x-arms-project=<arms-project>,x-cms-workspace=<workspace>"; // 请将 <license-key>、<arms-project>、<workspace> 替换为步骤一中获取的接入点信息
                             opt.Endpoint = new Uri("<endpoint>");  // 请将<endpoint>替换为步骤一中获取的接入点信息
                             opt.Protocol = OtlpExportProtocol.Grpc; // 使用gRPC协议上报
                         })
                    .AddConsoleExporter() // 可选,在控制台打印 Trace 数据
                    .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. 运行程序以生成并上报 Trace 数据。

    dotnet run

查看监控数据

  1. 登录云监控2.0控制台,选择目标工作空间,在左侧导航栏选择应用中心 > 运维监控 > 应用监控

  2. 应用列表页面单击目标应用名称,然后查看对应的监控详情。更多信息,请参见应用监控