导出到 Jaeger
了解如何使用 OpenTelemetry .NET 将跟踪导出到 Jaeger
本指南将向您展示如何将 OpenTelemetry .NET 跟踪导出到 Jaeger 进行可视化和分析。
先决条件
使用 OTLP 导出创建 .NET 应用程序
创建一个新的控制台应用程序
dotnet new console --output getting-started-jaeger
cd getting-started-jaeger
安装所需的 OpenTelemetry 包
dotnet add package OpenTelemetry.Exporter.Console
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
dotnet add package OpenTelemetry.Instrumentation.Http
使用以下代码更新 Program.cs 文件
using System.Diagnostics;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
namespace GettingStartedJaeger;
internal static class Program
{
private static readonly ActivitySource MyActivitySource = new("OpenTelemetry.Demo.Jaeger");
public static async Task Main()
{
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(
serviceName: "DemoApp",
serviceVersion: "1.0.0"))
.AddSource("OpenTelemetry.Demo.Jaeger")
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.AddOtlpExporter()
.Build();
using var parent = MyActivitySource.StartActivity("JaegerDemo");
using (var client = new HttpClient())
{
using (var slow = MyActivitySource.StartActivity("SomethingSlow"))
{
await client.GetStringAsync(new Uri("https://httpstat.us/200?sleep=1000")).ConfigureAwait(false);
await client.GetStringAsync(new Uri("https://httpstat.us/200?sleep=1000")).ConfigureAwait(false);
}
using (var fast = MyActivitySource.StartActivity("SomethingFast"))
{
await client.GetStringAsync(new Uri("https://httpstat.us/301")).ConfigureAwait(false);
}
}
}
}
运行此应用程序时,它将通过 `ConsoleExporter` 将跟踪输出到控制台,并尝试使用 `OtlpExporter` 将跟踪发送到 Jaeger。由于 Jaeger 尚未设置,这些跟踪将暂时被丢弃。
设置 Jaeger
Jaeger 是一个开源的分布式跟踪系统,可帮助监视和排查基于微服务的应用程序。
安装和运行 Jaeger
- 从 官方下载页面 下载 Jaeger。
- 将其解压缩到您计算机上的某个位置。
- 运行启用了 OTLP 的 Jaeger all-in-one 可执行文件
./jaeger-all-in-one --collector.otlp.enabled
这将启动
- Jaeger UI(`https://:16686`)
- Jaeger 收集器(具有 OTLP 接收器)(`https://:4317`)
- Jaeger 查询服务和其他组件
在 Jaeger 中查看跟踪
- 打开 Web 浏览器并导航到 https://:16686
- 运行您的 .NET 应用程序
- 在 Jaeger UI 中
- 从“Service”(服务)下拉菜单中选择“DemoApp”。
- 点击“Find Traces”(查找跟踪)。
您应该能在 Jaeger UI 中看到应用程序的跟踪。点击一个跟踪以查看所有 span 的详细甘特图视图。
理解代码
跟踪提供程序配置
应用程序使用以下方式配置 OpenTelemetry:
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(
serviceName: "DemoApp",
serviceVersion: "1.0.0"))
.AddSource("OpenTelemetry.Demo.Jaeger")
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.AddOtlpExporter()
.Build();
此代码
- 设置一个具有服务名称和版本的资源。
- 注册我们的 Activity Source。
- 添加 HttpClient 的自动插装。
- 配置控制台和 OTLP 导出器。
Activity 创建
应用程序使用 ActivitySource 创建 span。
private static readonly ActivitySource MyActivitySource = new("OpenTelemetry.Demo.Jaeger");
// Create a parent span
using var parent = MyActivitySource.StartActivity("JaegerDemo");
// Create child spans
using (var slow = MyActivitySource.StartActivity("SomethingSlow"))
{
// Operations inside this block will be part of the "SomethingSlow" span
}
跟踪导出流程
跟踪数据通过以下组件流动:
- 应用程序使用 ActivitySource 创建 span。
- TracerProvider 收集和处理 span。
- OTLP Exporter 通过 OTLP 协议将 span 发送到 Jaeger。
- Jaeger 存储跟踪,并允许您查询和可视化跟踪。
生产环境使用
在生产环境中使用时,应移除 Console Exporter,仅使用 OTLP Exporter。
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(
serviceName: "DemoApp",
serviceVersion: "1.0.0"))
.AddSource("OpenTelemetry.Demo.Jaeger")
.AddHttpClientInstrumentation()
// Remove Console Exporter
// .AddConsoleExporter()
.AddOtlpExporter()
.Build();
还可以移除 Console Exporter 包。
dotnet remove package OpenTelemetry.Exporter.Console