はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】protocのplugin作成をOpenTelemetryを活用して楽にデバッグをする

はじめに

先日protocpluginについて紹介したのですが、それに関連してデバッグについて書こうと思います。

www.hanachiru-blog.com

また私は普段Riderを利用しているのでRider前提です。

概要

protocpluginを作成するにあたって、デバッグしたいことはよくあると思います。ただprotocで直接C#のプロジェクトを指定することはできず、必ずビルド済の実行バイナリを指定しなければなりません。(もしかしたら迂回方法があるのかもしれませんが、私は知らないです...)

また厄介なのが標準出力をしてしまうとうまく動作しないので、例えばエラー情報などをまとめたデバッグ用ファイルを毎回出力するみたいな対応をしたりもします。ただ教えていただいてかなり良かったのがOpenTelemetryを活用する方法です。

learn.microsoft.com

そして更に嬉しいことに、JetBrains製のOpenTelemetryプラグインがRider 2025.2から利用可能になりました。以下の画像は実際に利用している様子です。

利用している様子

かなり使い心地が良いので、この記事では詳しく使い方を紹介していきます。

使い方

plugin側の対応

NuGetパッケージの導入

まずは以下のNuGetパッケージを導入します。

  • Microsoft.Extensions.Logging
  • OpenTelemetry.Exporter.OpenTelemetryProtocol

github.com

$ dotnet add package Microsoft.Extensions.Logging
$ dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
コードの対応

Loggingの使い方は以下のとおりです。

// Logging
using var loggerFactory = LoggerFactory.Create(builder =>
{
    builder.AddOpenTelemetry(options =>
    {
        options.IncludeFormattedMessage = true;

        // このあたりかなり自信がなく、一旦RiderのOTLPエンドポイントを指定(後ほど修正するかもです)
        // OTEL_EXPORTER_OTLP_ENDPOINT = http://localhost:17011
        options.AddOtlpExporter(opt =>
        {
            opt.Endpoint = new Uri(" http://localhost:17011");
        });
    });
});
var logger = loggerFactory.CreateLogger<Program>();

logger.LogError("This is a sample {LogType} log message.", "error");

opentelemetry-dotnet/docs/logs/getting-started-console/Program.cs at main · open-telemetry/opentelemetry-dotnet · GitHub


TracingMetricsについては下記にサンプルがあります。ただしTraceに関してはまだ可視化できるViewerはないようです。(Automatic architecture visualizationでは利用しているみたい)
opentelemetry-dotnet/docs/trace/getting-started-console/Program.cs at main · open-telemetry/opentelemetry-dotnet · GitHub
opentelemetry-dotnet/docs/metrics/getting-started-console/Program.cs at main · open-telemetry/opentelemetry-dotnet · GitHub

Rider側の対応

OpenTelemetryプラグインの有効化

Riderを立ち上げ、設定(setting) => プラグイン(plugin)からOpenTelemetryを探してインストール、再起動すればOKです。

プラグインの有効化
実行する

実際にprotocを実行してみます。

$ dotnet publish -o ./publish
$ protoc --plugin=protoc-gen-myplugin=./publish/CustomProtocPlugin --myplugin_out=./output ./sample.proto
Riderのサービスを見る

RiderのサービスにOpenTelemetryがあるはずです。

OpenTelemetry

そこにLogs・Metricsが出ているはずです。また構造化ログにも対応していますし、ログからコードに移動(Navigate to Code)も可能です。

Navigate to Code
実行/デバッグ構成から実行する

またRiderからprotocを実行することもできます。

Riderの右上のある実行/デバッグ構成から構成の編集...を選択し、左上の新規構成の追加からネイティブ実行可能ファイルを選択して項目を埋めればいけます。

実行/デバッグ構成

Zero-setup auto-instrumentationの箇所によると環境変数などを自動でセットアップとかしてくれるみたいです?ちょっとこのあたりちゃんと理解できていないので、後ほど修正します。
blog.jetbrains.com