.NET Blogでも「OpenTelemetry .NET reaches v1.0」にて公開された通り、OpenTelemetry .NETがv1.0に到達しました。New Relicで.NETアプリケーションをOpenTelemetryで計装する方法について 「New Relic’s OpenTelemetry .NET Offering Reaches V1.0」の抄訳にてお届けします。

現代のテクノロジー環境がより分散し複雑になるにつれ、そのパフォーマンスを効果的に管理することも困難になってきています。サービスやアプリケーションの全体的な動作を把握するには、すべてのフレームワークやライブラリを標準化された方法で計測する必要があります。

OpenTelemetryは、Cloud Native Computing Foundation(CNCF)が主催するオープンソースプロジェクトで、サービスの計装のための統一規格を提供しています。OpenTracing と OpenCensus を統合して作られた OpenTelemetry は、テレメトリーデータを収集して New Relic などの任意のバックエンドに転送する方法を標準化するための、単一の API とライブラリのセットを提供しています。

本日、New Relic は OpenTelemetry の提供を開始しました。オープンソースのデータを Telemetry Data Platform に取り込み、Full-Stack Observability を使用して問題の根本原因をすばやく把握することで、パフォーマンスを最適化したり、アプリケーションやサービスの複雑な相互作用を理解したりすることができます。

OpenTelemetry のデータを簡単に取り込む

New Relic が提供する OpenTelemetry では、複数の方法でデータを取り込むことができます。

  1. OpenTelemetry Collector: OpenTelemetry Collector は、テレメトリーデータの受信、処理、エクスポートの方法について、ベンダーを問わない実装を提供します。コレクターはさまざまなフォーマットでデータを受信し、エクスポートすることができるため、すでに計装されたコードを持っている場合には、この方法から始めるのがよいでしょう。OpenTelemetry Collector で New Relic Exporter を有効にすると、テレメトリデータを New Relic に送信することができます。これが、OpenTelemetry のデータを New Relic One に取り込むための推奨される方法となります。

    https://docs.newrelic.com/docs/integrations/open-source-telemetry-integrations/opentelemetry/opentelemetry-quick-start/#collector
  2. 言語固有のエクスポーター: OpenTelemetry Collector はデータの集約とルーティングを行いますが、サービスを計装するためのプロセスも必要です。OpenTelemetry プロジェクトには、サービスを計装するための言語固有の SDK や計装ライブラリが多数用意されています。言語固有のエクスポーターを使って、テレメトリーデータをコレクターに送ったり、New Relic に直接送ったりすることができます。現在、.NET (1.0)、JavaGo 用のものを提供しています。
  3. Java OpenTelemetry Integration Bundle: Java SDK、Java 自動計測エージェント、New Relic エクスポーターがパッケージされていますので、OpenTelemetry と Java を使い始める最も簡単な方法です。

New RelicのOpenTelemetry UIでデータを素早く可視化・分析

Full-Stack Observability の OpenTelemetry APM 機能を使用すると、スタック全体のパフォーマンスデータをコンテキストつきで可視化し、根本的な原因を迅速に突き止め、アプリケーションに最適なパフォーマンスを提供し、優れたデジタルエクスペリエンスを提供することができます。

それでは、New Relic Collector Exporter と OpenTelemetry UI を使用して、マイクロサービスのデモアプリケーションの一部である C# cartserviceを収集、視覚化、分析する方法を説明します。

アプリケーションを計装するには、以下のパッケージを追加します。

  • NewRelic.OpenTelemetry
  • OpenTelemetry.Extensions.Hosting
  • OpenTelemetry.Instrumentation.AspNetCore
  • OpenTelemetry.Instrumentation.AspNetCore
  • OpenTelemetry.Exporter.OpenTelemetryProtocol
  • OpenTelemetry.Instrumentation.Http (外部の HttpClient 呼び出しをインスツルメンテーションするためのオプション)
  • アプリケーションに適用されるその他の OpenTelemetry.Instrumentation.* パッケージ (例: Sql)

アプリケーションの起動時にASP.NET Coreのインスツルメンテーションを有効にします。通常はStartupクラスのConfigureServicesで行います。以下の例では、IServiceCollectionの拡張メソッドを使用して計装を有効にしています。このためには、OpenTelemetry.Extensions.Hostingパッケージをアプリケーションに追加する必要があります。これにより、ホストがシャットダウンしたときにインスツルメンテーションが確実にdisposeされます。

public void ConfigureServices(IServiceCollection services)

{

    ...

    services.AddOpenTelemetryTracing

     (builder => ConfigureOpenTelemetry(builder, cartStore));



    ...

}

さらに、このサービスではOpenTelemetry Collectorのエクスポーターを設定します。これには、アプリケーションにOpenTelemetry.Exporter.OpenTelemetryProtocolを追加し、エクスポーターがトレースを送信する場所を指すようにOTLPエンドポイントを構成する必要があります。

private static void ConfigureOpenTelemetry(TracerProviderBuilder builder, ICartStore cartStore)

{



   builder.AddAspNetCoreInstrumentation();

   if (cartStore is RedisCartStore redisCartStore)

   {

         builder.AddRedisInstrumentation(redisCartStore.ConnectionMultiplexer);

   }



   var exportType = Environment.GetEnvironmentVariable("NEW_RELIC_DEMO_EXPORT_TYPE") ?? "newrelic";

   var newRelicApiKey = Environment.GetEnvironmentVariable("NEW_RELIC_API_KEY");

   var newRelicTraceUrl = Environment.GetEnvironmentVariable("NEW_RELIC_TRACE_URL");

   var serviceName = "CartService" + (exportType == "newrelic" ? string.Empty : $"-{exportType}");







      builder.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName, null, null, 

      false, $"{exportType}-{Guid.NewGuid().ToString()}"));





   switch (exportType)

   {

         case "otlp":

               var otlpEndpoint = 

   Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_SPAN_ENDPOINT")?? 

   Environment.GetEnvironmentVariable("OTEL_EXPORTER_OTLP_ENDPOINT");

   Builder.AddOtlpExporter(options => options.Endpoint = otlpEndpoint);

   Break;



   ...

   ...

   ...



      }



   }

マイクロサービスのデモを実行すると、skaffold.yamlファイルのbuildargsで定義されているポート4317にOpenTelemetryのコレクターが自動的に起動し、cartserviceが使用するようになっています。

- image: cartservice

       context: src/cartservice

       docker:

       buildArgs:

             NEW_RELIC_DEMO_EXPORT_TYPE: "{{.NEW_RELIC_DEMO_EXPORT_TYPE}}"

             NEW_RELIC_API_KEY: "{{.NEW_RELIC_API_KEY}}"

             NEW_RELIC_TRACE_URL: "{{.NEW_RELIC_TRACE_URL}}"

             NEW_RELIC_METRIC_URL: "{{.NEW_RELIC_METRIC_URL}}"

             OTEL_EXPORTER_OTLP_SPAN_ENDPOINT: "otel-collector:4317"

アプリケーション データの分析

これで、New Relic One で .NET アプリケーションのデータ分析を始めることができます。下の図は、cartserviceのサマリーウィンドウで、応答時間、スループット、エラー率といったゴールデン メトリクスが表示されており、サービスに問題が発生した場合にはこれらのメトリクスから絞り込むことができます。

応答時間やエラーレートの急上昇に気づいたら、トランザクションページを使って問題の原因となるトランザクションを特定します。

さらに、特定のトランザクショントレースをクリックすると、サービスやレイヤーを横断するリクエストの詳細なエンドツーエンドのビューが表示され、問題のトラブルシューティングを迅速に行うために必要なコンテキストが表示されます。

OpenTelemetryの成長

OpenTelemetry .NET が v1.0.1 に到達したことは、OpenTelemetry にとって大きな節目であり、OpenTelemetry が広く受け入れられていることの証しです。New Relic は OpenTelemetry プロジェクトへの主要な貢献者の一人であることを誇りに思っており、すべての言語のトレースとメトリクスの両方がこの大きなマイルストーンにすぐに到達するよう、貢献と投資を続けていきます。

さらに、お客様が OpenTelemetry を簡単に導入できるように、インジェストの方法やユーザーエクスペリエンスを進化させ、オブザーバビリティ(可観測性)の機能を増やしていきます。New Relic One を発表した当初と同様に、コメントアイコンをクリックして、ユーザーインターフェースに関するフィードバックをお寄せください。

New Relic One と OpenTelemetry の機能をお試しになりたい方は、永続的な無償版にご登録ください。