Overview
このガイドでは、 MongoDB Goドライバーで監視を設定および構成する方法を学習できます。Goドライバー を使用してアプリケーションでイベントを監視できます。
モニタリングには、実行中のプログラムのアクティビティに関する情報を収集することが含まれます。この情報はアプリケーションパフォーマンス マネジメント ライブラリで使用できます。
イベントは、操作中にドライバー内で発生する任意のアクションです。Goドライバーには、これらのイベントのサブセットをリッスンする機能が含まれています。
Goドライバーをモニタリングすると、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計とデバッグに情報を得た決定を行うのに役立ちます。
このガイドでは、次のタスクを実行する方法を説明します。
このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。ドライバーでイベントをレコード方法については、 Goドライバーの ログガイドを参照してください。
コマンド イベントの監視
コマンドイベントは、 MongoDBデータベースコマンドに関連するイベントです。ドライバーを使用してアプリケーションでサブスクライブすることで、1 つ以上のコマンド モニタリング イベントにアクセスできます。
MongoDBデータベースコマンドの詳細については、サーバー マニュアルのデータベースコマンドガイドを参照してください。
イベントにサブスクライブ
アプリケーションでコマンド イベントをサブスクライブすることで、その詳細にアクセスできます。 次の例では、 CommandMonitor
をインスタンス化し、配置に接続して、 CommandStartedEvent
イベントをサブスクライブする方法を示しています。
var eventArray []*event.CommandStartedEvent cmdMonitor := &event.CommandMonitor{ Started: func(ctx context.Context, e *event.CommandStartedEvent) { eventArray = append(eventArray, e) }, } clientOpts := options.Client().ApplyURI(uri).SetMonitor(cmdMonitor) client, err := mongo.Connect(clientOpts)
イベントの説明
次のコマンド モニタリング イベントの 1 つ以上にサブスクライブできます。
イベント名 | 説明 |
---|---|
| コマンドの開始時に作成されます。 |
| コマンドが成功したときに作成されます。 |
| コマンドが成功しない場合に作成されます。 |
イベント ドキュメントの例
次のセクションでは、コマンド モニタリング イベントの各タイプのサンプル出力を示します。
コマンド開始
*event.CommandStartedEvent { "Command": "...", "DatabaseName": "...", "CommandName": "...", "RequestID": ..., "ConnectionID": "...", "ServerConnectionID": ..., "ServiceID": "..." }
コマンドSucceededEvent
*event.CommandSucceededEvent { "DurationNanos": 38717583, "Duration": 38717583, "CommandName": "insert", "RequestID": 13, "ConnectionID": "...", "ServerConnectionID": ..., "ServiceID": null, "Reply": "..." }
コマンドFailedEvent
*event.CommandFailedEvent { "DurationNanos": 38717583, "Duration": 38717583, "CommandName": "insert", "RequestID": 13, "ConnectionID": "...", "ServerConnectionID": ..., "ServiceID": null, "Failure": "..." }
サーバー検出とモニタリング イベントの監視
Goドライバーは、接続したインスタンスまたはクラスターの状態が変化した場合に、SDAM イベントとも呼ばれるトポロジーイベントを作成します。例、新しい接続を確立するか、クラスターが新しい プライマリノードを選択した場合、ドライバーはイベントを作成します。
次のセクションでは、アプリケーション内のトポロジーの変更を記録し、これらのイベントで提供される情報を調べる方法を示します。
イベントにサブスクライブ
アプリケーションで SDAM イベントをサブスクライブすることで、その詳細にアクセスできます。 次の例では、 ServerMonitor
をインスタンス化して配置に接続し、 ServerClosed
イベントをサブスクライブする方法を示します。
var eventArray []*event.ServerClosedEvent srvMonitor := &event.ServerMonitor{ ServerClosed: func(e *event.ServerClosedEvent) { eventArray = append(eventArray, e) }, } clientOpts := options.Client().ApplyURI(uri).SetServerMonitor(srvMonitor) client, err := mongo.Connect(clientOpts)
イベントの説明
ServerMonitor
インスタンスのプロパティを指定することで、次の SDAM イベントをサブスクライブできます。
イベント名 | 説明 |
---|---|
| インスタンスの状態が変更されたときに作成されます(セカンダリからプライマリへなど)。 |
| サーバーが初期化されたときに作成されます。 |
| サーバーが閉じられたときに作成されます。 |
| 新しいプライマリの選挙や |
| トポロジーが初期化されたときに作成されます。 |
| トポロジーが閉じられたときに作成されます。 |
| ハートビートが開始されたときに作成されます。 |
| ハートビートが成功したときに作成されます。 |
| ハートビートが失敗したときに作成されます。 |
イベント ドキュメントの例
次のセクションは、各 SDAM イベントのタイプごとのサンプル出力を示しています。
Server Description ChangedEvent
*event.ServerDescriptionChangedEvent { "Address": "...", "TopologyID": "...", "PreviousDescription": { "Addr": "...", "Arbiters": null, "AverageRTT": 0, "AverageRTTSet": false, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": 0, "HelloOK": false, "Hosts": null, "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": 0, "MaxDocumentSize": 0, "MaxMessageSize": 0, "Members": null, "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 0, "SetName": "...", "SetVersion": 0, "Tags": null, "TopologyVersion": null, "Kind": 0, "WireVersion": null }, "NewDescription": { "Addr": "...", "Arbiters": null, "AverageRTT": ..., "AverageRTTSet": true, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": ..., "HelloOK": true, "Hosts": [...], "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": ..., "MaxDocumentSize": ..., "MaxMessageSize": ..., "Members": [...], "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 30, "SetName": "...", "SetVersion": 9, "Tags": [...], "TopologyVersion": {...}, "Kind": 10, "WireVersion": {...} } }
Kind
フィールド値
イベント ドキュメントのKind
フィールドはトポロジー内の単一サーバーのタイプを表し、次の値を持つことができます。
値 | 説明 |
---|---|
| 不明なインスタンス |
| スタンドアロン インスタンス |
| レプリカセット ノード |
| プライマリ インスタンス |
| セカンダリ インスタンス |
| アービタ インスタンス |
| レプリカセットのスコープ(クエリできないノード) |
|
|
| ロード バランサー インスタンス |
ServerOpenEvent
*event.ServerOpeningEvent { "Address": "...", "TopologyID": "..." }
ServerClosedEvent
*event.ServerClosedEvent { "Address": "...", "TopologyID": "..." }
トポロジーの説明を変更したイベント
重要
ドライバーは配置トポロジーがロックされているときにTopologyDescriptionChangedEvent
を呼び出すため、このイベントのコールバック(関数引数)は、同じクライアントでサーバー選択を必要とする操作を試行しないでください。
*event.TopologyDescriptionChangedEvent { "TopologyID": "...", "PreviousDescription": { "Servers": [ { "Addr": "...", "Arbiters": null, "AverageRTT": 0, "AverageRTTSet": false, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": 0, "HelloOK": false, "Hosts": null, "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": 0, "MaxDocumentSize": 0, "MaxMessageSize": 0, "Members": null, "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 0, "SetName": "...", "SetVersion": 0, "Tags": null, "TopologyVersion": null, "Kind": 0, "WireVersion": null }, ... ], "SetName": "...", "Kind": 10, "SessionTimeoutMinutes": 30, "CompatibilityErr": null }, "NewDescription": { "Servers": [...], "SetName": "...", "Kind": 10, "SessionTimeoutMinutes": 30, "CompatibilityErr": null } }
Kind
フィールドの値を解釈するには、「種類のフィールド値 」セクションを参照してください。
トポロジーを開くイベント
*event.TopologyOpeningEvent { "TopologyID": "..." }
トポロジーが閉じたイベント
*event.TopologyClosedEvent { "TopologyID": "..." }
ServerHeartbeatStartedEvent
*event.ServerHeartbeatStartedEvent { "ConnectionID": "...", "Awaited": true }
ServerハートビートSucceededEvent
*event.ServerHeartbeatSucceededEvent { "DurationNanos": ..., "Reply": { "Addr": "...", "Arbiters": null, "AverageRTT": 0, "AverageRTTSet": false, "Compression": null, "CanonicalAddr": "...", "ElectionID": "...", "HeartbeatInterval": 0, "HelloOK": true, "Hosts": [...], "LastError": null, "LastUpdateTime": "...", "LastWriteTime": "...", "MaxBatchCount": ..., "MaxDocumentSize": ..., "MaxMessageSize": ..., "Members": [...], "Passives": null, "Passive": false, "Primary": "...", "ReadOnly": false, "ServiceID": null, "SessionTimeoutMinutes": 30, "SetName": "...", "SetVersion": 9, "Tags": [...], "TopologyVersion": {...}, "Kind": 6, "WireVersion": {...} }, "ConnectionID": "...", "Awaited": true }
Kind
フィールドの値を解釈するには、「種類のフィールド値 」セクションを参照してください。
ServerハートビートFailedEvent
*event.ServerHeartbeatFailedEvent { "DurationNanos": ..., "Failure": "<error message>" "ConnectionID": "...", "Awaited": true }
接続プール イベントの監視
接続プールとは、ドライバーがMongoDBインスタンスと維持するオープン TCP 接続のセットです。接続プールは、アプリケーションが実行する必要があるネットワーク ハンドシェイクの数を減らし、アプリケーションの実行を高速化するのに役立ちます。
次のセクションでは、アプリケーションで接続プール イベントを記録し、これらのイベントで提供される情報を調べる方法を示します。
イベントにサブスクライブ
アプリケーションで接続プール イベントをサブスクライブすることで、その詳細にアクセスできます。 次の例では、 PoolMonitor
をインスタンス化して配置に接続し、 PoolEvent
イベントをサブスクライブする方法を示します。
var eventArray []*event.PoolEvent cxnMonitor := &event.PoolMonitor{ Started: func(e *event.PoolEvent) { eventArray = append(eventArray, e) }, } clientOpts := options.Client().ApplyURI(uri).SetPoolMonitor(cxnMonitor) client, err := mongo.Connect(clientOpts)
イベントの説明
次の表では、ドライバーが発行するプール イベントの種類を説明します。
プール イベントタイプ | 説明 |
---|---|
| 接続プールが作成されたときに作成されます。 |
| 接続プールが準備できたときに作成されます。 |
| プール内のすべての接続が閉じられたときに作成されます。 |
| サーバー インスタンスが破棄される前に、接続プールが閉じられたときに作成されます。 |
| 接続が作成されたときに作成されますが、操作に使用される場合は必ずしも作成されません。 |
| 接続がハンドシェイクを完了し、操作に使用する準備ができた後に作成されます。 |
| 接続が閉じられたときに作成されます。 |
| 操作が実行用接続を取得しようとしたときに作成されます。 |
| 操作が実行用接続を取得できない場合に作成されます。 |
| 操作が実行用接続を正常に取得したときに作成されます。 |
| 操作が実行された後に接続がプールにチェックバックされたときに作成されます。 |
イベント ドキュメントの例
次のセクションでは、接続プールを監視するイベントの各タイプのサンプル出力を示します。
ConnectionPoolCreed
*event.PoolEvent { "type": "ConnectionPoolCreated", "address": "...", "connectionId": 0, "options": { "maxPoolSize": 100, "minPoolSize": 0, "maxIdleTimeMS": 0 }, "reason": "", "serviceId": null, "error": null }
ConnectionPoolReady
*event.PoolEvent { "type": "ConnectionPoolReady", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionPoolCleared
*event.PoolEvent { "type": "ConnectionPoolCleared", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionPoolClosed
*event.PoolEvent { "type": "ConnectionPoolClosed", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionCreed
*event.PoolEvent { "type": "ConnectionCreated", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionReady
*event.PoolEvent { "type": "ConnectionReady", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionClosed
*event.PoolEvent { "type": "ConnectionClosed", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionCheckOutStarted
*event.PoolEvent { "type": "ConnectionCheckOutStarted", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionCheckOutFailed
*event.PoolEvent { "type": "ConnectionCheckOutFailed", "address": "...", "connectionId": 0, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionCheckedOut
*event.PoolEvent { "type": "ConnectionCheckedOut", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
ConnectionCheckedIn
*event.PoolEvent { "type": "ConnectionCheckedIn", "address": "...", "connectionId": 1, "options": null, "reason": "", "serviceId": null, "error": null }
詳細情報
MongoDB 配置のモニタリングの詳細については、「 MongoDB をモニタリングする方法 」に関する記事を参照してください。
MongoDB への接続の詳細については、「接続ガイド」を参照してください。
MongoDB 操作の実行の詳細については、「 CRUD 操作 」のガイドを参照してください。
API ドキュメント
このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。
イベント パッケージ
コマンド イベント
コマンドモニター type
コマンド開始 type
コマンドSucceededEvent type
コマンドFailedEvent type
SDAM イベント
ServerMonitor type
SetServerMonitor() メソッド
接続プール イベント
PoolMonitor type
PoolEvent type
SetPoolMonitor() メソッド