导出到 Jaeger

了解如何使用 OpenTelemetry .NET 将跟踪导出到 Jaeger

本指南将向您展示如何将 OpenTelemetry .NET 跟踪导出到 Jaeger 进行可视化和分析。

先决条件

  • 在您的计算机上安装了 .NET SDK
  • 下载 Jaeger(本指南包含安装说明)
  • 熟悉基本的 OpenTelemetry 概念(请参阅 控制台入门

使用 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

  1. 官方下载页面 下载 Jaeger。
  2. 将其解压缩到您计算机上的某个位置。
  3. 运行启用了 OTLP 的 Jaeger all-in-one 可执行文件
./jaeger-all-in-one --collector.otlp.enabled

这将启动

  • Jaeger UI(`https://:16686`)
  • Jaeger 收集器(具有 OTLP 接收器)(`https://:4317`)
  • Jaeger 查询服务和其他组件

在 Jaeger 中查看跟踪

  1. 打开 Web 浏览器并导航到 https://:16686
  2. 运行您的 .NET 应用程序
  3. 在 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();

此代码

  1. 设置一个具有服务名称和版本的资源。
  2. 注册我们的 Activity Source。
  3. 添加 HttpClient 的自动插装。
  4. 配置控制台和 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
}

跟踪导出流程

跟踪数据通过以下组件流动:

  1. 应用程序使用 ActivitySource 创建 span。
  2. TracerProvider 收集和处理 span。
  3. OTLP Exporter 通过 OTLP 协议将 span 发送到 Jaeger。
  4. 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

了解更多