module OneApm::Agent::Datastore::Mongo::MetricTranslator

Constants

OA_CMD_COLLECTION
OA_MONGO_PRODUCT_NAME
OA_NAMES_IN_SELECTOR

Public Class Methods

build_metrics(name, collection) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 60
def self.build_metrics(name, collection)
  OneApm::Agent::Datastore::MetricHelper.metrics_for(OA_MONGO_PRODUCT_NAME,
                                                        name,
                                                        collection)
end
collection_in_selector?(payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 66
def self.collection_in_selector?(payload)
  payload[:collection] == '$cmd' && payload[:selector]
end
collection_name_from_group_selector(payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 174
def self.collection_name_from_group_selector(payload)
  payload[:selector]["group"]["ns"]
end
collection_name_from_index(payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 156
def self.collection_name_from_index(payload)
  if payload[:documents]
    if payload[:documents].is_a?(Array)
      # mongo gem versions pre 1.10.0
      document = payload[:documents].first
    else
      # mongo gem versions 1.10.0 and later
      document = payload[:documents]
    end

    if document && document[:ns]
      return document[:ns].split('.').last
    end
  end

  'system.indexes'
end
collection_name_from_rename_selector(payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 178
def self.collection_name_from_rename_selector(payload)
  parts = payload[:selector][:renameCollection].split('.')
  parts.shift
  parts.join('.')
end
command_key_from_selector(payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 89
def self.command_key_from_selector(payload)
  selector = payload[:selector]
  OA_NAMES_IN_SELECTOR.find do |check_name|
    selector.key?(check_name)
  end
end
create_index?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 132
def self.create_index?(name, payload)
  name == :insert && payload[:collection] == "system.indexes"
end
create_indexes?(name, paylod) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 128
def self.create_indexes?(name, paylod)
  name == :createIndexes
end
drop_index?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 140
def self.drop_index?(name, payload)
  name == :deleteIndexes
end
drop_indexes?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 136
def self.drop_indexes?(name, payload)
  name == :deleteIndexes && payload[:selector] && payload[:selector][:index] == "*"
end
find_and_modify?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 120
def self.find_and_modify?(name, payload)
  name == :findandmodify
end
find_and_remove?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 124
def self.find_and_remove?(name, payload)
  name == :findandmodify && payload[:selector] && payload[:selector][:remove]
end
find_one?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 116
def self.find_one?(name, payload)
  name == :find && payload[:limit] == -1
end
get_collection_from_selector(command_key, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 107
def self.get_collection_from_selector(command_key, payload)
  if command_key
    payload[:selector][command_key]
  else
    OneApm::Manager.increment_metric("Supportability/Mongo/UnknownCollection")
    OA_CMD_COLLECTION
  end
end
get_name_from_selector(command_key, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 96
def self.get_name_from_selector(command_key, payload)
  if command_key
    command_key.to_sym
  else
    OneApm::Manager.increment_metric("Supportability/Mongo/UnknownCollection")
    payload[:selector].first.first unless command_key
  end
end
group?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 148
def self.group?(name, payload)
  name == :group
end
metrics_for(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 11
def self.metrics_for(name, payload)
  payload ||= {}

  if collection_in_selector?(payload)
    command_key = command_key_from_selector(payload)
    name        = get_name_from_selector(command_key, payload)
    collection  = get_collection_from_selector(command_key, payload)
  else
    collection = payload[:collection]
  end

  # The 1.10.0 version of the mongo driver renamed 'remove' to
  # 'delete', but for metric consistency with previous versions we
  # want to keep it as 'remove'.
  name = 'remove' if name.to_s == 'delete'

  if self.find_one?(name, payload)
    name = 'findOne'
  elsif self.find_and_remove?(name, payload)
    name = 'findAndRemove'
  elsif self.find_and_modify?(name, payload)
    name = 'findAndModify'
  elsif self.create_indexes?(name, payload)
    name = 'createIndexes'
  elsif self.create_index?(name, payload)
    name = 'createIndex'
    collection = self.collection_name_from_index(payload)
  elsif self.drop_indexes?(name, payload)
    name = 'dropIndexes'
  elsif self.drop_index?(name, payload)
    name = 'dropIndex'
  elsif self.re_index?(name, payload)
    name = 'reIndex'
  elsif self.group?(name, payload)
    name = 'group'
    collection = collection_name_from_group_selector(payload)
  elsif self.rename_collection?(name, payload)
    name = 'renameCollection'
    collection = collection_name_from_rename_selector(payload)
  end

  build_metrics(name, collection)
rescue => e
  OneApm::Manager.logger.debug("Failure during Mongo metric generation", e)
  []
end
re_index?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 144
def self.re_index?(name, payload)
  name == :reIndex && payload[:selector] && payload[:selector][:reIndex]
end
rename_collection?(name, payload) click to toggle source
# File lib/one_apm/agent/datastore/mongo/metric_translator.rb, line 152
def self.rename_collection?(name, payload)
  name == :renameCollection
end