Tracing
背景
GraphQL サーバーのパフォーマンスチューニングする場合には、その Resolver の Tracing が行えると役立つ。
達成したいこと
Principled GraphQL の 原則 9. Structured Logging で、Tracing についての言及がある。Tracing ではあるクエリ操作に関する情報を全て1つの場所に集約する必要があり、その内訳として以下が挙げられている。
ビジネス的情報
誰が操作を実行したか?
何がアクセスされ、変更されたか?
どの開発者のどのアプリの機能か?
操作は成功したか?
どのように動作したか?
技術的情報
どのバックエンドサービスが利用されたか?
各サービスはどのようにレイテンシーに影響したか?
キャッシュが利用されたか?
その利用用途として以下が挙げられている。
削除したいフィールドにアクセスがあるか、あれば誰がアクセスしているか確認する
あるクエリのコストを本番データを元に計算する
監視により自動的に問題を発見する
アクセスの監査ログとして利用する
ビジネスに活用する
コストモデルに基づいてコスト計算を行い請求書を発行する
どうするか
何を収集したいか
クエリを実行したユーザ
実行されたクエリの情報
Type
Field
実行されたクエリのパフォーマンス
Resolver 毎
Exception の有無
どう収集するか
多くの 分散トレーシング サービスや Apollo のように、Tracing データを集めるのには agent-pattern がよさそう。つまり、ログの収集先のサーバにエージェントを常駐させ、エージェントが収集したログを別のデータストアなりに送信する。Apollo Server のエージェントの実装も 公開されている。
https://www.apollographql.com/docs/platform/setup-analytics.html#Engine-reporting-endpoint
例
GitHub
GitHub (Report: GraphQL Schema Design @ Scale) だと、GraphQL API のヒットにフックして GraphQL の Query Analytics サービスにクエリを送信し、必要な情報に分解してデータを格納している。
分散トレーシング
調べてみると、分散トレーシング 技術が役に立つようだ。
利用されている GraphQL 実装でサポートされているものがあったりなかったり。gqlgen は OpenTracing を利用しているようだが、OpenCensus を利用している 例もあるようだ。X-Ray で Tracing する例もあるようだ。
Apollo tracing
Apollo の場合、パフォーマンスの Tracing のための拡張しようが存在し、Apollo Tracing として公開されている。これは GraphQL クエリのリクエストに対して、そのレスポンスの一部に計測情報を含めるもののようだ。
Apollo Engine
Apollo の場合、Apollo Engine が Query Tracing の機能を備えている 他、Apollo Tracing という機能でパフォーマンスデータをレスポンスに含める、もしくはサーバサイドでログに出力する等が行える。
詳しくは Apollo Engine を参照だが。