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)
Esempio n. 3
0
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())
Esempio n. 8
0
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
Esempio n. 9
0
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)
Esempio n. 10
0
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
Esempio n. 11
0
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)
Esempio n. 13
0
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)
Esempio n. 15
0
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)