銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

OpenTelemetry .NETを理解する (7) おさらいとASP .NET Coreでの計装サンプル公開

ここでいちどおさらいです。

OpenTelemetry .NETの現在地

GitHubのページで確認できる通り、Logs、Metrics、Tracesの3要素ともStableになりました。

github.com

が、注意書きにある通り、ILoggerなどのログフレームワークから出力されたログを取り込む OpenTelemetryLoggerProviderはStableですが、これをOTLP (OpenTelemetry Protocol)でエクスポートする部分はまだStableになっていません。また、HttpClientなどの自動計装などもstableなバージョンが出ていないものもあり、使い方によってはStableではないものを使う必要がでてきます。

OpenTelemetry .NETの始め方

まずはドキュメントのGetting Startedを読みましょう。

opentelemetry.io

Consoleアプリケーションを計装してテレメトリーデータをConsole出力するので、データ保存や可視化の機能は試せませんが、コンソール内で完結するので使い方を把握するのに最適です。

ASP.NET Coreで一通り試す

次にLogs、Metrics、Tracesの3種類のデータを収集し、オブザーバビリティバックエンドを利用してデータ保存や可視化の機能まで試したい場合、ASP.NET Coreのアプリで試すのが一番よいと思っています。ここまで取り上げてきた機能を中心に、ASP.NET CoreにMetrics、Logs、Tracesを一通り設定し、OTEL ExporterでエクスポートしているサンプルをGitHubに公開しました。

github.com

エクスポート先はotel/opentelemetry-collector イメージを使ったDockerコンテナを想定していて、New Relic に送信するサンプルコマンドも上げています。オブザーバビリティバックエンド側で収集したデータを可視化できます。一例をあげてみます。

Tracesをもとにしたリクエスト数や1トランザクションあたりの平均所要時間のグラフ。

同じくTracesを基にした分散トレーシング。

Microsoft.Extensions.Loggingを使ったログ出力を、ログ処理部分のコード変更なしにOTELで収集できるロギング。

また、このロギングではTraceを識別するidが自動で付与されるため、トランザクションごとに出力されたログや例外処理時のログをすぐに特定できます。

ASP.NET CoreのRuntime Metricsを連携したMetrics。

さてこのコードの中で以前のブログで説明した部分が変わっている部分があります。Spanに例外状態を設定する部分です。

tech.tanaka733.net

以前のブログでは、以下のコードではSpanの状態が例外ステータスにならなかったのが、今回検証したところ修正されていました。

activity?.SetStatus(ActivityStatusCode.Error, "error happened.");

このようにこのコードだけでSpanが例外状態となります。

さて、次回からは別のライブラリやフレームワークを使うときにどこまでOpenTelemetry .NETで計測できるか試してみたいと思います。

OpenTelemetry .NETを理解する (6) コード修正不要な自動計装ライブラリを利用する

前回の投稿から時間が空きましたが、今回は今までとは違う方法での計装を試してみます。

今までの方法は、ソースコードの修正を前提とするものでした。トレース、ログ、メトリクスの1つ1つを詳細に計測するコードは必要なく、例えばASP.NET Coreに対応した計装ライブラリを利用できました。が、それでも、数行程度とはソースコードへの修正が必要でした。 今回試す方法は、ソースコードへの修正を必要としない方法での計装です。これは例えば、従来のNew Relic Agentと同じように、.NETのProfiler APIを利用した方法です。

さて、この方法については数ヶ月前にLTで発表しました。

その時は最初のバージョンでしたが、現在では次の0.2.0-beta1が出ています。今回はこれを試してみました。

github.com

おおまかには同じなのですが、10ページ目で言っていた課題がどうなっているかを確認してみました。

環境変数については相変わらず多いです。Macで動作しないのも同じでした。おそらく、MacOSでの.NET プロセスの権限まわりが問題だと思うのですが、詳しくはわからず... 今回は、Mac上のDockerで動作確認しました。 OTLPでの認証ヘッダーなしでのデータ転送についても変わらずですが、otel/opentelemetry-collectorを経由してデータ転送できます。

動作確認したデモアプリをここに公開しています。docker composeでアプリのコンテナとotel/opentelemetry-collectorを同時に立ち上げています。

github.com

そして、Collectorで適当なOTLPバックエンド(ここではNew Relic)を指定すると実際のデータを確認できます。

また、OpenTelemetry .NET では.NET標準のSystem.Diagnostics.Activityを利用することで手動での計装が可能です。

tech.tanaka733.net

Activityクラスは、今回ためしている自動計装ライブラリでも動作しており、例えば次のようなコードを記述すると

app.MapGet("/ExternalError", async (ILogger<Program> logger) => 
{
    var activity = Activity.Current;
    var client = new HttpClient();
    try
    {
        await client.GetStringAsync("https://httpstat.us/502");
        return "Hello World!";
    }
    catch (System.Exception e)
    {
        activity?.SetStatus(ActivityStatusCode.Error, "外部呼び出しエラー");
        logger.LogError(e, "外部呼び出しエラー");
        return "error";
    }
    
});

このように、HTTPの呼び出しスパンだけではなく、その親スパンもエラー状態と記録することができます。

また、Metricsの収集と送信にも対応しており、次のようなメトリクスを.NET Runtimeメトリクスとして収集しています。

Logsについては未対応なようです。また、更新があればまとめようと思います。

公開スライドをSlideshareからドクセルに移しています

今まで登壇資料などはSlideShareに公開していたのですが、徐々にドクセルに移しています。

www.docswell.com

一時期、docs.com を利用したこともあったのですが、サービス終了したこともありSlideShareを使い続けていました。が、買収により所有企業がころころ変わり、最近では一部の機能が有償化しているようです。一番懸念しているのが、どの機能が有償なのか、資料を公開する側が払うのか、資料を閲覧する側が払うのか明確でないということです。 基本的にはSlideShareで使っていた機能が使えることが条件だったのですが、例えばこんな機能です。

  • はてなブログなどへの埋め込みができる。できるだけ手順が簡単なのが望ましい。 => はてなブログではURLをコピぺしてページ埋め込みモードで下のように埋め込めます。
  • PPTXもしくはPDFがアップロード可能
  • スライド内のハイパーリンクが動くこと
  • 資料のページでTwitterへのシェアが可能なこと

www.docswell.com

加えて、ドクセルでは同じリンクのまま資料を更新することが可能です*1。また、ページを指定したURLハッシュに対応しているので、指定したページに直接飛ばすこともできます。

https://www.docswell.com/s/tanaka_733/KE17N5-202202-open-telemetry-net-handson#p3

実際に移行するときに気になるのがSlideShareに公開済みの既存の資料の移行ですが、ドクセルでは手順が公開されています。

www.docswell.com

SlideShareのExport機能を使うわけですが、SlideShareでのダウンロードはExport機能で出力されたURLをクリックするとWebページ内で(クライアントブラウザ内で)リダイレクトされたうえで、ファイル保存ダイアログが開く仕様になっています。つまり、プログラミングでの自動化がやりづらくなっています。なおかつ、このときのデフォルトファイル名がタイトルなどとは関連しないわかりづらいものになることがあり、ファイル数が多いとこの後の作業が非常にわかりづらい状況でした。

ドクセルではこのページに書いている通り、登録の代行もしていただけるとのことで、私も(声をかけていただいたこともあり)お願いしました。無事にすべて登録できており、まずは非公開ですべて保存されています。今後、確認しながら新しいものから順次公開しています。昨年公開した資料はすでにドクセルで公開済みにしました。

SlideShareに公開した資料は、今後デフォルトで課金されるなどなければそのままにするつもりですが、今後公開する資料はドクセルで公開する予定です。

*1:読み手が混乱するほど異なる資料をアップロードした場合は非公開になることもあると記載されています。妥当な対応だと思います。