この連載記事では、gRPC通信をしている.NETアプリに関してNew Relic .NET Agentを使ってgRCP部分の計装がどこまでできたかに関する調査をまとめたいと思います。
調査の動機としては、ドキュメント上にはサポートされるラリブラリとしてgRPCの記載がないことが挙げられます。
.NET agent: compatibility and requirements for .NET Core | New Relic Documentation
そのため、検証結果によらずgRPC関連の計測に関してはサポート対象外となります。が、検証した限り、ある程度の計測は可能だと分かりましたので、お客様が利用するかどうかの判断の助けになるよう結果を共有することにしました。
まず最初の記事として、一番基本的なgRPCサーバーとコンソールアプリによる通信の計測を取り上げます。計測対象となるアプリは、.NET のドキュメントにある手順で作成したものになります。
チュートリアル: ASP.NET Core で gRPC のクライアントとサーバーを作成する
今回はクライアントとしてはコンソールアプリケーションでサーバーがASP.NET Coreを利用しており、両者とも.NET Coreで動作します。また、検証ではdocker desktopを使った環境で行っています。
実際に動かしたコードはGitHubで公開しています。
New Relic .NET AgentによるgRPCアプリの計測デモアプリ
さて、結果ですが、gRPC向けの特別な計装コードを追加することなくExternalとして計測し分散トレーシングがつながることが確認できました。ただし、コンソールアプリケーションではトランザクションとして計測するためにはカスタム計装が必要です。これはgRPC通信に限らない挙動となっています。カスタム計装についてはこちらのドキュメントに説明があります。
今回必要なカスタム計装はトランザクションとして計測したいメソッドにNewRelic.Agent.ApiパッケージのTransaction属性を追加するだけです。
準備できたら、用意したdocker composeファイルを使ってクライアントとサーバーアプリの両方を起動します。しばらくするとNew Relic UIでDOTNET_GRPC_ClientとDOTNET_GRPC_Serviceという名前で2つのアプリが確認できます。
まず、クライアント側のDOTNET_GRPC_Clientから見ていきましょう。属性を追加した処理のスループット(サンプルでは1分間に1回)や所要時間の時間変化が確認できます。

External servicesのUIに移ると、gRPCによる通信先であるGRPC_DOTNET_ServiceアプリがExternal Entityとして表示され、そのパフォーマンスが確認できます。

Distributed tracingのUIから該当のトレースを表示するとクライアントスパンとサーバースパンがそれぞれ確認でき、分散トレーシングがgRPC通信でも繋がっていることが確認できます。

また、スパンの属性を見ると、gRPC通信で付与されるHTTPのヘッダーを確認できます。

そして、サーバー側であるGRPC_DOTNET_Serviceアプリを開くと、gRPC通信を行なっているサーバーサイドの処理が計測できていることがわかります。サーバーサイドに関してはNew Relic .NET Agentをインストールしただけの状態で計測できています。


以上のように、gRPC通信は特別な計装なく.NET Agentでも計測できることがわかりました。今後はもう少し複雑なケースでの検証を進めたいと思います。検証してほしいシナリオなどがありましたら、ぜひご連絡ください。
다음 단계
이 블로그에 표현된 견해는 저자의 견해이며 반드시 New Relic의 견해를 반영하는 것은 아닙니다. 저자가 제공하는 모든 솔루션은 환경에 따라 다르며 New Relic에서 제공하는 상용 솔루션이나 지원의 일부가 아닙니다. 이 블로그 게시물과 관련된 질문 및 지원이 필요한 경우 Explorers Hub(discuss.newrelic.com)에서만 참여하십시오. 이 블로그에는 타사 사이트의 콘텐츠에 대한 링크가 포함될 수 있습니다. 이러한 링크를 제공함으로써 New Relic은 해당 사이트에서 사용할 수 있는 정보, 보기 또는 제품을 채택, 보증, 승인 또는 보증하지 않습니다.