def test_service_check(aggregator, instance): check = Etcd(CHECK_NAME, {}, [instance]) check.check(instance) tags = ['endpoint:{}'.format(instance['prometheus_url'])] aggregator.assert_service_check('etcd.prometheus.health', Etcd.OK, tags=tags, count=1)
def test_legacy_service_checks(legacy_instance, aggregator): check = Etcd(CHECK_NAME, {}, [legacy_instance]) check.check(legacy_instance) tags = ['url:{}'.format(URL), 'etcd_state:{}'.format('leader' if is_leader(URL) else 'follower')] aggregator.assert_service_check(check.SERVICE_CHECK_NAME, tags=tags, count=1) aggregator.assert_service_check(check.HEALTH_SERVICE_CHECK_NAME, tags=tags[:1], count=1)
def test_followers(aggregator, spin_up_etcd): compose_file = spin_up_etcd urls = [] result = run_command('docker-compose -f {} ps -q'.format(compose_file), capture='out', check=True) container_ids = result.stdout.splitlines() for container_id in container_ids: result = run_command('docker port {} 2379/tcp'.format(container_id), capture='out', check=True) port = result.stdout.strip().split(':')[-1] urls.append('http://{}:{}'.format(HOST, port)) for url in urls: if is_leader(url): break else: raise Exception('No leader found') response = requests.get('{}/v2/stats/leader'.format(url)) followers = list(response.json().get('followers', {}).keys()) instance = {'url': url} check = Etcd(CHECK_NAME, None, {}, [instance]) check.check(instance) common_leader_tags = ['url:{}'.format(url), 'etcd_state:leader'] follower_tags = [ common_leader_tags + ['follower:{}'.format(followers[0])], common_leader_tags + ['follower:{}'.format(followers[1])], ] for fol_tags in follower_tags: aggregator.assert_metric('etcd.leader.counts.fail', count=1, tags=fol_tags) aggregator.assert_metric('etcd.leader.counts.success', count=1, tags=fol_tags) aggregator.assert_metric('etcd.leader.latency.avg', count=1, tags=fol_tags) aggregator.assert_metric('etcd.leader.latency.min', count=1, tags=fol_tags) aggregator.assert_metric('etcd.leader.latency.max', count=1, tags=fol_tags) aggregator.assert_metric('etcd.leader.latency.stddev', count=1, tags=fol_tags) aggregator.assert_metric('etcd.leader.latency.current', count=1, tags=fol_tags)
def test_bad_config(aggregator): bad_url = '{}/test'.format(URL) instance = {'url': bad_url, 'use_preview': False} check = Etcd(CHECK_NAME, {}, [instance]) with pytest.raises(Exception): check.check(instance) aggregator.assert_service_check(check.SERVICE_CHECK_NAME, tags=['url:{}'.format(bad_url)], count=1) aggregator.assert_service_check(check.HEALTH_SERVICE_CHECK_NAME)
def test_check(aggregator, instance, openmetrics_metrics): check = Etcd('etcd', {}, [instance]) check.check(instance) tags = ['is_leader:{}'.format('true' if is_leader(URL) else 'false')] for metric in openmetrics_metrics: aggregator.assert_metric('etcd.{}'.format(metric), tags=tags, at_least=0) assert aggregator.metrics_asserted_pct > 79, 'Missing metrics {}'.format(aggregator.not_asserted())
def test_legacy_metrics(legacy_instance, aggregator): check = Etcd(CHECK_NAME, {}, [legacy_instance]) check.check(legacy_instance) tags = ['url:{}'.format(URL), 'etcd_state:{}'.format('leader' if is_leader(URL) else 'follower')] for mname in STORE_METRICS: aggregator.assert_metric('etcd.store.{}'.format(mname), tags=tags, count=1) aggregator.assert_metric('etcd.self.send.appendrequest.count', tags=tags, count=1) aggregator.assert_metric('etcd.self.recv.appendrequest.count', tags=tags, count=1)
def test_check_no_leader_tag(aggregator, instance, openmetrics_metrics): instance = deepcopy(instance) instance['leader_tag'] = False check = Etcd('etcd', {}, [instance]) check.check(instance) for metric in openmetrics_metrics: aggregator.assert_metric('etcd.{}'.format(metric), tags=[], at_least=0) assert aggregator.metrics_asserted_pct > 79, 'Missing metrics {}'.format(aggregator.not_asserted())
def test_check(aggregator, instance): check = Etcd('etcd', {}, {}, [instance]) check.check(instance) for metric in itervalues(METRIC_MAP): try: aggregator.assert_metric(metric) except AssertionError: pass assert aggregator.metrics_asserted_pct > 80
def test_bad_config(main_instance, aggregator): instance = {'url': '{}/test'.format(main_instance['url'])} check = Etcd(CHECK_NAME, None, {}, [instance]) with pytest.raises(Exception): check.check(instance) aggregator.assert_service_check( check.SERVICE_CHECK_NAME, tags=['url:{}/test'.format(main_instance['url'])], count=1) aggregator.assert_service_check(check.HEALTH_SERVICE_CHECK_NAME)
def test_check(aggregator, instance): check = Etcd('etcd', {}, {}, [instance]) check.check(instance) tags = ['is_leader:{}'.format('true' if is_leader(URL) else 'false')] for metric in itervalues(METRIC_MAP): try: aggregator.assert_metric(metric, tags=tags) except AssertionError: pass assert aggregator.metrics_asserted_pct > 80
def test_service_check(aggregator, instance): check = Etcd(CHECK_NAME, None, {}, [instance]) check.check(instance) tags = [ 'endpoint:{}'.format(instance['prometheus_url']), 'is_leader:{}'.format('true' if is_leader(URL) else 'false') ] aggregator.assert_service_check('etcd.prometheus.health', Etcd.OK, tags=tags, count=1)
def test_config_legacy(legacy_instance, test_case, extra_config, expected_http_kwargs): legacy_instance.update(extra_config) check = Etcd(CHECK_NAME, {}, [legacy_instance]) with mock.patch('datadog_checks.base.utils.http.requests') as r: r.get.return_value = mock.MagicMock(status_code=200) check.check(legacy_instance) http_kwargs = dict( auth=mock.ANY, cert=mock.ANY, headers=mock.ANY, proxies=mock.ANY, timeout=mock.ANY, verify=mock.ANY ) http_kwargs.update(expected_http_kwargs) r.get.assert_called_with(URL + '/v2/stats/store', **http_kwargs)
def test_check_no_leader_tag(aggregator, instance): instance = deepcopy(instance) instance['leader_tag'] = False check = Etcd('etcd', {}, {}, [instance]) check.check(instance) for metric in itervalues(METRIC_MAP): try: aggregator.assert_metric(metric, tags=[]) except AssertionError: pass assert aggregator.metrics_asserted_pct > 80
def test_version_metadata(aggregator, instance, dd_environment, datadog_agent): check_instance = Etcd(CHECK_NAME, {}, [instance]) check_instance.check_id = 'test:123' check_instance.check(instance) raw_version = ETCD_VERSION.lstrip('v') # version contain `v` prefix major, minor, patch = raw_version.split('.') version_metadata = { 'version.scheme': 'semver', 'version.major': major, 'version.minor': minor, 'version.patch': patch, 'version.raw': raw_version, } datadog_agent.assert_metadata('test:123', version_metadata)
def test_service_checks(main_instance, aggregator): check = Etcd(CHECK_NAME, None, {}, [main_instance]) check.check(main_instance) url = main_instance['url'] tags = [ 'url:{}'.format(url), 'etcd_state:{}'.format('leader' if is_leader(url) else 'follower') ] aggregator.assert_service_check(check.SERVICE_CHECK_NAME, tags=tags, count=1) aggregator.assert_service_check(check.HEALTH_SERVICE_CHECK_NAME, tags=tags[:1], count=1)
def test_config(instance, test_case, extra_config, expected_http_kwargs): instance.update(extra_config) check = Etcd(CHECK_NAME, {}, [instance]) with mock.patch('datadog_checks.base.utils.http.requests') as r: r.get.return_value = mock.MagicMock(status_code=200) check.check(instance) http_kwargs = dict( auth=mock.ANY, cert=mock.ANY, data=mock.ANY, headers=mock.ANY, proxies=mock.ANY, timeout=mock.ANY, verify=mock.ANY, ) http_kwargs.update(expected_http_kwargs) r.post.assert_called_with(URL + '/v3alpha/maintenance/status', **http_kwargs)