Ichizokuは日本唯一のSentry公認販売業者です。 日本語のドキュメント、動画、サポート窓口で日本のお客様のSentry活用を支援します。

SentryとOpenTelemetryによるAspire Insightsの本番稼動対応

Aspire 101

.NET8のリリースに伴い、Microsoftは分散アプリケーションの作り方を大きく変える.NET Aspireと呼ばれる新しいフレームワークをリリースしました。

Aspireは、.NETでの分散アプリケーションの構成とデプロイを簡単にします。

詳細については、Aspireのドキュメントを参照してください。
Aspireを使用してアプリケーションをビルドすると、以下のような利点があります。

  • OpenTelemetryのログ、メトリクス、トレース
  • ヘルスチェック
  • サービスディスカバリー
  • .NETでのオーケストレーション(KubernetesやDockerの設定ファイルに潜る必要なし)
  • その他多数

Aspireには、”リソース”(Aspireでは分散システムの様々なコンポーネントを “リソース “と呼ぶ)から生成されるテレメトリを簡単にナビゲートできるダッシュボードが付属しています。

これらすべてが、かなりクールな開発者体験をもたらします。

そして、我々は、OpenTelemetry データを Sentry と簡単に共有することができます。Sentry は、テレメトリーデータから得られる全ての洞察に加えて、Sentry が提供する全てのクールなもの(クラッシュレポート、ソースマップ、.NET でビルドされていない分散アプリケーションコンポーネントを計測する機能など)を提供してくれます。

また、Sentryを使えば、開発現場でも生産現場でも、このインストルメンテーションを利用することができます(現在、Aspireのダッシュボードは開発者のみの体験となっています)。

では、どのように配線するのか見てみましょう!

注:以下のすべてのソースコードはGitHubで入手可能です。

基本的なAspireソリューションの作成

Aspire を使い始めるための良いチュートリアルがいくつかあるので、ここでは詳しく説明しません。
まず、ツールのセットアップが完了したら、コマンドラインから新しい aspire ソリューションを作成します。

これは、最小 API (ApiService)、Blazor フロントエンド (Web)、Aspire ソリューションのバックボーンとなる 2 つのプロジェクト (AppHost と ServiceDefaults) から構成される aspire-starter テンプレートを使用して、新しい Aspire ソリューションを作成します。

ServiceDefaults には、ソリューション内のすべてのプロジェクトに共通する設定を配線するためのさまざまな拡張メソッドが含まれています。

AppHostはすべてのオーケストレーションに使用され、開発マシン上ですべてをパワーアップしたいときに実行するアプリケーションです。
便利なダッシュボードも含まれています。

ダッシュボードには、分散アプリケーションの各「リソース」に対応するURLへの便利なリンクに加え、それぞれのログ、トレース、メトリクスが表示されます。

Sentry でそれを見ることができたら、素晴らしいと思いませんか?

Sentryへのトレース送信

各 Aspire プロジェクトは、ログ、メトリクス、トレース情報を OpenTelemetry 経由で利用できるように設定されています。

これは AspireWithSentry.ApiService/Program.cs の AddServiceDefaults の呼び出しによってトリガされます。

その拡張メソッドを調べてみると、一番最初にConfigureOpenTelemetryを呼び出しているのがお分かりいただけます。

SentryにはもちろんOpenTelemetry Supportがあるので、これをSentryに接続するのはとても簡単です。
Sentry Docsに記載されている手順に従って、ServiceDefaultsプロジェクトに必要な変更を加えるだけで完了します。
以下の手順の通りです。

  1. Sentry パッケージへの参照を追加する
  2. データを Sentry に送るように OpenTelemetry を設定する
  3. Sentry を初期化し、OpenTelemetry を使うように設定する
1. Sentryパッケージの参照を追加する

そのために、ServiceDefaultsプロジェクトにいくつかのパッケージ・リファレンスを追加するだけだ:

2. Sentryにテレメトリーデータを送信する

SentryにTelemetryデータを送信 するには、Sentryのドキュメントに従って、定型のConfigureOpenTelemetryメソッドを微調整 します:

3. OpenTelemetry で Sentry を使うようにプロジェクトを設定する

最後に、ソリューション内の各プロジェクトで Sentry を使用するように設定する必要があります。そのためには、ServiceDefaultsプロジェクトに以下の拡張メソッドを追加する必要があります:

これで AspireWithSentry.ApiService/Program.cs と AspireWithSentry.Web/Program.cs の両方からそのメソッドを呼び出せるようになりました。

これで完了です!
AspireWithSentry.AppHostプロジェクトを実行することで、分散アプリをパワーアップすることができます。
Webフロントエンドをナビゲートすると(カウンタをインクリメントし、天気予報をチェックする)、すべての素敵なトレースがSentryのパフォーマンスダッシュボードに流れていることがわかります!

注:上記のフックアップ方法は、WebプロジェクトとApiServiceプロジェクトの両方で同じ設定を使用することを想定しています。拡張メソッドで提供した configureOptions パラメータを使用して、プロジェクトごとに設定を上書きすることができます(または、appsettings.jsonに設定を記述することもできます)。

SQLデータベースの追加

ほとんどの分散アプリケーションは、何らかのデータ永続性を持っています。
アプリにSQLサーバーを追加してみましょう。

Aspireでは、これは本当に簡単にできます。

  1. Aspire Sql コンポーネントの追加する
  2. SQL Server Resource をオーケストレータに追加する
  3. クライアントプロジェクトからデータベースに問い合わせる
1. Aspire SQL コンポーネントを追加する

まず、ServiceDefaultsプロジェクトに Aspire.Microsoft.Data.SqlClient… のパッケージリファレンスを追加し、バージョンについては、aspire-starter テンプレートから他のAspireコンポーネントのバージョンと一致させます(私の場合、これは8.0.0-preview.2.23619.3です)。

2. SQL Serverリソースの追加

次に、AspireWithSentry.AppHost/Program.cs で、ApiService の依存関係として SQL Server コンテナを作成する必要があります。

C

次に、AspireWithSentry.ApiService/Program.cs で、依存性注入で利用できるように、これをサービスプロバイダに登録します。

3. 1999年のようなクエリー

最後に、ApiService の新しいAPIエンドポイントでSQL接続を使用することができます。

実際に実行されるSQLは、小さなヘルパークラスで定義されます。

これはとてもヒドいコードですね。🤡

新しいAPIエンドポイントを利用するためのUXを構築しましょう。

UXの追加

まず、新しいエンドポイントを簡単に呼び出せるように、AspireWithSentry.Web/WeatherApiClient.cs を修正する必要があります。

さて、新しいエンドポイントを使用するために、AspireWithSentry.Web/Components/Pages/Home.razor の内容を以下のように置き換えます。

さぁ、エンジンをかけてテストしてみましょうか……。

新しいボタンをクリックするとバグが発生することがわかりました!
こんなことになるとは思わなかった……🥸

Sentryではどう見えるのか?


中身を確認すると、50行目の AspireWithSentry.ApiService プログラムにエラーがあることがわかりますね。

完全なトレースを見るためのリンクがあります。
それをクリックすると、以下のように表示されます。

Blazorフロントエンドからのオリジナルのリクエストと、GET /crashtest エンドポイントへの複数のリクエストが表示されています。
これは、Aspire がデフォルトで HttpClient にワイヤーアップしている Microsoft.Extensions.Resilience 機能であることを示しています。

また、これらのリクエストに未処理のエラー(各トレースの左にある炎のアイコン)があったこともわかります。
そのうちのひとつをクリックすると、エラーの詳細を見ることができます。

ここでは、SQL クエリの詳細と、DB 接続用に作成されたスパンのコンテキスト(つまり、tempdb 接続がオープンされた後、クローズされる前)で例外が発生したことが確認できます。

これは、Sentryのクラッシュレポート機能が、Aspireでビルドされた分散アプリケーションから得られる豊富な遠隔測定情報をどのように補完するかがわかる素晴らしい例です。

もう少し手を加えれば、このような機能(デバッグシンボルとソースマップをSentryにアップロードする)をさらに良くすることができますが、それはこのブログ記事の範囲外です。

とりあえず、Aspireアプリケーションで利用可能な他の情報に話を戻しましょう。

Sentryにメトリクスを送信する

ServiceDefaults プロジェクトの Extensions.ConfigureOpenTelemetry をもう一度見てみると、トレースに加えて、様々なビルトインメトリクスがAspireアプリケーションのデフォルトで有効になっていることがわかります。

Sentry .NET SDKは、これらすべてのメトリクスをキャプチャするための実験的なサポートを持っています。
そのため、Sentryの初期化コードに少し手を加えるだけで、これらもSentryに流すことができます。

上記のコードは、.NET SDKの実験的なメトリクス機能を有効にし、Sentryが知っているすべての組み込みメトリクス(Aspireアプリケーションによって生成されたすべてのメトリクスを含む)をキャプチャするように構成します。

これで、Aspireのダッシュボードに表示されているのと同じメトリクスが、Sentryでも利用できるようになりました!

まとめ

Aspire は、アプリのオーケストレーションを簡素化し、パワフルな OpenTelemetry を迅速に提供します。

一方 Sentry は、テレメトリをキャプチャして視覚化し、クラッシュレポートや.NET 以外の言語で構築されたコンポーネントのインスツルメンテーションのような機能で補完するための、堅牢な生産準備インフラストラクチャを提供します。

AspireとSentryはすでに強力な組み合わせであり、まだまだ成長途中です。
Aspireフレームワークがどのように進化していくのかとても楽しみですし、将来的にAspireとSentryをより簡単に統合できる方法をご提供できるように改善し続けていきます。

 


 

IchizokuはSentryと提携し、日本でSentry製品の導入支援、テクニカルサポート、ベストプラクティスの共有を行なっています。Ichizokuが提供するSentryの日本語サイトについてはこちらをご覧ください。またご導入についての相談はこちらのフォームからお気軽にお問い合わせください。

シェアする

Recent Posts