トレースを始める - コンソール

.NET コンソールアプリケーションで OpenTelemetry トレースを使用する方法を学びます

このガイドでは、コンソールアプリケーションで OpenTelemetry .NET トレースをわずか数分で使い始める方法を紹介します。

前提条件

  • コンピューターに .NET SDK がインストールされていること

コンソールアプリケーションの作成

新しいコンソールアプリケーションを作成して実行します。

dotnet new console --output getting-started
cd getting-started
dotnet run

次のような出力が表示されるはずです。

Hello World!

OpenTelemetry トレースの追加

OpenTelemetry コンソールエクスポーターパッケージをインストールします。

dotnet add package OpenTelemetry.Exporter.Console

Program.cs ファイルを次のコードに更新します。

using System;
using System.Diagnostics;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace GettingStarted
{
    class Program
    {
        // アクティビティを作成するための ActivitySource を定義する
        private static readonly ActivitySource MyActivitySource = new ActivitySource(
            "MyCompany.MyProduct.MyLibrary");

        static void Main(string[] args)
        {
            // OpenTelemetry TracerProvider を設定する
            using var tracerProvider = Sdk.CreateTracerProviderBuilder()
                .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("getting-started"))
                .AddSource("MyCompany.MyProduct.MyLibrary")
                .AddConsoleExporter()
                .Build();

            // タグ(属性)を持つアクティビティ(スパン)を開始する
            using (var activity = MyActivitySource.StartActivity("SayHello"))
            {
                // アクティビティに属性を設定する
                activity?.SetTag("foo", 1);
                activity?.SetTag("bar", "Hello, World!");
                activity?.SetTag("baz", new int[] { 1, 2, 3 });

                // アクティビティのステータスを設定する
                activity?.SetStatus(ActivityStatusCode.Ok);

                // 何らかの処理を行う…
                Console.WriteLine("Hello World!");
            }

            Console.WriteLine("Trace has been exported. Press any key to exit.");
            Console.ReadKey();
        }
    }
}

dotnet run を使用して)アプリケーションを再度実行すると、コンソールからトレース出力が表示されるはずです。

Activity.TraceId:          d4a7d499698d62f0e2317a67abc559b6
Activity.SpanId:           a091d18fbe45bdf6
Activity.TraceFlags:       Recorded
Activity.ActivitySourceName: MyCompany.MyProduct.MyLibrary
Activity.DisplayName: SayHello
Activity.Kind:        Internal
Activity.StartTime:   2022-03-30T19:42:33.5178011Z
Activity.Duration:    00:00:00.0097620
StatusCode : Ok
Activity.Tags:
    foo: 1
    bar: Hello, World!
    baz: [1, 2, 3]
Resource associated with Activity:
    service.name: getting-started

これで OpenTelemetry を使用してトレースを収集できるようになりました。

仕組み

ActivitySource(Tracer)

このプログラムは OpenTelemetry の Tracer を表す ActivitySource を作成します。

private static readonly ActivitySource MyActivitySource = new ActivitySource(
    "MyCompany.MyProduct.MyLibrary");

ActivitySource は新しいアクティビティを作成して開始するために使用されます。

Activity(Span)

ActivitySource インスタンスを使用して、OpenTelemetry の Span を表す Activity を開始します。 複数のタグ(属性)を設定し、ステータスを設定できます。

using (var activity = MyActivitySource.StartActivity("SayHello"))
{
    activity?.SetTag("foo", 1);
    activity?.SetTag("bar", "Hello, World!");
    activity?.SetTag("baz", new int[] { 1, 2, 3 });
    activity?.SetStatus(ActivityStatusCode.Ok);
}

TracerProvider

TracerProvider は、指定されたソースからのアクティビティをサブスクライブしてエクスポートするように設定されます。

var tracerProvider = Sdk.CreateTracerProviderBuilder()
    .AddSource("MyCompany.MyProduct.MyLibrary")
    .AddConsoleExporter()
    .Build();

TracerProvider は OpenTelemetry SDK の中核コンポーネントです。 サンプラー、プロセッサー、エクスポーターなど、トレースに関するすべての設定を保持し、高度にカスタマイズ可能です。

トレースパイプライン

OpenTelemetry .NET のトレースパイプラインは次のフローに従います。

  1. ActivitySource がアクティビティを作成する
  2. TracerProvider がアクティビティを受信する
  3. プロセッサーがアクティビティを処理する
  4. エクスポーターがアクティビティをバックエンドにエクスポートする

OpenTelemetry .NET と .NET Activity API

OpenTelemetry .NET では、OpenTelemetry の仕様にある TracerSpan のかわりに ActivitySourceActivity という用語が使用されます。 これは、OpenTelemetry .NET のトレースが .NET ランタイムの組み込み診断システムの上に実装されているためです。

System.Diagnostics.DiagnosticSource パッケージに依存することで、アプリケーションを計装できます。 このパッケージは、OpenTelemetry の SpanTracer の概念をそれぞれ表す Activity クラスと ActivitySource クラスを提供します。

さらに学ぶ