New Relic for Go を使用すると、Go アプリケーションの トランザクション の特定のセグメントを監視して、特定の機能やコードブロックについてより詳細な情報を得ることができます。
機能やコードブロックの計測時間
Segments アプリケーション内のトランザクションの特定の部分です。 インストゥルメントされたセグメントによって、外部呼び出し、データストア呼び出し、キューへのメッセージの追加、バックグラウンドタスクなどの関数とコードブロックにかかる時間を測定できます。
Example: 配送情報とクレジット カード情報の両方を処理するチェックアウト プロセスに関連付けられたトランザクションがあります。 アプリケーションを計量して、その現場を 2 つの部分、つまり配送用の 1 つのセグメントと支払い用の 1 つのセグメントに分割することができます。
ブロック・オブ・コード・セグメント
トランザクション をインストルメントすると、そのトランザクション内の1つまたは複数のセグメントをインストルメントする準備が整います。
コードの任意のブロックをセグメントとして計測するには、次のパターンを使用し、トランザクションに設定された変数名としてtxn
を含めます。
segment := newrelic.Segment{}
segment.Name = "mySegmentName"
segment.StartTime = txn.StartSegmentNow()
StartSegment
便利なヘルパーです。セグメントを作成して開始します。
segment := txn.StartSegment("mySegmentName")
機能セグメント
関数をセグメントとしてインスツルメントすることは、任意のコードブロックをセグメントとしてインスツルメントすることと基本的に同じです。主な違いは、関数には個別の終わりがあるので、Go の defer ステートメント を使用できることです。
関数をセグメントとして計測するには、関数の先頭に次のコードを追加し、トランザクションに設定された変数名としてtxn
を含めます。
defer txn.StartSegment("mySegmentName").End()
ネストセグメント
セグメントはネストすることができます。終了するセグメントは、最後に開始されたセグメントでなければなりません。
以下は、あるセグメントが別のセグメントの中で始まり、終わる例です。
s1 := txn.StartSegment("outerSegment")
s2 := txn.StartSegment("innerSegment")
ゼロ値のセグメントは安全に終了することができます。したがって、次のコードは、条件付きで失敗しても安全です。
s.StartTime = txn.StartSegmentNow()
データストアのセグメント
Go アプリケーション データストアの通話を計装できます。 データストア セグメントは、New Relic のTransactionsページの APM Transactions breakdownテーブルとDatabasesタブに表示されます。
MySQL、PostgreSQL、または SQLite データベース ドライバを使用している場合、Datastore セグメントを追加する最も簡単な方法は、あらかじめ組み込まれている統合パッケージを使用することです。それ以外の場合は、データベースを呼び出すたびに手動で Datastore セグメントを作成することができます。
サポートしているデータベースドライバごとに統合パッケージを用意しています。
これらの統合機能を使用するには、まずドライバーを当社の統合バージョンに置き換えてください。
_ "github.com/newrelic/go-agent/v3/integrations/nrmysql"
db, err := sql.Open("nrmysql", "user@unix(/path/to/socket)/dbname")
次に、 sql.DB 、 sql.Conn 、 sql.Tx 、およびsql.StmtのExecContext
、 QueryContext
、およびQueryRowContext
メソッドを使用して、トランザクションを含むコンテキストを提供します。Exec
、 Query
、およびQueryRow
への呼び出しは計測されません。
ctx := newrelic.NewContext(context.Background(), txn)
row := db.QueryRowContext(ctx, "SELECT count(*) from tables")
上記以外の database/sql データベースを使用している場合は、 InstrumentConnector 、 InstrumentDriver 、 DriverSegmentBuilder を使用して、独自のインスツルメンテーションを記述することができます。統合パッケージは、この方法の例として機能します。
重要
MySQL、PostgreSQL、および SQLite のデータストア統合パッケージは、Go エージェント v2.8.0 で追加され、Go v1.10 以降が必要です。
基本セグメントと同様に、データストア セグメントは、 StartTime
フィールドにデータが入力されると開始し、 End
メソッドが呼び出されると終了します。データストア セグメントを計測するには、監視する関数の先頭に次を配置します。
s := newrelic.DatastoreSegment{
Product: newrelic.DatastoreMySQL,
ParameterizedQuery: "INSERT INTO users (name, age) VALUES ($1, $2)",
QueryParameters: map[string]interface{}{
DatabaseName: "my_database",
s.StartTime = txn.StartSegmentNow()
については、こちらをご覧ください。
関数呼び出し全体に渡るデータストア呼び出しをインストゥルメンテーションする場合、defer文を使用してインストゥルメンテーションを簡素化することができます。
s := newrelic.DatastoreSegment{
StartTime: txn.StartSegmentNow(),
Product: newrelic.DatastoreMySQL,
ParameterizedQuery: "INSERT INTO users (name, age) VALUES ($1, $2)",
QueryParameters: map[string]interface{}{
DatabaseName: "my_database",
外部セグメント
Web サービス、クラウド内のリソース、その他のネットワーク呼び出しなどの外部サービスへの Go アプリケーション呼び出しを計装できます。 外部セグメントは、New Relic の Transactions breakdownテーブルとExternal servicesページに表示されます。
外部セグメントのインストルメントには2つの方法があります。
推奨事項: New Relicディストリビューティッド(分散)トレースを使用してアプリケーション間のアクティビティをトレースするために StartExternalSegment
ヘルパーを使用するため、これを使用します。
func external(txn *newrelic.Transaction, req *http.Request) (*http.Response, error) {
s := newrelic.StartExternalSegment(txn, req)
response, err := http.DefaultClient.Do(req)
NewRoundTripper
http.RoundTripperを返します。これにより、 http.Client
のTransport
フィールドを変更することで、 StartExternalSegment
を呼び出さずに外部呼び出しを計測できます。返されたRoundTripper
は、 FromContextを使用してリクエストのコンテキストでTransaction
を探します。
NewRoundTripper
インストルメンテーションの例を次に示します。
client.Transport = newrelic.NewRoundTripper(client.Transport)
request, _ := http.NewRequest("GET", "http://example.com", nil)
request = newrelic.RequestWithTransactionContext(request, txn)
response, err := client.Do(request)
メッセージ・プロデューサー・セグメント
RabbitMQ や Kafka などのキューイング システムにメッセージを追加する Go アプリケーション呼び出しを計算できます。 メッセージ プロデューサー セグメントは、New Relic の APM Transactions breakdownに表示されます。
メッセージ・プロデューサー・セグメントを計測する方法は一つしかありません。
基本セグメントと同様に、メッセージ プロデューサ セグメントは、 StartTime
フィールドにデータが入力されると開始し、 End
メソッドが呼び出されると終了します。メッセージ プロデューサ セグメントをインストルメント化するには、監視する関数の先頭に以下を配置します。
s := newrelic.MessageProducerSegment{
DestinationType: newrelic.MessageExchange,
DestinationName: "myExchange",
DestinationTemporary: false,
s.StartTime = txn.StartSegmentNow()
Library
、 DestinationType
、 DestinationName
、またはDestinationTemporary
フィールドの割り当ての詳細については、GoDoc の New Relic メッセージ プロデューサー セグメントのドキュメントを参照してください。
関数呼び出し全体にまたがるメッセージ・プロデューサー・コールをインスツルメンテーションする場合、deferステートメントを使用してインスツルメンテーションを簡素化することができます。
s := newrelic.MessageProducerSegment{
StartTime: txn.StartSegmentNow(),
DestinationType: newrelic.MessageExchange,
DestinationName: "myExchange",
DestinationTemporary: false,
重要
メッセージ プロデューサー セグメントは、Go エージェント バージョン 2.14.0 で追加されました。