分散トレースを使用すると、分散システム全体でのリクエストの全過程を確認できます。Goエージェントには、2種類の分散トレースを提供しています(詳細については、 スパンサンプリングの仕組みを参照してください)。
標準(ヘッドベースのサンプリング):トレースが到着する前に、受け入れて分析するトレースの設定パーセンテージを決定します。これにより、トレースがどのように役立つかを確認するための確実な出発点が得られます。Goエージェント3.16.0以降ではデフォルトでオンになっています。
Infinite Tracing (tailベースサンプリング): 当社のクラウドベースのサービスは、すべてのトレースを受け入れ、それらを並べ替えて最も重要なものを見つけます。 Infinite tracing はすべてのトレースを分析し、最も重要なトレースをサンプリングするための設定オプションを提供します。
標準のディストリビューティッド(分散)トレーシング (ヘッドベースサンプリング) を試したい場合でも、無限トレーシング (テールベースサンプリング) もセットアップしたい場合でも、まず標準トレーシングをセットアップする必要があります。
標準の分散トレース
サービスに エージェントをまだインストールしていない場合、これが標準のディストリビューティッド(分散)トレーシング を設定するための最良の方法です。APM
ヒント
New Relic Go エージェントをインストールすると、標準のディストリビューティッド(分散)トレーシングがデフォルトでオンになります。 オフにしたい場合は、設定ガイドをご覧ください。
サービスを特定する
どのサービスがリクエストに対応しているかを把握し、各サービスをインストルメント化してトレースデータをNewRelicに送信できるようにします。
APMエージェントを使用して各サービスを計量する
あなたの場面に関係するサービスごとに、エージェントの個別の説明を実行します。 一部のサービスで他の言語を使用する場合は、その言語のインストール手順を繰り返すだけです。
ヒント
Go エージェントでは、他のNew Relicエージェントの自動インストゥルメンテーションとは異なり、Go サービスを手動で計量する必要があります。 つまり、Go エージェントを使用するには、コードにいくつかの行を追加する必要があります。 これについては、以下のインストレーションを開始するとわかります。
インストール ルーチンを開始するには、下のタイルをクリックします。各エージェントのインストールが完了したら、ここに戻って トレースを表示するためのヒントを参照してください。
トレースを表示
各サービスをAPMエージェントでインストルメント化した後、アプリケーションでトラフィックを生成して、トレースをキャプチャできるようにします。UIでトレースを表示する方法は次のとおりです。
特定のサービスのトレースを確認する1つの方法は次のとおりです。
- one.newrelic.com > All capabilities > APM & servicesに移動します。
- エンティティ(サービス)をクリックします。
- 左側のペインのMonitorセクションで、 Distributed tracingをクリックします。
- 詳細については、個々のトレースをクリックしてください。 上部のメニューでGroup similar tracesがオンになっている場合は、トレース グループをクリックしてから、個々のトレースをクリックします。
- 必要なトレースが表示されない場合は、
trace.id
でフィルタリングできます。
アカウントをまたがるトレースを表示するには:
- one.newrelic.com > All capabilities > Tracesに移動します。
- 左側のペインでエンティティ(サービス)を選択します。
- 詳細については、個々のトレースをクリックしてください。 上部のメニューでGroup similar tracesがオンになっている場合は、トレース グループをクリックしてから、個々のトレースをクリックします。
- 必要なトレースが表示されない場合は、
trace.id
でフィルタリングできます。
ログとトレースの詳細をまとめて、トラブルシューティングをより簡単かつ迅速に行うことができます。ログをコンテキストに含めると、NewRelicUIのトレースと一緒にログメッセージを表示できます。
特定のサービスを含むトレースの表示またはアカウント全体のトレースの表示の手順を使用して興味深いトレースを見つけたら、次の手順を実行します。
- コンテキスト内でログを有効にしている場合は、 Logsタブ ( Trace detailsの横) をクリックします。
- 個々のログに関連する詳細を表示するには、メッセージを直接クリックします。
UIでトレースを見つけるための詳細については、以下を参照してください。
無限トレース(オプション)
エージェント用の 標準のディストリビューティッド(分散)トレーシングは トレースの最大 APM10% をキャプチャしますが、すべてのデータを分析して最も関連性の高いトレースを見つけたい場合は、 無限トレーシング を設定できます。
始める前に、まず要件を満たしていることを確認してください。
標準ディストリビューティッド(分散)トレーシングのセットアップを完了する
Infinite Tracing セットアップは、標準のディストリビューティッド(分散)トレーシングに基づいて構築されています。 したがって、上記の手順を完了したことを確認してから、トレース オブザーバーのセットアップを続行してください。
トレース オブザーバーをセットアップする
トレースオブザーバーは、すべてのトレースを収集して分析するNewRelicAWSベースのサービスです。トレースオブザーバーの設定の手順に従います。完了したら、トレースオブザーバー情報をここに戻し、次の手順に進んでエージェントを構成します。
無限トレース構成設定には、標準の分散トレースに加えて、トレースオブザーバーに関する情報が含まれます。
設定の概要は次のとおりです。
タイプ | 必要な構成 |
---|
無限のトレース | 構成オプション: newrelic.Config 構造:
app, err := newrelic.NewApplication( newrelic.ConfigAppName(YOUR_APP_NAME), newrelic.ConfigLicense(YOUR_LICENSE_KEY), func(cfg *newrelic.Config) { cfg.InfiniteTracing.TraceObserver.Host = YOUR_TRACE_OBSERVER_HOST
環境変数:
|
ヒント
プロキシ設定についてサポートが必要な場合は、 プロキシサポートを参照してください。
(オプション) 無限トレースをカスタマイズする
エージェント構成設定を追加すると、NewRelicUIにデータが表示されるようになります。データの分析に時間を費やした後、無限トレースの機能のいくつかを調整することをお勧めします。
追加の手動計装
Goエージェントと分散トレースのすべてのインストールには、 Goエージェント構成設定にリストされている設定を使用した手動のインストルメンテーションが必要です。それでも、セットアップを選択するには、追加の構成が必要になる場合があります。トランザクションとHTTPリクエストをインストルメント化するためのガイドラインを次に示します。
Goのhttp.ServeMux
を使用していて、New Relicの分散トレースを有効にする場合は、GoアプリケーションにNewRelicのWrapHandle
}ラッパーとWrapHandleFunc
ラッパーをインストルメントする必要があります。これらのラッパーは、要求および応答ライターとのトランザクションを自動的に開始および終了します。これにより、正しい分散トレースヘッダーが自動的に追加されます。ヘッダー伝播の仕組みの詳細については、分散トレースの仕組みを参照してください。
ここでは、インスツルメンテーションを行う前のコードの例を示します。
http.HandleFunc("/users", usersHandler)
そして、同じコードをインストルメンテーションした後の例です。
http.HandleFunc(newrelic.WrapHandleFunc(app, "/users", usersHandler))
これらのラッパーの使用については、 Instrument Go transactions で詳しく説明しています。
アウトバウンドのHTTPリクエストを分散トレーシングの対象とするために、 外部セグメント を作成します。
アウトバウンドHTTPリクエストの外部セグメントを作成する最も簡単な方法は、 newrelic.NewRoundTripper
メソッドを使用することです。発信分散トレースヘッダーを含むhttp://api.example.com
へのリクエストの例を次に示します。
func useNewRoundTripper(txn *newrelic.Transaction) (*http.Response, error) {
client.Transport = newrelic.NewRoundTripper(client.Transport)
request, _ := http.NewRequest("GET", "http://example.com", nil)
request = newrelic.RequestWithTransactionContext(request, txn)
return client.Do(request)
Go標準ライブラリのhttp.Request
を使用するより複雑なリクエストがある場合は、 newrelic.StartExternalSegment
メソッドを使用して、アウトバウンドリクエストが分散トレースに適格であることを確認します。
func external(txn *newrelic.Transaction, req *http.Request) (*http.Response, error) {
s := newrelic.StartExternalSegment(txn, req)
response, err := http.DefaultClient.Do(req)
構造体リテラルで作成されたExternalSegment
は、分散トレースには使用できません。このため、NewRelicではnewrelic.NewRoundTripper
またはnewrelic.StartExternalSegment
の使用をお勧めします。
func noGoodForDt(txn *newrelic.Transaction, url string) (*http.Response, error) {
defer newrelic.ExternalSegment{
StartTime: txn.StartSegmentNow(),
分散トレースのペイロードには、New Relic が複数のサービスで発生したトランザクションをつなぎ合わせて完全なトランザクショントレースにするための情報が含まれています。New Relic が監視しているサービスが相互にトレースコンテキストを送信していない場合、トレースの詳細が不完全になります。
以下のAPIコールを使用して分散型トレーシングを実装する方法についての一般的な説明は、まず Use distributed tracing APIs を参照してください。
あなたがしたい場合は... | これを使用 |
---|
呼び出されたサービスに送信されるペイロードを作成します。 | |
最初のサービスから送られたペイロードを受け取る。その結果、これらのサービスを1つのトレース内で結びつけることができる。 | |
これらの使用方法の詳細については、 Go agent GitHub repo を参照してください。