Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Go Driver
/

アプリケーション イベントの監視

このガイドでは、 MongoDB Goドライバーで監視を設定および構成する方法を学習できます。Goドライバー を使用してアプリケーションでイベントを監視できます。

モニタリングには、実行中のプログラムのアクティビティに関する情報を収集することが含まれます。この情報はアプリケーションパフォーマンス マネジメント ライブラリで使用できます。

イベントは、操作中にドライバー内で発生する任意のアクションです。Goドライバーには、これらのイベントのサブセットをリッスンする機能が含まれています。

Goドライバーをモニタリングすると、ドライバーのリソース使用量とパフォーマンスを理解でき、アプリケーションの設計とデバッグに情報を得た決定を行うのに役立ちます。

このガイドでは、次のタスクを実行する方法を説明します。

  • コマンド イベントの監視

  • サーバー検出とモニタリング(SDAM)イベントの監視

  • 接続プール イベントの監視

このガイドでは、コード内でドライバーのアクティビティに関する情報を使用する方法を説明します。ドライバーでイベントをレコード方法については、 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 つ以上にサブスクライブできます。

イベント名
説明

CommandStartedEvent

コマンドの開始時に作成されます。

CommandSucceededEvent

コマンドが成功したときに作成されます。

CommandFailedEvent

コマンドが成功しない場合に作成されます。

次のセクションでは、コマンド モニタリング イベントの各タイプのサンプル出力を示します。

*event.CommandStartedEvent
{
"Command": "...",
"DatabaseName": "...",
"CommandName": "...",
"RequestID": ...,
"ConnectionID": "...",
"ServerConnectionID": ...,
"ServiceID": "..."
}
*event.CommandSucceededEvent
{
"DurationNanos": 38717583,
"Duration": 38717583,
"CommandName": "insert",
"RequestID": 13,
"ConnectionID": "...",
"ServerConnectionID": ...,
"ServiceID": null,
"Reply": "..."
}
*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 イベントをサブスクライブできます。

イベント名
説明

ServerDescriptionChangedEvent

インスタンスの状態が変更されたときに作成されます(セカンダリからプライマリへなど)。

ServerOpeningEvent

サーバーが初期化されたときに作成されます。

ServerClosedEvent

サーバーが閉じられたときに作成されます。

TopologyDescriptionChangedEvent

新しいプライマリの選挙やmongosプロキシの切断など、トポロジーが変更されたときに作成されます。

TopologyOpeningEvent

トポロジーが初期化されたときに作成されます。

TopologyClosedEvent

トポロジーが閉じられたときに作成されます。

ServerHeartbeatStartedEvent

ハートビートが開始されたときに作成されます。

ServerHeartbeatSucceededEvent

ハートビートが成功したときに作成されます。

ServerHeartbeatFailedEvent

ハートビートが失敗したときに作成されます。

次のセクションは、各 SDAM イベントのタイプごとのサンプル出力を示しています。

*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フィールドはトポロジー内の単一サーバーのタイプを表し、次の値を持つことができます。

説明

0

不明なインスタンス

1

スタンドアロン インスタンス

2

レプリカセット ノード

6

プライマリ インスタンス

10

セカンダリ インスタンス

18

アービタ インスタンス

34

レプリカセットのスコープ(クエリできないノード)

256

mongos プロキシ インスタンス

512

ロード バランサー インスタンス

*event.ServerOpeningEvent
{
"Address": "...",
"TopologyID": "..."
}
*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": "..."
}
*event.ServerHeartbeatStartedEvent
{
"ConnectionID": "...",
"Awaited": true
}
*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フィールドの値を解釈するには、「種類のフィールド値 」セクションを参照してください。

*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)

次の表では、ドライバーが発行するプール イベントの種類を説明します。

プール イベントタイプ
説明

ConnectionPoolCreated

接続プールが作成されたときに作成されます。

ConnectionPoolReady

接続プールが準備できたときに作成されます。

ConnectionPoolCleared

プール内のすべての接続が閉じられたときに作成されます。

ConnectionPoolClosed

サーバー インスタンスが破棄される前に、接続プールが閉じられたときに作成されます。

ConnectionCreated

接続が作成されたときに作成されますが、操作に使用される場合は必ずしも作成されません。

ConnectionReady

接続がハンドシェイクを完了し、操作に使用する準備ができた後に作成されます。

ConnectionClosed

接続が閉じられたときに作成されます。

ConnectionCheckOutStarted

操作が実行用接続を取得しようとしたときに作成されます。

ConnectionCheckOutFailed

操作が実行用接続を取得できない場合に作成されます。

ConnectionCheckedOut

操作が実行用接続を正常に取得したときに作成されます。

ConnectionCheckedIn

操作が実行された後に接続がプールにチェックバックされたときに作成されます。

次のセクションでは、接続プールを監視するイベントの各タイプのサンプル出力を示します。

*event.PoolEvent
{
"type": "ConnectionPoolCreated",
"address": "...",
"connectionId": 0,
"options": {
"maxPoolSize": 100,
"minPoolSize": 0,
"maxIdleTimeMS": 0
},
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionPoolReady",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionPoolCleared",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionPoolClosed",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCreated",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionReady",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionClosed",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckOutStarted",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckOutFailed",
"address": "...",
"connectionId": 0,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckedOut",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}
*event.PoolEvent
{
"type": "ConnectionCheckedIn",
"address": "...",
"connectionId": 1,
"options": null,
"reason": "",
"serviceId": null,
"error": null
}

MongoDB 配置のモニタリングの詳細については、「 MongoDB をモニタリングする方法 」に関する記事を参照してください。

MongoDB への接続の詳細については、「接続ガイド」を参照してください。

MongoDB 操作の実行の詳細については、「 CRUD 操作 」のガイドを参照してください。

このガイドで言及されているメソッドとタイプの詳細については、次のAPIドキュメントを参照してください。

戻る

モニタリングとロギング