class Mongo::Server::AppMetadata

Application metadata that is sent to the server in an ismaster command,

when a new connection is established.

@api private

@since 2.4.0

Constants

AUTH_OPTION_KEYS

Option keys that affect auth mechanism negotiation.

@api private

DRIVER_NAME

The driver name.

@since 2.4.0

MAX_APP_NAME_SIZE

The max application name byte size.

@since 2.4.0

MAX_DOCUMENT_SIZE

The max application metadata document byte size.

@since 2.4.0

Public Class Methods

new(options) click to toggle source

Instantiate the new AppMetadata object.

@api private

@example Instantiate the app metadata.

Mongo::Server::AppMetadata.new(options)

@param [ Hash ] options Metadata options. @option options [ String, Symbol ] :app_name Application name that is

printed to the mongod logs upon establishing a connection in server
versions >= 3.4.

@option options [ Symbol ] :auth_mech The authentication mechanism to

use. One of :mongodb_cr, :mongodb_x509, :plain, :scram, :scram256

@option options [ String ] :auth_source The source to authenticate from. @option options [ Array<String> ] :compressors A list of potential

compressors to use, in order of preference. The driver chooses the
first compressor that is also supported by the server. Currently the
driver only supports 'zlib'.

@option options [ String ] :platform Platform information to include in

the metadata printed to the mongod logs upon establishing a connection
in server versions >= 3.4.

@option options [ String ] :user The user name.

@since 2.4.0

# File lib/mongo/server/app_metadata.rb, line 70
def initialize(options)
  @app_name = options[:app_name].to_s if options[:app_name]
  @platform = options[:platform]
  @compressors = options[:compressors] || []

  if options[:user] && !options[:auth_mech]
    auth_db = options[:auth_source] || 'admin'
    @request_auth_mech = "#{auth_db}.#{options[:user]}"
  end
end

Public Instance Methods

ismaster_bytes() click to toggle source

Get the bytes of the ismaster message including this metadata.

@api private

@example Get the ismaster message bytes.

metadata.ismaster_bytes

@return [ String ] The raw bytes.

@since 2.4.0

# File lib/mongo/server/app_metadata.rb, line 91
def ismaster_bytes
  @ismaster_bytes ||= validate! && serialize.to_s
end

Private Instance Methods

architecture() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 160
def architecture
  RbConfig::CONFIG['target_cpu']
end
document() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 117
def document
  client_document = full_client_document
  while client_document.to_bson.to_s.size > MAX_DOCUMENT_SIZE do
    if client_document[:os][:name] || client_document[:os][:architecture]
      client_document[:os].delete(:name)
      client_document[:os].delete(:architecture)
    elsif client_document[:platform]
      client_document.delete(:platform)
    else
      client_document = nil
    end
  end
  document = Server::Monitor::Connection::ISMASTER
  document = document.merge(compression: @compressors)
  document[:client] = client_document
  document[:saslSupportedMechs] = @request_auth_mech if @request_auth_mech
  document
end
driver_doc() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 136
def driver_doc
  {
    name: DRIVER_NAME,
    version: Mongo::VERSION
  }
end
full_client_document() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 104
def full_client_document
  BSON::Document.new.tap do |doc|
    doc[:application] = { name: @app_name } if @app_name
    doc[:driver] = driver_doc
    doc[:os] = os_doc
    doc[:platform] = platform
  end
end
name() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 156
def name
  RbConfig::CONFIG['host_os']
end
os_doc() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 143
def os_doc
  {
    type: type,
    name: name,
    architecture: architecture
  }
end
platform() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 164
def platform
  [
    @platform,
    RUBY_VERSION,
    RUBY_PLATFORM,
    RbConfig::CONFIG['build']
  ].compact.join(', ')
end
serialize() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 113
def serialize
  Protocol::Query.new(Database::ADMIN, Database::COMMAND, document, :limit => -1).serialize
end
type() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 151
def type
  (RbConfig::CONFIG && RbConfig::CONFIG['host_os']) ?
    RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase : 'unknown'
end
validate!() click to toggle source
# File lib/mongo/server/app_metadata.rb, line 97
def validate!
  if @app_name && @app_name.bytesize > MAX_APP_NAME_SIZE
    raise Error::InvalidApplicationName.new(@app_name, MAX_APP_NAME_SIZE)
  end
  true
end