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 では、 分散型トレース も提供しています。ディストリビュートトレーシングは、クロスアプリケーショントレースを改良したもので、大規模な分散システムにお勧めです。