def test_check(aggregator, dd_environment, get_instance): """ Collect ZooKeeper metrics. """ zk_check = ZookeeperCheck(conftest.CHECK_NAME, {}, {}) zk_check.check(get_instance) zk_check.check(get_instance) # Test metrics for mname in conftest.STAT_METRICS: aggregator.assert_metric(mname, tags=["mode:standalone", "mytag"]) zk_version = os.environ.get("ZK_VERSION") or "3.4.10" if zk_version and LooseVersion(zk_version) > LooseVersion("3.4.0"): for mname in conftest.MNTR_METRICS: aggregator.assert_metric(mname, tags=["mode:standalone", "mytag"]) # Test service checks aggregator.assert_service_check("zookeeper.ruok", status=zk_check.OK) aggregator.assert_service_check("zookeeper.mode", status=zk_check.OK) expected_mode = get_instance['expected_mode'] mname = "zookeeper.instances.{}".format(expected_mode) aggregator.assert_metric(mname, value=1) aggregator.assert_all_metrics_covered()
def test_wrong_expected_mode(aggregator, dd_environment, get_invalid_mode_instance): """ Raise a 'critical' service check when ZooKeeper is not in the expected mode. """ zk_check = ZookeeperCheck(conftest.CHECK_NAME, {}, {}) zk_check.check(get_invalid_mode_instance) # Test service checks aggregator.assert_service_check("zookeeper.mode", status=zk_check.CRITICAL)
def test_error_state(aggregator, dd_environment, get_conn_failure_config): """ Raise a 'critical' service check when ZooKeeper is in an error state. Report status as down. """ zk_check = ZookeeperCheck(conftest.CHECK_NAME, {}, {}) with pytest.raises(Exception): zk_check.check(get_conn_failure_config) aggregator.assert_service_check("zookeeper.ruok", status=zk_check.CRITICAL) aggregator.assert_metric("zookeeper.instances", tags=["mode:down"], count=1) expected_mode = get_conn_failure_config['expected_mode'] mname = "zookeeper.instances.{}".format(expected_mode) aggregator.assert_metric(mname, value=1, count=1)
def test_parse_replica_mntr(aggregator, mock_mntr_output, get_test_instance): unparsed_line = "zk_peer_state following - broadcast\n" expected_message = "Unexpected 'mntr' output `%s`: %s" # Value Error is more verbose in PY 3 error_message = 'too many values to unpack' if PY3: error_message = "too many values to unpack (expected 2)" check = ZookeeperCheck(conftest.CHECK_NAME, {}, [get_test_instance]) check.log = mock.MagicMock() metrics, mode = check.parse_mntr(mock_mntr_output) assert mode == 'follower' assert len(metrics) == 499 check.log.debug.assert_called_once_with(expected_message, unparsed_line, error_message)
def test_metadata(datadog_agent): check = ZookeeperCheck(conftest.CHECK_NAME, {}, [conftest.VALID_CONFIG]) check.check_id = 'test:123' check.check(conftest.VALID_CONFIG) raw_version = common.ZK_VERSION major, minor = raw_version.split('.')[:2] version_metadata = { 'version.scheme': 'semver', 'version.major': major, 'version.minor': minor, 'version.patch': mock.ANY, 'version.raw': mock.ANY, } datadog_agent.assert_metadata('test:123', version_metadata)
def extract_nan_metrics(text): log_pattern = r'Metric value \"(\S+)\" is not supported for metric (\S+)' metrics = [] for line in text.splitlines(): m = re.search(log_pattern, line) if m: key = m.groups()[1] metrics.append(ZookeeperCheck.normalize_metric_label(key)) return metrics
def condition_non_tls(): sys.stderr.write("Waiting for ZK to boot...\n") booted = False dummy_instance = {'host': HOST, 'port': PORT, 'timeout': 500} for _ in range(10): try: out = ZookeeperCheck('zk', {}, [dummy_instance])._send_command('ruok') out.seek(0) if out.readline() != 'imok': raise ZKConnectionFailure() booted = True break except ZKConnectionFailure: time.sleep(1) if not booted: raise RetryError("Zookeeper failed to boot!") sys.stderr.write("ZK boot complete.\n")
def test_check(aggregator, dd_environment, get_instance, caplog): """ Collect ZooKeeper metrics. """ caplog.set_level(logging.DEBUG) zk_check = ZookeeperCheck(conftest.CHECK_NAME, {}, {}) zk_check.check(get_instance) zk_check.check(get_instance) skipped_metrics = extract_nan_metrics(caplog.text) # Test metrics common.assert_stat_metrics(aggregator) common.assert_mntr_metrics_by_version(aggregator, skipped_metrics) common.assert_service_checks_ok(aggregator) expected_mode = get_instance['expected_mode'] mname = "zookeeper.instances.{}".format(expected_mode) aggregator.assert_metric(mname, value=1) aggregator.assert_all_metrics_covered()
def condition(): sys.stderr.write("Waiting for ZK to boot...\n") booted = False for _ in xrange(3): try: out = ZookeeperCheck._send_command('ruok', HOST, PORT, 500) out.seek(0) if out.readline() != 'imok': raise ZKConnectionFailure() booted = True except ZKConnectionFailure: time.sleep(1) if not booted: raise RetryError("Zookeeper failed to boot!") sys.stderr.write("ZK boot complete.\n")