datadog-checks-base 37.20.0__py2.py3-none-any.whl → 37.21.1__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.
@@ -1,4 +1,4 @@
1
1
  # (C) Datadog, Inc. 2018-present
2
2
  # All rights reserved
3
3
  # Licensed under a 3-clause BSD style license (see LICENSE)
4
- __version__ = "37.20.0"
4
+ __version__ = "37.21.1"
@@ -3,7 +3,7 @@
3
3
  # Licensed under a 3-clause BSD style license (see LICENSE)
4
4
  from .__about__ import __version__
5
5
  from .agent import datadog_agent
6
- from .checks import AgentCheck
6
+ from .checks import AgentCheck, DatabaseCheck
7
7
  from .checks.kube_leader import KubeLeaderElectionBaseCheck
8
8
  from .checks.openmetrics import OpenMetricsBaseCheck
9
9
  from .checks.openmetrics.v2.base import OpenMetricsBaseCheckV2
@@ -16,6 +16,7 @@ from .utils.common import ensure_bytes, ensure_unicode, to_native_string, to_str
16
16
  __all__ = [
17
17
  '__version__',
18
18
  'AgentCheck',
19
+ 'DatabaseCheck',
19
20
  'ConfigurationError',
20
21
  'KubeLeaderElectionBaseCheck',
21
22
  'OpenMetricsBaseCheck',
@@ -2,6 +2,7 @@
2
2
  # All rights reserved
3
3
  # Licensed under a 3-clause BSD style license (see LICENSE)
4
4
  from .base import AgentCheck
5
+ from .db import DatabaseCheck
5
6
  from .network import EventType, NetworkCheck, Status
6
7
 
7
- __all__ = ['AgentCheck', 'EventType', 'NetworkCheck', 'Status']
8
+ __all__ = ['AgentCheck', 'DatabaseCheck', 'EventType', 'NetworkCheck', 'Status']
@@ -1094,6 +1094,9 @@ class AgentCheck(object):
1094
1094
  return entrypoint
1095
1095
 
1096
1096
  def __initialize_persistent_cache_key_prefix(self):
1097
+ if self.__persistent_cache_key_prefix:
1098
+ return
1099
+
1097
1100
  namespace = ':'.join(self.check_id.split(':')[:-1])
1098
1101
  self.__persistent_cache_key_prefix = f'{namespace}:{self.persistent_cache_id()}_'
1099
1102
 
@@ -0,0 +1,22 @@
1
+ # (C) Datadog, Inc. 2025-present
2
+ # All rights reserved
3
+ # Licensed under a 3-clause BSD style license (see LICENSE)
4
+
5
+ from . import AgentCheck
6
+
7
+
8
+ class DatabaseCheck(AgentCheck):
9
+ def database_monitoring_query_sample(self, raw_event: str):
10
+ self.event_platform_event(raw_event, "dbm-samples")
11
+
12
+ def database_monitoring_query_metrics(self, raw_event: str):
13
+ self.event_platform_event(raw_event, "dbm-metrics")
14
+
15
+ def database_monitoring_query_activity(self, raw_event: str):
16
+ self.event_platform_event(raw_event, "dbm-activity")
17
+
18
+ def database_monitoring_metadata(self, raw_event: str):
19
+ self.event_platform_event(raw_event, "dbm-metadata")
20
+
21
+ def database_monitoring_health(self, raw_event: str):
22
+ self.event_platform_event(raw_event, "dbm-health")
@@ -1,6 +1,7 @@
1
1
  # (C) Datadog, Inc. 2010-present
2
2
  # All rights reserved
3
3
  # Licensed under Simplified BSD License (see LICENSE)
4
+ from typing import Any
4
5
 
5
6
 
6
7
  class _FreezeKey(object):
@@ -30,8 +31,9 @@ class _FreezeKey(object):
30
31
  if other.value is None:
31
32
  # `x < None` -> `False`
32
33
  return False
33
- # ...But we let other cases bubble through.
34
- raise
34
+
35
+ # If we get 2 types that cannot be compared, we compare the string representation of the types.
36
+ return str(type(self.value)) < str(type(other.value))
35
37
  else:
36
38
  # We're on Python 2, where `a < b` never fails (returns `False` by default), or
37
39
  # we're on Python 3 and values have the same type.
@@ -65,6 +67,17 @@ def hash_mutable(m):
65
67
  return hash(freeze(m))
66
68
 
67
69
 
70
+ def hash_mutable_stable(m: Any) -> str:
71
+ """
72
+ This method provides a way of hashing a mutable object ensuring that the same object always
73
+ provides the same hash even in different processes.
74
+ """
75
+ from datadog_checks.base.utils.hashing import HashMethod
76
+
77
+ algorithm = HashMethod.secure()
78
+ return algorithm(str(freeze(m)).encode()).hexdigest()
79
+
80
+
68
81
  def iter_unique(*iterables):
69
82
  seen = set()
70
83
 
@@ -12,8 +12,7 @@ from typing import TYPE_CHECKING
12
12
  from datadog_checks.base.utils.serialization import json
13
13
 
14
14
  if TYPE_CHECKING:
15
- from datadog_checks.base import AgentCheck
16
-
15
+ from datadog_checks.base import DatabaseCheck
17
16
  try:
18
17
  import datadog_agent
19
18
  except ImportError:
@@ -42,7 +41,7 @@ class HealthStatus(Enum):
42
41
 
43
42
 
44
43
  class Health:
45
- def __init__(self, check: AgentCheck):
44
+ def __init__(self, check: DatabaseCheck):
46
45
  """
47
46
  Initialize the HealthCheck instance.
48
47
 
@@ -471,12 +471,13 @@ class TagManager:
471
471
  multiple times.
472
472
  """
473
473
 
474
- def __init__(self) -> None:
474
+ def __init__(self, normalizer: Optional[Callable[[Union[str, bytes]], str]] = None) -> None:
475
475
  self._tags: Dict[Union[str, TagType], List[str]] = {}
476
476
  self._cached_tag_list: Optional[tuple[str, ...]] = None
477
477
  self._keyless: TagType = TagType.KEYLESS
478
+ self._normalizer = normalizer
478
479
 
479
- def set_tag(self, key: Optional[str], value: str, replace: bool = False) -> None:
480
+ def set_tag(self, key: Optional[str], value: str, replace: bool = False, normalize: bool = False) -> None:
480
481
  """
481
482
  Set a tag with the given key and value.
482
483
  If key is None or empty, the value is stored as a keyless tag.
@@ -485,7 +486,11 @@ class TagManager:
485
486
  value (str): The tag value
486
487
  replace (bool): If True, replaces all existing values for this key
487
488
  If False, appends the value if it doesn't exist
489
+ normalize (bool): If True, applies tag normalization using the configured normalizer
488
490
  """
491
+ if normalize and self._normalizer:
492
+ value = self._normalizer(value)
493
+
489
494
  if not key:
490
495
  key = self._keyless
491
496
 
@@ -498,13 +503,14 @@ class TagManager:
498
503
  # Invalidate the cache since tags have changed
499
504
  self._cached_tag_list = None
500
505
 
501
- def set_tags_from_list(self, tag_list: List[str], replace: bool = False) -> None:
506
+ def set_tags_from_list(self, tag_list: List[str], replace: bool = False, normalize: bool = False) -> None:
502
507
  """
503
508
  Set multiple tags from a list of strings.
504
509
  Strings can be in "key:value" format or just "value" format.
505
510
  Args:
506
511
  tag_list (List[str]): List of tags in "key:value" format or just "value"
507
512
  replace (bool): If True, replaces all existing tags with the new tags list
513
+ normalize (bool): If True, applies tag normalization using the configured normalizer
508
514
  """
509
515
  if replace:
510
516
  self._tags.clear()
@@ -513,11 +519,11 @@ class TagManager:
513
519
  for tag in tag_list:
514
520
  if ':' in tag:
515
521
  key, value = tag.split(':', 1)
516
- self.set_tag(key, value)
522
+ self.set_tag(key, value, normalize=normalize)
517
523
  else:
518
- self.set_tag(None, tag)
524
+ self.set_tag(None, tag, normalize=normalize)
519
525
 
520
- def delete_tag(self, key: Optional[str], value: Optional[str] = None) -> bool:
526
+ def delete_tag(self, key: Optional[str], value: Optional[str] = None, normalize: bool = False) -> bool:
521
527
  """
522
528
  Delete a tag or specific value for a tag.
523
529
  For keyless tags, use None or empty string as the key.
@@ -525,9 +531,13 @@ class TagManager:
525
531
  key (str): The tag key to delete, or None/empty for keyless tags
526
532
  value (str, optional): If provided, only deletes this specific value for the key.
527
533
  If None, deletes all values for the key.
534
+ normalize (bool): If True, applies tag normalization to the value for lookup
528
535
  Returns:
529
536
  bool: True if something was deleted, False otherwise
530
537
  """
538
+ if normalize and self._normalizer and value:
539
+ value = self._normalizer(value)
540
+
531
541
  if not key:
532
542
  key = self._keyless
533
543
 
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any, Protocol
4
+
5
+ if TYPE_CHECKING:
6
+ from collections.abc import Buffer
7
+
8
+
9
+ class Hash(Protocol):
10
+ def digest(self) -> bytes: ...
11
+ def hexdigest(self) -> str: ...
12
+ def update(self, obj: Buffer, /) -> None: ...
13
+ def copy(self) -> Hash: ...
14
+
15
+
16
+ class HashingAlgorithm(Protocol):
17
+ def __call__(self, data: bytes, *args: Any, **kwargs: Any) -> Hash: ...
18
+
19
+
20
+ class HashMethod:
21
+ """
22
+ Singleton class used to provide hashing algorithms
23
+ """
24
+
25
+ _architecture: str | None = None
26
+ _secure: HashingAlgorithm | None = None
27
+ _fast: HashingAlgorithm | None = None
28
+
29
+ @classmethod
30
+ def secure(cls) -> HashingAlgorithm:
31
+ """
32
+ Provides a secure hashing algorithm.
33
+
34
+ This algorithm is compliant with the FIPS 140-2 standard.
35
+ """
36
+ if cls._secure is not None:
37
+ return cls._secure
38
+
39
+ from hashlib import sha256
40
+
41
+ def secure(data: bytes, *args: Any, **kwargs: Any) -> Hash:
42
+ return sha256(data, *args, **kwargs)
43
+
44
+ cls._secure = secure
45
+ return cls._secure
46
+
47
+ @classmethod
48
+ def fast(cls) -> HashingAlgorithm:
49
+ """
50
+ Provides a fast hashing algorithm.
51
+
52
+ If the platform is 64bit, it will use the blake2b algorithm, otherwise it will use the blake2s algorithm.
53
+ """
54
+ if cls._fast is not None:
55
+ return cls._fast
56
+
57
+ from hashlib import blake2b, blake2s
58
+
59
+ selected_blake = blake2b if cls.architecture() == "64bit" else blake2s
60
+
61
+ def blake(data: bytes, *args: Any, **kwargs: Any) -> Hash:
62
+ return selected_blake(data, *args, **kwargs)
63
+
64
+ cls._fast = blake
65
+ return cls._fast
66
+
67
+ @classmethod
68
+ def architecture(cls) -> str:
69
+ if cls._architecture is not None:
70
+ return cls._architecture
71
+
72
+ from datadog_checks.base.utils.platform import Platform
73
+
74
+ cls._architecture = Platform().python_architecture()
75
+ return cls._architecture
@@ -1,7 +1,7 @@
1
1
  from collections.abc import Collection
2
2
 
3
3
  from datadog_checks.base import AgentCheck
4
- from datadog_checks.base.utils.containers import hash_mutable
4
+ from datadog_checks.base.utils.containers import hash_mutable_stable
5
5
 
6
6
 
7
7
  def config_set_persistent_cache_id(
@@ -30,4 +30,5 @@ def config_set_persistent_cache_id(
30
30
  instance_config_values = tuple(value for key, value in check.instance.items() if key in set_instance_config_options)
31
31
 
32
32
  selected_values = init_config_values + instance_config_values
33
- return str(hash_mutable(selected_values)).replace("-", "")
33
+
34
+ return hash_mutable_stable(selected_values)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datadog-checks-base
3
- Version: 37.20.0
3
+ Version: 37.21.1
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>
@@ -10,7 +10,7 @@ Classifier: Development Status :: 5 - Production/Stable
10
10
  Classifier: Intended Audience :: Developers
11
11
  Classifier: Intended Audience :: System Administrators
12
12
  Classifier: License :: OSI Approved :: BSD License
13
- Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
14
  Classifier: Topic :: System :: Monitoring
15
15
  Provides-Extra: db
16
16
  Requires-Dist: mmh3==5.2.0; extra == 'db'
@@ -3,9 +3,9 @@ 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=hXkLHsKgHttGQ7R5jeQ0cESbDNRVE8U1W-La8t1CUAw,139
6
+ datadog_checks/base/__about__.py,sha256=zY9yrvpmsQJIlSMC9LByfIb_KGfdfnD6iYbUnIQNZBo,139
7
7
  datadog_checks/base/__init__.py,sha256=yWegSLE-TZWIGSvAiJj9PSrUxzlOo_UVJLt2zORZ8Ek,363
8
- datadog_checks/base/__init__.pyi,sha256=eH8XhrtvnD6uE6FWfEyCmKwOaaLJxNolS08D6IRHZuU,995
8
+ datadog_checks/base/__init__.pyi,sha256=a4Y1JIcPJ8pz9tRkBAvjWdtvSQwZxbMZBuRmIiSs_4E,1031
9
9
  datadog_checks/base/agent.py,sha256=nX9x_BYYizRKGNYfXq5z7S0FZ9xcX_wd2tuxpGe3_8k,350
10
10
  datadog_checks/base/config.py,sha256=qcAA4X9sXQZRdwQe8DgiGd2980VBp1SQA0d695tX_tU,604
11
11
  datadog_checks/base/constants.py,sha256=cR19tAqVysMFbdBWqIGZoHIKk1kGTyqRsCn9FfFQOnw,197
@@ -13,9 +13,10 @@ datadog_checks/base/errors.py,sha256=fPcFaR3zHpSkMo8epvF3lRe9KrEnS8g4J0dXM_nvzsw
13
13
  datadog_checks/base/log.py,sha256=gSfzYimmg0z3Dgmn8NpXuyMNjgXwmTbn0NcyUX8B1ls,6283
14
14
  datadog_checks/base/types.py,sha256=anajZS0W0TsxUHJQw-JHOP2NSeuC9BisXSy9mAStlxQ,1623
15
15
  datadog_checks/base/checks/__init__.py,sha256=q7V6v-FwQWkQC1QWaVzKaPjZMaxPJHJcLd71C0uM7bA,211
16
- datadog_checks/base/checks/__init__.pyi,sha256=LASfm-daLNQIYe6-w0NPqBw4cl83nYIX5_B-VhV6ARo,262
16
+ datadog_checks/base/checks/__init__.pyi,sha256=ydetl6kEFCSChppYQhs8mvIP5l6vnZD5AbLABGhbFcM,309
17
17
  datadog_checks/base/checks/_config_ast.py,sha256=v1rAhwORF80b3kfZKhf6zXZ7S5D3A2QPUK4tSo8eo-Y,3268
18
- datadog_checks/base/checks/base.py,sha256=xP56kjtCvW-CMWrdVN3ZC1yAhQr4jad9ORPDuOdz-eM,60654
18
+ datadog_checks/base/checks/base.py,sha256=mnh61HRvHFisSP4IvUtoDPswxB3_ybX-nWkfXMyzWJE,60721
19
+ datadog_checks/base/checks/db.py,sha256=HzEOH4uZaMDAaUTJYy0K5wV9FryNQDXsSMAOHXPVaf4,794
19
20
  datadog_checks/base/checks/network.py,sha256=UkgqkVHaoX7Hqi0WKEx-TvaFiF6-37VyF9A3m2aSaJM,1966
20
21
  datadog_checks/base/checks/kube_leader/__init__.py,sha256=q7V6v-FwQWkQC1QWaVzKaPjZMaxPJHJcLd71C0uM7bA,211
21
22
  datadog_checks/base/checks/kube_leader/__init__.pyi,sha256=UGDywoRwmCIz3Zii1uHsp7jiFGWRdn5fFMZZxgGGlQs,398
@@ -108,15 +109,16 @@ datadog_checks/base/utils/_http_utils.py,sha256=w8whzycmGzVKlCUv703rgg2qMAF0T3d5
108
109
  datadog_checks/base/utils/aws.py,sha256=wxFLWlVFtv5_EURdsXzDhORcTpM0jBlAokcMiPV1xD8,1945
109
110
  datadog_checks/base/utils/common.py,sha256=OtmKd5FKjlwJwRbhE4aImOBWPOzNPVqfXXmHXk4MMIw,3803
110
111
  datadog_checks/base/utils/constants.py,sha256=QwTey4CWB0NAxm2rcD-wPYRkEyglekQIrAzFMabEa38,306
111
- datadog_checks/base/utils/containers.py,sha256=LBqUzERHxx5TdgcWVQTq1A1WaGCMhzXT9k4Gn0fX3J8,2753
112
+ datadog_checks/base/utils/containers.py,sha256=S6c9kvmDJuiHh9hO62Pbdqrnhm6e2R3O5gGH3l5jtNo,3243
112
113
  datadog_checks/base/utils/date.py,sha256=JJmqP84CgVcFJ0cvAmMu8EtM6v96tIESucQNm9eKeEc,2780
113
114
  datadog_checks/base/utils/diagnose.py,sha256=eLMe0tISpkzS3yxVR83IHxorQJfHT_Xi6Cq4zzRNxVI,5285
114
115
  datadog_checks/base/utils/fips.py,sha256=vxm3K7wTQKYenP1LbXk7pmJ8WA6l367BTJGBNO0DkvQ,2490
115
116
  datadog_checks/base/utils/functions.py,sha256=iGlybxR6aPPElNxNb2ELOzbk328j9OVBAxredJxdCRw,695
117
+ datadog_checks/base/utils/hashing.py,sha256=dNAe3RUvd7TE3WmcDX6SYQhTaMXsxxDHue4fPkFuL5Q,2015
116
118
  datadog_checks/base/utils/headers.py,sha256=0SSdC71jwaB61BODfusahCVr1c56GvT9iwt7cidcHP0,1779
117
119
  datadog_checks/base/utils/http.py,sha256=ePSzL7x_xsb1dnXJyU2fBXIgOU0p5UFZIpG2AX_jZZA,44651
118
120
  datadog_checks/base/utils/limiter.py,sha256=YRTrPCX1S5EtHLVcP_-GEfzRots_LTcy1f_uHZVs90g,3027
119
- datadog_checks/base/utils/persistent_cache.py,sha256=i5I9BKIb5V2BFEs0sVTf8bBQUIH21G2nL_tRQHC9GMk,1538
121
+ datadog_checks/base/utils/persistent_cache.py,sha256=1Tk0dkWZH8yH4I_bMZgnhhz2jcZcIyu85dNpBvy5lsM,1531
120
122
  datadog_checks/base/utils/platform.py,sha256=wW8f6XKo4JHxvu1sN0DpLDmYjS_cCu8GoKvfTjIj4yM,2499
121
123
  datadog_checks/base/utils/secrets.py,sha256=Tj5MBOoyGXXDWB3Hr-7UKDy5GV1NZJkFPY4T4v9PHHg,551
122
124
  datadog_checks/base/utils/serialization.py,sha256=pcRUzZIUZkOsfnGDGbxeUwGXrSsFl_9rLhA0ekD_AZ8,975
@@ -139,7 +141,7 @@ datadog_checks/base/utils/concurrency/limiter.py,sha256=is2ZpUEjfsI4nBGtXG2D0Zgv
139
141
  datadog_checks/base/utils/db/__init__.py,sha256=EVTc2FtnHWLHXI3M79jyMn9ypZAMa9eqG3EKLAiMF-M,211
140
142
  datadog_checks/base/utils/db/__init__.pyi,sha256=ewmGxxyJ52wAaYxNZahi2koEUnddfvHcn3HYxQ3RUr0,240
141
143
  datadog_checks/base/utils/db/core.py,sha256=bYanwXIqBzsSxK7b-Ofb0W1WiHbFBtKyYdUBonBLe_Q,11165
142
- datadog_checks/base/utils/db/health.py,sha256=OWdhGSUhEr8Rxr6anVxD__52wkG8kDaY7M015Y4fCkA,2361
144
+ datadog_checks/base/utils/db/health.py,sha256=rdcZPdlLMT4g9tepkietuViKtmP4gwPsjMGCvqC5s54,2366
143
145
  datadog_checks/base/utils/db/query.py,sha256=-PyxdqpbShkQ78h7sWnghQZVtjdLGVrm71n8OpHuPW4,14432
144
146
  datadog_checks/base/utils/db/sql.py,sha256=oiEzQa_vC_w3U65VFrFCoQHWj5GQLLRlSO0CfiSlp4A,2490
145
147
  datadog_checks/base/utils/db/sql_commenter.py,sha256=r_efK6TGRQxM_-Qj-ndEJdECk47J4nCFjkVyxu1XmvU,1522
@@ -147,7 +149,7 @@ datadog_checks/base/utils/db/statement_metrics.py,sha256=U7EtERkmFzfCtfyd3094fBa
147
149
  datadog_checks/base/utils/db/timed_cache.py,sha256=a9Ks5KKUvExB6GOATXTSCLamVtLD919Dn6HpweGKtFw,2114
148
150
  datadog_checks/base/utils/db/transform.py,sha256=H3JN8_MF0Pk0HaXvIZeX1A8iQrP8KBgS741MPeBiWDo,23969
149
151
  datadog_checks/base/utils/db/types.py,sha256=OLX2Oq58JQPFBD4oqUpCLkAP7ovRGN_i1vFk1E0N8Lg,267
150
- datadog_checks/base/utils/db/utils.py,sha256=6rYXjV9I7Hr_PhgkvhbTiZ0QCmyHWoZYETeUD4Qe3Js,22441
152
+ datadog_checks/base/utils/db/utils.py,sha256=g6GAG1OGvo4O-GrTB6nETvUZGfVUSpqYYJMBuhLs2pM,23130
151
153
  datadog_checks/base/utils/discovery/__init__.py,sha256=vPCOdsThBcBjFJRPhDm6IsZGOwk8HlvciwCe_l8dKLk,211
152
154
  datadog_checks/base/utils/discovery/__init__.pyi,sha256=ScVLU1Njj9ekZmewltb0cULI6BylssVHfn4CcPNeyr8,173
153
155
  datadog_checks/base/utils/discovery/cache.py,sha256=f9L3A7YZpZ-mpZpFIwjsa5ab9cZMGkqdetdr9EpalbI,887
@@ -221,6 +223,6 @@ datadog_checks/utils/tracing.py,sha256=HQbQakKM-Lw75MDkItaYJYipS6YO24Z_ymDVxDsx5
221
223
  datadog_checks/utils/prometheus/__init__.py,sha256=8WwXnM9g1sfS5267QYCJX_hd8MZl5kRgBgQ_SzdNdXs,161
222
224
  datadog_checks/utils/prometheus/functions.py,sha256=4vWsTGLgujHwdYZo0tlAQkqDPHofqUJM3k9eItJqERQ,197
223
225
  datadog_checks/utils/prometheus/metrics_pb2.py,sha256=xg3UdUHe4TjeR4s13LUKZ2U1WVSt6U6zjsVRG6lX6dc,173
224
- datadog_checks_base-37.20.0.dist-info/METADATA,sha256=Btd945pDmErXUpZ1MdzT1T8BWpedTQU4xKyl9XsHOA8,4245
225
- datadog_checks_base-37.20.0.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
226
- datadog_checks_base-37.20.0.dist-info/RECORD,,
226
+ datadog_checks_base-37.21.1.dist-info/METADATA,sha256=W1zsqHGVigXb-0R8vJOUv2kxuRDn0S02dYFWEfggkHQ,4245
227
+ datadog_checks_base-37.21.1.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
228
+ datadog_checks_base-37.21.1.dist-info/RECORD,,