Class: Mongo::Monitoring

Inherits:
Object
  • Object
show all
Includes:
Id, Subscribable
Defined in:
lib/mongo/monitoring.rb,
lib/mongo/monitoring/publishable.rb,
lib/mongo/monitoring/event/secure.rb,
lib/mongo/monitoring/event/cmap/base.rb,
lib/mongo/monitoring/cmap_log_subscriber.rb,
lib/mongo/monitoring/event/server_closed.rb,
lib/mongo/monitoring/sdam_log_subscriber.rb,
lib/mongo/monitoring/event/command_failed.rb,
lib/mongo/monitoring/event/server_opening.rb,
lib/mongo/monitoring/event/cmap/pool_ready.rb,
lib/mongo/monitoring/event/command_started.rb,
lib/mongo/monitoring/event/topology_closed.rb,
lib/mongo/monitoring/command_log_subscriber.rb,
lib/mongo/monitoring/event/cmap/pool_closed.rb,
lib/mongo/monitoring/event/topology_changed.rb,
lib/mongo/monitoring/event/topology_opening.rb,
lib/mongo/monitoring/event/cmap/pool_cleared.rb,
lib/mongo/monitoring/event/cmap/pool_created.rb,
lib/mongo/monitoring/event/command_succeeded.rb,
lib/mongo/monitoring/event/cmap/connection_ready.rb,
lib/mongo/monitoring/unified_sdam_log_subscriber.rb,
lib/mongo/monitoring/event/cmap/connection_closed.rb,
lib/mongo/monitoring/server_closed_log_subscriber.rb,
lib/mongo/monitoring/event/cmap/connection_created.rb,
lib/mongo/monitoring/event/server_heartbeat_failed.rb,
lib/mongo/monitoring/server_opening_log_subscriber.rb,
lib/mongo/monitoring/event/server_heartbeat_started.rb,
lib/mongo/monitoring/topology_closed_log_subscriber.rb,
lib/mongo/monitoring/topology_changed_log_subscriber.rb,
lib/mongo/monitoring/topology_opening_log_subscriber.rb,
lib/mongo/monitoring/event/cmap/connection_checked_in.rb,
lib/mongo/monitoring/event/server_description_changed.rb,
lib/mongo/monitoring/event/server_heartbeat_succeeded.rb,
lib/mongo/monitoring/event/cmap/connection_checked_out.rb,
lib/mongo/monitoring/event/cmap/connection_check_out_failed.rb,
lib/mongo/monitoring/event/cmap/connection_check_out_started.rb,
lib/mongo/monitoring/server_description_changed_log_subscriber.rb

Overview

The class defines behavior for the performance monitoring API.

Since:

  • 2.1.0

Defined Under Namespace

Modules: Event, Global, Publishable, Subscribable Classes: CmapLogSubscriber, CommandLogSubscriber, SDAMLogSubscriber, ServerClosedLogSubscriber, ServerDescriptionChangedLogSubscriber, ServerOpeningLogSubscriber, TopologyChangedLogSubscriber, TopologyClosedLogSubscriber, TopologyOpeningLogSubscriber, UnifiedSdamLogSubscriber

Constant Summary collapse

COMMAND =

The command topic.

Since:

  • 2.1.0

'Command'.freeze
CONNECTION_POOL =

The connection pool topic.

Since:

  • 2.9.0

'ConnectionPool'.freeze
SERVER_CLOSED =

Server closed topic.

Since:

  • 2.4.0

'ServerClosed'.freeze
SERVER_DESCRIPTION_CHANGED =

Server description changed topic.

Since:

  • 2.4.0

'ServerDescriptionChanged'.freeze
SERVER_OPENING =

Server opening topic.

Since:

  • 2.4.0

'ServerOpening'.freeze
TOPOLOGY_CHANGED =

Topology changed topic.

Since:

  • 2.4.0

'TopologyChanged'.freeze
TOPOLOGY_CLOSED =

Topology closed topic.

Since:

  • 2.4.0

'TopologyClosed'.freeze
TOPOLOGY_OPENING =

Topology opening topic.

Since:

  • 2.4.0

'TopologyOpening'.freeze
SERVER_HEARTBEAT =

Server heartbeat started topic.

Since:

  • 2.7.0

'ServerHeartbeat'.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Subscribable

#subscribe, #subscribers, #subscribers?, #unsubscribe

Methods included from Id

included

Constructor Details

#initialize(options = {}) ⇒ Monitoring

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Initialize the monitoring.

Examples:

Create the new monitoring.

Monitoring.new(:monitoring => true)

Parameters:

  • options (Hash) (defaults to: {})

    Options. Client constructor forwards its options to Monitoring constructor, although Monitoring recognizes only a subset of the options recognized by Client.

Options Hash (options):

  • :monitoring (true, false)

    If false is given, the Monitoring instance is initialized without global monitoring event subscribers and will not publish SDAM events. Command monitoring events will still be published, and the driver will still perform SDAM and monitor its cluster in order to perform server selection. Built-in driver logging of SDAM events will be disabled because it is implemented through SDAM event subscription. Client#subscribe will succeed for all event types, but subscribers to SDAM events will not be invoked. Values other than false result in default behavior which is to perform normal SDAM event publication.

Since:

  • 2.1.0

 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
# File 'lib/mongo/monitoring.rb', line 220 def initialize(options = {}) @options = options if options[:monitoring] != false Global.subscribers.each do |topic, subscribers| subscribers.each do |subscriber| subscribe(topic, subscriber) end end subscribe(COMMAND, CommandLogSubscriber.new(options)) # CMAP events are not logged by default because this will create  # log entries for every operation performed by the driver.  #subscribe(CONNECTION_POOL, CmapLogSubscriber.new(options))  subscribe(SERVER_OPENING, ServerOpeningLogSubscriber.new(options)) subscribe(SERVER_CLOSED, ServerClosedLogSubscriber.new(options)) subscribe(SERVER_DESCRIPTION_CHANGED, ServerDescriptionChangedLogSubscriber.new(options)) subscribe(TOPOLOGY_OPENING, TopologyOpeningLogSubscriber.new(options)) subscribe(TOPOLOGY_CHANGED, TopologyChangedLogSubscriber.new(options)) subscribe(TOPOLOGY_CLOSED, TopologyClosedLogSubscriber.new(options)) end end

Instance Attribute Details

#optionsObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 2.1.0

 242 243 244
# File 'lib/mongo/monitoring.rb', line 242 def options @options end

Class Method Details

.next_operation_idInteger

Used for generating unique operation ids to link events together.

Examples:

Get the next operation id.

Monitoring.next_operation_id

Returns:

  • (Integer)

    The next operation id.

Since:

  • 2.1.0

 79 80 81
# File 'lib/mongo/monitoring.rb', line 79 def self.next_operation_id self.next_id end

Instance Method Details

#failed(topic, event) ⇒ Object

Publish a failed event.

This method is used for event types which have the started/succeeded/failed events in them, such as command and heartbeat events.

Examples:

Publish a failed event.

monitoring.failed(COMMAND, event)

Parameters:

  • topic (String)

    The event topic.

  • event (Event)

    The event to publish.

Since:

  • 2.1.0

 306 307 308
# File 'lib/mongo/monitoring.rb', line 306 def failed(topic, event) subscribers_for(topic).each{ |subscriber| subscriber.failed(event) } end

#monitoring?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)

Since:

  • 2.1.0

 245 246 247
# File 'lib/mongo/monitoring.rb', line 245 def monitoring? options[:monitoring] != false end

#publish_heartbeat(server, awaited: false) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Since:

  • 2.1.0

 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
# File 'lib/mongo/monitoring.rb', line 311 def publish_heartbeat(server, awaited: false) if monitoring? started_event = Event::ServerHeartbeatStarted.new( server.address, awaited: awaited) started(SERVER_HEARTBEAT, started_event) end # The duration we publish in heartbeat succeeded/failed events is  # the time spent on the entire heartbeat. This could include time  # to connect the socket (including TLS handshake), not just time  # spent on hello call itself.  # The spec at https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-logging-and-monitoring.md  # requires that the duration exposed here start from "sending the  # message" (hello). This requirement does not make sense if,  # for example, we were never able to connect to the server at all  # and thus hello was never sent.  start_time = Utils.monotonic_time begin result = yield rescue => exc if monitoring? event = Event::ServerHeartbeatFailed.new( server.address, Utils.monotonic_time - start_time, exc, awaited: awaited, started_event: started_event, ) failed(SERVER_HEARTBEAT, event) end raise else if monitoring? event = Event::ServerHeartbeatSucceeded.new( server.address, Utils.monotonic_time - start_time, awaited: awaited, started_event: started_event, ) succeeded(SERVER_HEARTBEAT, event) end result end end

#published(topic, event) ⇒ Object

Publish an event.

This method is used for event types which only have a single event in them.

Parameters:

  • topic (String)

    The event topic.

  • event (Event)

    The event to publish.

Since:

  • 2.9.0

 258 259 260
# File 'lib/mongo/monitoring.rb', line 258 def published(topic, event) subscribers_for(topic).each{ |subscriber| subscriber.published(event) } end

#started(topic, event) ⇒ Object

Publish a started event.

This method is used for event types which have the started/succeeded/failed events in them, such as command and heartbeat events.

Examples:

Publish a started event.

monitoring.started(COMMAND, event)

Parameters:

  • topic (String)

    The event topic.

  • event (Event)

    The event to publish.

Since:

  • 2.1.0

 274 275 276
# File 'lib/mongo/monitoring.rb', line 274 def started(topic, event) subscribers_for(topic).each{ |subscriber| subscriber.started(event) } end

#succeeded(topic, event) ⇒ Object

Publish a succeeded event.

This method is used for event types which have the started/succeeded/failed events in them, such as command and heartbeat events.

Examples:

Publish a succeeded event.

monitoring.succeeded(COMMAND, event)

Parameters:

  • topic (String)

    The event topic.

  • event (Event)

    The event to publish.

Since:

  • 2.1.0

 290 291 292
# File 'lib/mongo/monitoring.rb', line 290 def succeeded(topic, event) subscribers_for(topic).each{ |subscriber| subscriber.succeeded(event) } end