module Mongo::Monitoring::Publishable

Defines behaviour for an object that can publish monitoring events.

@since 2.1.0

Attributes

monitoring[R]

@return [ Monitoring ] monitoring The monitoring.

Public Instance Methods

publish_command(messages, operation_id = Monitoring.next_operation_id) { |messages| ... } click to toggle source

Publish a command event to the global monitoring.

@example Publish a command event.

publish_command do |messages|
  # ...
end

@param [ Array<Message> ] messages The messages.

@return [ Object ] The result of the yield.

@since 2.1.0

# File lib/mongo/monitoring/publishable.rb, line 39
def publish_command(messages, operation_id = Monitoring.next_operation_id)
  start = Time.now
  message = messages.first
  message.set_request_id
  payload = message.payload
  send_duration = duration(start)
  command_started(address, operation_id, payload)
  receive_start = Time.now
  begin
    result = yield(messages)
    total_duration = duration(receive_start) + send_duration
    command_completed(result, address, operation_id, payload, total_duration)
    result
  rescue Exception => e
    total_duration = duration(receive_start) + send_duration
    command_failed(nil, address, operation_id, payload, e.message, total_duration)
    raise e
  end
end
publish_event(topic, event) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 59
def publish_event(topic, event)
  monitoring.succeeded(topic, event)
end
publish_sdam_event(topic, event) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 63
def publish_sdam_event(topic, event)
  return unless monitoring?

  log_debug("EVENT: #{event.inspect}")
  monitoring.succeeded(topic, event)
end

Private Instance Methods

command_completed(result, address, operation_id, payload, duration) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 79
def command_completed(result, address, operation_id, payload, duration)
  document = result ? (result.documents || []).first : nil
  if error?(document)
    parser = Error::Parser.new(document)
    command_failed(document, address, operation_id, payload, parser.message, duration)
  else
    command_succeeded(result, address, operation_id, payload, duration)
  end
end
command_failed(failure, address, operation_id, payload, message, duration) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 102
def command_failed(failure, address, operation_id, payload, message, duration)
  monitoring.failed(
    Monitoring::COMMAND,
    Event::CommandFailed.generate(address, operation_id, payload, message, failure, duration)
  )
end
command_started(address, operation_id, payload) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 72
def command_started(address, operation_id, payload)
  monitoring.started(
    Monitoring::COMMAND,
    Event::CommandStarted.generate(address, operation_id, payload)
  )
end
command_succeeded(result, address, operation_id, payload, duration) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 89
def command_succeeded(result, address, operation_id, payload, duration)
  monitoring.succeeded(
    Monitoring::COMMAND,
    Event::CommandSucceeded.generate(
      address,
      operation_id,
      payload,
      result ? result.payload : nil,
      duration
    )
  )
end
duration(start) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 109
def duration(start)
  Time.now - start
end
error?(document) click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 113
def error?(document)
  document && (document['ok'] == 0 || document.key?('$err'))
end
monitoring?() click to toggle source
# File lib/mongo/monitoring/publishable.rb, line 117
def monitoring?
  options[:monitoring] != false
end