通过OpenTelemetry为应用埋点并上报链路数据至云监控2.0后,云监控2.0即可开始监控应用,您可以查看应用拓扑、调用链路、异常事务、慢事务和SQL分析等一系列监控数据。本文介绍如何使用OpenTelemetry为.NET应用进行自动或手动埋点并上报数据。
背景信息
OpenTelemetry .NET支持自动埋点和手动埋点。
自动埋点
OpenTelemetry .NET 自动埋点与所有官方支持的操作系统和 .NET 版本兼容。 .NET Framework的最低支持版本为 4.6.2。 更多信息,请查看OpenTelemetry .NET 自动埋点兼容性。
手动埋点
.NET SDK 8+
步骤一:获取接入点信息
登录云监控2.0控制台,选择目标工作空间,在左侧导航栏选择 。
在服务端应用区域单击.NET卡片,然后选择接入协议类型为Opentelemetry。
在参数配置区域单击LicenseKey右侧的点击获取,然后根据需求选择埋点方式、连接方式、上报方式,并输入应用名称、版本号和部署环境。
页面下方将会根据配置参数生成相应的接入代码,代码中包含了Endpoint、LicenseKey等接入点信息。
步骤二:设置依赖库
自动埋点(推荐)
下载并执行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
配置以下环境变量,然后启动应用程序。
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 自动埋点配置。
手动埋点
添加依赖包。
dotnet add package OpenTelemetry dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol dotnet add package OpenTelemetry.Exporter.Console # 可选,在控制台导出数据 dotnet add package OpenTelemetry.Extensions.Hosting
创建 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"); } } } }
运行程序以生成并上报 Trace 数据。
dotnet run