class Mongo::Cluster::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

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(cluster) click to toggle source

Instantiate the new AppMetadata object.

@api private

@example Instantiate the app metadata.

Mongo::Cluster.AppMetadata.new(cluster)

@param [ Mongo::Cluster ] cluster The cluster.

@since 2.4.0

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

  if cluster.options[:user] && !cluster.options[:auth_mech]
    auth_db = cluster.options[:auth_source] || 'admin'
    @request_auth_mech = "#{auth_db}.#{cluster.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/cluster/app_metadata.rb, line 75
def ismaster_bytes
  @ismaster_bytes ||= validate! && serialize.to_s
end

Private Instance Methods

architecture() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 144
def architecture
  RbConfig::CONFIG['target_cpu']
end
document() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 101
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/cluster/app_metadata.rb, line 120
def driver_doc
  {
    name: DRIVER_NAME,
    version: Mongo::VERSION
  }
end
full_client_document() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 88
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/cluster/app_metadata.rb, line 140
def name
  RbConfig::CONFIG['host_os']
end
os_doc() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 127
def os_doc
  {
    type: type,
    name: name,
    architecture: architecture
  }
end
platform() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 148
def platform
  [
    @platform,
    RUBY_VERSION,
    RUBY_PLATFORM,
    RbConfig::CONFIG['build']
  ].compact.join(', ')
end
serialize() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 97
def serialize
  Protocol::Query.new(Database::ADMIN, Database::COMMAND, document, :limit => -1).serialize
end
type() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 135
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/cluster/app_metadata.rb, line 81
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