Exemplo n.º 1
0
    def get_connection(self):
        connection_options = {
            'database': self._db,
            'host': self._server,
            'port': self._port,
            'user': self._username,
            'password': self._password,
            'backup_server_node': self._backup_servers,
            'connection_load_balance': self._connection_load_balance,
            'connection_timeout': self._timeout,
        }
        if self._client_lib_log_level:
            connection_options['log_level'] = self._client_lib_log_level
            # log_path is required by vertica client for using logging
            # when log_path is set to '', vertica won't log to a file
            # but we still get logs via parent root logger
            connection_options['log_path'] = ''

        if self._use_tls:
            tls_context = self.get_tls_context()
            connection_options['ssl'] = tls_context

        try:
            connection = vertica.connect(**exclude_undefined_keys(connection_options))
        except Exception as e:
            self.log.error('Unable to connect to database `%s` as user `%s`: %s', self._db, self._username, e)
            self.service_check(self.SERVICE_CHECK_CONNECT, self.CRITICAL, tags=self._tags)
        else:
            self.service_check(self.SERVICE_CHECK_CONNECT, self.OK, tags=self._tags)
            return connection
Exemplo n.º 2
0
def test_query_construction(new_check, instance, filters, query):
    instance['filters'] = filters
    check = new_check(instance)
    check.load_configuration_models()

    assert construct_xpath_query(
        exclude_undefined_keys(check.config.filters.dict())) == query
Exemplo n.º 3
0
    def construct_query(self):
        query = self.config.query
        if query:
            self._query = query
            return

        self._query = construct_xpath_query(
            exclude_undefined_keys(self.config.filters.dict()))
        self.log.debug('Using constructed query: %s', self._query)
Exemplo n.º 4
0
def version_metadata():
    if '-' in ELASTIC_VERSION:
        base, release = ELASTIC_VERSION.split('-')
        parts = base.split('.')
    else:
        release = None
        parts = ELASTIC_VERSION.split('.')

    major = parts[0]
    minor = parts[1] if len(parts) > 1 else mock.ANY
    patch = parts[2] if len(parts) > 2 else mock.ANY
    return exclude_undefined_keys({
        'version.scheme': 'semver',
        'version.major': major,
        'version.minor': minor,
        'version.patch': patch,
        'version.raw': mock.ANY,
        'version.release': release,
    })
Exemplo n.º 5
0
    def __init__(self, name, init_config, instances=None):
        super(MongoDb, self).__init__(name, init_config, instances)

        # x.509 authentication
        self.ssl_params = exclude_undefined_keys({
            'ssl':
            self.instance.get('ssl', None),
            'ssl_keyfile':
            self.instance.get('ssl_keyfile', None),
            'ssl_certfile':
            self.instance.get('ssl_certfile', None),
            'ssl_cert_reqs':
            self.instance.get('ssl_cert_reqs', None),
            'ssl_ca_certs':
            self.instance.get('ssl_ca_certs', None),
        })

        if 'server' in self.instance:
            self.warning(
                'Option `server` is deprecated and will be removed in a future release. Use `hosts` instead.'
            )
            self.server = self.instance['server']
        else:
            hosts = self.instance.get('hosts', [])
            if not hosts:
                raise ConfigurationError('No `hosts` specified')

            username = self.instance.get('username')
            password = self.instance.get('password')

            if password and not username:
                raise ConfigurationError(
                    '`username` must be set when a `password` is specified')

            self.server = build_connection_string(
                hosts,
                scheme=self.instance.get('connection_scheme', 'mongodb'),
                username=username,
                password=password,
                database=self.instance.get('database'),
                options=self.instance.get('options'),
            )

        (
            self.username,
            self.password,
            self.db_name,
            self.nodelist,
            self.clean_server_name,
            self.auth_source,
        ) = parse_mongo_uri(self.server,
                            sanitize_username=bool(self.ssl_params))

        self.additional_metrics = self.instance.get('additional_metrics', [])

        # Get the list of metrics to collect
        self.collect_tcmalloc_metrics = 'tcmalloc' in self.additional_metrics
        self.metrics_to_collect = self._build_metric_list_to_collect()

        if not self.db_name:
            self.log.info(
                'No MongoDB database found in URI. Defaulting to admin.')
            self.db_name = 'admin'

        # Tagging
        custom_tags = list(set(self.instance.get('tags', [])))
        self.service_check_tags = ["db:%s" % self.db_name] + custom_tags

        # ...add the `server` tag to the metrics' tags only
        # (it's added in the backend for service checks)
        self.base_tags = custom_tags + ['server:%s' % self.clean_server_name]

        if self.nodelist:
            host = self.nodelist[0][0]
            port = self.nodelist[0][1]
            self.service_check_tags = self.service_check_tags + [
                "host:%s" % host, "port:%s" % port
            ]

        self.timeout = float(self.instance.get('timeout',
                                               DEFAULT_TIMEOUT)) * 1000

        # Authenticate
        self.do_auth = True
        self.use_x509 = self.ssl_params and not self.password
        if not self.username:
            self.log.debug(u"A username is required to authenticate to `%s`",
                           self.server)
            self.do_auth = False

        self.replica_check = is_affirmative(
            self.instance.get('replica_check', True))
        self.collections_indexes_stats = is_affirmative(
            self.instance.get('collections_indexes_stats'))
        self.coll_names = self.instance.get('collections', [])
        self.custom_queries = self.instance.get("custom_queries", [])
        # By default consider that this instance is a standalone, updated on each check run.
        self.deployment = StandaloneDeployment()
        self.collectors = []
        self.last_states_by_server = {}
Exemplo n.º 6
0
    def __init__(self, instance, log):
        self.log = log

        # x.509 authentication
        self.ssl_params = exclude_undefined_keys({
            'ssl':
            instance.get('ssl', None),
            'ssl_keyfile':
            instance.get('ssl_keyfile', None),
            'ssl_certfile':
            instance.get('ssl_certfile', None),
            'ssl_cert_reqs':
            instance.get('ssl_cert_reqs', None),
            'ssl_ca_certs':
            instance.get('ssl_ca_certs', None),
        })

        if 'server' in instance:
            self.server = instance['server']
            (
                self.username,
                self.password,
                self.db_name,
                self.hosts,
                _,
                self.auth_source,
            ) = parse_mongo_uri(self.server,
                                sanitize_username=bool(self.ssl_params))
            self.scheme = None
            self.additional_options = {}
            self.hosts = ["%s:%s" % (host[0], host[1]) for host in self.hosts]
        else:
            self.server = None
            self.hosts = instance.get('hosts', [])
            self.username = instance.get('username')
            self.password = instance.get('password')
            # Deprecated
            self.scheme = instance.get('connection_scheme', 'mongodb')
            self.db_name = instance.get('database')
            self.additional_options = instance.get('options', {})
            self.auth_source = self.additional_options.get(
                'authSource') or self.db_name or 'admin'

        if not self.hosts:
            raise ConfigurationError('No `hosts` specified')

        self.clean_server_name = self._get_clean_server_name()
        if self.password and not self.username:
            raise ConfigurationError(
                '`username` must be set when a `password` is specified')

        if self.scheme != 'mongodb':
            self.log.info(
                "connection_scheme is deprecated and shouldn't be set to a value other than 'mongodb'"
            )

        if not self.db_name:
            self.log.info(
                'No MongoDB database found in URI. Defaulting to admin.')
            self.db_name = 'admin'

        self.timeout = float(instance.get('timeout', DEFAULT_TIMEOUT)) * 1000
        self.additional_metrics = instance.get('additional_metrics', [])

        # Authenticate
        self.do_auth = True
        self.use_x509 = self.ssl_params and not self.password
        if not self.username:
            self.log.info(
                "Disabling authentication because a username was not provided."
            )
            self.do_auth = False

        self.replica_check = is_affirmative(instance.get(
            'replica_check', True))
        self.collections_indexes_stats = is_affirmative(
            instance.get('collections_indexes_stats'))
        self.coll_names = instance.get('collections', [])
        self.custom_queries = instance.get("custom_queries", [])

        self._base_tags = list(set(instance.get('tags', [])))
        self.service_check_tags = self._compute_service_check_tags()
        self.metric_tags = self._compute_metric_tags()