🕌

New Relic の Transaction trace と Distributed tracing の違いをわかった気になる記事

に公開

New Relic APM を利用した際に UI に表示される Transaction trace と Distributed tracing というよーく似た2つの機能があります。UI として表示される情報はほぼ同じように見えますがこの記事を読むとその違いがチョットだけわかった気分になれる記事なります。

本記事は New Relic APM を実際にある程度使いはじめている方から向けの記事になっていますので細かい機能の説明などは省略させて頂きます。

Transaction trace

Distributed tracing

まったく同じ Trace ID bcf0385075045f2da8dc0558aee368a5 を指定したものを表示させているのですが Span の数がかなり違います。この違いがどこからきているかというのが本記事の趣旨になりますので説明をしていきます。

取得される方法が違う

まず Transaction trace と Distributed tracing では取得される(サンプリングされる)方法が異なります。

Transaction trace

Transaction trace については以下の記事を引用しますので説明を省略します。

https://qiita.com/joe225/items/edc8e0fdc0dcbf648240

めちゃくちゃ端折った表現をすると1分間で1番遅かった Trasnsaction を Transaction trace として取得するようにしています。

Distributed tracing

New Relic APM の Distributed tracing のサンプリングはヘッドベースサンプリングを使用していますが APM は adaptive sampling という手法を採用しています。

最初にリクエストを受け取るサービス(トレースオリジン)はランダムに取得するトレースを選択します。
その取得するトレースは1分あたり10トレースをサンプリングします。この10トレースを1分間の中で分散させて取得させるようにしています。

https://docs.newrelic.com/docs/distributed-tracing/concepts/how-new-relic-distributed-tracing-works/#trace-origin-sampling

またトレースオリジンで取得されたトレースが後続の New Relic APM が導入されているサービスへと伝播された場合、そのリクエストのトレースは取得するように動作をします。但し、エージェントが取得できる Span の数に1分間の制限(デフォルト2000)がありこれを超過した場合は断片化されたトレースとしてUIに表示されます。

これがまず取得される方法の違いです。

表示される情報の違い

一見見える情報としての粒度は同じように見えますが細かく見ると違いがあります。

付与される属性の違い

Transaction trace と Distributed tracing の各 Span を見ると細かい違いがあります。

例えば以下の画像は Distributed tracing もサンプリングの対象になっている Transaction trace の UI からどれか一つ Span を選択してみて見れる Attributes を確認すると。

5つの情報が表示されます。
では次に Distributed tracing で同じ箇所の Span を選択してみます。

Attributes に対して多くの情報が表示されます。
このようにして情報の粒度が異なり、Distributed tracing には Code-level metrics のようなコードレベルでのパフォーマンス情報も同時に取得することができます。

見れる情報の範囲

先ほど表示した画像を見ると展開される Span の数に大きな違いがあることがわかるかと思います。

Transaction trace はそのアプリ単体の情報を収集しており Distributed tracing はサービスを跨いだ情報を含めて横断的に可視化させることができます。

例えばこの処理を Transaction trace から見ると microservicesdemo-adservice:9555 - gRPC/hipstershop.AdService/GetAds という処理に時間がかかっています。ですがその先で何が起きているのかは見えないです。

では Distributed tracing で同じリクエストを見てみましょう。

一見 Distributed tracing の方が多くの情報がリクエスト先のサービスのリクエスト情報も見れて便利ではないかという部分もありますがこれは Transaction trace が遅い処理に対してのパフォーマンス情報を取得するということに特化しておりその処理を自動的にサンプリング対象にしてくれるという利便性もあるので優劣をつけるものではなくそれぞれに特性があるので必要に応じて利用してもらうことが重要になります。

まとめ

以上の内容を踏まえたまとめです。

  • Transaction trace は1分間で1番遅かった Trasnsaction を Transaction trace として取得するようにしている
  • Distributed tracing は1分あたり10トレースをサンプリングし、この10トレースを1分間の中で分散させて取得させるようにしている
  • Distributed tracing のほうが細かい情報は表示されているがケースに合わせて利用することが大事

以上になります。

Discussion