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] || []
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 70
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 138
def architecture
  RbConfig::CONFIG['target_cpu']
end
document() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 96
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
end
driver_doc() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 114
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 83
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 134
def name
  RbConfig::CONFIG['host_os']
end
os_doc() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 121
def os_doc
  {
    type: type,
    name: name,
    architecture: architecture
  }
end
platform() click to toggle source
# File lib/mongo/cluster/app_metadata.rb, line 142
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 92
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 129
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 76
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