def test_metric_limit_gauges(self, aggregator): check = LimitedCheck() assert check.get_warnings() == [] for i in range(0, 10): check.gauge("metric", 0) assert len(check.get_warnings()) == 0 assert len(aggregator.metrics("metric")) == 10 for i in range(0, 10): check.gauge("metric", 0) assert len(check.get_warnings()) == 1 assert len(aggregator.metrics("metric")) == 10
def test_metric_limit_instance_config(self, aggregator): instances = [{ "max_returned_metrics": 42, }] check = AgentCheck("test", {}, instances) assert check.get_warnings() == [] for i in range(0, 42): check.gauge("metric", 0) assert len(check.get_warnings()) == 0 assert len(aggregator.metrics("metric")) == 42 check.gauge("metric", 0) assert len(check.get_warnings()) == 1 assert len(aggregator.metrics("metric")) == 42
def test_metric_limit_count(self, aggregator): check = LimitedCheck() assert check.get_warnings() == [] # Multiple calls for a single set of (metric_name, tags) should not trigger for i in range(0, 20): check.count("metric", 0, hostname="host-single") assert len(check.get_warnings()) == 0 assert len(aggregator.metrics("metric")) == 20 # Multiple sets of tags should trigger # Only 9 new sets of tags should pass through for i in range(0, 20): check.count("metric", 0, hostname="host-{}".format(i)) assert len(check.get_warnings()) == 1 assert len(aggregator.metrics("metric")) == 29
def test_metric_limit_instance_config_zero(self, aggregator): instances = [{ "max_returned_metrics": 0, }] check = LimitedCheck("test", {}, instances) assert len(check.get_warnings()) == 1 for i in range(0, 42): check.gauge("metric", 0) assert len(check.get_warnings()) == 1 # get_warnings resets the array assert len(aggregator.metrics("metric")) == 10
def test_success(self, aggregator): instance = INSTANCES['main'] c = Envoy(self.CHECK_NAME, None, {}, [instance]) c.check(instance) metrics_collected = 0 for metric in METRICS.keys(): metrics_collected += len(aggregator.metrics(METRIC_PREFIX + metric)) assert metrics_collected >= 250
def test_invalid_metric(aggregator, poll_mock): """ Testing that invalid values of metrics are discarded """ bad_metric_instance = { 'prometheus_url': 'http://localhost:10249/metrics', 'namespace': 'prometheus', 'metrics': [{ 'metric1': 'renamed.metric1' }, 'metric2', 'metric3'], 'send_histograms_buckets': True } c = PrometheusCheck('prometheus', None, {}, [bad_metric_instance]) c.check(bad_metric_instance) assert aggregator.metrics('metric3') == []
def test_success(self, aggregator): instance = self.INSTANCES['main'] c = Envoy(self.CHECK_NAME, None, {}, [instance]) with mock.patch('requests.get', return_value=response('multiple_services')): c.check(instance) metrics_collected = 0 for metric in METRICS.keys(): metrics_collected += len(aggregator.metrics(METRIC_PREFIX + metric)) num_metrics = len( response('multiple_services').content.decode().splitlines()) num_metrics -= sum(c.unknown_metrics.values()) + sum( c.unknown_tags.values()) assert 4150 <= metrics_collected == num_metrics
def test_check(aggregator, spin_up_elastic): elastic_check = ESCheck(CHECK_NAME, {}, {}) default_tags = ["url:http://{0}:{1}".format(HOST, PORT)] for _ in xrange(2): try: elastic_check.check(CONFIG) except Exception: time.sleep(1) elastic_check.check(CONFIG) expected_metrics = dict(ESCheck.STATS_METRICS) ESCheck.CLUSTER_HEALTH_METRICS.update(ESCheck.CLUSTER_PENDING_TASKS) expected_metrics.update(ESCheck.CLUSTER_HEALTH_METRICS) instance = elastic_check.get_instance_config(CONFIG) es_version = elastic_check._get_es_version(instance) assert es_version == get_es_version() if es_version < [5, 0, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_PRE_5_0_0) if es_version >= [0, 90, 5]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_0_90_5) if es_version >= [0, 90, 10]: expected_metrics.update(ESCheck.JVM_METRICS_POST_0_90_10) else: expected_metrics.update(ESCheck.JVM_METRICS_PRE_0_90_10) else: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_PRE_0_90_5) expected_metrics.update(ESCheck.JVM_METRICS_PRE_0_90_10) if es_version >= [1, 0, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_1_0_0) if es_version < [2, 0, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_PRE_2_0) if es_version >= [0, 90, 5]: expected_metrics.update( ESCheck.ADDITIONAL_METRICS_POST_0_90_5_PRE_2_0) # Currently has issues in test framework # if es_version >= [1, 0, 0]: # expected_metrics.update(ESCheck.ADDITIONAL_METRICS_1_x) if es_version >= [1, 3, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_1_3_0) if es_version >= [1, 4, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_1_4_0) if es_version >= [1, 5, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_1_5_0) if es_version >= [1, 6, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_1_6_0) if es_version >= [2, 0, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_2_0) if es_version >= [2, 1, 0]: expected_metrics.update(ESCheck.ADDITIONAL_METRICS_POST_2_1) if os.environ.get("DD_ELASTIC_LOCAL_HOSTNAME"): local_hostname = os.environ.get("DD_ELASTIC_LOCAL_HOSTNAME") elif es_version < [2, 0, 0]: local_hostname = socket.gethostname() else: local_hostname = '127.0.0.1' contexts = [(CONF_HOSTNAME, default_tags + TAGS), (local_hostname, default_tags + TAGS)] stats_keys = (set(expected_metrics.keys()) - set(ESCheck.CLUSTER_HEALTH_METRICS.keys()) - set(ESCheck.CLUSTER_PENDING_TASKS.keys())) # index_writer_max_memory metric was removed in v5 deprecated_metrics = [ 'elasticsearch.indices.segments.index_writer_max_memory_in_bytes' ] for m_name, desc in set(expected_metrics.iteritems()): for hostname, m_tags in contexts: m_tags = m_tags + CLUSTER_TAG if (m_name in ESCheck.CLUSTER_HEALTH_METRICS and hostname == local_hostname): hostname = CONF_HOSTNAME if m_name in stats_keys: m_tags = m_tags + [u"node_name:batman"] m_tags.sort() if desc[0] == "gauge": aggregator.metrics(m_name) if es_version < [2, 0, 0]: aggregator.assert_metric(m_name, tags=m_tags) elif not (m_name in deprecated_metrics): aggregator.assert_metric(m_name) good_sc_tags = ['host:{0}'.format(HOST), 'port:{0}'.format(PORT)] aggregator.assert_service_check( 'elasticsearch.can_connect', status=ESCheck.OK, # OK tags=good_sc_tags + TAGS) # Assert service metadata # self.assertServiceMetadata(['version'], count=3) # FIXME: 0.90.13 returns randomly a red status instead of yellow, # so we don't do a coverage test for it # Remove me when we stop supporting 0.90.x (not supported anymore by ES) if get_es_version() != [0, 90, 13]: # Warning because elasticsearch status should be yellow, according to # http://chrissimpson.co.uk/elasticsearch-yellow-cluster-status-explained.html aggregator.assert_service_check('elasticsearch.cluster_health')