diff --git a/datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/scraper.py b/datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/scraper.py index bc64bbdd0d081..768471948ac71 100644 --- a/datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/scraper.py +++ b/datadog_checks_base/datadog_checks/base/checks/openmetrics/v2/scraper.py @@ -151,13 +151,8 @@ def __init__(self, check, config): # some tags can still generate unwanted metric contexts (e.g pod annotations as tags). ignore_tags = config.get('ignore_tags', []) if ignore_tags: - ignored_tag_patterns = set() - for ignored_tag in ignore_tags: - ignored_tag_patterns.add(fnmatch.translate(ignored_tag)) - - if ignored_tag_patterns: - ignored_tags_re = re.compile('|'.join(ignored_tag_patterns)) - custom_tags = [tag for tag in custom_tags if not ignored_tags_re.search(tag)] + ignored_tags_re = re.compile('|'.join(set(ignore_tags))) + custom_tags = [tag for tag in custom_tags if not ignored_tags_re.search(tag)] # 16 KiB seems optimal, and is also the standard chunk size of the Bittorrent protocol: # https://www.bittorrent.org/beps/bep_0003.html diff --git a/datadog_checks_base/tests/openmetrics/test_options.py b/datadog_checks_base/tests/openmetrics/test_options.py index edd47982a4248..cb55b6a37c206 100644 --- a/datadog_checks_base/tests/openmetrics/test_options.py +++ b/datadog_checks_base/tests/openmetrics/test_options.py @@ -553,7 +553,27 @@ def test_excluded_metric(self, aggregator, dd_run_check, mock_http_response): class TestIgnoreTags: - def test(self, aggregator, dd_run_check, mock_http_response): + def test_simple_match(self, aggregator, dd_run_check, mock_http_response): + mock_http_response( + """ + # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. + # TYPE go_memstats_alloc_bytes gauge + go_memstats_alloc_bytes 6.396288e+06 + """ + ) + all_tags = ['foo', 'foobar', 'bar', 'bar:baz', 'bar:bar'] + ignored_tags = ['foo', 'bar:baz'] + wanted_tags = ['bar', 'bar:bar'] + check = get_check({'metrics': ['go_memstats_alloc_bytes'], 'tags': all_tags, 'ignore_tags': ignored_tags}) + dd_run_check(check) + + aggregator.assert_metric( + 'test.go_memstats_alloc_bytes', 6396288, metric_type=aggregator.GAUGE, tags=['endpoint:test'] + wanted_tags + ) + + aggregator.assert_all_metrics_covered() + + def test_simple_wildcard(self, aggregator, dd_run_check, mock_http_response): mock_http_response( """ # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. @@ -561,14 +581,34 @@ def test(self, aggregator, dd_run_check, mock_http_response): go_memstats_alloc_bytes 6.396288e+06 """ ) + all_tags = ['foo', 'foobar', 'bar', 'bar:baz', 'bar:bar'] + ignored_tags = ['foo*', '.*baz'] + wanted_tags = ['bar', 'bar:bar'] + check = get_check({'metrics': ['go_memstats_alloc_bytes'], 'tags': all_tags, 'ignore_tags': ignored_tags}) + dd_run_check(check) + + aggregator.assert_metric( + 'test.go_memstats_alloc_bytes', 6396288, metric_type=aggregator.GAUGE, tags=['endpoint:test'] + wanted_tags + ) + + aggregator.assert_all_metrics_covered() - all_tags = ['foo', 'foofoo', 'bar', 'bar:baz'] - ignored_tags = ['foo*', 'bar:baz'] + def test_regex(self, aggregator, dd_run_check, mock_http_response): + mock_http_response( + """ + # HELP go_memstats_alloc_bytes Number of bytes allocated and still in use. + # TYPE go_memstats_alloc_bytes gauge + go_memstats_alloc_bytes 6.396288e+06 + """ + ) + all_tags = ['foo', 'foobar', 'bar:baz', 'bar:bar'] + ignored_tags = ['^foo', '.+:bar$'] + wanted_tags = ['bar:baz'] check = get_check({'metrics': ['go_memstats_alloc_bytes'], 'tags': all_tags, 'ignore_tags': ignored_tags}) dd_run_check(check) aggregator.assert_metric( - 'test.go_memstats_alloc_bytes', 6396288, metric_type=aggregator.GAUGE, tags=['endpoint:test', 'bar'] + 'test.go_memstats_alloc_bytes', 6396288, metric_type=aggregator.GAUGE, tags=['endpoint:test'] + wanted_tags ) aggregator.assert_all_metrics_covered() diff --git a/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py b/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py index 90abd0ce4af12..d34784c3492c3 100644 --- a/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py +++ b/gitlab_runner/datadog_checks/gitlab_runner/config_models/defaults.py @@ -80,6 +80,10 @@ def instance_ignore_metrics_by_labels(field, value): return get_default_field_value(field, value) +def instance_ignore_tags(field, value): + return get_default_field_value(field, value) + + def instance_kerberos_auth(field, value): return 'disabled' @@ -124,10 +128,18 @@ def instance_log_requests(field, value): return False +def instance_metrics(field, value): + return get_default_field_value(field, value) + + def instance_min_collection_interval(field, value): return 15 +def instance_namespace(field, value): + return 'service' + + def instance_ntlm_domain(field, value): return get_default_field_value(field, value) diff --git a/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py b/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py index dda03adfde49b..cf0415915d47f 100644 --- a/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py +++ b/gitlab_runner/datadog_checks/gitlab_runner/config_models/instance.py @@ -3,7 +3,7 @@ # Licensed under a 3-clause BSD style license (see LICENSE) from __future__ import annotations -from typing import Any, Mapping, Optional, Sequence +from typing import Any, Mapping, Optional, Sequence, Union from pydantic import BaseModel, root_validator, validator @@ -73,6 +73,7 @@ class Config: health_service_check: Optional[bool] ignore_metrics: Optional[Sequence[str]] ignore_metrics_by_labels: Optional[IgnoreMetricsByLabels] + ignore_tags: Optional[Sequence[str]] kerberos_auth: Optional[str] kerberos_cache: Optional[str] kerberos_delegate: Optional[bool] @@ -84,9 +85,9 @@ class Config: label_to_hostname: Optional[str] labels_mapper: Optional[Mapping[str, Any]] log_requests: Optional[bool] - metrics: Sequence[str] + metrics: Optional[Sequence[Union[str, Mapping[str, str]]]] min_collection_interval: Optional[float] - namespace: str + namespace: Optional[str] ntlm_domain: Optional[str] password: Optional[str] persist_connections: Optional[bool]