diff --git a/.builders/inputs_hash.py b/.builders/inputs_hash.py new file mode 100644 index 0000000000000..3b92ad4f671fb --- /dev/null +++ b/.builders/inputs_hash.py @@ -0,0 +1,164 @@ +"""Content-hash the inputs that determine each builder container image. + +The `Resolve Dependencies and Build Wheels` workflow uses these hashes to +decide whether to rebuild a builder image from scratch, or pull the existing +one by digest from .deps/image_digests.json. The pinned hashes live in +.deps/builder_inputs.toml and are rewritten by .builders/upload.py whenever +dependency resolution publishes new artifacts. + +A "target" is one of the builder image names we maintain — one per +(OS, CPU architecture) pair that the Agent ships Python wheels for. +The names match the subdirectories of .builders/images/, for example: +`linux-x86_64`, `linux-aarch64`, `windows-x86_64`. +""" +from __future__ import annotations + +import argparse +import sys +import tomllib +from collections.abc import Iterator +from hashlib import sha256 +from pathlib import Path + +HERE = Path(__file__).parent +PINNED_FILE = HERE.parent / '.deps' / 'builder_inputs.toml' + +# Files and directories whose contents determine a builder image. A change to +# any of these should force a rebuild. Paths are relative to .builders/ and +# are shared across all targets; per-target inputs live under images//. +# If you add a new input under .builders/ that affects image contents, add it here. +COMMON_INPUTS = [ + 'build.py', + 'deps/build_dependencies.txt', + 'scripts', + 'patches', + 'images/helpers.ps1', + 'images/install-from-source.sh', + 'images/runner_dependencies.txt', +] + + +def _iter_files(root: Path) -> Iterator[Path]: + if root.is_file(): + yield root + elif root.is_dir(): + for path in root.rglob('*'): + rel_parts = path.relative_to(root).parts + if path.is_file() and not any(_is_ignored(part) for part in rel_parts): + yield path + + +def _is_ignored(name: str) -> bool: + if name == '.gitkeep': + return False + return name.startswith('.') or name == '__pycache__' + + +def compute(target: str) -> str: + """Hash the working-tree inputs for `target` and return hex sha256.""" + target_dir = HERE / 'images' / target + if not target_dir.is_dir(): + raise FileNotFoundError(f'Unknown builder target: {target} (expected {target_dir})') + + paths: set[Path] = set() + for rel in COMMON_INPUTS: + files = list(_iter_files(HERE / rel)) + if not files: + print(f'warning: {rel} matched no files under {HERE}', file=sys.stderr) + paths.update(files) + paths.update(_iter_files(target_dir)) + + # Sort by the relative POSIX path string, not by Path objects: WindowsPath + # sorting is case-insensitive and uses backslashes, which produces a + # different iteration order (and therefore a different hash) than on + # POSIX systems for the same input set. + sorted_paths = sorted(paths, key=lambda p: p.relative_to(HERE).as_posix()) + + digest = sha256() + for path in sorted_paths: + rel_path = path.relative_to(HERE).as_posix().encode('utf-8') + digest.update(rel_path + b'\0') + digest.update(path.read_bytes()) + digest.update(b'\0') + return digest.hexdigest() + + +def pinned(target: str) -> str: + """Return the hash pinned for `target` in builder_inputs.toml, or empty if absent.""" + if not PINNED_FILE.is_file(): + print(f'{PINNED_FILE} not found; treating as unpinned', file=sys.stderr) + return '' + try: + with PINNED_FILE.open('rb') as f: + data = tomllib.load(f) + except tomllib.TOMLDecodeError as e: + raise RuntimeError(f'{PINNED_FILE} is malformed (it should not be edited by hand): {e}') from e + inputs = data.get('inputs', {}) + if target not in inputs: + print(f'{PINNED_FILE}: no entry for {target}; treating as unpinned', file=sys.stderr) + return inputs.get(target, '') + + +def main() -> None: + parser = argparse.ArgumentParser( + description=( + 'Gate rebuilds of the builder container images. The resolve-build-deps ' + 'workflow compares the working-tree hash against the pinned hash to ' + 'decide whether to rebuild from scratch or pull the existing image.' + ), + epilog=( + 'A "target" is a builder image name matching a subdirectory of ' + '.builders/images/ (e.g. linux-x86_64, linux-aarch64, windows-x86_64).\n\n' + 'Examples:\n' + ' python .builders/inputs_hash.py compute linux-x86_64\n' + ' python .builders/inputs_hash.py pinned linux-x86_64\n' + ' diff <(… compute linux-x86_64) <(… pinned linux-x86_64)' + ), + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + subparsers = parser.add_subparsers(dest='command', required=True) + + compute_parser = subparsers.add_parser( + 'compute', + help='Hash the working-tree inputs for a target.', + description=( + 'Answers "would the current tree produce a different image than ' + 'the one we have pinned?". Run this against the checked-out tree ' + 'and compare to `pinned` — a mismatch means the image needs a rebuild.' + ), + epilog=( + 'Examples:\n' + ' python .builders/inputs_hash.py compute linux-x86_64\n' + ' python .builders/inputs_hash.py compute windows-x86_64' + ), + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + compute_parser.add_argument('target', help='Builder image name (e.g. linux-x86_64).') + + pinned_parser = subparsers.add_parser( + 'pinned', + help='Print the hash pinned for a target in .deps/builder_inputs.toml.', + description=( + 'Answers "which inputs produced the image we are pulling today?". ' + 'Returns an empty string when the file or entry is missing, so a ' + 'naive string compare with `compute` correctly flags first-run and ' + 'never-built targets as needing a rebuild.' + ), + epilog=( + 'Examples:\n' + ' python .builders/inputs_hash.py pinned linux-x86_64\n' + ' python .builders/inputs_hash.py pinned windows-x86_64' + ), + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + pinned_parser.add_argument('target', help='Builder image name (e.g. linux-x86_64).') + + args = parser.parse_args() + if args.command == 'compute': + sys.stdout.write(compute(args.target)) + elif args.command == 'pinned': + sys.stdout.write(pinned(args.target)) + + +if __name__ == '__main__': + main() diff --git a/.builders/upload.py b/.builders/upload.py index 6b8ea1ffdf1f7..3155ed7b0fa36 100644 --- a/.builders/upload.py +++ b/.builders/upload.py @@ -288,21 +288,51 @@ def generate_lockfiles(targets_dir, lockfiles): f.write(f'{contents}\n') image_digests = {} + builder_inputs = {} for target_name, lockfile_lines in lockfiles.items(): # The lockfiles contain the major.minor Python version # so that the Agent can transition safely lock_file = LOCK_FILE_DIR / f'{target_name}_{CURRENT_PYTHON_VERSION}.txt' lock_file.write_text('\n'.join(lockfile_lines), encoding='utf-8') - # these `image_digest` files are generated in the 'Save new image digest' - # step of the github workflow + # The `image_digest` and `inputs_sha256` files are written by the + # 'Save new image digest' / 'Persist current image digest' steps of + # the github workflow; macOS targets don't produce them. if (image_digest_file := targets_dir / target_name / 'image_digest').is_file(): image_digests[target_name] = image_digest_file.read_text(encoding='utf-8').strip() + if (inputs_hash_file := targets_dir / target_name / 'inputs_sha256').is_file(): + builder_inputs[target_name] = inputs_hash_file.read_text(encoding='utf-8').strip() with RESOLUTION_DIR.joinpath('image_digests.json').open('w', encoding='utf-8') as f: contents = json.dumps(image_digests, indent=2, sort_keys=True) f.write(f'{contents}\n') + _write_builder_inputs(RESOLUTION_DIR / 'builder_inputs.toml', builder_inputs) + + +_BUILDER_INPUTS_HEADER = """\ +# Content hashes of the inputs that determine each builder image. +# +# The `Resolve Dependencies and Build Wheels` workflow compares these +# hashes against hashes computed from the working tree (via +# .builders/inputs_hash.py) to decide whether to rebuild a builder image +# from scratch or pull the existing one by digest from image_digests.json. +# +# This file is rewritten by .builders/upload.py whenever dependency +# resolution publishes new artifacts and should not be edited by hand. +# The set of files covered by each hash is defined by COMMON_INPUTS in +# .builders/inputs_hash.py plus everything under .builders/images//. + +[inputs] +""" + + +def _write_builder_inputs(path: Path, hashes: dict[str, str]) -> None: + lines = [_BUILDER_INPUTS_HEADER.rstrip('\n')] + for target in sorted(hashes): + lines.append(f'{target} = "{hashes[target]}"') + path.write_text('\n'.join(lines) + '\n', encoding='utf-8') + def upload(targets_dir: Path, bucket: Bucket | None = None) -> dict[str, list[str]]: bucket = bucket or Bucket(BUCKET_NAME) diff --git a/.deps/builder_inputs.toml b/.deps/builder_inputs.toml new file mode 100644 index 0000000000000..2dfbe5a814928 --- /dev/null +++ b/.deps/builder_inputs.toml @@ -0,0 +1,16 @@ +# Content hashes of the inputs that determine each builder image. +# +# The `Resolve Dependencies and Build Wheels` workflow compares these +# hashes against hashes computed from the working tree (via +# .builders/inputs_hash.py) to decide whether to rebuild a builder image +# from scratch or pull the existing one by digest from image_digests.json. +# +# This file is rewritten by .builders/upload.py whenever dependency +# resolution publishes new artifacts and should not be edited by hand. +# The set of files covered by each hash is defined by COMMON_INPUTS in +# .builders/inputs_hash.py plus everything under .builders/images//. + +[inputs] +linux-aarch64 = "e48bf769667a4f30addf317d2b889aea045e025b981276a5cbfdf5b53ae86ca8" +linux-x86_64 = "5e769b5c5678a0c578bbaf2289a8359ade8f3420de2a7f7ed3c09217866014c7" +windows-x86_64 = "beba3774e0929bc4f9377cabcde2f797a83309d88be329154b3e099961c95884" diff --git a/.deps/image_digests.json b/.deps/image_digests.json index 253f20cf1ddca..a40766f7f01f8 100644 --- a/.deps/image_digests.json +++ b/.deps/image_digests.json @@ -1,5 +1,5 @@ { "linux-aarch64": "sha256:223fa103a2f1b67c98d2c15a250a9eec39b6b1768011096260f6e12cef1870c4", "linux-x86_64": "sha256:7dca4137ffe24807e2e5ffafb4d50dbd9a201534c1c5e072618075d378e9b975", - "windows-x86_64": "sha256:ad7d49d4cef858824a652547291553fa99d220992024421e0618a59e87f96718" + "windows-x86_64": "sha256:ee9772fc71d78c232f6315e9609cf78a78213200ca24bcc55040f18d8e63313f" } diff --git a/.deps/resolved/linux-aarch64_3.13.txt b/.deps/resolved/linux-aarch64_3.13.txt index 2b7c32251b1c6..bdac0ff4c2461 100644 --- a/.deps/resolved/linux-aarch64_3.13.txt +++ b/.deps/resolved/linux-aarch64_3.13.txt @@ -1,30 +1,30 @@ -aerospike @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/aerospike/aerospike-7.1.1-20260326173356-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=a1de7c7019b1dd5363cdd1a838ba92185418a114be9b59f902e8aef66326c4ea -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260417115331-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +aerospike @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/aerospike/aerospike-7.1.1-20260418125217-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=a1de7c7019b1dd5363cdd1a838ba92185418a114be9b59f902e8aef66326c4ea +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260420123342-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173357-py3-none-manylinux2014_aarch64.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260417115756-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=92b07f252810125c0d378a307a1cc7d76258eb4d44816d77aa9d85068a26b63e -cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.6-20260417115757-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=c990c5a361825d4462e2899b6d4d0647eb34d5a7f05b5199783777548ded89b7 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260420124718-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=1d68f453308b86d7234cb8bd9c46942e63f7a456dc8c392e98ebcf43ce2e2cbb +cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.6-20260420124721-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=32260110ead1ea0dadf90f9b76c6756d1060c67385fff3e8f0c607ee28e0d3ba ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115249-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl#sha256=a4f8d07adccdd43908156ab2c143dbb6261ed9a3c43ba58a3bb6bd1b6ef94734 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173358-py3-none-manylinux2014_aarch64.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 -gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260417115758-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=95e5e8521bb191907748a7360ffd025398aa861cb47014c551384380d52be412 -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260417115333-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 -krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260417115759-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=9700f818130cf996f844203d60c9e41b95700a90916c9ef39b008166ba6c9f71 -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260417115334-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260417115334-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260417115335-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260420112228-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=95e5e8521bb191907748a7360ffd025398aa861cb47014c551384380d52be412 +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260420123239-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260420112240-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=9700f818130cf996f844203d60c9e41b95700a90916c9ef39b008166ba6c9f71 +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260420123407-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260420123254-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260420123308-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173401-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=22e075e3cbc57b5da0d93f72f691746c5198ce88c5aea6fdb54186b3e8c46832 -psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260415154515-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=e9a6db500356a67b07cf971b394b92445797d608578961cd2c931ec1d61567b9 +psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260418125308-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=e9a6db500356a67b07cf971b394b92445797d608578961cd2c931ec1d61567b9 pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260415154515-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=30d8af4ef8fda85d1a865bdb254e6b2e3988f26b723eb39a4843c766371ff517 pyodbc @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyodbc/pyodbc-5.3.0-20260415154516-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=91a4191cf30930755d82e8edd6ac861443dfb6fbbf7915753b73209038ad5ad2 -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260417115336-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260420123322-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173403-py2.py3-none-manylinux2014_aarch64.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260417115337-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260417115338-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260417115339-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260420123336-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260420123349-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260420123403-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173404-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=cb739020a718c2e32041a0fa0a3f79398f45c067347fe8f286c8222fa777bc5d -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260417115339-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260417115340-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260417115341-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260417115342-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260420123417-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260420123430-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260420123444-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260420123458-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/linux-x86_64_3.13.txt b/.deps/resolved/linux-x86_64_3.13.txt index c6a0d94806cf6..835c629c1a657 100644 --- a/.deps/resolved/linux-x86_64_3.13.txt +++ b/.deps/resolved/linux-x86_64_3.13.txt @@ -1,31 +1,31 @@ -aerospike @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/aerospike/aerospike-7.1.1-20260326173305-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=611776d7bc950a342e16b75973aadc0bf11280666055d4d868bac6d160e7164d -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260417115846-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +aerospike @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/aerospike/aerospike-7.1.1-20260418130014-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=611776d7bc950a342e16b75973aadc0bf11280666055d4d868bac6d160e7164d +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260420125129-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173305-py3-none-manylinux2014_x86_64.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260417115906-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=687e59b819bd3bca85539d739c3272db79bda62db33ac09d668ceb4646b33d95 -cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.6-20260417115907-cp313-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3cb48817eed81e69a6c20e01c6b9c2303d77e9b69cefe68230e17fdbc5ede807 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260420125254-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=dd4790ad0949f1cf28634a91d5843b1df315b2bcf896eb4d7319b926e96e4611 +cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.6-20260420125257-cp313-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a3d5b16c3fe497b91ced78f861e92611adc623285e2de6b23e6622114e4ae82c ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115349-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl#sha256=e0aa298cfd1947902fed35d8fa6129c90f6d5e687328b0cba6fe137714198608 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173307-py3-none-manylinux2014_x86_64.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 -gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260417115908-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=9cf9e44ae3c9adbf681ab815511ce6c274f6403f106fc8e8e73eaa9268a0913f -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260417115848-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 -krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260417115909-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=082536495ab7afb814a87311d3f5000b1d85b5afe19c5f52e8ea98c1da9c0df0 -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260417115849-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260417115850-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260417115851-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260418130032-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=9cf9e44ae3c9adbf681ab815511ce6c274f6403f106fc8e8e73eaa9268a0913f +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260420125136-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260418130041-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=082536495ab7afb814a87311d3f5000b1d85b5afe19c5f52e8ea98c1da9c0df0 +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260420125142-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260420125148-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260420125154-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173308-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=af8dd07e6f1bf1d41381ad59dff0a0a36153c7dd5a69becc765010329f17db01 -psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260415154629-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1381485b44a98283661adeee3aae934dc1275eef8f62c8cedce46ffa750708d2 +psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260418130105-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1381485b44a98283661adeee3aae934dc1275eef8f62c8cedce46ffa750708d2 pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260415154630-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a0bc69dc57d3ba6db1fc23ac471ddd5edeeef737fef8e912b0b96126f0b13a8c pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260326173310-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=20b5e67134719cae77a2b6c20da5219931b3735e30538567fb2b73e34219203b pyodbc @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyodbc/pyodbc-5.3.0-20260415154630-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=80d6bdc8ba09a778205c68493fa72a44a599fd8c31803a4f4d4e3bcf1f2284fe -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260417115852-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260420125200-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173310-py2.py3-none-manylinux2014_x86_64.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260417115853-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260417115854-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260417115855-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260420125206-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260420125212-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260420125218-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173311-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=dec16958f71ce93ac1c2fdc212800892ca22a9e90efcab5b5e01d121146cc5cc -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260417115856-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260417115857-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260417115858-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260417115859-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260420125224-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260420125230-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260420125236-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260420125242-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/macos-aarch64_3.13.txt b/.deps/resolved/macos-aarch64_3.13.txt index 6e9024be5fe0c..5ca54f6eba49f 100644 --- a/.deps/resolved/macos-aarch64_3.13.txt +++ b/.deps/resolved/macos-aarch64_3.13.txt @@ -1,28 +1,28 @@ -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260417115331-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260420123342-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173218-py3-none-macosx_12_0_universal2.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260415154528-cp313-cp313-macosx_12_0_arm64.whl#sha256=344f33861abc0c7392317debd7386086022672d25c978cec64fc8dcf285c542b +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260419053453-cp313-cp313-macosx_12_0_arm64.whl#sha256=344f33861abc0c7392317debd7386086022672d25c978cec64fc8dcf285c542b ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115301-cp313-cp313-macosx_12_0_arm64.whl#sha256=1274db819aa41b189135f83ad2b8e37c6e26b8d2f25c60a725a01637ebd63ee4 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173219-py3-none-macosx_12_0_universal2.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260326173323-cp311-abi3-macosx_11_0_arm64.whl#sha256=b5f5ac28470db99338814e4285a491dc218b9bee3f8d20bfa219274e84bd87c4 -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260417115333-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260420123239-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260326173323-cp311-abi3-macosx_11_0_arm64.whl#sha256=47f731bebe725962f7b644e7238a4c68eca2879f6c35842babda9140f263c615 -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260417115334-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260417115334-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260417115335-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260420123407-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260420123254-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260420123308-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173324-cp38-abi3-macosx_11_0_arm64.whl#sha256=33472398d3e6da655a430b106920164b04f036f891bd0ea803a4309ed2a80ef9 -psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260326173324-cp313-cp313-macosx_12_0_arm64.whl#sha256=2c853472bed5a003bdcfbec159bf7849d1ac7a2a3867055d0005d1aa647549cf +psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260418125458-cp313-cp313-macosx_12_0_arm64.whl#sha256=2c853472bed5a003bdcfbec159bf7849d1ac7a2a3867055d0005d1aa647549cf pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260326173325-cp313-cp313-macosx_12_0_arm64.whl#sha256=7c94a2b73c148f84ab217ea2084d07e01e834d49244dec026b473e889016f556 pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260326173325-cp313-cp313-macosx_12_0_arm64.whl#sha256=482b0d2593868c595ec53db794a61a792c0e1fcad04aee86db96afaadf986baf -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260417115336-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260420123322-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173224-py2.py3-none-macosx_12_0_universal2.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260417115337-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260417115338-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260417115339-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260420123336-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260420123349-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260420123403-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173326-cp313-cp313-macosx_11_0_arm64.whl#sha256=fc3c4e9feecd85f1831fb0983b04e7170765b5047c3c629ab97c0c49190a5da8 -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260417115339-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260417115340-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260417115341-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260417115342-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260420123417-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260420123430-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260420123444-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260420123458-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/macos-x86_64_3.13.txt b/.deps/resolved/macos-x86_64_3.13.txt index 23e4d94b70055..f1aa63f93f184 100644 --- a/.deps/resolved/macos-x86_64_3.13.txt +++ b/.deps/resolved/macos-x86_64_3.13.txt @@ -1,28 +1,28 @@ -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260417115846-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260420125129-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173218-py3-none-macosx_12_0_universal2.whl#sha256=0bbcf2766028850c26a917deef3704a096cc9ba0c25220d45ff424334d25dcd7 -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260415154604-cp313-cp313-macosx_12_0_x86_64.whl#sha256=e217d743a2d906dd4cbe16d711aad2bc0519772fc00891e8159f004fd33c5a5a +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260419053856-cp313-cp313-macosx_12_0_x86_64.whl#sha256=e217d743a2d906dd4cbe16d711aad2bc0519772fc00891e8159f004fd33c5a5a ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115332-cp313-cp313-macosx_12_0_x86_64.whl#sha256=813c9fae90bd65d60d97e183b21dff8f9d54591a9186cf163f606fb11b7a6575 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173219-py3-none-macosx_12_0_universal2.whl#sha256=d34180500220db4458e57505c774de0363456d4129f0e3fe98c9e99e8eef77c2 gssapi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/gssapi/gssapi-1.11.1-20260326173219-cp311-abi3-macosx_10_9_x86_64.whl#sha256=91608d102056a7768b9e572ccbe2ccbe7da84688a84f05bb8c4ea56e9d0e979d -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260417115848-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260420125136-py3-none-any.whl#sha256=a15092187950de965ff6096e203d31e461c61cfd47ec1f5249a0e2955187cba2 krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260326173220-cp311-abi3-macosx_10_9_x86_64.whl#sha256=0fe3a687f4e9a8d305ba0183f9b8368e9ed13f4e32716ba3a14de77e12f1e978 -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260417115849-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260417115850-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260417115851-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260420125142-py3-none-any.whl#sha256=88abe8f44e3b8c5c25b1093de735c700aa727a7ac408e273aa855d6db6ba38bf +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260420125148-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260420125154-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173222-cp36-abi3-macosx_10_9_x86_64.whl#sha256=81ae816033cb82995bc78424b02886430400b730698d6a7c492e3256b7854777 -psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260326173222-cp313-cp313-macosx_12_0_x86_64.whl#sha256=eb227dea25dadacf8cfe6a20fb7206f889723f0990b603ae388d9e5fb5087110 +psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260418125859-cp313-cp313-macosx_12_0_x86_64.whl#sha256=eb227dea25dadacf8cfe6a20fb7206f889723f0990b603ae388d9e5fb5087110 pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260326173223-cp313-cp313-macosx_12_0_x86_64.whl#sha256=8b8c0174d55284134d7373fa1116522a241804560b86f05b883d4964692caaaa pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260326173223-cp313-cp313-macosx_12_0_x86_64.whl#sha256=95ed07eebe53c2720cdaaf5d7de3364c80d373b9286b4a1b301f157592ee8ccb -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260417115852-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260420125200-py2.py3-none-any.whl#sha256=0cc4610711208cdc64361464a23d1f2dce88ec5990a12b4bdce4f13b6a169810 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173224-py2.py3-none-macosx_12_0_universal2.whl#sha256=dd71476b7308286ed4219373ca9523e4f06bfed3f5932f60e5c67d8d5a673e1e -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260417115853-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260417115854-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260417115855-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260420125206-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260420125212-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260420125218-py3-none-any.whl#sha256=b020c62c9ea6c1c3e7a29a8e385967909ceb85a77398f7fbe3c63e2abab52e87 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173225-cp313-cp313-macosx_10_13_x86_64.whl#sha256=41b283f75ddb7e47b24fb57dc37d88078e51cd777438f368224e1282fc8ee465 -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260417115856-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260417115857-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260417115858-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260417115859-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260420125224-py3-none-any.whl#sha256=0cf2a7cb9c915eddc77a591df48e8ab78f93167e8ac77d0efb04eb375f91d8b2 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260420125230-py2.py3-none-any.whl#sha256=81d63e968a5133203a334102b8e6e72b1f5ecfc9673c1af7680f9f7e0db8d4fd +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260420125236-py3-none-any.whl#sha256=df8d667b7bd070532a72c25f37e7259d3673c1908ae726fdfb3087d777caa9da +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260420125242-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.deps/resolved/windows-x86_64_3.13.txt b/.deps/resolved/windows-x86_64_3.13.txt index 396ffa87e1da9..9cbdd35502ac6 100644 --- a/.deps/resolved/windows-x86_64_3.13.txt +++ b/.deps/resolved/windows-x86_64_3.13.txt @@ -1,28 +1,28 @@ -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260417115825-py3-none-any.whl#sha256=6f69d4818864f67ab304ac48497fefcc7f4fdd9bbcb9403cbc22dbe211177824 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260420124956-py3-none-any.whl#sha256=6f69d4818864f67ab304ac48497fefcc7f4fdd9bbcb9403cbc22dbe211177824 cm-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cm-client/cm_client-45.0.4-20260326173335-py3-none-win_amd64.whl#sha256=6a11ff78eeff20d6a20036e7320a2cb1fd4a5c318a2f1b81b1449efea34048eb colorama @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/colorama/colorama-0.4.6-20260417115313-py2.py3-none-any.whl#sha256=3eb3f5bc1022d96fbe8df6f419cfb07d028e24c055cc3c59517fa49a95ab067a -confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260417115826-cp313-cp313-win_amd64.whl#sha256=cbcff38cc63a8fa2b175da4f39cea4308944d6b5740575042187e0583cc0fcd8 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260420124959-cp313-cp313-win_amd64.whl#sha256=a31602816688f4bed64d0221eafd65a213bcfc22d5ad5111d12e6a585e9c5e43 ddtrace @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/ddtrace/ddtrace-3.19.5-20260417115314-cp313-cp313-win_amd64.whl#sha256=4f3009589d1c2e0ca84fe8bdb20367de10f090e84cb401ab1d538055927ac0f7 foundationdb @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/foundationdb/foundationdb-6.3.25-20260326173337-py3-none-win_amd64.whl#sha256=828ed23b81a64a5495b1091dd8a66ea51e84c55d9d814c5b6baf7b80dbd9881b -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260417115827-py3-none-any.whl#sha256=81b21cc6f3283215bb1a993f7c8240a0aeef36775d52ccca99c438075e054fba -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260417115828-py3-none-any.whl#sha256=4ac88799ad5c355825b9567f5ca00fe9bcbd97cfe2649f60500fbe5f66610732 -os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260417115829-py3-none-any.whl#sha256=668903c54b88cc4db5fd1dcbaf7cf7417220ef70592b70b49a76d202e8a7f4e8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260417115830-py2.py3-none-any.whl#sha256=dbc2e1e0dbf694097374a40b72c890c915302ae4dd7d37c73db9cff8bf520c4b +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.13.1-20260420125005-py3-none-any.whl#sha256=81b21cc6f3283215bb1a993f7c8240a0aeef36775d52ccca99c438075e054fba +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260420125010-py3-none-any.whl#sha256=4ac88799ad5c355825b9567f5ca00fe9bcbd97cfe2649f60500fbe5f66610732 +os-service-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/os-service-types/os_service_types-1.8.2-20260420125016-py3-none-any.whl#sha256=668903c54b88cc4db5fd1dcbaf7cf7417220ef70592b70b49a76d202e8a7f4e8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260420125022-py2.py3-none-any.whl#sha256=dbc2e1e0dbf694097374a40b72c890c915302ae4dd7d37c73db9cff8bf520c4b psutil @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psutil/psutil-6.0.0-20260326173339-cp37-abi3-win_amd64.whl#sha256=484a4a6e0e16a9adf22b01dc2917426536c8bf63378e445816eee9833aad4f71 -psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260417115831-cp313-cp313-win_amd64.whl#sha256=c7c4759a4942a5c3ae1ebc8f4a124e02d3ae3f02d3736d4699b8bf8a46ca2bc4 -pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260417115831-cp313-cp313-win_amd64.whl#sha256=af1784550dc06af8b8800bf862fcaf906dc9bdeef4ac8d6c9b42bdabe25dc365 -pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260417115832-cp313-cp313-win_amd64.whl#sha256=00db604385e0d5dc8089c1059d026a18af04174ea54c5f764b45a3598dbd8a2f -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260417115833-py2.py3-none-any.whl#sha256=b3796e82ce920d942b3e2de5af4c8567738b72caffac49ec6d88684fd0365690 +psycopg-c @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/psycopg-c/psycopg_c-3.3.3-20260420125025-cp313-cp313-win_amd64.whl#sha256=561e02e857fb496aeceb13613453ed776626195c067948ade900630d95673958 +pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260420125029-cp313-cp313-win_amd64.whl#sha256=e5dca78fa828f2cb946ecf92d25724248fc40f93aa179c665bb2e4f27230ba46 +pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260420125032-cp313-cp313-win_amd64.whl#sha256=a49906cbb85a698a2a845fd264fefc2e05303b62306e945450ab7d125ad62ecd +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260420125038-py2.py3-none-any.whl#sha256=b3796e82ce920d942b3e2de5af4c8567738b72caffac49ec6d88684fd0365690 pyvmomi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyvmomi/pyvmomi-8.0.3.0.1-20260326173340-py2.py3-none-win_amd64.whl#sha256=c8487fb88881dc6bfc3507b9c351929221c8e85aa5e74179b82cda9d21364218 pywin32 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pywin32/pywin32-311-20260326173341-cp313-cp313-win_amd64.whl#sha256=1e7784bf006cbfd7ffc4ce238eecc6ae43bfaf5d8132a6401d58a4ad0a36aea5 -requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260417115834-py3-none-any.whl#sha256=7f0bbfc823535680dd0e1ad2aedad8dc958130a180c421288244a33509ea2b0d -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260417115835-py3-none-any.whl#sha256=4b33353c4d80e63f2417fff600939c30580c49721c76b0f7cf1ea4a18a131c4b -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260417115836-py3-none-any.whl#sha256=3e5b8439ed8ba11221d6479f27a25a261cba045c357a912dc60e236710504ef6 +requests-unixsocket2 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/requests-unixsocket2/requests_unixsocket2-1.0.1-20260420125043-py3-none-any.whl#sha256=7f0bbfc823535680dd0e1ad2aedad8dc958130a180c421288244a33509ea2b0d +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260420125049-py3-none-any.whl#sha256=4b33353c4d80e63f2417fff600939c30580c49721c76b0f7cf1ea4a18a131c4b +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260420125055-py3-none-any.whl#sha256=3e5b8439ed8ba11221d6479f27a25a261cba045c357a912dc60e236710504ef6 simplejson @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/simplejson/simplejson-3.20.2-20260326173342-cp313-cp313-win_amd64.whl#sha256=cd71398a228fa91cd9ee2bb88079ba6693c60a68c14e684d386181a8a5eb67bc -stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260417115837-py3-none-any.whl#sha256=b6ba40fc40b665f04276c98a21b7ddd029b6b5d80bc3c3e68dc58964f2ca0828 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260417115838-py2.py3-none-any.whl#sha256=01f0c6c7fbc4b9a0ccb659a6463319eb83742ba0d6c156e5256484aaedef2917 -vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260417115839-py3-none-any.whl#sha256=3a094a32c4a892c32be2acb3e77452c8d7b907b6b6ebaa1e6b0a1f5bbecf4d38 -websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260417115840-py3-none-any.whl#sha256=cb12e51596b0dbb085df6efdbd7d00cc315ea04e88f667513702899903ec39fc +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.7.0-20260420125101-py3-none-any.whl#sha256=b6ba40fc40b665f04276c98a21b7ddd029b6b5d80bc3c3e68dc58964f2ca0828 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260420125107-py2.py3-none-any.whl#sha256=01f0c6c7fbc4b9a0ccb659a6463319eb83742ba0d6c156e5256484aaedef2917 +vertica-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/vertica-python/vertica_python-1.4.0-20260420125113-py3-none-any.whl#sha256=3a094a32c4a892c32be2acb3e77452c8d7b907b6b6ebaa1e6b0a1f5bbecf4d38 +websocket-client @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/websocket-client/websocket_client-1.9.0-20260420125119-py3-none-any.whl#sha256=cb12e51596b0dbb085df6efdbd7d00cc315ea04e88f667513702899903ec39fc annotated-types @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/annotated-types/annotated_types-0.7.0-py3-none-any.whl#sha256=1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 attrs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/attrs/attrs-26.1.0-py3-none-any.whl#sha256=c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309 aws-msk-iam-sasl-signer-python @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/aws-msk-iam-sasl-signer-python/aws_msk_iam_sasl_signer_python-1.0.2-py2.py3-none-any.whl#sha256=310eb2db9ca0ff55ed06a24212739b87533e7f1cf6f34e43aabbd97a3b21290e diff --git a/.github/workflows/resolve-build-deps.yaml b/.github/workflows/resolve-build-deps.yaml index 638c051d74afa..cc8dde82606aa 100644 --- a/.github/workflows/resolve-build-deps.yaml +++ b/.github/workflows/resolve-build-deps.yaml @@ -1,17 +1,21 @@ name: Resolve Dependencies and Build Wheels on: - pull_request: - branches: + # We considered using pull_request as a trigger event, but then the diff will always contain all the changes compared to the target branch. + # Using the push target naturally limits the diff to the changes part of the push. + # This simplifies the decision whether to trigger the workflow or not. + push: + branches-ignore: - master - 7.*.* + - gh-readonly-queue/** paths: - agent_requirements.in - .builders/** - .github/workflows/resolve-build-deps.yaml concurrency: - group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true defaults: @@ -28,7 +32,6 @@ env: jobs: test: name: Run tests - if: github.event.pull_request.head.repo.fork == false runs-on: ubuntu-22.04 steps: - name: Checkout code @@ -118,23 +121,29 @@ jobs: steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Set up Python ${{ env.PYTHON_VERSION }} + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: - fetch-depth: 0 + python-version: ${{ env.PYTHON_VERSION }} - name: Detect builder changes + # Hashing the builder code is more robust than any kind of dance with git when it comes to determining whether we need to rebuild the builder images. id: builder-check run: | - if git diff --quiet "origin/${{ github.base_ref }}...HEAD" -- .builders/; then + current=$(python .builders/inputs_hash.py compute ${{ matrix.job.image }}) + pinned=$(python .builders/inputs_hash.py pinned ${{ matrix.job.image }}) + echo "current hash: $current" + echo "pinned hash: $pinned" + echo "current=$current" >> "$GITHUB_OUTPUT" + if [[ "$current" == "$pinned" ]]; then + echo "=> builder unchanged, will pull image by digest" echo "builder_changed=false" >> "$GITHUB_OUTPUT" else + echo "=> builder changed, will rebuild image" echo "builder_changed=true" >> "$GITHUB_OUTPUT" fi - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: ${{ env.PYTHON_VERSION }} - - name: Install management dependencies run: pip install -r .builders/deps/host_dependencies.txt @@ -168,18 +177,19 @@ jobs: if: steps.builder-check.outputs.builder_changed == 'true' run: ${DOCKER} push ${{ env.BUILDER_IMAGE }} - - name: Save new image digest + - name: Save new image digest and inputs hash if: steps.builder-check.outputs.builder_changed == 'true' - run: >- - ${DOCKER} inspect --format "{{index .RepoDigests 0}}" ${{ env.BUILDER_IMAGE }} - | cut -d '@' -f 2 - > ${{ env.OUT_DIR }}/image_digest + run: | + ${DOCKER} inspect --format "{{index .RepoDigests 0}}" ${{ env.BUILDER_IMAGE }} \ + | cut -d '@' -f 2 \ + > ${{ env.OUT_DIR }}/image_digest + echo "${{ steps.builder-check.outputs.current }}" > ${{ env.OUT_DIR }}/inputs_sha256 - - name: Persist current image digest + - name: Persist current image digest and inputs hash if: steps.builder-check.outputs.builder_changed == 'false' - run: >- - jq -r '.["${{ matrix.job.image }}"]' .deps/image_digests.json - > ${{ env.OUT_DIR }}/image_digest + run: | + jq -r '.["${{ matrix.job.image }}"]' .deps/image_digests.json > ${{ env.OUT_DIR }}/image_digest + echo "${{ steps.builder-check.outputs.current }}" > ${{ env.OUT_DIR }}/inputs_sha256 - name: Upload artifacts uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 @@ -299,7 +309,7 @@ jobs: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: - ref: "${{ github.head_ref }}" + ref: ${{ github.ref_name }} token: ${{ steps.token-generator.outputs.token }} - name: Set up Python ${{ env.PYTHON_VERSION }} diff --git a/mysql/changelog.d/23366.fixed b/mysql/changelog.d/23366.fixed new file mode 100644 index 0000000000000..e06a69fcec823 --- /dev/null +++ b/mysql/changelog.d/23366.fixed @@ -0,0 +1 @@ +Use parameterized queries for table names in schema collection. \ No newline at end of file diff --git a/mysql/datadog_checks/mysql/databases_data.py b/mysql/datadog_checks/mysql/databases_data.py index ad99c072fccb1..900d8dbfd434e 100644 --- a/mysql/datadog_checks/mysql/databases_data.py +++ b/mysql/datadog_checks/mysql/databases_data.py @@ -148,11 +148,10 @@ def shut_down(self): self._data_submitter.submit() def _cursor_run(self, cursor, query, params=None): - """ - Run and log the query. If provided, obfuscated params are logged in place of the regular params. - """ + """Run the query, log it, and emit a metric on database error.""" try: - self._log.debug("Running query [{}] params={}".format(query, params)) + params_repr = "({} params)".format(len(params)) if isinstance(params, list) else params + self._log.debug("Running query [{}] params={}".format(query, params_repr)) cursor.execute(query, params) except pymysql.DatabaseError as e: self._check.count( @@ -321,21 +320,30 @@ def _get_tables_data(self, table_list, db_name, cursor): table_name_to_table_index = {} for i, table in enumerate(table_list): table_name_to_table_index[table["name"]] = i - table_names = ','.join(f'"{str(table["name"])}"' for table in table_list) + table_name_list = [str(table["name"]) for table in table_list] + placeholders = ','.join(['%s'] * len(table_name_list)) total_columns_number = self._populate_with_columns_data( - table_name_to_table_index, table_list, table_names, db_name, cursor + table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor + ) + self._populate_with_partitions_data( + table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor + ) + self._populate_with_foreign_keys_data( + table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor + ) + self._populate_with_index_data( + table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor ) - self._populate_with_partitions_data(table_name_to_table_index, table_list, table_names, db_name, cursor) - self._populate_with_foreign_keys_data(table_name_to_table_index, table_list, table_names, db_name, cursor) - self._populate_with_index_data(table_name_to_table_index, table_list, table_names, db_name, cursor) return total_columns_number, table_list @tracked_method(agent_check_getter=agent_check_getter) - def _populate_with_columns_data(self, table_name_to_table_index, table_list, table_names, db_name, cursor): + def _populate_with_columns_data( + self, table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor + ): self._cursor_run( cursor, - query=SQL_COLUMNS.format(table_names), - params=db_name, + query=SQL_COLUMNS.format(placeholders), + params=[db_name] + table_name_list, ) rows = cursor.fetchall() for row in rows: @@ -354,9 +362,11 @@ def _populate_with_columns_data(self, table_name_to_table_index, table_list, tab return len(rows) @tracked_method(agent_check_getter=agent_check_getter) - def _populate_with_index_data(self, table_name_to_table_index, table_list, table_names, db_name, cursor): - query = get_indexes_query(self._check.version, self._check.is_mariadb, table_names) - self._cursor_run(cursor, query=query, params=db_name) + def _populate_with_index_data( + self, table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor + ): + query = get_indexes_query(self._check.version, self._check.is_mariadb, placeholders) + self._cursor_run(cursor, query=query, params=[db_name] + table_name_list) rows = cursor.fetchall() if not rows: return @@ -394,8 +404,10 @@ def _populate_with_index_data(self, table_name_to_table_index, table_list, table table_list[table_name_to_table_index[table_name]]["indexes"] = list(index_dict.values()) @tracked_method(agent_check_getter=agent_check_getter, track_result_length=True) - def _populate_with_foreign_keys_data(self, table_name_to_table_index, table_list, table_names, db_name, cursor): - self._cursor_run(cursor, query=SQL_FOREIGN_KEYS.format(table_names), params=db_name) + def _populate_with_foreign_keys_data( + self, table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor + ): + self._cursor_run(cursor, query=SQL_FOREIGN_KEYS.format(placeholders), params=[db_name] + table_name_list) rows = cursor.fetchall() for row in rows: table_name = row["table_name"] @@ -403,8 +415,10 @@ def _populate_with_foreign_keys_data(self, table_name_to_table_index, table_list table_list[table_name_to_table_index[table_name]]["foreign_keys"].append(row) @tracked_method(agent_check_getter=agent_check_getter, track_result_length=True) - def _populate_with_partitions_data(self, table_name_to_table_index, table_list, table_names, db_name, cursor): - self._cursor_run(cursor, query=SQL_PARTITION.format(table_names), params=db_name) + def _populate_with_partitions_data( + self, table_name_to_table_index, table_list, table_name_list, placeholders, db_name, cursor + ): + self._cursor_run(cursor, query=SQL_PARTITION.format(placeholders), params=[db_name] + table_name_list) rows = cursor.fetchall() if not rows: return diff --git a/mysql/datadog_checks/mysql/queries.py b/mysql/datadog_checks/mysql/queries.py index a993bf31d4d66..9dc1bed47f00d 100644 --- a/mysql/datadog_checks/mysql/queries.py +++ b/mysql/datadog_checks/mysql/queries.py @@ -274,13 +274,13 @@ def show_replica_status_query(version, is_mariadb, channel=''): return "{0};".format(base_query) -def get_indexes_query(version, is_mariadb, table_names): +def get_indexes_query(version, is_mariadb, placeholders): """ Get the appropriate indexes query based on MySQL version and flavor. The EXPRESSION column was introduced in MySQL 8.0.13 for functional indexes. MariaDB doesn't support functional indexes. """ if not is_mariadb and version.version_compatible((8, 0, 13)): - return SQL_INDEXES_8_0_13.format(table_names) + return SQL_INDEXES_8_0_13.format(placeholders) else: - return SQL_INDEXES.format(table_names) + return SQL_INDEXES.format(placeholders) diff --git a/mysql/tests/test_unit.py b/mysql/tests/test_unit.py index cd2f022209dd8..721b5b9c09c4f 100644 --- a/mysql/tests/test_unit.py +++ b/mysql/tests/test_unit.py @@ -433,6 +433,37 @@ def test_submit_is_called_if_too_many_columns(): assert mocked_submit.call_count == 2 +def test_get_tables_data_uses_parameterized_queries(): + """Table names must be passed as query parameters, not interpolated into SQL strings.""" + check = MySql(common.CHECK_NAME, {}, instances=[{'server': 'localhost', 'user': 'datadog'}]) + databases_data = DatabasesData({}, check, check._config) + + table_list = [{"name": 'normal_table'}, {"name": 'bad"table'}, {"name": "x\") UNION SELECT user()#"}] + execute_calls = [] + + class MockCursor: + def execute(self, query, params=None): + execute_calls.append((query, params)) + + def fetchall(self): + return [] + + def fake_index_query(v, m, p): + return "SELECT 1 WHERE s = %s AND n IN ({})".format(p) + + with mock.patch('datadog_checks.mysql.databases_data.get_indexes_query', side_effect=fake_index_query): + databases_data._get_tables_data(table_list, "mydb", MockCursor()) + + table_name_list = [str(t["name"]) for t in table_list] + + assert execute_calls, "Expected at least one query to be executed" + for query, params in execute_calls: + assert isinstance(params, list) + assert params[0] == "mydb" + assert params[1:] == table_name_list + assert query.count('%s') == len(table_list) + 1 + + def test_exception_handling_by_do_for_dbs(): check = MySql(common.CHECK_NAME, {}, instances=[{'server': 'localhost', 'user': 'datadog'}]) databases_data = DatabasesData({}, check, check._config)