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
Attributes
@return [ Array<Hash> | nil ] Information about libraries wrapping
the driver.
Public Class Methods
Source
# File lib/mongo/server/app_metadata.rb, line 74 def initialize(options) @app_name = options[:app_name].to_s if options[:app_name] @platform = options[:platform] @compressors = options[:compressors] || [] @wrapping_libraries = options[:wrapping_libraries] if options[:user] && !options[:auth_mech] auth_db = options[:auth_source] || 'admin' @request_auth_mech = "#{auth_db}.#{options[:user]}" end end
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. @option options [ Array<Hash> ] :wrapping_libraries Information about
libraries such as ODMs that are wrapping the driver. Specify the lower level libraries first. Allowed hash keys: :name, :version, :platform.
@since 2.4.0
Public Instance Methods
Source
# File lib/mongo/server/app_metadata.rb, line 101 def ismaster_bytes @ismaster_bytes ||= validate! && serialize.to_s end
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 @deprecated
Source
# File lib/mongo/server/app_metadata.rb, line 105 def validated_document validate! document end
Private Instance Methods
Source
# File lib/mongo/server/app_metadata.rb, line 183 def architecture RbConfig::CONFIG['target_cpu'] end
Source
# File lib/mongo/server/app_metadata.rb, line 132 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
Source
# File lib/mongo/server/app_metadata.rb, line 151 def driver_doc names = [DRIVER_NAME] versions = [Mongo::VERSION] if wrapping_libraries wrapping_libraries.each do |library| names << library[:name] || '' versions << library[:version] || '' end end { name: names.join('|'), version: versions.join('|'), } end
Source
# File lib/mongo/server/app_metadata.rb, line 119 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
Source
# File lib/mongo/server/app_metadata.rb, line 179 def name RbConfig::CONFIG['host_os'] end
Source
# File lib/mongo/server/app_metadata.rb, line 166 def os_doc { type: type, name: name, architecture: architecture } end
Source
# File lib/mongo/server/app_metadata.rb, line 187 def platform if BSON::Environment.jruby? ruby_versions = ["JRuby #{JRUBY_VERSION}", "like Ruby #{RUBY_VERSION}"] platforms = [RUBY_PLATFORM, "JVM #{java.lang.System.get_property('java.version')}"] else ruby_versions = ["Ruby #{RUBY_VERSION}"] platforms = [RUBY_PLATFORM] end platform = [ @platform, *ruby_versions, *platforms, RbConfig::CONFIG['build'], ].compact.join(', ') platforms = [platform] if wrapping_libraries wrapping_libraries.each do |library| platforms << library[:platform] || '' end end platforms.join('|') end
Source
# File lib/mongo/server/app_metadata.rb, line 128 def serialize Protocol::Query.new(Database::ADMIN, Database::COMMAND, document, :limit => -1).serialize end
Source
# File lib/mongo/server/app_metadata.rb, line 174 def type (RbConfig::CONFIG && RbConfig::CONFIG['host_os']) ? RbConfig::CONFIG['host_os'].split('_').first[/[a-z]+/i].downcase : 'unknown' end
Source
# File lib/mongo/server/app_metadata.rb, line 112 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