分散トレースを使用すると、分散システム全体でのリクエストの全過程を確認できます。Goエージェントには、2種類の分散トレースを提供しています(詳細については、 スパンサンプリングの仕組みを参照してください)。
- 標準(ヘッドベースのサンプリング):トレースが到着する前に、受け入れて分析するトレースの設定パーセンテージを決定します。これにより、トレースがどのように役立つかを確認するための確実な出発点が得られます。Goエージェント3.16.0以降ではデフォルトでオンになっています。
- 無限トレース(テールベースのサンプリング):当社のクラウドベースのサービスは、すべてのトレースを受け入れ、それらをソートして最も重要なものを見つけます。標準トレースを設定した後、このオプションを追加することをお勧めします。これは、すべてのトレースを分析し、最も重要なトレースをサンプリングするための構成オプションを提供するためです。
分散トレースを開始するために必要なすべての手順は、次のとおりです。
新しいGoエージェント
標準の分散トレース (ヘッドベースのサンプリング) を試してみたいだけか、無限トレース (テールベースのサンプリング) をセットアップしたいかどうかに関係なく、標準のトレースをセットアップすることから始める必要があります。私たちはあなたを通り抜けます ヘッドベースのサンプリングを開始するためのエージェントのインストール。 その後、オプションですが推奨される Infinite Tracing を設定できます。
ヒント
Goエージェントでは、他のNew Relicエージェントの自動インストルメンテーションとは異なり、Goサービスを手動でインストルメントする必要があります。つまり、Goエージェントを使用して分散トレースを有効にするには、コードにいくつかの行を追加する必要があります。
エージェントをインストールして、標準の分散トレースを取得します
これは、サービスにAPMエージェントをまだインストールしていない場合、または追加のサービスをインストルメント化する場合に、標準の分散トレースを設定するための最良のアプローチです。
このAPMエージェントでインストルメント化されたサービスがすでにいくつかあり、それらを分散トレースに含めたい場合は、各サービスの分散トレースを手動で有効にする必要があります。古いGoエージェントのオプションを参照してください。
ステップ1.サービスを特定する
どのサービスがリクエストに対応しているかを把握し、各サービスをインストルメント化してトレースデータをNewRelicに送信できるようにします。
ステップ2.各サービスをAPMエージェントでインストルメント化する
トランザクションに関係するサービスごとに、エージェントのインストールルーチンを繰り返します。一部のサービスが他の言語を使用している場合は、それらの言語のインストール手順を繰り返すだけです。
インストールルーチンを開始するには、下のタイルをクリックします。各エージェントのインストールが完了したら、ここに戻ってトレースを表示するためのヒントを確認してください。
ステップ3.トレースを表示する
各サービスをAPMエージェントでインストルメント化した後、アプリケーションでトラフィックを生成して、トレースをキャプチャできるようにします。UIでトレースを表示する方法は次のとおりです。
特定のサービスのトレースを確認する1つの方法は次のとおりです。
- one.newrelic.com > All capabilities > APM & servicesに移動します。
- エンティティ(サービス)をクリックします。
- 左側のペインの[監視]セクションで、[分散トレース]をクリックします。
- 詳細については、個々のトレースをクリックしてください。トップメニューで[類似のトレースをグループ化]がオンになっている場合は、トレースグループをクリックしてから、個々のトレースをクリックします。
- 必要なトレースが表示されない場合は、
trace.id
でフィルタリングできます。
アカウントをまたがるトレースを表示するには:
- one.newrelic.com > All capabilities > Tracesに移動します。
- 左側のペインでエンティティ(サービス)を選択します。
- 詳細については、個々のトレースをクリックしてください。トップメニューで[類似のトレースをグループ化]がオンになっている場合は、トレースグループをクリックしてから、個々のトレースをクリックします。
- 必要なトレースが表示されない場合は、
trace.id
でフィルタリングできます。
ログとトレースの詳細をまとめて、トラブルシューティングをより簡単かつ迅速に行うことができます。ログをコンテキストに含めると、NewRelicUIのトレースと一緒にログメッセージを表示できます。
特定のサービスを含むトレースの表示またはアカウント全体のトレースの表示の手順を使用して興味深いトレースを見つけたら、次の手順を実行します。
- コンテキストでログを有効にしている場合は、[ログ]タブ([トレースの詳細]の横)をクリックします。
- 個々のログに関連する詳細を表示するには、メッセージを直接クリックします。
UIでトレースを見つけるための詳細については、以下を参照してください。
無限トレースのセットアップ
APMエージェントの標準分散トレース(上記)は、トレースの最大10%をキャプチャしますが、すべてのデータを分析して最も関連性の高いトレースを見つけたい場合は、無限トレースを設定できます。
ヒント
この機能の詳細については、「 無限トレース」を参照してください。
開始する前に、まず要件を満たしていることを確認してください。
手順1.新しいエージェントのインストールを完了します
Infinite Tracingセットアップは、標準の分散トレース用の新しいエージェントインストールからのインストルメンテーションステップに基づいています。
ステップ2.トレースオブザーバーを設定します
トレースオブザーバーは、すべてのトレースを収集して分析する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
環境変数:
|
ステップ4.(オプション)無限トレースをカスタマイズする
エージェント構成設定を追加すると、NewRelicUIにデータが表示されるようになります。データの分析に時間を費やした後、無限トレースの機能のいくつかを調整することをお勧めします。
古いGoエージェントのオプション
古いGoエージェントがある場合は、このセクションを使用して、必要な分散トレース機能がサポートされているかどうかを確認してください。
互換性情報に続いて、標準の分散トレースをオンにするための基本的な構成設定を示すセクションがあります。古いエージェントがInfiniteTracingをサポートしていて、それを設定する場合は、上記の手順を参照してください。
互換性ガイド
以下の互換性情報を確認した後、構成設定に従います。
必要なGoエージェントバージョンをインストールまたは更新します。最良の結果を得るには、最新のGoエージェントバージョンに更新してください。
オプション | エージェントバージョンにGo |
---|
標準の分散トレース | 2.1.0以上 W3Cトレースコンテキストの場合:3.1.0以上 |
無限のトレース | v3.5.0(W3Cトレースコンテキストを含む) サポートされている環境:1.9以降に移行 |
分散トレースを有効にするには、以下の設定を参照してください。
ヒント
分散トレースを使用せずに古いエージェントを使用している場合は、分散トレースをオンにする前に、APMへの影響を確認してください。
設定の概要は次のとおりです。構成の詳細については、 Go エージェントの構成を参照してください。
タイプ | 必要な構成 |
---|
標準の分散トレース | 構成オプション: ConfigOption 構造:
newrelic.ConfigAppName("Example App"), newrelic.ConfigLicense(os.Getenv("NEW_RELIC_LICENSE_KEY")), newrelic.ConfigDistributedTracerEnabled(true),
環境変数: NEW_RELIC_DISTRIBUTED_TRACING_ENABLED=true
|
無限のトレース | 古いエージェントが無限トレースをサポートしている場合は、上記の構成手順を参照してください。 |
追加の手動計装
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 を参照してください。