class ElasticAPM::Spies::MongoSpy::Subscriber

@api private

Constants

ACTION
SUBTYPE
TYPE

Public Class Methods

new() click to toggle source
# File lib/elastic_apm/spies/mongo.rb, line 38
def initialize
  @events = {}
end

Public Instance Methods

failed(event) click to toggle source
# File lib/elastic_apm/spies/mongo.rb, line 46
def failed(event)
  if (span = pop_event(event))
    span.outcome = Span::Outcome::FAILURE
  end

  span
end
started(event) click to toggle source
# File lib/elastic_apm/spies/mongo.rb, line 42
def started(event)
  push_event(event)
end
succeeded(event) click to toggle source
# File lib/elastic_apm/spies/mongo.rb, line 54
def succeeded(event)
  if span = pop_event(event)
    span.outcome = Span::Outcome::SUCCESS
  end

  span
end

Private Instance Methods

build_context(event) click to toggle source
# File lib/elastic_apm/spies/mongo.rb, line 102
def build_context(event)
  Span::Context.new(
    db: {
      instance: event.database_name,
      statement: event.command.to_s,
      type: 'mongodb',
      user: nil
    },
    destination: {
      service: {
        name: SUBTYPE,
        resource: SUBTYPE,
        type: TYPE
      }
    }
  )
end
pop_event(event) click to toggle source
# File lib/elastic_apm/spies/mongo.rb, line 95
def pop_event(event)
  span = @events.delete(event.operation_id)
  return unless (curr = ElasticAPM.current_span)

  curr == span && ElasticAPM.end_span
end
push_event(event) click to toggle source
# File lib/elastic_apm/spies/mongo.rb, line 64
def push_event(event)
  return unless ElasticAPM.current_transaction
  # Some MongoDB commands are not on collections but rather are db
  # admin commands. For these commands, the value at the `command_name`
  # key is the integer 1.
  # For getMore commands, the value at `command_name` is the cursor id
  # and the collection name is at the key `collection`
  collection =
    if event.command[event.command_name] == 1 ||
       event.command[event.command_name].is_a?(BSON::Int64)
      event.command[:collection]
    else
      event.command[event.command_name]
    end

  name = [event.database_name,
          collection,
          event.command_name].compact.join('.')

  span =
    ElasticAPM.start_span(
      name,
      TYPE,
      subtype: SUBTYPE,
      action: ACTION,
      context: build_context(event)
    )

  @events[event.operation_id] = span
end