datadog-checks-base 37.4.0__py2.py3-none-any.whl → 37.6.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- datadog_checks/base/__about__.py +1 -1
- datadog_checks/base/checks/base.py +10 -0
- datadog_checks/base/checks/openmetrics/v2/labels.py +57 -19
- datadog_checks/base/checks/openmetrics/v2/scraper.py +37 -2
- datadog_checks/base/utils/agent/packages.py +1 -6
- datadog_checks/base/utils/http.py +38 -2
- {datadog_checks_base-37.4.0.dist-info → datadog_checks_base-37.6.0.dist-info}/METADATA +13 -14
- {datadog_checks_base-37.4.0.dist-info → datadog_checks_base-37.6.0.dist-info}/RECORD +9 -9
- {datadog_checks_base-37.4.0.dist-info → datadog_checks_base-37.6.0.dist-info}/WHEEL +0 -0
datadog_checks/base/__about__.py
CHANGED
|
@@ -164,6 +164,8 @@ class AgentCheck(object):
|
|
|
164
164
|
# See https://github.com/DataDog/integrations-core/pull/2093 for more information.
|
|
165
165
|
DEFAULT_METRIC_LIMIT = 0
|
|
166
166
|
|
|
167
|
+
HA_SUPPORTED = False
|
|
168
|
+
|
|
167
169
|
# Allow tracing for classic integrations
|
|
168
170
|
def __init_subclass__(cls, *args, **kwargs):
|
|
169
171
|
try:
|
|
@@ -312,6 +314,14 @@ class AgentCheck(object):
|
|
|
312
314
|
if os.environ.get("GOFIPS", "0") == "1":
|
|
313
315
|
enable_fips()
|
|
314
316
|
|
|
317
|
+
ha_enabled_init = self.init_config.get('ha_enabled', False) if self.init_config else False
|
|
318
|
+
ha_enabled_instance = self.instance.get('ha_enabled', False) if self.instance else False
|
|
319
|
+
|
|
320
|
+
if not self.HA_SUPPORTED and (ha_enabled_init or ha_enabled_instance):
|
|
321
|
+
raise ConfigurationError(
|
|
322
|
+
f"High Availability is enabled for check {self.name} but this integration does not support it"
|
|
323
|
+
)
|
|
324
|
+
|
|
315
325
|
def _create_metrics_pattern(self, metric_patterns, option_name):
|
|
316
326
|
all_patterns = metric_patterns.get(option_name, [])
|
|
317
327
|
|
|
@@ -1,21 +1,27 @@
|
|
|
1
1
|
# (C) Datadog, Inc. 2020-present
|
|
2
2
|
# All rights reserved
|
|
3
3
|
# Licensed under a 3-clause BSD style license (see LICENSE)
|
|
4
|
+
from collections import ChainMap
|
|
5
|
+
|
|
4
6
|
from ....utils.functions import no_op
|
|
5
7
|
|
|
6
8
|
|
|
7
9
|
class LabelAggregator:
|
|
8
10
|
def __init__(self, check, config):
|
|
9
11
|
share_labels = config.get('share_labels', {})
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
self.target_info = config.get('target_info', False)
|
|
13
|
+
self.target_info_labels = {}
|
|
14
|
+
|
|
15
|
+
self._validate_type(share_labels, dict, "Setting `share_labels` must be a mapping")
|
|
16
|
+
self._validate_type(self.target_info, bool, "Setting `target_info` must be a boolean")
|
|
17
|
+
|
|
18
|
+
if not share_labels and not self.target_info:
|
|
13
19
|
self.populate = no_op
|
|
14
20
|
return
|
|
15
21
|
|
|
16
22
|
self.cache_shared_labels = config.get('cache_shared_labels', True)
|
|
17
23
|
self.shared_labels_cached = False
|
|
18
|
-
|
|
24
|
+
self.info_metric = {'target_info': {}}
|
|
19
25
|
self.metric_config = {}
|
|
20
26
|
for metric, config in share_labels.items():
|
|
21
27
|
data = self.metric_config[metric] = {}
|
|
@@ -31,6 +37,7 @@ class LabelAggregator:
|
|
|
31
37
|
raise TypeError(f'Option `values` for metric `{metric}` of setting `share_labels` must be an array')
|
|
32
38
|
|
|
33
39
|
allowed_values = set()
|
|
40
|
+
|
|
34
41
|
for i, value in enumerate(values, 1):
|
|
35
42
|
value = str(value)
|
|
36
43
|
|
|
@@ -72,34 +79,32 @@ class LabelAggregator:
|
|
|
72
79
|
|
|
73
80
|
self.unconditional_labels = {}
|
|
74
81
|
|
|
82
|
+
def _validate_type(self, value, expected_type, error_message):
|
|
83
|
+
if not isinstance(value, expected_type):
|
|
84
|
+
raise TypeError(error_message)
|
|
85
|
+
|
|
75
86
|
def __call__(self, metrics):
|
|
76
87
|
if self.cache_shared_labels:
|
|
77
88
|
if self.shared_labels_cached:
|
|
78
89
|
yield from metrics
|
|
79
90
|
else:
|
|
80
|
-
metric_config = self.
|
|
91
|
+
metric_config, target_info_metric = self.copy_configs()
|
|
81
92
|
|
|
82
93
|
for metric in metrics:
|
|
83
|
-
|
|
84
|
-
self.collect(metric, metric_config.pop(metric.name))
|
|
85
|
-
|
|
94
|
+
self.process_metric(metric, metric_config, target_info_metric)
|
|
86
95
|
yield metric
|
|
87
96
|
|
|
88
97
|
self.shared_labels_cached = True
|
|
89
98
|
else:
|
|
90
99
|
try:
|
|
91
|
-
metric_config = self.
|
|
92
|
-
|
|
93
|
-
# Cache every encountered metric until the desired labels have been collected
|
|
100
|
+
metric_config, target_info_metric = self.copy_configs()
|
|
94
101
|
cached_metrics = []
|
|
95
102
|
|
|
96
103
|
for metric in metrics:
|
|
97
|
-
|
|
98
|
-
self.collect(metric, metric_config.pop(metric.name))
|
|
99
|
-
|
|
104
|
+
self.process_metric(metric, metric_config, target_info_metric)
|
|
100
105
|
cached_metrics.append(metric)
|
|
101
106
|
|
|
102
|
-
if not metric_config:
|
|
107
|
+
if not (metric_config or target_info_metric):
|
|
103
108
|
break
|
|
104
109
|
|
|
105
110
|
yield from cached_metrics
|
|
@@ -108,6 +113,24 @@ class LabelAggregator:
|
|
|
108
113
|
self.label_sets.clear()
|
|
109
114
|
self.unconditional_labels.clear()
|
|
110
115
|
|
|
116
|
+
def copy_configs(self):
|
|
117
|
+
return self.metric_config.copy(), self.info_metric.copy()
|
|
118
|
+
|
|
119
|
+
def process_metric(self, metric, *configs):
|
|
120
|
+
"""
|
|
121
|
+
Collects labels from shared_labels + target_info metrics
|
|
122
|
+
"""
|
|
123
|
+
for config in configs:
|
|
124
|
+
if config and metric.name in config:
|
|
125
|
+
self.collect(metric, config.pop(metric.name))
|
|
126
|
+
|
|
127
|
+
def process_target_info(self, metric):
|
|
128
|
+
"""
|
|
129
|
+
Updates cached target info metrics
|
|
130
|
+
"""
|
|
131
|
+
if metric.samples[0].labels != self.target_info_labels:
|
|
132
|
+
self.target_info_labels = metric.samples[0].labels
|
|
133
|
+
|
|
111
134
|
def collect(self, metric, config):
|
|
112
135
|
allowed_values = config.get('values')
|
|
113
136
|
|
|
@@ -147,13 +170,28 @@ class LabelAggregator:
|
|
|
147
170
|
if label in labels:
|
|
148
171
|
self.unconditional_labels[label] = value
|
|
149
172
|
else:
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
173
|
+
# Store target_info metric labels to be applied to other metrics in payload
|
|
174
|
+
if metric.name == 'target_info':
|
|
175
|
+
self.target_info_labels.update(
|
|
176
|
+
{
|
|
177
|
+
label: value
|
|
178
|
+
for sample in self.allowed_samples(metric, allowed_values)
|
|
179
|
+
for label, value in sample.labels.items()
|
|
180
|
+
}
|
|
181
|
+
)
|
|
182
|
+
else:
|
|
183
|
+
# Store shared labels in a seperate attribute
|
|
184
|
+
self.unconditional_labels.update(
|
|
185
|
+
{
|
|
186
|
+
label: value
|
|
187
|
+
for sample in self.allowed_samples(metric, allowed_values)
|
|
188
|
+
for label, value in sample.labels.items()
|
|
189
|
+
}
|
|
190
|
+
)
|
|
153
191
|
|
|
154
192
|
def populate(self, labels):
|
|
155
193
|
label_set = frozenset(labels.items())
|
|
156
|
-
labels.update(self.unconditional_labels)
|
|
194
|
+
labels.update(ChainMap(self.unconditional_labels, self.target_info_labels))
|
|
157
195
|
|
|
158
196
|
for matching_label_set, shared_labels in self.label_sets:
|
|
159
197
|
# Check for subset without incurring the cost of a `.issubset` lookup and call
|
|
@@ -58,6 +58,7 @@ class OpenMetricsScraper:
|
|
|
58
58
|
|
|
59
59
|
# Parse the configuration
|
|
60
60
|
self.endpoint = config['openmetrics_endpoint']
|
|
61
|
+
self.target_info = config.get('target_info', False)
|
|
61
62
|
|
|
62
63
|
self.metric_transformer = MetricTransformer(self.check, config)
|
|
63
64
|
self.label_aggregator = LabelAggregator(self.check, config)
|
|
@@ -238,7 +239,13 @@ class OpenMetricsScraper:
|
|
|
238
239
|
"""
|
|
239
240
|
runtime_data = {'flush_first_value': self.flush_first_value, 'static_tags': self.static_tags}
|
|
240
241
|
|
|
241
|
-
|
|
242
|
+
# Determine which consume method to use based on target_info config
|
|
243
|
+
if self.target_info:
|
|
244
|
+
consume_method = self.consume_metrics_w_target_info
|
|
245
|
+
else:
|
|
246
|
+
consume_method = self.consume_metrics
|
|
247
|
+
|
|
248
|
+
for metric in consume_method(runtime_data):
|
|
242
249
|
transformer = self.metric_transformer.get(metric)
|
|
243
250
|
if transformer is None:
|
|
244
251
|
continue
|
|
@@ -248,23 +255,52 @@ class OpenMetricsScraper:
|
|
|
248
255
|
self.flush_first_value = True
|
|
249
256
|
|
|
250
257
|
def consume_metrics(self, runtime_data):
|
|
258
|
+
"""
|
|
259
|
+
Yield the processed metrics and filter out excluded metrics, without checking for target_info metrics.
|
|
260
|
+
"""
|
|
261
|
+
|
|
262
|
+
metric_parser = self.parse_metrics()
|
|
263
|
+
|
|
264
|
+
if not self.flush_first_value and self.use_process_start_time:
|
|
265
|
+
metric_parser = first_scrape_handler(metric_parser, runtime_data, datadog_agent.get_process_start_time())
|
|
266
|
+
if self.label_aggregator.configured:
|
|
267
|
+
metric_parser = self.label_aggregator(metric_parser)
|
|
268
|
+
|
|
269
|
+
for metric in metric_parser:
|
|
270
|
+
# Skip excluded metrics
|
|
271
|
+
if metric.name in self.exclude_metrics or (
|
|
272
|
+
self.exclude_metrics_pattern is not None and self.exclude_metrics_pattern.search(metric.name)
|
|
273
|
+
):
|
|
274
|
+
self.submit_telemetry_number_of_ignored_metric_samples(metric)
|
|
275
|
+
continue
|
|
276
|
+
|
|
277
|
+
yield metric
|
|
278
|
+
|
|
279
|
+
def consume_metrics_w_target_info(self, runtime_data):
|
|
251
280
|
"""
|
|
252
281
|
Yield the processed metrics and filter out excluded metrics.
|
|
282
|
+
Additionally, handle target_info metrics.
|
|
253
283
|
"""
|
|
254
284
|
|
|
255
285
|
metric_parser = self.parse_metrics()
|
|
286
|
+
|
|
256
287
|
if not self.flush_first_value and self.use_process_start_time:
|
|
257
288
|
metric_parser = first_scrape_handler(metric_parser, runtime_data, datadog_agent.get_process_start_time())
|
|
258
289
|
if self.label_aggregator.configured:
|
|
259
290
|
metric_parser = self.label_aggregator(metric_parser)
|
|
260
291
|
|
|
261
292
|
for metric in metric_parser:
|
|
293
|
+
# Skip excluded metrics
|
|
262
294
|
if metric.name in self.exclude_metrics or (
|
|
263
295
|
self.exclude_metrics_pattern is not None and self.exclude_metrics_pattern.search(metric.name)
|
|
264
296
|
):
|
|
265
297
|
self.submit_telemetry_number_of_ignored_metric_samples(metric)
|
|
266
298
|
continue
|
|
267
299
|
|
|
300
|
+
# Process target_info metrics
|
|
301
|
+
if metric.name == 'target_info':
|
|
302
|
+
self.label_aggregator.process_target_info(metric)
|
|
303
|
+
|
|
268
304
|
yield metric
|
|
269
305
|
|
|
270
306
|
def parse_metrics(self):
|
|
@@ -312,7 +348,6 @@ class OpenMetricsScraper:
|
|
|
312
348
|
"""
|
|
313
349
|
Yield a sample of processed data.
|
|
314
350
|
"""
|
|
315
|
-
|
|
316
351
|
label_normalizer = get_label_normalizer(metric.type)
|
|
317
352
|
|
|
318
353
|
for sample in metric.samples:
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
# (C) Datadog, Inc. 2019-present
|
|
2
2
|
# All rights reserved
|
|
3
3
|
# Licensed under a 3-clause BSD style license (see LICENSE)
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
if sys.version_info >= (3, 8):
|
|
7
|
-
from importlib.metadata import distributions
|
|
8
|
-
else:
|
|
9
|
-
from importlib_metadata import distributions
|
|
4
|
+
from importlib.metadata import distributions
|
|
10
5
|
|
|
11
6
|
DATADOG_CHECK_PREFIX = 'datadog-'
|
|
12
7
|
|
|
@@ -52,6 +52,8 @@ LOGGER = logging.getLogger(__file__)
|
|
|
52
52
|
# https://tools.ietf.org/html/rfc2988
|
|
53
53
|
DEFAULT_TIMEOUT = 10
|
|
54
54
|
|
|
55
|
+
DEFAULT_EXPIRATION = 300
|
|
56
|
+
|
|
55
57
|
# 16 KiB seems optimal, and is also the standard chunk size of the Bittorrent protocol:
|
|
56
58
|
# https://www.bittorrent.org/beps/bep_0003.html
|
|
57
59
|
DEFAULT_CHUNK_SIZE = 16
|
|
@@ -92,6 +94,7 @@ STANDARD_FIELDS = {
|
|
|
92
94
|
'tls_private_key': None,
|
|
93
95
|
'tls_protocols_allowed': DEFAULT_PROTOCOL_VERSIONS,
|
|
94
96
|
'tls_verify': True,
|
|
97
|
+
'tls_ciphers': 'ALL',
|
|
95
98
|
'timeout': DEFAULT_TIMEOUT,
|
|
96
99
|
'use_legacy_auth_encoding': True,
|
|
97
100
|
'username': None,
|
|
@@ -153,6 +156,7 @@ class RequestsWrapper(object):
|
|
|
153
156
|
'auth_token_handler',
|
|
154
157
|
'request_size',
|
|
155
158
|
'tls_protocols_allowed',
|
|
159
|
+
'tls_ciphers_allowed',
|
|
156
160
|
)
|
|
157
161
|
|
|
158
162
|
def __init__(self, instance, init_config, remapper=None, logger=None, session=None):
|
|
@@ -347,6 +351,14 @@ class RequestsWrapper(object):
|
|
|
347
351
|
if config['kerberos_cache']:
|
|
348
352
|
self.request_hooks.append(lambda: handle_kerberos_cache(config['kerberos_cache']))
|
|
349
353
|
|
|
354
|
+
ciphers = config.get('tls_ciphers')
|
|
355
|
+
if ciphers:
|
|
356
|
+
if 'ALL' in ciphers:
|
|
357
|
+
updated_ciphers = "ALL"
|
|
358
|
+
else:
|
|
359
|
+
updated_ciphers = ":".join(ciphers)
|
|
360
|
+
self.tls_ciphers_allowed = updated_ciphers
|
|
361
|
+
|
|
350
362
|
def get(self, url, **options):
|
|
351
363
|
return self._request('get', url, options)
|
|
352
364
|
|
|
@@ -465,6 +477,7 @@ class RequestsWrapper(object):
|
|
|
465
477
|
try:
|
|
466
478
|
context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS)
|
|
467
479
|
context.verify_mode = ssl.CERT_NONE
|
|
480
|
+
context.set_ciphers(self.tls_ciphers_allowed)
|
|
468
481
|
|
|
469
482
|
with context.wrap_socket(sock, server_hostname=hostname) as secure_sock:
|
|
470
483
|
der_cert = secure_sock.getpeercert(binary_form=True)
|
|
@@ -856,8 +869,16 @@ class AuthTokenOAuthReader(object):
|
|
|
856
869
|
|
|
857
870
|
# https://www.rfc-editor.org/rfc/rfc6749#section-4.4.3
|
|
858
871
|
self._token = response['access_token']
|
|
859
|
-
self._expiration = get_timestamp()
|
|
860
|
-
|
|
872
|
+
self._expiration = get_timestamp()
|
|
873
|
+
try:
|
|
874
|
+
# According to https://www.rfc-editor.org/rfc/rfc6749#section-5.1, the `expires_in` field is optional
|
|
875
|
+
self._expiration += _parse_expires_in(response.get('expires_in'))
|
|
876
|
+
except TypeError:
|
|
877
|
+
LOGGER.debug(
|
|
878
|
+
'The `expires_in` field of the OAuth2 response is not a number, defaulting to %s',
|
|
879
|
+
DEFAULT_EXPIRATION,
|
|
880
|
+
)
|
|
881
|
+
self._expiration += DEFAULT_EXPIRATION
|
|
861
882
|
return self._token
|
|
862
883
|
|
|
863
884
|
|
|
@@ -991,6 +1012,21 @@ def quote_uds_url(url):
|
|
|
991
1012
|
return urlunparse(parsed)
|
|
992
1013
|
|
|
993
1014
|
|
|
1015
|
+
def _parse_expires_in(token_expiration):
|
|
1016
|
+
if isinstance(token_expiration, int) or isinstance(token_expiration, float):
|
|
1017
|
+
return token_expiration
|
|
1018
|
+
if isinstance(token_expiration, str):
|
|
1019
|
+
try:
|
|
1020
|
+
token_expiration = int(token_expiration)
|
|
1021
|
+
except ValueError:
|
|
1022
|
+
LOGGER.debug('Could not convert %s to an integer', token_expiration)
|
|
1023
|
+
else:
|
|
1024
|
+
LOGGER.debug('Unexpected type for `expires_in`: %s.', type(token_expiration))
|
|
1025
|
+
token_expiration = None
|
|
1026
|
+
|
|
1027
|
+
return token_expiration
|
|
1028
|
+
|
|
1029
|
+
|
|
994
1030
|
# For documentation generation
|
|
995
1031
|
# TODO: use an enum and remove STANDARD_FIELDS when mkdocstrings supports it
|
|
996
1032
|
class StandardFields(object):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datadog-checks-base
|
|
3
|
-
Version: 37.
|
|
3
|
+
Version: 37.6.0
|
|
4
4
|
Summary: The Datadog Check Toolkit
|
|
5
5
|
Project-URL: Source, https://github.com/DataDog/integrations-core
|
|
6
6
|
Author-email: Datadog <packages@datadoghq.com>
|
|
@@ -13,40 +13,39 @@ Classifier: License :: OSI Approved :: BSD License
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.12
|
|
14
14
|
Classifier: Topic :: System :: Monitoring
|
|
15
15
|
Provides-Extra: db
|
|
16
|
-
Requires-Dist: mmh3==
|
|
16
|
+
Requires-Dist: mmh3==5.1.0; extra == 'db'
|
|
17
17
|
Provides-Extra: deps
|
|
18
18
|
Requires-Dist: binary==1.0.1; extra == 'deps'
|
|
19
|
-
Requires-Dist: cachetools==5.5.
|
|
19
|
+
Requires-Dist: cachetools==5.5.1; extra == 'deps'
|
|
20
20
|
Requires-Dist: cryptography==43.0.1; extra == 'deps'
|
|
21
21
|
Requires-Dist: ddtrace==2.10.6; extra == 'deps'
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist: pydantic==2.8.2; extra == 'deps'
|
|
22
|
+
Requires-Dist: jellyfish==1.1.3; extra == 'deps'
|
|
23
|
+
Requires-Dist: prometheus-client==0.21.1; extra == 'deps'
|
|
24
|
+
Requires-Dist: protobuf==5.29.3; extra == 'deps'
|
|
25
|
+
Requires-Dist: pydantic==2.10.6; extra == 'deps'
|
|
27
26
|
Requires-Dist: python-dateutil==2.9.0.post0; extra == 'deps'
|
|
28
|
-
Requires-Dist: pywin32==
|
|
27
|
+
Requires-Dist: pywin32==308; (sys_platform == 'win32') and extra == 'deps'
|
|
29
28
|
Requires-Dist: pyyaml==6.0.2; extra == 'deps'
|
|
30
29
|
Requires-Dist: requests-toolbelt==1.0.0; extra == 'deps'
|
|
31
30
|
Requires-Dist: requests-unixsocket2==0.4.2; extra == 'deps'
|
|
32
31
|
Requires-Dist: requests==2.32.3; extra == 'deps'
|
|
33
32
|
Requires-Dist: simplejson==3.19.3; extra == 'deps'
|
|
34
33
|
Requires-Dist: uptime==3.0.1; extra == 'deps'
|
|
35
|
-
Requires-Dist: wrapt==1.
|
|
34
|
+
Requires-Dist: wrapt==1.17.2; extra == 'deps'
|
|
36
35
|
Provides-Extra: http
|
|
37
36
|
Requires-Dist: aws-requests-auth==0.4.3; extra == 'http'
|
|
38
|
-
Requires-Dist: botocore==1.
|
|
37
|
+
Requires-Dist: botocore==1.36.16; extra == 'http'
|
|
39
38
|
Requires-Dist: oauthlib==3.2.2; extra == 'http'
|
|
40
|
-
Requires-Dist: pyjwt==2.
|
|
39
|
+
Requires-Dist: pyjwt==2.10.1; extra == 'http'
|
|
41
40
|
Requires-Dist: pyopenssl==24.2.1; extra == 'http'
|
|
42
41
|
Requires-Dist: pysocks==1.7.1; extra == 'http'
|
|
43
42
|
Requires-Dist: requests-kerberos==0.15.0; extra == 'http'
|
|
44
43
|
Requires-Dist: requests-ntlm==1.3.0; extra == 'http'
|
|
45
44
|
Requires-Dist: requests-oauthlib==2.0.0; extra == 'http'
|
|
46
45
|
Provides-Extra: json
|
|
47
|
-
Requires-Dist: orjson==3.10.
|
|
46
|
+
Requires-Dist: orjson==3.10.15; extra == 'json'
|
|
48
47
|
Provides-Extra: kube
|
|
49
|
-
Requires-Dist: kubernetes==
|
|
48
|
+
Requires-Dist: kubernetes==32.0.0; extra == 'kube'
|
|
50
49
|
Requires-Dist: requests-oauthlib==2.0.0; extra == 'kube'
|
|
51
50
|
Description-Content-Type: text/markdown
|
|
52
51
|
|
|
@@ -3,7 +3,7 @@ datadog_checks/config.py,sha256=PrAXGdlLnoV2VMQff_noSaSJJ0wg4BAiGnw7jCQLSik,196
|
|
|
3
3
|
datadog_checks/errors.py,sha256=eFwmnrX-batIgbu-iJyseqAPNO_4rk1UuaKK89evLhg,155
|
|
4
4
|
datadog_checks/log.py,sha256=orvOgMKGNEsqSTLalCAQpWP-ouorpG1A7Gn-j2mRD80,301
|
|
5
5
|
datadog_checks/py.typed,sha256=la67KBlbjXN-_-DfGNcdOcjYumVpKG_Tkw-8n5dnGB4,8
|
|
6
|
-
datadog_checks/base/__about__.py,sha256=
|
|
6
|
+
datadog_checks/base/__about__.py,sha256=S_ZwVHZuaDm_khDL1A2LsMwt13C_wKzUL2qqN-p0lmU,138
|
|
7
7
|
datadog_checks/base/__init__.py,sha256=rSTDo6-2p_RX6I6wnuXrNMglaatoLRyZFTE5wbHZY8s,1466
|
|
8
8
|
datadog_checks/base/agent.py,sha256=nX9x_BYYizRKGNYfXq5z7S0FZ9xcX_wd2tuxpGe3_8k,350
|
|
9
9
|
datadog_checks/base/config.py,sha256=qcAA4X9sXQZRdwQe8DgiGd2980VBp1SQA0d695tX_tU,604
|
|
@@ -13,7 +13,7 @@ datadog_checks/base/errors.py,sha256=fPcFaR3zHpSkMo8epvF3lRe9KrEnS8g4J0dXM_nvzsw
|
|
|
13
13
|
datadog_checks/base/log.py,sha256=3P5Tq-kWZkqx5AtvQhUk89O1s-5YnE49LJ8xeeKcvB8,6344
|
|
14
14
|
datadog_checks/base/types.py,sha256=anajZS0W0TsxUHJQw-JHOP2NSeuC9BisXSy9mAStlxQ,1623
|
|
15
15
|
datadog_checks/base/checks/__init__.py,sha256=a0Wv-Od0BYUA45z37eVOvugflTZMijgGSOuJqndE3DU,263
|
|
16
|
-
datadog_checks/base/checks/base.py,sha256=
|
|
16
|
+
datadog_checks/base/checks/base.py,sha256=1eRBvcSgZhn9V6av_TmhDExDMO-39HPfB8DB9vUBrqE,58503
|
|
17
17
|
datadog_checks/base/checks/network.py,sha256=UijP1OVBCpCNKMy6bVkNazHgy6Sdm8qCvCYGPaWuTDo,1968
|
|
18
18
|
datadog_checks/base/checks/kube_leader/__init__.py,sha256=rEM1wqMkx8JLvJpYNHMOy6OdPmCwQ46JSOfE3QDApyY,399
|
|
19
19
|
datadog_checks/base/checks/kube_leader/base_check.py,sha256=2LIRU6a2cJb4byM4Q3v1SVVJjQW8NjVJr_yUKOfjKjU,708
|
|
@@ -38,9 +38,9 @@ datadog_checks/base/checks/openmetrics/mixins.py,sha256=bkrE_cQ6peW147BACY-G0tHy
|
|
|
38
38
|
datadog_checks/base/checks/openmetrics/v2/__init__.py,sha256=P81FBhJLA9MGpz4L7o_7C-pvEwd4A_8jWFWQZ1jg0Eg,115
|
|
39
39
|
datadog_checks/base/checks/openmetrics/v2/base.py,sha256=UXytG0ze00rXU13VB0BM_ZK_Y_qC6wfxA-OidFm_MyY,4096
|
|
40
40
|
datadog_checks/base/checks/openmetrics/v2/first_scrape_handler.py,sha256=In-tZXMzieSdL2OXJlIAFi78KbQVwuJnGP0iaLH9974,941
|
|
41
|
-
datadog_checks/base/checks/openmetrics/v2/labels.py,sha256=
|
|
41
|
+
datadog_checks/base/checks/openmetrics/v2/labels.py,sha256=JAIlxAtzQAFoEj1d9IYLZCGt-2M3-ClyyGjZ-VzKNQY,8907
|
|
42
42
|
datadog_checks/base/checks/openmetrics/v2/metrics.py,sha256=uDVZOHHRWMW8YUQZBY9jCLzecN5DueRNjImxBm1K82k,2189
|
|
43
|
-
datadog_checks/base/checks/openmetrics/v2/scraper.py,sha256=
|
|
43
|
+
datadog_checks/base/checks/openmetrics/v2/scraper.py,sha256=nj7dmKuHeoI_A8bWUzZh16Q3r94-27dV7FepvdOnv9I,24733
|
|
44
44
|
datadog_checks/base/checks/openmetrics/v2/transform.py,sha256=qv7Y1yvqWm-269mGU7Oq0it8x3VkWUZU2m2d3q-VJZ0,8377
|
|
45
45
|
datadog_checks/base/checks/openmetrics/v2/utils.py,sha256=tpk3htJAz_KwCRqFs2CTjajHkLCs_2TbGdBp514rWOQ,3565
|
|
46
46
|
datadog_checks/base/checks/openmetrics/v2/transformers/__init__.py,sha256=hPZn8WLvQfrzLSaJxtFbYYAtK1dt8IQXSULL79srZjs,493
|
|
@@ -101,7 +101,7 @@ datadog_checks/base/utils/diagnose.py,sha256=eLMe0tISpkzS3yxVR83IHxorQJfHT_Xi6Cq
|
|
|
101
101
|
datadog_checks/base/utils/fips.py,sha256=G92RNoZkrMojaTKi1DiccbvfMFO3adktDZgKjpxkkTw,1400
|
|
102
102
|
datadog_checks/base/utils/functions.py,sha256=iGlybxR6aPPElNxNb2ELOzbk328j9OVBAxredJxdCRw,695
|
|
103
103
|
datadog_checks/base/utils/headers.py,sha256=0SSdC71jwaB61BODfusahCVr1c56GvT9iwt7cidcHP0,1779
|
|
104
|
-
datadog_checks/base/utils/http.py,sha256=
|
|
104
|
+
datadog_checks/base/utils/http.py,sha256=TcOdwoFKggxr_VsCEQoXlxFFGS-n9UYz4pDZH2zxjoM,40516
|
|
105
105
|
datadog_checks/base/utils/limiter.py,sha256=YRTrPCX1S5EtHLVcP_-GEfzRots_LTcy1f_uHZVs90g,3027
|
|
106
106
|
datadog_checks/base/utils/network.py,sha256=YXo9JQgWUtFn4dFefWZap20OMmSReLSPOjgzodJbddw,1814
|
|
107
107
|
datadog_checks/base/utils/platform.py,sha256=wW8f6XKo4JHxvu1sN0DpLDmYjS_cCu8GoKvfTjIj4yM,2499
|
|
@@ -119,7 +119,7 @@ datadog_checks/base/utils/agent/__init__.py,sha256=o3aWvy3PhykD_h7YT3s628O0W2YpH
|
|
|
119
119
|
datadog_checks/base/utils/agent/common.py,sha256=1XRsPJWdpmbxAKKBVHGBPUm4WHdviq0ovuggtpx7LWo,217
|
|
120
120
|
datadog_checks/base/utils/agent/debug.py,sha256=zeBbNLt3Y_Wxpf9OdAklldLy1gmL0U6bMDmOHSDGM3M,2274
|
|
121
121
|
datadog_checks/base/utils/agent/memory.py,sha256=mG10PFFgjWCLetF6ihC463VQz1V3S4STMs_F8bADkvY,10514
|
|
122
|
-
datadog_checks/base/utils/agent/packages.py,sha256=
|
|
122
|
+
datadog_checks/base/utils/agent/packages.py,sha256=mpkkq01sizzz-0Mdbd_t_deMakHAX1oiZ1rSFGD-luE,531
|
|
123
123
|
datadog_checks/base/utils/agent/utils.py,sha256=FV_o6rccU5B0MrXyma-4yAqmKghklzTeOf1nhYcmY7o,1360
|
|
124
124
|
datadog_checks/base/utils/concurrency/__init__.py,sha256=ORssE5bXZuYua5UCLesGfPvcrQKcADHaDsXrUyfARF0,115
|
|
125
125
|
datadog_checks/base/utils/concurrency/limiter.py,sha256=is2ZpUEjfsI4nBGtXG2D0Zgv0GD38_i5jJQCkdzPW_Y,3170
|
|
@@ -200,6 +200,6 @@ datadog_checks/utils/tracing.py,sha256=HQbQakKM-Lw75MDkItaYJYipS6YO24Z_ymDVxDsx5
|
|
|
200
200
|
datadog_checks/utils/prometheus/__init__.py,sha256=8WwXnM9g1sfS5267QYCJX_hd8MZl5kRgBgQ_SzdNdXs,161
|
|
201
201
|
datadog_checks/utils/prometheus/functions.py,sha256=4vWsTGLgujHwdYZo0tlAQkqDPHofqUJM3k9eItJqERQ,197
|
|
202
202
|
datadog_checks/utils/prometheus/metrics_pb2.py,sha256=xg3UdUHe4TjeR4s13LUKZ2U1WVSt6U6zjsVRG6lX6dc,173
|
|
203
|
-
datadog_checks_base-37.
|
|
204
|
-
datadog_checks_base-37.
|
|
205
|
-
datadog_checks_base-37.
|
|
203
|
+
datadog_checks_base-37.6.0.dist-info/METADATA,sha256=5KhBZ8crWNv4qGCfHV_DZZGgVU2ODu6mOCTlBSULWYE,3591
|
|
204
|
+
datadog_checks_base-37.6.0.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
|
|
205
|
+
datadog_checks_base-37.6.0.dist-info/RECORD,,
|
|
File without changes
|