Go トランザクションの計測

バックグラウンドタスクや HTTP レスポンンスなどの特定のアプリサーバーのアクティビティに関連する transactions を作成することで、Go アプリやマイクロサービスを監視します。

New Relic による Go アプリの監視の概要については、Go 用 New Relic をご覧ください。

Go アプリの監視の概要

他の言語とは異なり、Go アプリは、コンパイルしたネイティブのバイナリファイルから実行します。つまり、Golang アプリで New Relic を利用するには、手動で New Relic のメソッドをソースコードへ追加する必要があるということです。

transaction は、New Relic が監視するアプリサーバーにおける HTTP リクエストのようなインタラクションを指します。New Relic UI 上で、トランザクションは、Web トランザクションと Web 以外のトランザクションで分かれています。HTTP リクエストやレスポンスライターを持つトランザクションを計測したり、ラップする際、それは、web transactions となります。HTTP データを持たないトランザクションは、non-web transactions となります。New Relic UI でトランザクションがどのように扱われるかは、Transactions ページ をご覧ください。

セグメントは、トランザクションのオプションのサブコンポーネントです。セグメントは、トランザクション内の特定の function の内訳や時間計測に利用できます。

トランザクションの作成

各トランザクションは、単一の goroutine 内で使われる必要があります。トランザクションは、複数の goroutine をまたがって使用できません。

トランザクションを作成する手順は以下のとおりです。

監視したい function の開始直後に以下のコードを配置します。

txn := app.StartTransaction("transaction_name", nil, nil)
defer txn.End()

このコードでは、app は、New Relic の設定処理中に割り当てられた変数を参照しています。詳しくは、インストール処理をご覧ください。

defer 文は、function が終了するまでセグメントの完了を延期します。

2 つの nil 引数は、このトランザクションが、Web 以外のトランザクションであることを示しています。Web トランザクションを作成するには、以下のように、nil の代わりに HTTP レスポンスライターとリクエストを設定します。

txn := app.StartTransaction("transaction_name", w http.ResponseWriter, r *http.Request)
defer txn.End()
トランザクションの例
以下は、checkout_transaction が呼ばれた際にトランザクションを生成する前と後の例です。

追加前:

func checkout() {
// function code here
}

追加後:

func checkout() {
txn := app.StartTransaction("checkout_transaction", nil, nil)
defer txn.End()
// function code here
}

HTTP ハンドラーのラップによるランザクションの作成

標準の HTTP ライブラリパッケージを利用している場合は、function のコードを計測する代わりに、HTTP リクエストをラップして、トランザクションを生成します。

以下は、HTTP ハンドラーをラップする前と後の例です。

ラップ前:

http.HandleFunc("/users", usersHandler)

ラップ後:

http.HandleFunc(newrelic.WrapHandleFunc(app, "/users", usersHandler))

これは自動的にリクエストとレスポンスライターを持つトランザクションを起動し、終了します。

ハンドラー内からトランザクションにアクセスするには、ハンドラーに渡したレスポンスライター上で、以下のように型アサーションを利用します。

func myHandler(w http.ResponseWriter, r *http.Request) {
    if txn, ok := w.(newrelic.Transaction); ok {
        txn.NoticeError(errors.New("my error message"))
    }
}

その他のトランザクションメソッド

transaction オブジェクトは、NoticeErrorAddAttributeIgnore などのトランザクションの振る舞いを制御するメソッドがあります。

これらのトランザクションのメソッドについては、GitHub にある Go 用 New Relic トランザクションのメソッド一覧をご覧ください。

関連情報

関連する情報は以下のとおりです。