diff --git a/crio/datadog_checks/crio/crio.py b/crio/datadog_checks/crio/crio.py index 8ce7e89a14e5a..07a7e49407ef6 100644 --- a/crio/datadog_checks/crio/crio.py +++ b/crio/datadog_checks/crio/crio.py @@ -11,11 +11,10 @@ class CrioCheck(OpenMetricsBaseCheck): DEFAULT_METRIC_LIMIT = 0 - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): super(CrioCheck, self).__init__( name, init_config, - agentConfig, instances, default_instances={ "crio": { diff --git a/crio/tests/test_crio.py b/crio/tests/test_crio.py index 08f44a7544ae3..5e71e9fd323d5 100644 --- a/crio/tests/test_crio.py +++ b/crio/tests/test_crio.py @@ -33,7 +33,7 @@ def test_crio(aggregator, mock_data): Testing crio. """ - c = CrioCheck(CHECK_NAME, None, {}, [instance]) + c = CrioCheck(CHECK_NAME, {}, [instance]) c.check(instance) aggregator.assert_metric(NAMESPACE + '.operations.count') aggregator.assert_metric(NAMESPACE + '.operations.latency.count') diff --git a/datadog_checks_base/datadog_checks/base/checks/openmetrics/base_check.py b/datadog_checks_base/datadog_checks/base/checks/openmetrics/base_check.py index 912bb9ba14e66..eb8b2aada4aab 100644 --- a/datadog_checks_base/datadog_checks/base/checks/openmetrics/base_check.py +++ b/datadog_checks_base/datadog_checks/base/checks/openmetrics/base_check.py @@ -34,6 +34,14 @@ class OpenMetricsBaseCheck(OpenMetricsScraperMixin, AgentCheck): DEFAULT_METRIC_LIMIT = 2000 + HTTP_CONFIG_REMAPPER = { + 'ssl_verify': {'name': 'tls_verify'}, + 'ssl_cert': {'name': 'tls_cert'}, + 'ssl_private_key': {'name': 'tls_private_key'}, + 'ssl_ca_cert': {'name': 'tls_ca_cert'}, + 'prometheus_timeout': {'name': 'timeout'}, + } + def __init__(self, *args, **kwargs): args = list(args) default_instances = kwargs.pop('default_instances', None) or {} @@ -49,6 +57,7 @@ def __init__(self, *args, **kwargs): super(OpenMetricsBaseCheck, self).__init__(*args, **kwargs) self.config_map = {} + self.http_handlers = {} self.default_instances = default_instances self.default_namespace = default_namespace diff --git a/datadog_checks_base/datadog_checks/base/checks/openmetrics/mixins.py b/datadog_checks_base/datadog_checks/base/checks/openmetrics/mixins.py index 407883eaec55c..1dc0f512aa3b8 100644 --- a/datadog_checks_base/datadog_checks/base/checks/openmetrics/mixins.py +++ b/datadog_checks_base/datadog_checks/base/checks/openmetrics/mixins.py @@ -10,12 +10,11 @@ import requests from prometheus_client.parser import text_fd_to_metric_families from six import PY3, iteritems, itervalues, string_types -from urllib3.exceptions import InsecureRequestWarning from ...config import is_affirmative from ...errors import CheckException from ...utils.common import to_string -from ...utils.warnings_util import disable_warnings_ctx +from ...utils.http import RequestsWrapper from .. import AgentCheck if PY3: @@ -288,8 +287,29 @@ def create_scraper_configuration(self, instance=None): if config['metadata_metric_name'] and config['metadata_label_map']: config['_default_metric_transformers'][config['metadata_metric_name']] = self.transform_metadata + # Set up the HTTP wrapper for this endpoint + self._set_up_http_handler(endpoint, config) + return config + def _set_up_http_handler(self, endpoint, scraper_config): + # TODO: Deprecate this behavior in Agent 8 + if scraper_config['ssl_verify'] is False: + scraper_config.setdefault('tls_ignore_warning', True) + + http_handler = self.http_handlers[endpoint] = RequestsWrapper( + scraper_config, self.init_config, self.HTTP_CONFIG_REMAPPER, self.log + ) + + headers = http_handler.options['headers'] + + bearer_token = scraper_config['_bearer_token'] + if bearer_token is not None: + headers['Authorization'] = 'Bearer {}'.format(bearer_token) + + # TODO: Determine if we really need this + headers.setdefault('accept-encoding', 'gzip') + def parse_metric_family(self, response, scraper_config): """ Parse the MetricFamily from a valid requests.Response object to provide a MetricFamily object (see [0]) @@ -556,53 +576,11 @@ def poll(self, scraper_config, headers=None): raise def send_request(self, endpoint, scraper_config, headers=None): - # Determine the headers - if headers is None: - headers = {} - if 'accept-encoding' not in headers: - headers['accept-encoding'] = 'gzip' - headers.update(scraper_config['extra_headers']) - - # Add the bearer token to headers - bearer_token = scraper_config['_bearer_token'] - if bearer_token is not None: - auth_header = {'Authorization': 'Bearer {}'.format(bearer_token)} - headers.update(auth_header) - - # Determine the SSL verification settings - cert = None - if isinstance(scraper_config['ssl_cert'], string_types): - if isinstance(scraper_config['ssl_private_key'], string_types): - cert = (scraper_config['ssl_cert'], scraper_config['ssl_private_key']) - else: - cert = scraper_config['ssl_cert'] - - verify = scraper_config['ssl_verify'] - # TODO: deprecate use as `ssl_verify` boolean - if scraper_config['ssl_ca_cert'] is False: - verify = False - - disable_insecure_warnings = False - if isinstance(scraper_config['ssl_ca_cert'], string_types): - verify = scraper_config['ssl_ca_cert'] - elif verify is False: - disable_insecure_warnings = True - - # Determine the authentication settings - username = scraper_config['username'] - password = scraper_config['password'] - auth = (username, password) if username is not None and password is not None else None - - with disable_warnings_ctx(InsecureRequestWarning, disable=disable_insecure_warnings): - return requests.get( - endpoint, - headers=headers, - stream=True, - timeout=scraper_config['prometheus_timeout'], - cert=cert, - verify=verify, - auth=auth, - ) + kwargs = {} + if headers: + kwargs['headers'] = headers + + return self.http_handlers[scraper_config['prometheus_url']].get(endpoint, stream=True, **kwargs) def get_hostname_for_sample(self, sample, scraper_config): """ diff --git a/kube_controller_manager/datadog_checks/kube_controller_manager/kube_controller_manager.py b/kube_controller_manager/datadog_checks/kube_controller_manager/kube_controller_manager.py index a318a0677df31..13a29d8ea68e0 100644 --- a/kube_controller_manager/datadog_checks/kube_controller_manager/kube_controller_manager.py +++ b/kube_controller_manager/datadog_checks/kube_controller_manager/kube_controller_manager.py @@ -81,7 +81,7 @@ class KubeControllerManagerCheck(KubeLeaderElectionMixin, OpenMetricsBaseCheck): "record_namespace": "kube-system", } - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): self.QUEUE_METRICS_TRANSFORMERS = { '_adds': self.queue_adds, '_depth': self.queue_depth, @@ -103,7 +103,6 @@ def __init__(self, name, init_config, agentConfig, instances=None): super(KubeControllerManagerCheck, self).__init__( name, init_config, - agentConfig, instances, default_instances={ "kube_controller_manager": { diff --git a/kube_controller_manager/tests/test_kube_controller_manager.py b/kube_controller_manager/tests/test_kube_controller_manager.py index b8f3b38a8539a..5c8f8c8e8683a 100644 --- a/kube_controller_manager/tests/test_kube_controller_manager.py +++ b/kube_controller_manager/tests/test_kube_controller_manager.py @@ -57,14 +57,14 @@ def mock_leader(): def test_check_metrics_with_deprecated(aggregator, mock_metrics, mock_leader): - c = KubeControllerManagerCheck(CHECK_NAME, None, {}, [instance]) + c = KubeControllerManagerCheck(CHECK_NAME, {}, [instance]) c.check(instance) generic_check_metrics(aggregator, True) def test_check_metrics_without_deprecated(aggregator, mock_metrics, mock_leader): - c = KubeControllerManagerCheck(CHECK_NAME, None, {}, [instance]) + c = KubeControllerManagerCheck(CHECK_NAME, {}, [instance]) c.check(instance2) generic_check_metrics(aggregator, False) diff --git a/kube_metrics_server/datadog_checks/kube_metrics_server/kube_metrics_server.py b/kube_metrics_server/datadog_checks/kube_metrics_server/kube_metrics_server.py index 573d32814aa79..5899a0ec7ee95 100644 --- a/kube_metrics_server/datadog_checks/kube_metrics_server/kube_metrics_server.py +++ b/kube_metrics_server/datadog_checks/kube_metrics_server/kube_metrics_server.py @@ -82,11 +82,10 @@ class KubeMetricsServerCheck(OpenMetricsBaseCheck): KUBE_METRICS_SERVER_NAMESPACE = "kube_metrics_server" - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): super(KubeMetricsServerCheck, self).__init__( name, init_config, - agentConfig, instances, default_instances={ "kube_metrics_server": { diff --git a/kube_metrics_server/tests/test_kube_metrics_server.py b/kube_metrics_server/tests/test_kube_metrics_server.py index 8db4c2909a598..546efa9c4e9f2 100644 --- a/kube_metrics_server/tests/test_kube_metrics_server.py +++ b/kube_metrics_server/tests/test_kube_metrics_server.py @@ -35,7 +35,7 @@ def mock_metrics(): def test_check_metrics(aggregator, mock_metrics): - c = KubeMetricsServerCheck(CHECK_NAME, None, {}, [instance]) + c = KubeMetricsServerCheck(CHECK_NAME, {}, [instance]) c.check(instance) def assert_metric(name, **kwargs): diff --git a/kube_proxy/datadog_checks/kube_proxy/kube_proxy.py b/kube_proxy/datadog_checks/kube_proxy/kube_proxy.py index 71c62fcf922a7..91368145622f0 100644 --- a/kube_proxy/datadog_checks/kube_proxy/kube_proxy.py +++ b/kube_proxy/datadog_checks/kube_proxy/kube_proxy.py @@ -7,11 +7,10 @@ class KubeProxyCheck(OpenMetricsBaseCheck): DEFAULT_METRIC_LIMIT = 0 - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): super(KubeProxyCheck, self).__init__( name, init_config, - agentConfig, instances, default_instances={ "kubeproxy": { diff --git a/kube_proxy/tests/test_kube_proxy.py b/kube_proxy/tests/test_kube_proxy.py index bf207a7caf7fb..b96181088cbc2 100644 --- a/kube_proxy/tests/test_kube_proxy.py +++ b/kube_proxy/tests/test_kube_proxy.py @@ -51,7 +51,7 @@ def test_check_iptables(aggregator, mock_iptables): Testing Kube_proxy in iptables mode. """ - c = KubeProxyCheck(CHECK_NAME, None, {}, [instance]) + c = KubeProxyCheck(CHECK_NAME, {}, [instance]) c.check(instance) aggregator.assert_metric(NAMESPACE + '.cpu.time') aggregator.assert_metric(NAMESPACE + '.mem.resident') @@ -74,7 +74,7 @@ def test_check_userspace(aggregator, mock_userspace): """ Testing Kube_proxy in userspace mode. """ - c = KubeProxyCheck(CHECK_NAME, None, {}, [instance]) + c = KubeProxyCheck(CHECK_NAME, {}, [instance]) c.check(instance) aggregator.assert_metric(NAMESPACE + '.cpu.time') aggregator.assert_metric(NAMESPACE + '.mem.resident') diff --git a/kube_scheduler/datadog_checks/kube_scheduler/kube_scheduler.py b/kube_scheduler/datadog_checks/kube_scheduler/kube_scheduler.py index a4f22460faec2..49921b7443edf 100644 --- a/kube_scheduler/datadog_checks/kube_scheduler/kube_scheduler.py +++ b/kube_scheduler/datadog_checks/kube_scheduler/kube_scheduler.py @@ -103,11 +103,10 @@ class KubeSchedulerCheck(KubeLeaderElectionMixin, OpenMetricsBaseCheck): "record_namespace": "kube-system", } - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): super(KubeSchedulerCheck, self).__init__( name, init_config, - agentConfig, instances, default_instances={ "kube_scheduler": { diff --git a/kube_scheduler/tests/test_kube_scheduler_1_13.py b/kube_scheduler/tests/test_kube_scheduler_1_13.py index 3d30f0caa2f00..a8e451803f1d8 100644 --- a/kube_scheduler/tests/test_kube_scheduler_1_13.py +++ b/kube_scheduler/tests/test_kube_scheduler_1_13.py @@ -46,7 +46,7 @@ def mock_leader(): def test_check_metrics_1_13(aggregator, mock_metrics, mock_leader): - c = KubeSchedulerCheck(CHECK_NAME, None, {}, [instance]) + c = KubeSchedulerCheck(CHECK_NAME, {}, [instance]) c.check(instance) def assert_metric(name, **kwargs): diff --git a/kube_scheduler/tests/test_kube_scheduler_1_14.py b/kube_scheduler/tests/test_kube_scheduler_1_14.py index 4926d14a2ccf7..d33a722eeaf40 100644 --- a/kube_scheduler/tests/test_kube_scheduler_1_14.py +++ b/kube_scheduler/tests/test_kube_scheduler_1_14.py @@ -46,7 +46,7 @@ def mock_leader(): def test_check_metrics_1_14(aggregator, mock_metrics, mock_leader): - c = KubeSchedulerCheck(CHECK_NAME, None, {}, [instance]) + c = KubeSchedulerCheck(CHECK_NAME, {}, [instance]) c.check(instance) def assert_metric(name, **kwargs): diff --git a/kubelet/datadog_checks/kubelet/kubelet.py b/kubelet/datadog_checks/kubelet/kubelet.py index 8267491c5819e..4eaeb6a6fcc69 100644 --- a/kubelet/datadog_checks/kubelet/kubelet.py +++ b/kubelet/datadog_checks/kubelet/kubelet.py @@ -163,7 +163,7 @@ class KubeletCheck(CadvisorPrometheusScraperMixin, OpenMetricsBaseCheck, Cadviso COUNTER_METRICS = {'kubelet_evictions': 'kubelet.evictions'} - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): self.NAMESPACE = 'kubernetes' if instances is not None and len(instances) > 1: raise Exception('Kubelet check only supports one configured instance.') @@ -172,7 +172,7 @@ def __init__(self, name, init_config, agentConfig, instances=None): cadvisor_instance = self._create_cadvisor_prometheus_instance(inst) kubelet_instance = self._create_kubelet_prometheus_instance(inst) generic_instances = [cadvisor_instance, kubelet_instance] - super(KubeletCheck, self).__init__(name, init_config, agentConfig, generic_instances) + super(KubeletCheck, self).__init__(name, init_config, generic_instances) self.cadvisor_legacy_port = inst.get('cadvisor_port', CADVISOR_DEFAULT_PORT) self.cadvisor_legacy_url = None diff --git a/kubelet/tests/test_cadvisor.py b/kubelet/tests/test_cadvisor.py index 47457cb6fd800..bc032db128bef 100644 --- a/kubelet/tests/test_cadvisor.py +++ b/kubelet/tests/test_cadvisor.py @@ -57,7 +57,7 @@ def test_detect_cadvisor_port_zero(): def test_kubelet_check_cadvisor(monkeypatch, aggregator, tagger): instance_with_tag = {"tags": ["instance:tag"], "cadvisor_port": 4194} cadvisor_url = "http://valid:port/url" - check = KubeletCheck('kubelet', None, {}, [instance_with_tag]) + check = KubeletCheck('kubelet', {}, [instance_with_tag]) monkeypatch.setattr( check, 'retrieve_pod_list', mock.Mock(return_value=json.loads(mock_from_file('pods_list_1.2.json'))) ) diff --git a/kubelet/tests/test_common.py b/kubelet/tests/test_common.py index 59e5fae1d9542..6ab80b36f3285 100644 --- a/kubelet/tests/test_common.py +++ b/kubelet/tests/test_common.py @@ -120,9 +120,9 @@ def test_credentials_empty(): assert creds.cert_pair() is None assert creds.headers("https://dummy") is None - scraper = OpenMetricsBaseCheck('prometheus', {}, {}) - scraper_config = scraper.create_scraper_configuration() - scraper_config['prometheus_url'] = "https://dummy" + instance = {'prometheus_url': 'https://dummy', 'namespace': 'foo'} + scraper = OpenMetricsBaseCheck('prometheus', {}, [instance]) + scraper_config = scraper.create_scraper_configuration(instance) creds.configure_scraper(scraper_config) assert scraper_config['ssl_ca_cert'] is None assert scraper_config['ssl_cert'] is None @@ -138,9 +138,9 @@ def test_credentials_certificates(): assert creds.cert_pair() == ("crt", "key") assert creds.headers("https://dummy") is None - scraper = OpenMetricsBaseCheck('prometheus', {}, {}) - scraper_config = scraper.create_scraper_configuration({}) - scraper_config['prometheus_url'] = "https://dummy" + instance = {'prometheus_url': 'https://dummy', 'namespace': 'foo'} + scraper = OpenMetricsBaseCheck('prometheus', {}, [instance]) + scraper_config = scraper.create_scraper_configuration(instance) creds.configure_scraper(scraper_config) assert scraper_config['ssl_ca_cert'] == "ca_cert" assert scraper_config['ssl_cert'] == "crt" @@ -159,9 +159,9 @@ def test_credentials_token_noverify(): # Make sure we don't leak the token over http assert creds.headers("http://dummy") is None - scraper = OpenMetricsBaseCheck('prometheus', {}, {}) - scraper_config = scraper.create_scraper_configuration() - scraper_config['prometheus_url'] = 'https://dummy' + instance = {'prometheus_url': 'https://dummy', 'namespace': 'foo'} + scraper = OpenMetricsBaseCheck('prometheus', {}, [instance]) + scraper_config = scraper.create_scraper_configuration(instance) creds.configure_scraper(scraper_config) assert scraper_config['ssl_ca_cert'] is False assert scraper_config['ssl_cert'] is None diff --git a/kubelet/tests/test_kubelet.py b/kubelet/tests/test_kubelet.py index 43a7d903fbd4f..538573f7062a4 100644 --- a/kubelet/tests/test_kubelet.py +++ b/kubelet/tests/test_kubelet.py @@ -198,7 +198,7 @@ def mock_kubelet_check(monkeypatch, instances, kube_version=KUBE_1_14, stats_sum Returns a check that uses mocked data for responses from prometheus endpoints, pod list, and node spec. """ - check = KubeletCheck('kubelet', None, {}, instances) + check = KubeletCheck('kubelet', {}, instances) monkeypatch.setattr(check, 'retrieve_pod_list', mock.Mock(return_value=json.loads(mock_from_file('pods.json')))) monkeypatch.setattr(check, '_retrieve_node_spec', mock.Mock(return_value=NODE_SPEC)) if stats_summary_fail: @@ -270,7 +270,7 @@ def mock_from_file(fname): def test_bad_config(): with pytest.raises(Exception): - KubeletCheck('kubelet', None, {}, [{}, {}]) + KubeletCheck('kubelet', {}, [{}, {}]) def test_parse_quantity(): @@ -279,7 +279,7 @@ def test_parse_quantity(): def test_kubelet_default_options(): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) assert check.cadvisor_scraper_config['namespace'] == 'kubernetes' assert check.kubelet_scraper_config['namespace'] == 'kubernetes' @@ -473,7 +473,7 @@ def mock_kubelet_check_no_prom(): def test_report_pods_running(monkeypatch, tagger): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) monkeypatch.setattr(check, 'retrieve_pod_list', mock.Mock(return_value=json.loads(mock_from_file('pods.json')))) monkeypatch.setattr(check, 'gauge', mock.Mock()) pod_list = check.retrieve_pod_list() @@ -512,7 +512,7 @@ def test_report_pods_running_none_ids(monkeypatch, tagger): podlist["items"][0]['metadata']['uid'] = None podlist["items"][1]['status']['containerStatuses'][0]['containerID'] = None - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) monkeypatch.setattr(check, 'retrieve_pod_list', mock.Mock(return_value=podlist)) monkeypatch.setattr(check, 'gauge', mock.Mock()) pod_list = check.retrieve_pod_list() @@ -531,7 +531,7 @@ def test_report_pods_running_none_ids(monkeypatch, tagger): def test_report_container_spec_metrics(monkeypatch, tagger): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) monkeypatch.setattr(check, 'retrieve_pod_list', mock.Mock(return_value=json.loads(mock_from_file('pods.json')))) monkeypatch.setattr(check, 'gauge', mock.Mock()) @@ -571,7 +571,7 @@ def test_report_container_spec_metrics(monkeypatch, tagger): def test_report_container_state_metrics(monkeypatch, tagger): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) check.pod_list_url = "dummyurl" monkeypatch.setattr(check, 'perform_kubelet_query', mock.Mock(return_value=MockStreamResponse('pods_crashed.json'))) monkeypatch.setattr(check, '_compute_pod_expiration_datetime', mock.Mock(return_value=None)) @@ -643,7 +643,7 @@ def test_no_tags_no_metrics(monkeypatch, aggregator, tagger): def test_pod_expiration(monkeypatch, aggregator, tagger): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) check.pod_list_url = "dummyurl" # Fixtures contains four pods: @@ -683,7 +683,7 @@ def iter_lines(decode_unicode=False): def test_perform_kubelet_check(monkeypatch): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) check.kube_health_url = "http://127.0.0.1:10255/healthz" check.kubelet_credentials = KubeletCredentials({}) monkeypatch.setattr(check, 'service_check', mock.Mock()) @@ -711,7 +711,7 @@ def test_perform_kubelet_check(monkeypatch): def test_report_node_metrics(monkeypatch): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) monkeypatch.setattr(check, '_retrieve_node_spec', mock.Mock(return_value={'num_cores': 4, 'memory_capacity': 512})) monkeypatch.setattr(check, 'gauge', mock.Mock()) check._report_node_metrics(['foo:bar']) @@ -723,7 +723,7 @@ def test_report_node_metrics(monkeypatch): def test_retrieve_pod_list_success(monkeypatch): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) check.pod_list_url = "dummyurl" monkeypatch.setattr(check, 'perform_kubelet_query', mock.Mock(return_value=MockStreamResponse('pod_list_raw.dat'))) monkeypatch.setattr(check, '_compute_pod_expiration_datetime', mock.Mock(return_value=None)) @@ -737,7 +737,7 @@ def test_retrieved_pod_list_failure(monkeypatch): def mock_perform_kubelet_query(s, stream=False): raise Exception("network error") - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) check.pod_list_url = "dummyurl" monkeypatch.setattr(check, 'perform_kubelet_query', mock_perform_kubelet_query) @@ -780,7 +780,7 @@ def test_add_labels_to_tags(monkeypatch, aggregator): def test_report_container_requests_limits(monkeypatch, tagger): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) monkeypatch.setattr( check, 'retrieve_pod_list', mock.Mock(return_value=json.loads(mock_from_file('pods_requests_limits.json'))) ) @@ -814,7 +814,7 @@ def test_kubelet_stats_summary_not_available(monkeypatch, aggregator, tagger): def test_system_container_metrics(monkeypatch, aggregator, tagger): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) monkeypatch.setattr( check, '_retrieve_stats', mock.Mock(return_value=json.loads(mock_from_file('stats_summary.json'))) ) diff --git a/kubelet/tests/test_prometheus.py b/kubelet/tests/test_prometheus.py index 398deb8ce8639..c53fb744ea647 100644 --- a/kubelet/tests/test_prometheus.py +++ b/kubelet/tests/test_prometheus.py @@ -33,7 +33,7 @@ def mock_from_file(fname): @pytest.fixture def check(): - return KubeletCheck('kubelet', None, {}, [{}]) + return KubeletCheck('kubelet', {}, [{}]) @pytest.fixture @@ -48,7 +48,7 @@ def cadvisor_scraper(check): def test_cadvisor_default_options(): - check = KubeletCheck('kubelet', None, {}, [{}]) + check = KubeletCheck('kubelet', {}, [{}]) cadvisor_scraper_config = check.cadvisor_scraper_config assert check.fs_usage_bytes == {} assert check.mem_usage_bytes == {} diff --git a/linkerd/datadog_checks/linkerd/linkerd.py b/linkerd/datadog_checks/linkerd/linkerd.py index fb611ffb592e8..82275788360f7 100644 --- a/linkerd/datadog_checks/linkerd/linkerd.py +++ b/linkerd/datadog_checks/linkerd/linkerd.py @@ -15,13 +15,15 @@ class LinkerdCheck(OpenMetricsBaseCheck): DEFAULT_METRIC_LIMIT = 0 HEALTH_METRIC = 'linkerd.prometheus.health' - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): labels_mapper = {'rt': 'linkerd_router', 'client': 'linkerd_client', 'service': 'linkerd_service'} default_config = { 'linkerd': {'labels_mapper': labels_mapper, 'metrics': [METRIC_MAP], 'type_overrides': TYPE_OVERRIDES} } - super(LinkerdCheck, self).__init__(name, init_config, agentConfig, instances, default_config, 'linkerd') + super(LinkerdCheck, self).__init__( + name, init_config, instances, default_instances=default_config, default_namespace='linkerd' + ) def process(self, scraper_config, metric_transformers=None): # Override the process method to send the health metric, as service checks can be disabled. diff --git a/linkerd/tests/test_linkerd.py b/linkerd/tests/test_linkerd.py index 01b6b945778b0..d64755fbad99c 100644 --- a/linkerd/tests/test_linkerd.py +++ b/linkerd/tests/test_linkerd.py @@ -22,7 +22,7 @@ def test_linkerd(aggregator): """ Test the full check """ - check = LinkerdCheck('linkerd', None, {}, [MOCK_INSTANCE]) + check = LinkerdCheck('linkerd', {}, [MOCK_INSTANCE]) with requests_mock.Mocker() as metric_request: metric_request.get('http://fake.tld/prometheus', text=get_response('linkerd.txt')) check.check(MOCK_INSTANCE) @@ -40,7 +40,7 @@ def test_linkerd(aggregator): def test_linkerd_v2(aggregator): - check = LinkerdCheck('linkerd', None, {}, [MOCK_INSTANCE]) + check = LinkerdCheck('linkerd', {}, [MOCK_INSTANCE]) with requests_mock.Mocker() as metric_request: metric_request.get('http://fake.tld/prometheus', text=get_response('linkerd_v2.txt')) check.check(MOCK_INSTANCE) @@ -56,7 +56,7 @@ def test_linkerd_v2(aggregator): def test_openmetrics_error(monkeypatch): - check = LinkerdCheck('linkerd', None, {}, [MOCK_INSTANCE]) + check = LinkerdCheck('linkerd', {}, [MOCK_INSTANCE]) with requests_mock.Mocker() as metric_request: metric_request.get('http://fake.tld/prometheus', exc="Exception") with pytest.raises(Exception): diff --git a/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/nginx_ingress_controller.py b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/nginx_ingress_controller.py index 775d26e8ca80a..90a142386e0c5 100644 --- a/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/nginx_ingress_controller.py +++ b/nginx_ingress_controller/datadog_checks/nginx_ingress_controller/nginx_ingress_controller.py @@ -11,11 +11,10 @@ class NginxIngressControllerCheck(OpenMetricsBaseCheck): DEFAULT_METRIC_LIMIT = 0 - def __init__(self, name, init_config, agentConfig, instances=None): + def __init__(self, name, init_config, instances): super(NginxIngressControllerCheck, self).__init__( name, init_config, - agentConfig, instances, default_instances={ "nginx_ingress": { diff --git a/nginx_ingress_controller/tests/test_nginx_ingress_controller.py b/nginx_ingress_controller/tests/test_nginx_ingress_controller.py index 8d33ffeefb4ed..2d0facd17b5f6 100644 --- a/nginx_ingress_controller/tests/test_nginx_ingress_controller.py +++ b/nginx_ingress_controller/tests/test_nginx_ingress_controller.py @@ -33,7 +33,7 @@ def test_nginx_ingress_controller(aggregator, mock_data): Testing nginx ingress controller. """ - c = NginxIngressControllerCheck(CHECK_NAME, None, {}, [instance]) + c = NginxIngressControllerCheck(CHECK_NAME, {}, [instance]) c.check(instance) # nginx metrics aggregator.assert_metric(NAMESPACE + '.nginx.connections.current') diff --git a/openmetrics/tests/test_integration.py b/openmetrics/tests/test_integration.py index 68602f2574209..eeb488d8a3240 100644 --- a/openmetrics/tests/test_integration.py +++ b/openmetrics/tests/test_integration.py @@ -7,7 +7,7 @@ @pytest.mark.integration def test_integration(aggregator, dd_environment): - c = OpenMetricsCheck('openmetrics', None, {}, [dd_environment]) + c = OpenMetricsCheck('openmetrics', {}, [dd_environment]) c.check(dd_environment) aggregator.assert_metric(CHECK_NAME + '.go_memstats_mallocs_total', metric_type=aggregator.MONOTONIC_COUNT) assert_metrics_covered(aggregator) diff --git a/openmetrics/tests/test_openmetrics.py b/openmetrics/tests/test_openmetrics.py index 21b10dbbffc8e..a840978abdf5b 100644 --- a/openmetrics/tests/test_openmetrics.py +++ b/openmetrics/tests/test_openmetrics.py @@ -20,7 +20,7 @@ def test_openmetrics_check(aggregator): - c = OpenMetricsCheck('openmetrics', None, {}, [instance]) + c = OpenMetricsCheck('openmetrics', {}, [instance]) c.check(instance) aggregator.assert_metric( CHECK_NAME + '.renamed.metric1', @@ -38,7 +38,7 @@ def test_openmetrics_check(aggregator): def test_openmetrics_check_counter_gauge(aggregator): instance['send_monotonic_counter'] = False - c = OpenMetricsCheck('openmetrics', None, {}, [instance]) + c = OpenMetricsCheck('openmetrics', {}, [instance]) c.check(instance) aggregator.assert_metric( CHECK_NAME + '.renamed.metric1', @@ -64,7 +64,7 @@ def test_invalid_metric(aggregator): 'metrics': [{'metric1': 'renamed.metric1'}, 'metric2', 'metric3'], 'send_histograms_buckets': True, } - c = OpenMetricsCheck('openmetrics', None, {}, [bad_metric_instance]) + c = OpenMetricsCheck('openmetrics', {}, [bad_metric_instance]) c.check(bad_metric_instance) assert aggregator.metrics('metric3') == [] @@ -76,7 +76,7 @@ def test_openmetrics_wildcard(aggregator): 'metrics': ['metric*'], } - c = OpenMetricsCheck('openmetrics', None, {}, [instance_wildcard]) + c = OpenMetricsCheck('openmetrics', {}, [instance_wildcard]) c.check(instance) aggregator.assert_metric( CHECK_NAME + '.metric1', @@ -98,7 +98,6 @@ def test_openmetrics_default_instance(aggregator): c = OpenMetricsCheck( CHECK_NAME, - None, {}, [], default_instances={ @@ -127,7 +126,6 @@ def test_openmetrics_default_instance(aggregator): def test_openmetrics_mixed_instance(aggregator): c = OpenMetricsCheck( CHECK_NAME, - None, {}, [], default_instances={ diff --git a/vault/datadog_checks/vault/vault.py b/vault/datadog_checks/vault/vault.py index d968df7a897e1..90fc05a52574c 100644 --- a/vault/datadog_checks/vault/vault.py +++ b/vault/datadog_checks/vault/vault.py @@ -226,10 +226,7 @@ def parse_config(self): methods = {method: getattr(self, '{}_v{}'.format(method, api_version)) for method in self.API_METHODS} self._api = Api(**methods) - if self._client_token_path: - self.renew_client_token() - - if self._client_token: + if self._client_token_path or self._client_token: instance = self.instance.copy() instance['prometheus_url'] = '{}/sys/metrics?format=prometheus'.format(self._api_url) @@ -240,17 +237,25 @@ def parse_config(self): instance['ssl_ca_cert'] = instance.pop('tls_ca_cert', None) self._scraper_config = self.create_scraper_configuration(instance) - self.set_client_token(self._client_token) # Global static tags self._scraper_config['custom_tags'] = self._tags + # https://www.vaultproject.io/api/overview#the-x-vault-request-header + self._set_header(self.http_handlers[instance['prometheus_url']], 'X-Vault-Request', 'true') + + if self._client_token_path: + self.renew_client_token() + else: + self.set_client_token(self._client_token) + # https://www.vaultproject.io/api/overview#the-x-vault-request-header - self.http.options['headers']['X-Vault-Request'] = 'true' + self._set_header(self.http, 'X-Vault-Request', 'true') def set_client_token(self, client_token): self._client_token = client_token - self.http.options['headers']['X-Vault-Token'] = client_token + self._set_header(self.http, 'X-Vault-Token', client_token) + self._set_header(self.http_handlers[self._scraper_config['prometheus_url']], 'X-Vault-Token', client_token) def renew_client_token(self): with open(self._client_token_path, 'rb') as f: @@ -264,6 +269,9 @@ def poll(self, scraper_config, headers=None): return super(Vault, self).poll(scraper_config, headers=headers) + def _set_header(self, http_wrapper, header, value): + http_wrapper.options['headers'][header] = value + def get_scraper_config(self, instance): # This validation is called during `__init__` but we don't need it pass