Goエージェントは、 クロスアプリケーショントレース(CAT)をサポートしています 。クロスアプリケーショントレースは、APMが監視するアプリ間のトランザクションをリンクするもので、サービス指向アーキテクチャやマイクロサービスアーキテクチャを実装するアプリケーションには不可欠です。
重要
クロスアプリケーション トレーシングはディストリビューティッド(分散)トレーシングに代わって非推奨となり、将来のエージェント バージョンでは削除される予定です。
Goでクロスアプリケーショントレースを有効にする
CrossApplicationTracer.Enabled構成フラグを使用して、Go エージェントでクロス アプリケーション トレースを有効または無効にできます。
GoによるトランザクションとHTTPリクエストのガイドライン
クロスアプリケーショントレースを有効にしても、アプリケーションがHTTP(s)リクエストに応答したり、独自のHTTP(s)リクエストを作成したり、 独自のトランザクションを作成したりする際には、いくつかの簡単な規則に従っていることを確認する必要があります 。
Go のhttp.ServeMuxを使用していて、CAT のサポートが必要な場合は、エージェントのWrapHandleおよびWrapHandleFuncラッパーを使用する必要があります。これらのラッパーは、正しい CAT ヘッダーを自動的に追加するリクエストおよびレスポンス ライターとのトランザクションを自動的に開始および終了します。コードは次のようになります。
http.HandleFunc("/users", usersHandler)
http.HandleFunc(newrelic.WrapHandleFunc(app, "/users", usersHandler))
これらのラッパーについては、 Instrument Go transactions で詳しく説明されています。
app.StartTransactionで独自のトランザクションを作成する場合は、必ずTransaction.SetWebRequestとTransaction.SetWebResponseも呼び出してください。たとえば、次のコードで開始されたトランザクションでは、CAT が有効になります。
txn := app.StartTransaction("transactionName")
txn.SetWebRequestHTTP(req)
writer = txn.SetWebResponse(writer)
ただし、 Transaction.SetWebRequestおよびTransaction.SetWebResponseの呼び出しなしでトランザクションが開始され、 will notでは CAT が有効になっています。
txn := app.StartTransaction("transactionName")
また、HTTP 応答コードを設定する場合は、標準ライブラリのhttp.ResponseWriter.WriteHeaderメソッドではなく、Go エージェントのtxn.WriteHeaderメソッドを使用してください。
txn := app.StartTransaction("transactionName")
writer = txn.SetWebResponse(writer)
writer.WriteHeader(http.StatusInternalServerError)
アウトバウンドのHTTP(s)リクエストをCATの対象とするためには、 外部セグメントを作成する必要があります 。
アウトバウンド HTTP(s) リクエスト用の外部セグメントを作成する最も簡単な方法は、 newrelic.NewRoundTripperメソッドを使用することです。たとえば、次のコードは、発信 CAT ヘッダーを含むhttp://api.example.com/への要求を行います。
func useNewRoundTripper(txn *newrelic.Transaction) (*http.Response, error) {
client.Transport = newrelic.NewRoundTripper(client.Transport)
req, _ := http.NewRequest("GET", "http://api.example.com/", nil)
req = newrelic.RequestWithTransactionContext(req, txn)
Go 標準ライブラリのhttp.Requestを使用するより複雑なリクエストがある場合は、 newrelic.StartExternalSegmentメソッドを使用して、アウトバウンド リクエストが CAT に適していることを確認する必要があります。
func external(txn *newrelic.Transaction, req *http.Request) (*http.Response, error) {
s := newrelic.StartExternalSegment(txn, req)
response, err := http.DefaultClient.Do(req)
構造体リテラルを使用してExternalSegmentを作成することもできますが、このセグメントwill notは CAT の対象となります。 このため、New Relic ではnewrelic.NewRoundTripperまたはnewrelic.ExternalSegment使用を推奨しています。
func noGoodForCat(txn *newrelic.Transaction, url string) (*http.Response, error) {
defer newrelic.ExternalSegment{
StartTime: txn.StartSegmentNow(),
分散トレースを取得する
New Relic では、 分散型トレース も提供しています。ディストリビュートトレーシングは、クロスアプリケーショントレースを改良したもので、大規模な分散システムにお勧めです。