New Relic の Go エージェントで 分散型トレース を有効にして設定する方法についてはこちらをご覧ください。
ディストリビューティッド(分散)トレーシングの有効化
Goアプリケーションで分散型トレースを有効にするには
Goエージェントの設定 を使用して、希望する分散型トレースのタイプに合わせて設定します。
- 標準ディストリビューティッド(分散)トレーシング
- 無限トレーシング
トランザクションとリクエスト・インスツルメンテーション・ガイドライン を続けてお読みください。
トランザクションとHTTPリクエストの計測
分散トレーシングが最適に機能するためには、Goアプリケーションが以下のシナリオのガイドラインを遵守する必要があります。
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) {
// Distributed tracing headers are not added to the outgoing request.
// Use newrelic.NewRoundTripper or newrelicc.StartExternalSegment instead.
defer newrelic.ExternalSegment{
StartTime: txn.StartSegmentNow(),
分散トレースのペイロードには、New Relic が複数のサービスで発生したトランザクションをつなぎ合わせて完全なトランザクショントレースにするための情報が含まれています。New Relic が監視しているサービスが相互にトレースコンテキストを送信していない場合、トレースの詳細が不完全になります。
以下のAPIコールを使用して分散型トレーシングを実装する方法についての一般的な説明は、まず Use distributed tracing APIs を参照してください。
あなたがしたい場合は... | これを使用 |
---|
呼び出されたサービスに送信されるペイロードを作成します。 | |
最初のサービスから送られたペイロードを受け取る。その結果、これらのサービスを1つのトレース内で結びつけることができる。 | |
これらの使用方法の詳細については、 Go agent GitHub repo を参照してください。
トレースの詳細についてログを調べる
ログとアプリケーションのデータを統合して、トラブルシューティングをより簡単かつ迅速に行うことができます。コンテキストのログでは、エラーとトレースに関連するログメッセージをアプリケーションのUIで直接表示できます。
- Transactionsページでトレースをクリックして、Trace detailsページに移動します。
- トレースの詳細ページで、See logsをクリックします。
- 各ログメッセージに関連する詳細を表示するには、メッセージを直接クリックしてください。
また、Kubernetesクラスターなどのインフラストラクチャデータのコンテキストでログを表示することもできます。で別のUIページに切り替える必要はありません。