diff --git a/.deps/builder_inputs.toml b/.deps/builder_inputs.toml index 9942909b3a3db..c8d90a7511b6c 100644 --- a/.deps/builder_inputs.toml +++ b/.deps/builder_inputs.toml @@ -11,7 +11,7 @@ # Hash inputs are defined in .builders/inputs_hash.py (SHARED_INPUTS, # RESOLUTION_INPUTS). [resolution] -hash = "de1a22354f312917e6a8795bf61184b6b7f1dc9db24fdb0b69ec8bb01fde4612" +hash = "aa676a172ec12e2926234fe5865bfde2281f669258fc87a35f724404c0f2e3ae" [images] linux-aarch64 = "f183db47c9b55ef83e324c5eeb8edaba75feaa5766f695da6f4f5964668579d4" diff --git a/.deps/resolved/linux-aarch64_3.13.txt b/.deps/resolved/linux-aarch64_3.13.txt index 1e864e0504a16..893732540ba14 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-20260423151051-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=13e750c0fbc8fd5f41810e5b3e72be2d132124e47a148dd147352a84b90fc614 -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260519113047-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260520150257-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-20260519113304-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=7c79fee28b751b9314991b34f75c1b85bd82c31b9fa0561c534d13a6f35e28a8 -cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260519113306-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=6e65632db954aebb373d06f0e1d17df1939809abc1fbd43fbf21dbb33487fc06 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260520150715-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=dffb540e50308294349c680b6fef9223b2c3fa48e2b30694b3fa56379317214b +cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260520150719-cp313-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=6e660e501d7780ead3d3cc0b307eaab1fce18f5abccef86d8a216ad4dcbcedfd 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-20260519113308-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=861b3cde93aec1b05a5e9ac917780dbac66d773bd427834bdf738825e559d197 -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.14.0-20260519113057-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.14.0-20260520150315-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260519113309-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=f6dd9d9a2d81b129b52ace318104ea9c04c1e7a5e11724aede73ba7c12f7fcac -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260519113108-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-20260519113118-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260519113128-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260520150335-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-20260520150354-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260520150413-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-20260518161020-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl#sha256=91f63a673fb68a595ab2c0a4e05178a7eacb964b154afb9cda19caae1e7e9a0b 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-20260519113140-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-20260520150436-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-20260519113151-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260519113201-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260519113212-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-20260520150457-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260520150517-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260520150537-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.8.0-20260519113212-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260519113223-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-20260519113233-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-20260519113244-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.8.0-20260520150538-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260520150558-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-20260520150617-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-20260520150637-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 @@ -37,7 +37,7 @@ binary @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE} boto3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/boto3/boto3-1.42.72-py3-none-any.whl#sha256=2b5fdac4f202b2ccb9ed21f8b84229463b15573ea16941c2b1b8db1c69e08b63 bytecode @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/bytecode/bytecode-0.17.0-py3-none-any.whl#sha256=64fb10cde1db7ef5cc39bd414ecebd54ba3b40e1c4cf8121ca5e72f170916ff8 cachetools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cachetools/cachetools-7.0.5-py3-none-any.whl#sha256=46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114 -certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.4.22-py3-none-any.whl#sha256=3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a +certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.5.20-py3-none-any.whl#sha256=3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 cffi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cffi/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl#sha256=d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b charset-normalizer @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/charset-normalizer/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl#sha256=0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c click @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/click/click-8.4.0-py3-none-any.whl#sha256=40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81 @@ -111,6 +111,6 @@ tuf @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/ex typing-extensions @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-extensions/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 typing-inspection @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-inspection/typing_inspection-0.4.2-py3-none-any.whl#sha256=4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 uhashring @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/uhashring/uhashring-2.4-py3-none-any.whl#sha256=0d6cae4ac3205ef039860b0befd6bc762f1686a276805bf1b998c8657124df62 -urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.6.3-py3-none-any.whl#sha256=bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 +urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.7.0-py3-none-any.whl#sha256=9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 wrapt @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/wrapt/wrapt-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl#sha256=16997dfb9d67addc2e3f41b62a104341e80cac52f91110dece393923c0ebd5ca zstandard @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/zstandard/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl#sha256=bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea diff --git a/.deps/resolved/linux-x86_64_3.13.txt b/.deps/resolved/linux-x86_64_3.13.txt index af31204651462..846e57d56b739 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-20260515131248-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b9c97cc2d6b72897ec06ca9e63457d4fa13bd04979fcddea59b2539cbeb651df -botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260519113047-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260520150257-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-20260519113053-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=d018992585ab946b872af89ff205aba11ab6a17c21073f4739ac1b69b828bb0e -cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260519113055-cp313-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=80fd7d0591d6164610f5f73a33b38159c5dd3e9808a235e40e33469fcd1bc6b3 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260520150308-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0babed7e9d6c112763013c1fe7b68108afa607592614a184a7e3b961fca11e48 +cryptography @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/cryptography/cryptography-46.0.7-20260520150312-cp313-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=9248eb040e3ffced6c70eb69fbff95f51d1dfee4bb7b15d80d3bc4c36a9fc45a 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-20260512161841-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=b0eefba08d72fa793402e49072b61c84e8414c9fdeda2b80dfa8a47c3865dc66 -keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.14.0-20260519113057-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.14.0-20260520150315-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef krb5 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/krb5/krb5-0.9.0-20260512161852-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=1814588e913f80e3f81753b2cb601eb1fce0001d33749cdc78b6134c20f1382a -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260519113108-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-20260519113118-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260519113128-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260520150335-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-20260520150354-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260520150413-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-20260518160748-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=3a8168f920ea77d841cc318818137aaf75d2744987e54078d2686f7784791d2c pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260515131417-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=f93c2743bedf78e5cd8fce172e068be0323e43053b4be04d6b48d7bed65d4bfd pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260515131418-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=d6ed6f8a9ae1dd91aaaa047caee858d42bf020d28336bf7046d8cd91eab35f7b pyodbc @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pyodbc/pyodbc-5.3.0-20260515131419-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=67e647a09d11119d56849c66f99100b3d24e9b7fff4e5d7b5ddf17fc167fdd20 -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260519113140-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-20260520150436-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-20260519113151-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260519113201-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260519113212-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-20260520150457-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260520150517-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260520150537-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.8.0-20260519113212-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260519113223-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-20260519113233-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-20260519113244-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.8.0-20260520150538-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260520150558-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-20260520150617-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-20260520150637-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 @@ -38,7 +38,7 @@ binary @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE} boto3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/boto3/boto3-1.42.72-py3-none-any.whl#sha256=2b5fdac4f202b2ccb9ed21f8b84229463b15573ea16941c2b1b8db1c69e08b63 bytecode @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/bytecode/bytecode-0.17.0-py3-none-any.whl#sha256=64fb10cde1db7ef5cc39bd414ecebd54ba3b40e1c4cf8121ca5e72f170916ff8 cachetools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cachetools/cachetools-7.0.5-py3-none-any.whl#sha256=46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114 -certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.4.22-py3-none-any.whl#sha256=3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a +certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.5.20-py3-none-any.whl#sha256=3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 cffi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cffi/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl#sha256=c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26 charset-normalizer @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/charset-normalizer/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl#sha256=e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd click @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/click/click-8.4.0-py3-none-any.whl#sha256=40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81 @@ -112,6 +112,6 @@ tuf @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/ex typing-extensions @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-extensions/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 typing-inspection @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-inspection/typing_inspection-0.4.2-py3-none-any.whl#sha256=4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 uhashring @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/uhashring/uhashring-2.4-py3-none-any.whl#sha256=0d6cae4ac3205ef039860b0befd6bc762f1686a276805bf1b998c8657124df62 -urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.6.3-py3-none-any.whl#sha256=bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 +urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.7.0-py3-none-any.whl#sha256=9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 wrapt @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/wrapt/wrapt-2.1.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl#sha256=bbac24d879aa22998e87f6b3f481a5216311e7d53c7db87f189a7a0266dafffb zstandard @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/zstandard/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl#sha256=8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a diff --git a/.deps/resolved/macos-aarch64_3.13.txt b/.deps/resolved/macos-aarch64_3.13.txt index 5b1879660089d..f2067519ec6c0 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-20260519113047-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260520150257-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-20260519113706-cp313-cp313-macosx_12_0_arm64.whl#sha256=183ebf1624fecca426224e2bbd7f0a9320e89facb976da4cd8c0abb0397fba14 +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260520151452-cp313-cp313-macosx_12_0_arm64.whl#sha256=42f071cd2d2f8c21def6fe4f0bcbc08082a09d837b51f6cc74f00b63405cab6a 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.14.0-20260519113057-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.14.0-20260520150315-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef 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-20260519113108-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-20260519113118-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260519113128-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260520150335-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-20260520150354-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260520150413-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-20260518161505-cp313-cp313-macosx_12_0_arm64.whl#sha256=47022f902ff341b88679bdb9f9a799e5e79057f45f943a1f558a664ec2d77436 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-20260519113140-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-20260520150436-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-20260519113151-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260519113201-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260519113212-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-20260520150457-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260520150517-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260520150537-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.8.0-20260519113212-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260519113223-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-20260519113233-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-20260519113244-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.8.0-20260520150538-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260520150558-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-20260520150617-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-20260520150637-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 @@ -35,7 +35,7 @@ binary @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE} boto3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/boto3/boto3-1.42.72-py3-none-any.whl#sha256=2b5fdac4f202b2ccb9ed21f8b84229463b15573ea16941c2b1b8db1c69e08b63 bytecode @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/bytecode/bytecode-0.17.0-py3-none-any.whl#sha256=64fb10cde1db7ef5cc39bd414ecebd54ba3b40e1c4cf8121ca5e72f170916ff8 cachetools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cachetools/cachetools-7.0.5-py3-none-any.whl#sha256=46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114 -certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.4.22-py3-none-any.whl#sha256=3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a +certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.5.20-py3-none-any.whl#sha256=3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 cffi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cffi/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl#sha256=45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca charset-normalizer @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/charset-normalizer/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl#sha256=f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 click @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/click/click-8.4.0-py3-none-any.whl#sha256=40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81 @@ -111,6 +111,6 @@ tuf @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/ex typing-extensions @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-extensions/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 typing-inspection @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-inspection/typing_inspection-0.4.2-py3-none-any.whl#sha256=4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 uhashring @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/uhashring/uhashring-2.4-py3-none-any.whl#sha256=0d6cae4ac3205ef039860b0befd6bc762f1686a276805bf1b998c8657124df62 -urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.6.3-py3-none-any.whl#sha256=bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 +urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.7.0-py3-none-any.whl#sha256=9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 wrapt @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/wrapt/wrapt-2.1.2-cp313-cp313-macosx_11_0_arm64.whl#sha256=4bdf26e03e6d0da3f0e9422fd36bcebf7bc0eeb55fdf9c727a09abc6b9fe472e zstandard @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/zstandard/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl#sha256=a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1 diff --git a/.deps/resolved/macos-x86_64_3.13.txt b/.deps/resolved/macos-x86_64_3.13.txt index 4b7608dd5b46e..9572e106ec8ef 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-20260519113047-py3-none-any.whl#sha256=f1933a8ca6c1108ed23f7b01f82577327fc254e330025887fdd4ba17db03e8e2 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260520150257-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-20260519113507-cp313-cp313-macosx_12_0_x86_64.whl#sha256=2227c28f752956cb6a05c1cfc4f4c7371d1f9335b6537902986bc843ad9c055a +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260520151108-cp313-cp313-macosx_12_0_x86_64.whl#sha256=cde0b33b8841015d2302a84a154109afbb6e0b5b041e8c9e800f461082108fbd 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.14.0-20260519113057-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.14.0-20260520150315-py3-none-any.whl#sha256=981596c8e7346d2b46ee5ec738312b8e46b0beb29d62104ccb7c113ed9c7fbef 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-20260519113108-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-20260519113118-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260519113128-py2.py3-none-any.whl#sha256=1544652b80307f0b4c491bd66f58f969cb0656994e632365f90e8e044c223b4e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260520150335-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-20260520150354-py3-none-any.whl#sha256=758ccaa020eea0edd84bcf4123746ddd060d1dbaeef63d04d76bd2e0ae6f91d8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260520150413-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-20260518161243-cp313-cp313-macosx_12_0_x86_64.whl#sha256=4d8cc8f8e8d18c4f1f3a879741a9215fd13a4bb7f3cb8634b4e2d712474f5e64 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-20260519113140-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-20260520150436-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-20260519113151-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260519113201-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260519113212-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-20260520150457-py3-none-any.whl#sha256=aae3f1743ab60955ea91e9a095d54997ea56b956bab652bf194379ef4dc6fa7f +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260520150517-py3-none-any.whl#sha256=861ab6f8c1930e0c05915f32a34f1c4ae1d76ee542ad2b424121e3e26a9fb1dd +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260520150537-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.8.0-20260519113212-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260519113223-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-20260519113233-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-20260519113244-py3-none-any.whl#sha256=b628876a9b1eed1d49f1a230bf4b1c21fa3cd9163594f9f9628c8a8b22f97e10 +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.8.0-20260520150538-py3-none-any.whl#sha256=b9c2fdfb8d02797f171fc63ada01759955b4bac02a7cbe63d2ad2e827e3530f6 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260520150558-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-20260520150617-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-20260520150637-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 @@ -35,7 +35,7 @@ binary @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE} boto3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/boto3/boto3-1.42.72-py3-none-any.whl#sha256=2b5fdac4f202b2ccb9ed21f8b84229463b15573ea16941c2b1b8db1c69e08b63 bytecode @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/bytecode/bytecode-0.17.0-py3-none-any.whl#sha256=64fb10cde1db7ef5cc39bd414ecebd54ba3b40e1c4cf8121ca5e72f170916ff8 cachetools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cachetools/cachetools-7.0.5-py3-none-any.whl#sha256=46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114 -certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.4.22-py3-none-any.whl#sha256=3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a +certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.5.20-py3-none-any.whl#sha256=3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 cffi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cffi/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl#sha256=00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb charset-normalizer @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/charset-normalizer/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl#sha256=f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063 click @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/click/click-8.4.0-py3-none-any.whl#sha256=40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81 @@ -111,6 +111,6 @@ tuf @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/ex typing-extensions @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-extensions/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 typing-inspection @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-inspection/typing_inspection-0.4.2-py3-none-any.whl#sha256=4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 uhashring @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/uhashring/uhashring-2.4-py3-none-any.whl#sha256=0d6cae4ac3205ef039860b0befd6bc762f1686a276805bf1b998c8657124df62 -urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.6.3-py3-none-any.whl#sha256=bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 +urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.7.0-py3-none-any.whl#sha256=9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 wrapt @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/wrapt/wrapt-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl#sha256=787fd6f4d67befa6fe2abdffcbd3de2d82dfc6fb8a6d850407c53332709d030b zstandard @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/zstandard/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl#sha256=ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94 diff --git a/.deps/resolved/windows-x86_64_3.13.txt b/.deps/resolved/windows-x86_64_3.13.txt index ea498f12a8c40..3cff3b623f2a5 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-20260519112823-py3-none-any.whl#sha256=6f69d4818864f67ab304ac48497fefcc7f4fdd9bbcb9403cbc22dbe211177824 +botocore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/botocore/botocore-1.42.72-20260520145819-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-20260519112830-cp313-cp313-win_amd64.whl#sha256=5558e5b518842d9a51f0c0353c9e03671aea6e3ff938a8cdf6f1420ad1c93d0e +confluent-kafka @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/confluent-kafka/confluent_kafka-2.13.2-20260520145829-cp313-cp313-win_amd64.whl#sha256=496529036bacb9b66e0ed88f7c1a3e14b57df14d17be5465d27a705710cc9923 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.14.0-20260519112831-py3-none-any.whl#sha256=5c38e33e1aa685d2dcd7b3c0dc62d61cc1c5f4878076b9fd79afa4cfa6f08c0e -openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260519112841-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-20260519112851-py3-none-any.whl#sha256=668903c54b88cc4db5fd1dcbaf7cf7417220ef70592b70b49a76d202e8a7f4e8 -pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260519112901-py2.py3-none-any.whl#sha256=dbc2e1e0dbf694097374a40b72c890c915302ae4dd7d37c73db9cff8bf520c4b +keystoneauth1 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/keystoneauth1/keystoneauth1-5.14.0-20260520145831-py3-none-any.whl#sha256=5c38e33e1aa685d2dcd7b3c0dc62d61cc1c5f4878076b9fd79afa4cfa6f08c0e +openstacksdk @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/openstacksdk/openstacksdk-4.10.0-20260520145850-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-20260520145909-py3-none-any.whl#sha256=668903c54b88cc4db5fd1dcbaf7cf7417220ef70592b70b49a76d202e8a7f4e8 +pbr @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pbr/pbr-7.0.3-20260520145928-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-20260519112907-cp313-cp313-win_amd64.whl#sha256=aafd80e48af8f2ea9593c8a6428b32d201477c08a836d5b14506bf2423fa040b -pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260519112913-cp313-cp313-win_amd64.whl#sha256=aa298a805eb1f75e50048f9cc8b962d67c8ecf23d44e86d66b4a6c8258288e5f -pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260519112918-cp313-cp313-win_amd64.whl#sha256=ef655b00ce7de8aeb26085fbaad9183e9bfd71f63dc77ad2c98762ee7b2c86c3 -pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260519112929-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-20260520145939-cp313-cp313-win_amd64.whl#sha256=65cf42da539e0c4f752d5f1ff8c514b6935f713f08f93516fb7e4d4faed07683 +pymongo @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymongo/pymongo-4.8.0-20260520145949-cp313-cp313-win_amd64.whl#sha256=0b1089e137bd1e1c36055e01bc255e5d983a4de34661b39224ad434bf693c795 +pymqi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pymqi/pymqi-1.12.13-20260520145959-cp313-cp313-win_amd64.whl#sha256=ea935f8f8682a20a186284a9a6478d1a73c04b741141b0e33ed60a3b541e6b0a +pysnmp-mibs @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/pysnmp-mibs/pysnmp_mibs-0.1.6-20260520150019-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-20260519112939-py3-none-any.whl#sha256=7f0bbfc823535680dd0e1ad2aedad8dc958130a180c421288244a33509ea2b0d -securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260519112950-py3-none-any.whl#sha256=4b33353c4d80e63f2417fff600939c30580c49721c76b0f7cf1ea4a18a131c4b -setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260519113000-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-20260520150041-py3-none-any.whl#sha256=7f0bbfc823535680dd0e1ad2aedad8dc958130a180c421288244a33509ea2b0d +securesystemslib @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/securesystemslib/securesystemslib-0.28.0-20260520150102-py3-none-any.whl#sha256=4b33353c4d80e63f2417fff600939c30580c49721c76b0f7cf1ea4a18a131c4b +setuptools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/setuptools/setuptools-82.0.1-20260520150123-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.8.0-20260519113000-py3-none-any.whl#sha256=4fda71787750545abe0ff0845544b6729dca0e3bf18ab799bacdefebd9f703b5 -supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260519113011-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-20260519113021-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-20260519113032-py3-none-any.whl#sha256=cb12e51596b0dbb085df6efdbd7d00cc315ea04e88f667513702899903ec39fc +stevedore @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/stevedore/stevedore-5.8.0-20260520150124-py3-none-any.whl#sha256=4fda71787750545abe0ff0845544b6729dca0e3bf18ab799bacdefebd9f703b5 +supervisor @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/built/supervisor/supervisor-4.3.0-20260520150146-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-20260520150207-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-20260520150227-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 @@ -35,7 +35,7 @@ binary @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE} boto3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/boto3/boto3-1.42.72-py3-none-any.whl#sha256=2b5fdac4f202b2ccb9ed21f8b84229463b15573ea16941c2b1b8db1c69e08b63 bytecode @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/bytecode/bytecode-0.17.0-py3-none-any.whl#sha256=64fb10cde1db7ef5cc39bd414ecebd54ba3b40e1c4cf8121ca5e72f170916ff8 cachetools @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cachetools/cachetools-7.0.5-py3-none-any.whl#sha256=46bc8ebefbe485407621d0a4264b23c080cedd913921bad7ac3ed2f26c183114 -certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.4.22-py3-none-any.whl#sha256=3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a +certifi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/certifi/certifi-2026.5.20-py3-none-any.whl#sha256=3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 cffi @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/cffi/cffi-2.0.0-cp313-cp313-win_amd64.whl#sha256=19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75 charset-normalizer @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/charset-normalizer/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl#sha256=3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110 click @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/click/click-8.4.0-py3-none-any.whl#sha256=40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81 @@ -110,6 +110,6 @@ tuf @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/ex typing-extensions @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-extensions/typing_extensions-4.15.0-py3-none-any.whl#sha256=f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548 typing-inspection @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/typing-inspection/typing_inspection-0.4.2-py3-none-any.whl#sha256=4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7 tzdata @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/tzdata/tzdata-2026.2-py2.py3-none-any.whl#sha256=bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7 -urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.6.3-py3-none-any.whl#sha256=bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4 +urllib3 @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/urllib3/urllib3-2.7.0-py3-none-any.whl#sha256=9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897 wrapt @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/wrapt/wrapt-2.1.2-cp313-cp313-win_amd64.whl#sha256=f8bc1c264d8d1cf5b3560a87bbdd31131573eb25f9f9447bb6252b8d4c44a3a1 zstandard @ https://agent-int-packages.datadoghq.com/${INTEGRATIONS_WHEELS_STORAGE}/external/zstandard/zstandard-0.25.0-cp313-cp313-win_amd64.whl#sha256=1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5 diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f1e14347af913..cd73c3380f650 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,5 +7,5 @@ ### Review checklist (to be filled by reviewers) - [ ] Feature or bugfix MUST have appropriate tests (unit, integration, e2e) -- [ ] Add the `qa/skip-qa` label if the PR doesn't need to be tested during QA. +- [ ] Add `qa/required` if this PR needs QA validation, or `qa/skip-qa` if it does not. Exactly one of the two is required. - [ ] If you need to backport this PR to another branch, you can add the `backport/` label to the PR and it will automatically open a backport PR once this one is merged diff --git a/.github/actions/render-skip-qa-comment/action.yml b/.github/actions/render-skip-qa-comment/action.yml deleted file mode 100644 index a12a774bbc5ea..0000000000000 --- a/.github/actions/render-skip-qa-comment/action.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: "Render skip-qa comment body" -description: "Renders the validate-skip-qa PR comment into a markdown file." - -inputs: - mode: - description: "Rendering mode: add-label or remove-label." - required: true - output: - description: "Path to write the rendered markdown body." - required: true - changed-files-json: - description: "JSON array containing changed files (required for remove-label mode)." - required: false - default: "" - -runs: - using: "composite" - steps: - - name: Render comment body - shell: bash - env: - MODE: ${{ inputs.mode }} - OUTPUT_PATH: ${{ inputs.output }} - CHANGED_FILES_JSON: ${{ inputs.changed-files-json }} - run: | - set -euo pipefail - - args=("$MODE" "--output" "$OUTPUT_PATH") - if [[ "$MODE" == "remove-label" ]]; then - args+=("--changed-files-json" "$CHANGED_FILES_JSON") - fi - - python3 "${{ github.action_path }}/src/render_skip_qa_comment.py" "${args[@]}" diff --git a/.github/actions/render-skip-qa-comment/src/render_skip_qa_comment.py b/.github/actions/render-skip-qa-comment/src/render_skip_qa_comment.py deleted file mode 100644 index ba621187ef261..0000000000000 --- a/.github/actions/render-skip-qa-comment/src/render_skip_qa_comment.py +++ /dev/null @@ -1,85 +0,0 @@ -""" -Running this script by itself must not use any external dependencies. -""" - -# (C) Datadog, Inc. 2023-present -# All rights reserved -# Licensed under a 3-clause BSD style license (see LICENSE) -from __future__ import annotations - -import argparse -import json -from pathlib import Path -from string import Template - -ADD_LABEL_TEMPLATE = Template( - "⚠️ **Recommendation: Add `qa/skip-qa` label**\n\n" - "This PR does not modify any files shipped with the agent.\n\n" - "To help streamline the release process, please consider adding the `qa/skip-qa` label " - "if these changes do not require QA testing.\n" -) - -REMOVE_LABEL_TEMPLATE = Template( - "⚠️ **The `qa/skip-qa` label has been added with shippable changes**\n\n" - "The following files, which will be shipped with the agent, were modified in this PR and\n" - "the `qa/skip-qa` label has been added.\n\n" - "You can ignore this if you are sure the changes in this PR do not require QA. Otherwise,\n" - "consider removing the label.\n\n" - "
\n" - "List of modified files that will be shipped with the agent\n\n" - "```\n" - "${file_list}\n" - "```\n\n" - "
\n" -) - - -def build_add_label_comment() -> str: - return ADD_LABEL_TEMPLATE.substitute() - - -def parse_changed_files_json(changed_files_json: str) -> list[str]: - changed_files = json.loads(changed_files_json) - if not isinstance(changed_files, list) or not all(isinstance(item, str) for item in changed_files): - raise ValueError("changed files JSON must decode to a list of strings") - - return changed_files - - -def build_remove_label_comment(changed_files: list[str]) -> str: - return REMOVE_LABEL_TEMPLATE.substitute(file_list="\n".join(changed_files)) - - -def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(description="Render validate-skip-qa PR comments.") - subparsers = parser.add_subparsers(dest="command", required=True) - - add_label = subparsers.add_parser("add-label", help="Render the recommendation to add qa/skip-qa.") - add_label.add_argument("--output", required=True, help="Path to write the rendered markdown body.") - - remove_label = subparsers.add_parser( - "remove-label", help="Render the warning shown when shippable files are changed." - ) - remove_label.add_argument( - "--changed-files-json", required=True, help="JSON array containing the changed filenames." - ) - remove_label.add_argument("--output", required=True, help="Path to write the rendered markdown body.") - - return parser - - -def main(args: list[str] | None = None) -> None: - parsed = build_parser().parse_args(args) - - if parsed.command == "add-label": - body = build_add_label_comment() - else: - body = build_remove_label_comment(parse_changed_files_json(parsed.changed_files_json)) - - output = Path(parsed.output) - output.parent.mkdir(parents=True, exist_ok=True) - output.write_text(body, encoding="utf-8") - - -if __name__ == "__main__": - main() diff --git a/.github/workflows/validate-skip-qa.yml b/.github/workflows/validate-skip-qa.yml deleted file mode 100644 index d227e95a379a8..0000000000000 --- a/.github/workflows/validate-skip-qa.yml +++ /dev/null @@ -1,110 +0,0 @@ -name: 'Validate skip QA label' - -# Runs under the fork-PR threat model: -# - No repository secrets are exposed (pull_request from a fork). -# - GITHUB_TOKEN is forcibly read-only. -# - No id-token: write and no OIDC/STS exchange happen here, so even if a -# fork PR modifies this workflow or the render composite action, there is -# no writable credential to steal. -# -# The rendered comment body is handed off to .github/workflows/post-pr-comment.yml -# (triggered via workflow_run, always runs from master) using this artifact -# contract: -# - name: pr-comment -# - files: -# body.md rendered markdown (treated as opaque, attacker-controlled text) -# -# The central workflow owns the hidden marker used by find-comment; producers -# here are not concerned with it. - -on: - pull_request: - types: [opened, synchronize] - branches: - - master -jobs: - validate-skip-qa: - if: '!github.event.pull_request.draft' - runs-on: ubuntu-latest - permissions: - contents: read - env: - PYTHON_VERSION: "3.13" - - steps: - - name: Checkout Code - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - with: - persist-credentials: false - - - name: Set up Python ${{ env.PYTHON_VERSION }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 - with: - python-version: "${{ env.PYTHON_VERSION }}" - - # json: true produces a JSON array. escape_json / safe_output are - # string-mode sanitizers that would double-encode a JSON array, so we - # disable them. The JSON flows through env vars into a Python json.loads - # in the composite action, never through a shell expansion. - - name: Get files changed - id: changed_files - uses: tj-actions/changed-files@22103cc46bda19c2b464ffe86db46df6922fd323 # v47.0.5 - with: - json: true - escape_json: false - safe_output: false - files: | - **/datadog_checks/** - **/changelog.d/** - **/pyproject.toml - **/hatch.toml - files_ignore: | - ddev/** - datadog_checks_dev/** - datadog_checks_tests_helper/** - - - name: Debug - Show detected changed files - env: - ANY_CHANGED: ${{ steps.changed_files.outputs.any_changed }} - ALL_CHANGED_FILES: ${{ steps.changed_files.outputs.all_changed_files }} - ALL_MODIFIED_FILES: ${{ steps.changed_files.outputs.all_modified_files }} - ADDED_FILES: ${{ steps.changed_files.outputs.added_files }} - MODIFIED_FILES: ${{ steps.changed_files.outputs.modified_files }} - DELETED_FILES: ${{ steps.changed_files.outputs.deleted_files }} - RENAMED_FILES: ${{ steps.changed_files.outputs.renamed_files }} - HAS_SKIP_QA_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'qa/skip-qa') }} - run: | - echo "any_changed=${ANY_CHANGED}" - echo "has_skip_qa_label=${HAS_SKIP_QA_LABEL}" - echo "all_changed_files=${ALL_CHANGED_FILES}" - echo "all_modified_files=${ALL_MODIFIED_FILES}" - echo "added_files=${ADDED_FILES}" - echo "modified_files=${MODIFIED_FILES}" - echo "deleted_files=${DELETED_FILES}" - echo "renamed_files=${RENAMED_FILES}" - - - name: Render comment body - Add skip qa label - id: render_add - if: steps.changed_files.outputs.any_changed == 'false' && !contains(github.event.pull_request.labels.*.name, 'qa/skip-qa') - uses: ./.github/actions/render-skip-qa-comment - with: - mode: add-label - output: pr-comment/body.md - - - name: Render comment body - Remove skip qa label - id: render_remove - if: steps.changed_files.outputs.any_changed == 'true' && contains(github.event.pull_request.labels.*.name, 'qa/skip-qa') - uses: ./.github/actions/render-skip-qa-comment - with: - mode: remove-label - changed-files-json: ${{ steps.changed_files.outputs.all_changed_files }} - output: pr-comment/body.md - - - name: Upload comment artifact - if: steps.render_add.outcome == 'success' || steps.render_remove.outcome == 'success' - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 - with: - name: pr-comment - path: pr-comment/ - retention-days: 1 - if-no-files-found: error diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 6de5e5b9790eb..fb2a73bac57a3 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -5,6 +5,7 @@ on: branches: - master pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] merge_group: types: [checks_requested] diff --git a/AGENTS.md b/AGENTS.md index deb56502f39fe..ed2bcbc2b45fb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -170,7 +170,7 @@ echo "Fix a bug where ``tempdb`` is wrongly excluded from database files metrics - Open PRs in draft mode unless explicitly asked otherwise; mark them ready for review once the work is complete and CI passes. - Always populate the PR body using the repository's template at `.github/PULL_REQUEST_TEMPLATE.md`. Read the template first and fill in every section (`What does this PR do?`, `Motivation`, `Review checklist`). Do not omit, rename, or reorder the template sections, and do not add unrelated sections on top. - Keep PR titles short and descriptive in plain words. Do not use conventional-commit prefixes (`feat:`, `fix:`, `chore:`). -- Add the `qa/skip-qa` label when the PR doesn't need to be tested during QA, and check the corresponding checkbox in the template. +- Every PR must declare a QA decision via a label. Add `qa/required` if the PR ships changes that need QA validation, or `qa/skip-qa` if it does not (e.g., docs, tests, developer tooling, or no agent-impacting changes). The `validate-all` CI check fails until exactly one of those labels is set. Tick the matching checkbox in the PR template. - Push the branch and open the PR before adding the changelog entry so the entry filename can reference the real PR number. ## Documentation diff --git a/agent_requirements.in b/agent_requirements.in index 8075c8d95ef92..7bba418432a15 100644 --- a/agent_requirements.in +++ b/agent_requirements.in @@ -64,6 +64,6 @@ service-identity[idna]==24.2.0 simplejson==3.20.2 supervisor==4.3.0 tuf==4.0.0 -urllib3==2.6.3 +urllib3==2.7.0 vertica-python==1.4.0 wrapt==2.1.2 diff --git a/anthropic_compliance_logs/CHANGELOG.md b/anthropic_compliance_logs/CHANGELOG.md index a8856c0a7f6e9..830f6c3090a4f 100644 --- a/anthropic_compliance_logs/CHANGELOG.md +++ b/anthropic_compliance_logs/CHANGELOG.md @@ -1,7 +1,7 @@ -# CHANGELOG - Anthropic Compliance Logs +# CHANGELOG - Claude Compliance Logs -## 1.0.0 / 2026-05-13 +## 1.0.0 / 2026-05-21 -***Added***: +**Added**: -* Initial Release +* Initial release of the Claude Compliance Logs integration. Includes a log pipeline, dashboard, monitor, and saved views for monitoring Anthropic Console activity such as SSO sign-ins, API key lifecycle events, organization membership changes, and Claude usage. diff --git a/anthropic_compliance_logs/README.md b/anthropic_compliance_logs/README.md index 95673f37029e1..79d8eebb415d1 100644 --- a/anthropic_compliance_logs/README.md +++ b/anthropic_compliance_logs/README.md @@ -1,8 +1,8 @@ -# Anthropic Compliance +# Claude Compliance API ## Overview -Datadog's Anthropic Compliance integration ingests audit activity logs from Anthropic's [Compliance API][1]. With this integration, security and compliance teams can: +Datadog's Claude Compliance API integration ingests audit activity logs from Anthropic's [Compliance API][1]. With this integration, security and compliance teams can: - **Monitor SSO sign-ins and authentication events** across your organization - **Track API key lifecycle** (creation, deletion, scope updates) for Admin, Platform, and Scoped API keys @@ -34,14 +34,13 @@ The Compliance API is available to Anthropic Enterprise plan customers with the ### 3. Configure the Datadog integration -1. In Datadog, go to [**Integrations -> Anthropic Compliance**](https://app.datadoghq.com/integrations?integrationId=anthropic-compliance-logs). -2. In the configuration panel, paste your **Admin API Key**. -3. Click **Save Configuration**. +1. Paste your **Admin API Key** into the configuration panel. +2. Click **Save Configuration**. ### 4. Validate 1. Wait up to 5 minutes for the first crawl. -2. Open [Log Explorer][3] and filter on `source:anthropic-compliance-logs`. +2. Open [Log Explorer][3] and filter on `source:claude-compliance-logs`. 3. Confirm logs appear with `evt.name` values such as `claude_chat_viewed`, `admin_api_key_created`, or `user_signed_in_sso`. ## Data Collected @@ -55,19 +54,19 @@ The integration collects audit activity logs from `GET /v1/compliance/activities - An activity `type` such as `user_signed_in_sso`, `admin_api_key_created`, `org_user_invite_accepted`, or `claude_chat_viewed` (150+ activity types across 35+ categories) - Organization and workspace context -Logs are tagged `source:anthropic-compliance-logs` and processed by a Datadog log pipeline that flattens the actor object into standard `usr.*` and `network.client.*` attributes and enriches the source IP with GeoIP and the User-Agent string. +Logs are tagged `source:claude-compliance-logs` and processed by a Datadog log pipeline that flattens the actor object into standard `usr.*` and `network.client.*` attributes and enriches the source IP with GeoIP and the User-Agent string. ### Metrics -Anthropic Compliance does not include any metrics. +Claude Compliance does not include any metrics. ### Service Checks -Anthropic Compliance does not include any service checks. +Claude Compliance does not include any service checks. ### Events -Anthropic Compliance does not include any events. +Claude Compliance does not include any events. ## Troubleshooting @@ -79,5 +78,5 @@ Need help? Contact [Datadog support][4]. [1]: https://platform.claude.com/docs/en/api/compliance [2]: https://app.datadoghq.com/integrations?integrationId=anthropic-usage-and-costs -[3]: https://app.datadoghq.com/logs?query=source%3Aanthropic-compliance-logs +[3]: https://app.datadoghq.com/logs?query=source%3Aclaude-compliance-logs [4]: https://docs.datadoghq.com/help/ diff --git a/anthropic_compliance_logs/assets/account_config.json b/anthropic_compliance_logs/assets/account_config.json deleted file mode 100644 index f1e63afad4f0d..0000000000000 --- a/anthropic_compliance_logs/assets/account_config.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "supported_auth_methods": [], - "additional_config_fields": [ - { - "type": "password", - "key": "api_key", - "label": "Admin API key", - "help": "An Anthropic Admin API key with permission to read compliance logs. Generate one in the Anthropic Console under Settings > Admin Keys.", - "editable": true, - "required": true - } - ], - "dataflow_config": [ - { - "dataflow_id": "anthropic-compliance-logs", - "additional_config_fields": [] - } - ] -} diff --git a/anthropic_compliance_logs/assets/dashboards/anthropic_compliance_logs_overview.json b/anthropic_compliance_logs/assets/dashboards/claude_compliance_logs_overview.json similarity index 89% rename from anthropic_compliance_logs/assets/dashboards/anthropic_compliance_logs_overview.json rename to anthropic_compliance_logs/assets/dashboards/claude_compliance_logs_overview.json index 4ff9cea3fd23b..899eeb927f084 100644 --- a/anthropic_compliance_logs/assets/dashboards/anthropic_compliance_logs_overview.json +++ b/anthropic_compliance_logs/assets/dashboards/claude_compliance_logs_overview.json @@ -1,5 +1,5 @@ { - "title": "Anthropic Compliance Logs Overview", + "title": "Claude Compliance Logs Overview", "description": "Security and compliance visibility into Anthropic Console activity: SSO sign-ins, admin API key lifecycle, organization changes, and Claude chat/project access.", "layout_type": "ordered", "reflow_type": "fixed", @@ -29,7 +29,7 @@ "widgets": [ { "definition": { - "title": "About Anthropic Compliance Logs", + "title": "About Claude Compliance Logs", "type": "group", "background_color": "white", "show_title": true, @@ -50,7 +50,7 @@ { "definition": { "type": "note", - "content": "## Anthropic Compliance Logs\n\nMonitor security-relevant activity from the Anthropic Console: SSO and password sign-ins, admin API key lifecycle, organization membership changes, SSO/SAML configuration updates, and Claude chat and project access events.\n\nAll widgets scope to `source:anthropic-compliance-logs`. Use the template variables at the top of the dashboard to slice by organization, actor type, or event name.\n\n### Useful links\n- [Anthropic Compliance Logs tile](https://app.datadoghq.com/integrations/anthropic-compliance-logs)\n- [Anthropic Console compliance API](https://docs.anthropic.com/en/api/compliance-api)\n- [Datadog Cloud SIEM](https://app.datadoghq.com/security)", + "content": "## Claude Compliance Logs\n\nMonitor security-relevant activity from the Anthropic Console: SSO and password sign-ins, admin API key lifecycle, organization membership changes, SSO/SAML configuration updates, and Claude chat and project access events.\n\nAll widgets scope to `source:claude-compliance-logs`. Use the template variables at the top of the dashboard to slice by organization, actor type, or event name.\n\n### Useful links\n- [Claude Compliance Logs tile](https://app.datadoghq.com/integrations/claude-compliance-logs)\n- [Anthropic Console compliance API](https://docs.anthropic.com/en/api/compliance-api)\n- [Datadog Cloud SIEM](https://app.datadoghq.com/security)", "background_color": "white", "font_size": "14", "text_align": "left", @@ -87,7 +87,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [], "compute": {"aggregation": "count"}, @@ -116,7 +116,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [], "compute": {"aggregation": "cardinality", "metric": "@usr.email"}, @@ -145,7 +145,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [], "compute": {"aggregation": "cardinality", "metric": "@network.client.ip"}, @@ -177,7 +177,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [ { @@ -242,7 +242,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs @evt.name:(user_signed_in_sso OR user_signed_in_google OR user_signed_in_apple OR user_signed_in_password OR user_signed_out) $org $actor_type"}, + "search": {"query": "source:claude-compliance-logs @evt.name:(user_signed_in_sso OR user_signed_in_google OR user_signed_in_apple OR user_signed_in_password OR user_signed_out) $org $actor_type"}, "indexes": ["*"], "group_by": [ { @@ -277,7 +277,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs @evt.name:user_signed_in_* $org $actor_type"}, + "search": {"query": "source:claude-compliance-logs @evt.name:user_signed_in_* $org $actor_type"}, "indexes": ["*"], "group_by": [ { @@ -339,7 +339,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [ { @@ -373,7 +373,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs $org $event_name"}, + "search": {"query": "source:claude-compliance-logs $org $event_name"}, "indexes": ["*"], "group_by": [ { @@ -420,7 +420,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs @usr.email:* $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs @usr.email:* $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [ { @@ -454,7 +454,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs @network.client.ip:* $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs @network.client.ip:* $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [ { @@ -515,7 +515,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs @evt.name:(*api_key_created OR *api_key_deleted OR *api_key_updated) $org $actor_type"}, + "search": {"query": "source:claude-compliance-logs @evt.name:(*api_key_created OR *api_key_deleted OR *api_key_updated) $org $actor_type"}, "indexes": ["*"], "group_by": [ { @@ -549,7 +549,7 @@ { "name": "query1", "data_source": "logs", - "search": {"query": "source:anthropic-compliance-logs $org $actor_type $event_name"}, + "search": {"query": "source:claude-compliance-logs $org $actor_type $event_name"}, "indexes": ["*"], "group_by": [ { @@ -604,7 +604,7 @@ "title_align": "left", "type": "log_stream", "indexes": ["*"], - "query": "source:anthropic-compliance-logs (@actor.type:admin_api_key_actor OR @evt.name:admin_*) $org $event_name", + "query": "source:claude-compliance-logs (@actor.type:admin_api_key_actor OR @evt.name:admin_*) $org $event_name", "sort": {"column": "timestamp", "order": "desc"}, "columns": ["host", "@evt.name", "@usr.email", "@network.client.ip"], "show_date_column": true, @@ -620,7 +620,7 @@ "title_align": "left", "type": "log_stream", "indexes": ["*"], - "query": "source:anthropic-compliance-logs @evt.name:(*sso_* OR *saml_*) $org $actor_type", + "query": "source:claude-compliance-logs @evt.name:(*sso_* OR *saml_*) $org $actor_type", "sort": {"column": "timestamp", "order": "desc"}, "columns": ["host", "@evt.name", "@usr.email", "@network.client.ip"], "show_date_column": true, @@ -648,7 +648,7 @@ "title_align": "left", "type": "log_stream", "indexes": ["*"], - "query": "source:anthropic-compliance-logs $org $actor_type $event_name", + "query": "source:claude-compliance-logs $org $actor_type $event_name", "sort": {"column": "timestamp", "order": "desc"}, "columns": ["host", "@evt.name", "@actor.type", "@usr.email", "@network.client.geoip.country.iso_code"], "show_date_column": true, diff --git a/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs.yaml b/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs.yaml index 3c3b6c59ebe89..975da722e2bbf 100644 --- a/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs.yaml +++ b/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs.yaml @@ -1,5 +1,7 @@ id: anthropic-compliance-logs backend_only: false +installation_sources: + - claude-compliance-logs facets: - groups: - Event @@ -88,10 +90,10 @@ facets: source: log pipeline: type: pipeline - name: Anthropic Compliance Logs + name: Claude Compliance Logs enabled: true filter: - query: source:anthropic-compliance-logs + query: source:claude-compliance-logs processors: - type: date-remapper name: Define `created_at` as the official date of the log diff --git a/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs_tests.yaml b/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs_tests.yaml index a2735c511d4dd..17d3d7c1f3948 100644 --- a/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs_tests.yaml +++ b/anthropic_compliance_logs/assets/logs/anthropic-compliance-logs_tests.yaml @@ -1,59 +1,6 @@ id: "anthropic-compliance-logs" tests: - - - sample: |- - { - "actor" : { - "email_address" : "user@example.com", - "user_id" : "user_01FBY4qyk7SdPxJCAd4EfPbT", - "ip_address" : "192.0.2.1", - "type" : "user_actor", - "user_agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" - }, - "organization_id" : "org_01GuSHHxdWNCcTtk6Wr5arBM", - "organization_uuid" : "80cb55fa-462c-4bc0-82d6-07ebb1a6f004", - "created_at" : "2026-05-05T16:04:57.150724Z", - "id" : "activity_01R1sBnxj7yvtdZnt8DsfpRL", - "type" : "claude_chat_viewed", - "claude_chat_id" : "claude_chat_01AxWT9aH4swoDJ8u6dShxMV" - } - service: "anthropic.compliance" - result: - custom: - actor: - type: "user_actor" - claude_chat_id: "claude_chat_01AxWT9aH4swoDJ8u6dShxMV" - created_at: "2026-05-05T16:04:57.150724Z" - evt: - name: "claude_chat_viewed" - http: - useragent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" - useragent_details: - browser: - family: "Safari" - major: "17" - minor: "0" - device: - brand: "Apple" - category: "Desktop" - family: "Mac" - model: "Mac" - os: - family: "Mac OS X" - major: "10" - minor: "15" - patch: "7" - id: "activity_01R1sBnxj7yvtdZnt8DsfpRL" - network: - client: - geoip: {} - ip: "192.0.2.1" - organization_id: "org_01GuSHHxdWNCcTtk6Wr5arBM" - organization_uuid: "80cb55fa-462c-4bc0-82d6-07ebb1a6f004" - usr: - email: "user@example.com" - id: "user_01FBY4qyk7SdPxJCAd4EfPbT" - message: |- + - sample: |- { "actor" : { "email_address" : "user@example.com", @@ -69,7 +16,57 @@ tests: "type" : "claude_chat_viewed", "claude_chat_id" : "claude_chat_01AxWT9aH4swoDJ8u6dShxMV" } - service: "anthropic.compliance" - tags: - - "source:LOGS_SOURCE" - timestamp: 1777997097150 + result: + custom: + actor: + type: "user_actor" + claude_chat_id: "claude_chat_01AxWT9aH4swoDJ8u6dShxMV" + created_at: "2026-05-05T16:04:57.150724Z" + evt: + name: "claude_chat_viewed" + http: + useragent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" + useragent_details: + browser: + family: "Safari" + major: "17" + minor: "0" + device: + brand: "Apple" + category: "Desktop" + family: "Mac" + model: "Mac" + os: + family: "Mac OS X" + major: "10" + minor: "15" + patch: "7" + id: "activity_01R1sBnxj7yvtdZnt8DsfpRL" + network: + client: + geoip: {} + ip: "192.0.2.1" + organization_id: "org_01GuSHHxdWNCcTtk6Wr5arBM" + organization_uuid: "80cb55fa-462c-4bc0-82d6-07ebb1a6f004" + usr: + email: "user@example.com" + id: "user_01FBY4qyk7SdPxJCAd4EfPbT" + message: |- + { + "actor" : { + "email_address" : "user@example.com", + "user_id" : "user_01FBY4qyk7SdPxJCAd4EfPbT", + "ip_address" : "192.0.2.1", + "type" : "user_actor", + "user_agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" + }, + "organization_id" : "org_01GuSHHxdWNCcTtk6Wr5arBM", + "organization_uuid" : "80cb55fa-462c-4bc0-82d6-07ebb1a6f004", + "created_at" : "2026-05-05T16:04:57.150724Z", + "id" : "activity_01R1sBnxj7yvtdZnt8DsfpRL", + "type" : "claude_chat_viewed", + "claude_chat_id" : "claude_chat_01AxWT9aH4swoDJ8u6dShxMV" + } + tags: + - "source:LOGS_SOURCE" + timestamp: 1777997097150 diff --git a/anthropic_compliance_logs/assets/monitors/anthropic_compliance_logs_no_data.json b/anthropic_compliance_logs/assets/monitors/anthropic_compliance_logs_no_data.json deleted file mode 100644 index 54a3a7aa693e8..0000000000000 --- a/anthropic_compliance_logs/assets/monitors/anthropic_compliance_logs_no_data.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "version": 2, - "created_at": "2026-05-08", - "last_updated_at": "2026-05-08", - "title": "Compliance log ingestion has stopped", - "description": "Alerts when no Anthropic compliance log events are received within a recent window, indicating the crawler is broken, the Compliance API toggle was disabled, or the Admin API key lost compliance scope.", - "tags": [ - "integration:anthropic-compliance-logs" - ], - "definition": { - "id": 1, - "name": "[Anthropic] Compliance log ingestion has stopped", - "type": "log alert", - "query": "logs(\"source:anthropic-compliance-logs\").index(\"*\").rollup(\"count\").last(\"1h\") < 1", - "message": "{{#is_alert}}\n## What's happening?\n\nNo Anthropic compliance log events have been received in the last 1 hour. The Anthropic crawler normally polls every 5 minutes, so an hour of complete silence is a strong signal that compliance log ingestion has stopped.\n{{/is_alert}}\n\n{{#is_warning}}\n## What's happening?\n\nNo Anthropic compliance log events have been received in the last 30 minutes. The Anthropic crawler normally polls every 5 minutes, so this gap may indicate an early sign of an ingestion problem.\n{{/is_warning}}\n\n{{#is_recovery}}\n## Recovered\n\nAnthropic compliance log ingestion has resumed. Events tagged `source:anthropic-compliance-logs` are flowing again.\n{{/is_recovery}}\n\n{{^is_recovery}}\n\n---\n\n## Impact\n\nWhile compliance logs are not being ingested, your organization loses visibility into Anthropic Console activity (member changes, workspace and API key management, billing actions, and other audit events) — which can create gaps in security review, incident response, and regulatory evidence.\n\n---\n\n## Common causes\n\n* **Compliance API was disabled** — Someone toggled off the Compliance API in the Anthropic Organization settings under Data and privacy.\n* **Admin API key was rotated or lost scope** — The Admin API key configured in Datadog was rotated, revoked, or no longer carries the `read:compliance_activities` scope.\n* **Anthropic Compliance API outage** — An upstream incident on Anthropic's Compliance API is preventing the crawler from retrieving events.\n\n---\n\n## How to investigate\n\n* Open the [Log Explorer scoped to Anthropic compliance logs](/logs?query=source%3Aanthropic-compliance-logs) and confirm there is no recent activity.\n* Review the Anthropic Compliance Logs integration README for setup and troubleshooting steps.\n* In the Anthropic Console, go to **Settings -> Data and privacy** and confirm the Compliance API is enabled for the organization.\n* On the Datadog Anthropic Compliance Logs tile, verify the configured Admin API key is current.\n* Confirm the Admin API key still has the `read:compliance_activities` scope; rotate and re-enter the key in Datadog if necessary.\n* Check the [Anthropic status page](https://status.anthropic.com/) for any active Compliance API incidents.\n\n---\n\n## Related links\n\n* [Anthropic Compliance Logs integration documentation](https://docs.datadoghq.com/integrations/anthropic_compliance_logs/)\n* [Anthropic status page](https://status.anthropic.com/)\n{{/is_recovery}}", - "options": { - "thresholds": { - "critical": 1 - }, - "enable_logs_sample": true, - "notify_audit": false, - "require_full_window": false, - "notify_no_data": false, - "renotify_interval": 0, - "include_tags": true, - "on_missing_data": "default", - "avalanche_window": 10, - "groupby_simple_monitor": false, - "silenced": {} - }, - "priority": 3, - "restricted_roles": null - }, - "template_variables": [] -} diff --git a/anthropic_compliance_logs/assets/monitors/claude_compliance_logs_no_data.json b/anthropic_compliance_logs/assets/monitors/claude_compliance_logs_no_data.json new file mode 100644 index 0000000000000..1d0a1edbabd4c --- /dev/null +++ b/anthropic_compliance_logs/assets/monitors/claude_compliance_logs_no_data.json @@ -0,0 +1,35 @@ +{ + "version": 2, + "created_at": "2026-05-08", + "last_updated_at": "2026-05-08", + "title": "Compliance log ingestion has stopped", + "description": "Alerts when no Claude compliance log events are received within a recent window, indicating the crawler is broken, the Compliance API toggle was disabled, or the Admin API key lost compliance scope.", + "tags": [ + "integration:anthropic-compliance-logs" + ], + "definition": { + "id": 1, + "name": "[Claude] Compliance log ingestion has stopped", + "type": "log alert", + "query": "logs(\"source:claude-compliance-logs\").index(\"*\").rollup(\"count\").last(\"1h\") < 1", + "message": "{{#is_alert}}\n## What's happening?\n\nNo Claude compliance log events have been received in the last 1 hour. The crawler normally polls every 5 minutes, so an hour of complete silence is a strong signal that compliance log ingestion has stopped.\n{{/is_alert}}\n\n{{#is_warning}}\n## What's happening?\n\nNo Claude compliance log events have been received in the last 30 minutes. The crawler normally polls every 5 minutes, so this gap may indicate an early sign of an ingestion problem.\n{{/is_warning}}\n\n{{#is_recovery}}\n## Recovered\n\nClaude compliance log ingestion has resumed. Events tagged `source:claude-compliance-logs` are flowing again.\n{{/is_recovery}}\n\n{{^is_recovery}}\n\n---\n\n## Impact\n\nWhile compliance logs are not being ingested, your organization loses visibility into Anthropic Console activity (member changes, workspace and API key management, billing actions, and other audit events) — which can create gaps in security review, incident response, and regulatory evidence.\n\n---\n\n## Common causes\n\n* **Compliance API was disabled** — Someone toggled off the Compliance API in the Anthropic Organization settings under Data and privacy.\n* **Admin API key was rotated or lost scope** — The Admin API key configured in Datadog was rotated, revoked, or no longer carries the `read:compliance_activities` scope.\n* **Anthropic Compliance API outage** — An upstream incident on Anthropic's Compliance API is preventing the crawler from retrieving events.\n\n---\n\n## How to investigate\n\n* Open the [Log Explorer scoped to Claude compliance logs](/logs?query=source%3Aclaude-compliance-logs) and confirm there is no recent activity.\n* Review the Claude Compliance Logs integration README for setup and troubleshooting steps.\n* In the Anthropic Console, go to **Settings -> Data and privacy** and confirm the Compliance API is enabled for the organization.\n* On the Datadog Claude Compliance Logs tile, verify the configured Admin API key is current.\n* Confirm the Admin API key still has the `read:compliance_activities` scope; rotate and re-enter the key in Datadog if necessary.\n* Check the [Anthropic status page](https://status.anthropic.com/) for any active Compliance API incidents.\n\n---\n\n## Related links\n\n* [Claude Compliance Logs integration documentation](https://docs.datadoghq.com/integrations/claude_compliance_logs/)\n* [Anthropic status page](https://status.anthropic.com/)\n{{/is_recovery}}", + "options": { + "thresholds": { + "critical": 1 + }, + "enable_logs_sample": true, + "notify_audit": false, + "require_full_window": false, + "notify_no_data": false, + "renotify_interval": 0, + "include_tags": true, + "on_missing_data": "default", + "avalanche_window": 10, + "groupby_simple_monitor": false, + "silenced": {} + }, + "priority": 3, + "restricted_roles": null + }, + "template_variables": [] +} diff --git a/anthropic_compliance_logs/assets/saved_views/all_anthropic_compliance_logs.json b/anthropic_compliance_logs/assets/saved_views/all_claude_compliance_logs.json similarity index 88% rename from anthropic_compliance_logs/assets/saved_views/all_anthropic_compliance_logs.json rename to anthropic_compliance_logs/assets/saved_views/all_claude_compliance_logs.json index aef8181d5897e..749b40ecfa69e 100644 --- a/anthropic_compliance_logs/assets/saved_views/all_anthropic_compliance_logs.json +++ b/anthropic_compliance_logs/assets/saved_views/all_claude_compliance_logs.json @@ -1,8 +1,8 @@ { - "name": "All Anthropic Compliance Logs", + "name": "All Claude Compliance Logs", "type": "logs", "page": "stream", - "query": "source:anthropic-compliance-logs", + "query": "source:claude-compliance-logs", "timerange": { "interval_ms": 86400000 }, diff --git a/anthropic_compliance_logs/assets/saved_views/anthropic_admin_activity.json b/anthropic_compliance_logs/assets/saved_views/claude_admin_activity.json similarity index 83% rename from anthropic_compliance_logs/assets/saved_views/anthropic_admin_activity.json rename to anthropic_compliance_logs/assets/saved_views/claude_admin_activity.json index 5fd66831f48a3..c3e872d4e4713 100644 --- a/anthropic_compliance_logs/assets/saved_views/anthropic_admin_activity.json +++ b/anthropic_compliance_logs/assets/saved_views/claude_admin_activity.json @@ -1,8 +1,8 @@ { - "name": "Anthropic Admin Activity", + "name": "Claude Admin Activity", "type": "logs", "page": "stream", - "query": "source:anthropic-compliance-logs @actor.type:admin_api_key_actor", + "query": "source:claude-compliance-logs @actor.type:admin_api_key_actor", "timerange": { "interval_ms": 86400000 }, diff --git a/anthropic_compliance_logs/assets/saved_views/anthropic_api_key_lifecycle.json b/anthropic_compliance_logs/assets/saved_views/claude_api_key_lifecycle.json similarity index 77% rename from anthropic_compliance_logs/assets/saved_views/anthropic_api_key_lifecycle.json rename to anthropic_compliance_logs/assets/saved_views/claude_api_key_lifecycle.json index 7412a29f19e24..e005dcc690825 100644 --- a/anthropic_compliance_logs/assets/saved_views/anthropic_api_key_lifecycle.json +++ b/anthropic_compliance_logs/assets/saved_views/claude_api_key_lifecycle.json @@ -1,8 +1,8 @@ { - "name": "Anthropic API Key Lifecycle", + "name": "Claude API Key Lifecycle", "type": "logs", "page": "stream", - "query": "source:anthropic-compliance-logs @evt.name:(*api_key_created OR *api_key_deleted OR *api_key_updated OR *api_key_rotated)", + "query": "source:claude-compliance-logs @evt.name:(*api_key_created OR *api_key_deleted OR *api_key_updated OR *api_key_rotated)", "timerange": { "interval_ms": 86400000 }, diff --git a/anthropic_compliance_logs/assets/saved_views/anthropic_auth_events.json b/anthropic_compliance_logs/assets/saved_views/claude_auth_events.json similarity index 76% rename from anthropic_compliance_logs/assets/saved_views/anthropic_auth_events.json rename to anthropic_compliance_logs/assets/saved_views/claude_auth_events.json index b992d023e95b2..751e3d7f15e2f 100644 --- a/anthropic_compliance_logs/assets/saved_views/anthropic_auth_events.json +++ b/anthropic_compliance_logs/assets/saved_views/claude_auth_events.json @@ -1,8 +1,8 @@ { - "name": "Anthropic Auth Events", + "name": "Claude Auth Events", "type": "logs", "page": "stream", - "query": "source:anthropic-compliance-logs @evt.name:(user_signed_in_sso OR user_signed_in_google OR user_signed_in_apple OR user_signed_out OR user_signed_in_*)", + "query": "source:claude-compliance-logs @evt.name:(user_signed_in_sso OR user_signed_in_google OR user_signed_in_apple OR user_signed_out OR user_signed_in_*)", "timerange": { "interval_ms": 86400000 }, diff --git a/anthropic_compliance_logs/assets/saved_views/anthropic_org_membership_changes.json b/anthropic_compliance_logs/assets/saved_views/claude_org_membership_changes.json similarity index 72% rename from anthropic_compliance_logs/assets/saved_views/anthropic_org_membership_changes.json rename to anthropic_compliance_logs/assets/saved_views/claude_org_membership_changes.json index 74237dcdd2a9d..a7482b1ae8f0b 100644 --- a/anthropic_compliance_logs/assets/saved_views/anthropic_org_membership_changes.json +++ b/anthropic_compliance_logs/assets/saved_views/claude_org_membership_changes.json @@ -1,8 +1,8 @@ { - "name": "Anthropic Org Membership Changes", + "name": "Claude Org Membership Changes", "type": "logs", "page": "stream", - "query": "source:anthropic-compliance-logs @evt.name:(org_user_invite_sent OR org_user_invite_accepted OR org_user_invite_revoked OR org_user_role_changed OR org_user_removed)", + "query": "source:claude-compliance-logs @evt.name:(org_user_invite_sent OR org_user_invite_accepted OR org_user_invite_revoked OR org_user_role_changed OR org_user_removed)", "timerange": { "interval_ms": 86400000 }, diff --git a/anthropic_compliance_logs/manifest.json b/anthropic_compliance_logs/manifest.json index 82f9170d62643..5a939fe542252 100644 --- a/anthropic_compliance_logs/manifest.json +++ b/anthropic_compliance_logs/manifest.json @@ -9,8 +9,8 @@ "configuration": "README.md#Setup", "support": "README.md#Troubleshooting", "changelog": "CHANGELOG.md", - "description": "Collect compliance logs from Anthropic for security monitoring and SIEM use cases.", - "title": "Anthropic Compliance", + "description": "Collect compliance logs from Claude for security monitoring and SIEM use cases.", + "title": "Claude Compliance Logs", "media": [], "classifier_tags": [ "Category::AI/ML", @@ -36,17 +36,17 @@ } }, "dashboards": { - "Anthropic Compliance Logs Overview": "assets/dashboards/anthropic_compliance_logs_overview.json" + "Claude Compliance Logs Overview": "assets/dashboards/claude_compliance_logs_overview.json" }, "monitors": { - "Anthropic Compliance Log Ingestion Has Stopped": "assets/monitors/anthropic_compliance_logs_no_data.json" + "Claude Compliance Log Ingestion Has Stopped": "assets/monitors/claude_compliance_logs_no_data.json" }, "saved_views": { - "All Anthropic Compliance Logs": "assets/saved_views/all_anthropic_compliance_logs.json", - "Anthropic Auth Events": "assets/saved_views/anthropic_auth_events.json", - "Anthropic API Key Lifecycle": "assets/saved_views/anthropic_api_key_lifecycle.json", - "Anthropic Admin Activity": "assets/saved_views/anthropic_admin_activity.json", - "Anthropic Org Membership Changes": "assets/saved_views/anthropic_org_membership_changes.json" + "All Claude Compliance Logs": "assets/saved_views/all_claude_compliance_logs.json", + "Claude Auth Events": "assets/saved_views/claude_auth_events.json", + "Claude API Key Lifecycle": "assets/saved_views/claude_api_key_lifecycle.json", + "Claude Admin Activity": "assets/saved_views/claude_admin_activity.json", + "Claude Org Membership Changes": "assets/saved_views/claude_org_membership_changes.json" } }, "author": { diff --git a/clickhouse/assets/configuration/spec.yaml b/clickhouse/assets/configuration/spec.yaml index f2aa3c5733635..5842be7ef5c0c 100644 --- a/clickhouse/assets/configuration/spec.yaml +++ b/clickhouse/assets/configuration/spec.yaml @@ -20,6 +20,13 @@ files: description: The hostname used to connect to the system. value: type: string + - name: reported_hostname + description: | + Set the reported hostname for this instance. Overrides the default hostname resolution, + which uses the `server` value. Useful when the agent connects via localhost or 127.0.0.1 + (e.g., co-located with ClickHouse in the same pod) to avoid reporting a non-unique hostname. + value: + type: string - name: port description: | The port used to connect to the system. diff --git a/clickhouse/changelog.d/23756.fixed b/clickhouse/changelog.d/23756.fixed new file mode 100644 index 0000000000000..34caac52bcc54 --- /dev/null +++ b/clickhouse/changelog.d/23756.fixed @@ -0,0 +1 @@ +Fix ClickHouse check to honor the reported_hostname config option and fall back to the agent hostname when connecting via localhost or 127.0.0.1. diff --git a/clickhouse/datadog_checks/clickhouse/clickhouse.py b/clickhouse/datadog_checks/clickhouse/clickhouse.py index bf3c3bd16964a..e25a7992aed90 100644 --- a/clickhouse/datadog_checks/clickhouse/clickhouse.py +++ b/clickhouse/datadog_checks/clickhouse/clickhouse.py @@ -10,7 +10,7 @@ from datadog_checks.base import AgentCheck from datadog_checks.base.checks.db import DatabaseCheck from datadog_checks.base.utils.db import QueryManager -from datadog_checks.base.utils.db.utils import TagManager, default_json_event_encoding +from datadog_checks.base.utils.db.utils import TagManager, default_json_event_encoding, resolve_db_host from datadog_checks.base.utils.serialization import json from . import advanced_queries, queries, utils @@ -323,11 +323,11 @@ def _get_debug_tags(self): @property def reported_hostname(self) -> str | None: - """ - Get the hostname to be reported in metrics and events. - """ if self._resolved_hostname is None: - self._resolved_hostname = self._config.server + if self._config.reported_hostname: + self._resolved_hostname = self._config.reported_hostname + else: + self._resolved_hostname = resolve_db_host(self._config.server) return self._resolved_hostname @property diff --git a/clickhouse/datadog_checks/clickhouse/config_models/instance.py b/clickhouse/datadog_checks/clickhouse/config_models/instance.py index 25894c8d49055..4bec26f4cd289 100644 --- a/clickhouse/datadog_checks/clickhouse/config_models/instance.py +++ b/clickhouse/datadog_checks/clickhouse/config_models/instance.py @@ -147,6 +147,7 @@ class InstanceConfig(BaseModel): query_metrics: Optional[QueryMetrics] = None query_samples: Optional[QuerySamples] = None read_timeout: Optional[int] = None + reported_hostname: Optional[str] = None server: str service: Optional[str] = None single_endpoint_mode: Optional[bool] = None diff --git a/clickhouse/datadog_checks/clickhouse/data/conf.yaml.example b/clickhouse/datadog_checks/clickhouse/data/conf.yaml.example index 6984b8f0283dc..279e5d96ec433 100644 --- a/clickhouse/datadog_checks/clickhouse/data/conf.yaml.example +++ b/clickhouse/datadog_checks/clickhouse/data/conf.yaml.example @@ -29,6 +29,13 @@ instances: # - server: + ## @param reported_hostname - string - optional + ## Set the reported hostname for this instance. Overrides the default hostname resolution, + ## which uses the `server` value. Useful when the agent connects via localhost or 127.0.0.1 + ## (e.g., co-located with ClickHouse in the same pod) to avoid reporting a non-unique hostname. + # + # reported_hostname: + ## @param port - integer - optional - default: 8123 ## The port used to connect to the system. ## This integration uses the HTTP interface, so the default is 8123 (HTTP port). diff --git a/clickhouse/tests/test_clickhouse.py b/clickhouse/tests/test_clickhouse.py index ba211455cbe13..dde487919801c 100644 --- a/clickhouse/tests/test_clickhouse.py +++ b/clickhouse/tests/test_clickhouse.py @@ -18,7 +18,7 @@ def test_check(aggregator, instance, dd_run_check): server_tag = 'server:{}'.format(instance['server']) port_tag = 'port:{}'.format(instance['port']) metrics = common.get_metrics(CLICKHOUSE_VERSION) - db_hostname_tag = 'database_hostname:{}'.format(instance['server']) + db_hostname_tag = 'database_hostname:{}'.format(check.reported_hostname) db_instance_tag = 'database_instance:{}:{}:default'.format(instance['server'], instance['port']) for metric in metrics: @@ -55,7 +55,7 @@ def test_custom_queries(aggregator, instance, dd_run_check): 'db:default', 'foo:bar', 'test:clickhouse', - 'database_hostname:{}'.format(instance['server']), + 'database_hostname:{}'.format(check.reported_hostname), 'database_instance:{}:{}:default'.format(instance['server'], instance['port']), ], ) diff --git a/clickhouse/tests/test_config_defaults.py b/clickhouse/tests/test_config_defaults.py index 5d28994bf2999..40929dd30e726 100644 --- a/clickhouse/tests/test_config_defaults.py +++ b/clickhouse/tests/test_config_defaults.py @@ -23,6 +23,7 @@ 'password': '', 'connect_timeout': 10, 'read_timeout': 10, + 'reported_hostname': None, 'compression': None, 'tls_verify': False, 'tls_ca_cert': None, diff --git a/clickhouse/tests/test_dbm_integration.py b/clickhouse/tests/test_dbm_integration.py index c5cf785e9a832..dd27d4ae8e1f9 100644 --- a/clickhouse/tests/test_dbm_integration.py +++ b/clickhouse/tests/test_dbm_integration.py @@ -264,8 +264,8 @@ def test_dbm_properties(instance): check = ClickhouseCheck('clickhouse', {}, [instance_config]) assert check.reported_hostname is not None + assert check.reported_hostname != '' assert check.database_identifier is not None - assert check._config.server in check.reported_hostname assert str(check._config.port) in check.database_identifier diff --git a/clickhouse/tests/test_e2e.py b/clickhouse/tests/test_e2e.py index 75051c154a787..e6780f1c90cbb 100644 --- a/clickhouse/tests/test_e2e.py +++ b/clickhouse/tests/test_e2e.py @@ -14,13 +14,14 @@ def test_check(dd_agent_check, instance): aggregator = dd_agent_check(instance, rate=True) server_tag = 'server:{}'.format(instance['server']) port_tag = 'port:{}'.format(instance['port']) - db_hostname_tag = 'database_hostname:{}'.format(instance['server']) db_instance_tag = 'database_instance:{}:{}:default'.format(instance['server'], instance['port']) for metric in common.get_metrics(CLICKHOUSE_VERSION): aggregator.assert_metric_has_tags( - metric, [port_tag, server_tag, 'db:default', 'foo:bar', db_hostname_tag, db_instance_tag], at_least=1 + metric, [port_tag, server_tag, 'db:default', 'foo:bar', db_instance_tag], at_least=1 ) + # database_hostname is the resolved agent hostname; exact value varies by environment + aggregator.assert_metric_has_tag_prefix(metric, 'database_hostname', at_least=1) for metric in common.get_optional_metrics(CLICKHOUSE_VERSION): aggregator.assert_metric(metric, at_least=0) diff --git a/clickhouse/tests/test_unit.py b/clickhouse/tests/test_unit.py index 8a3789732e0c8..f92811c040fb9 100644 --- a/clickhouse/tests/test_unit.py +++ b/clickhouse/tests/test_unit.py @@ -327,3 +327,29 @@ def test_query_completions_zero_samples_per_hour_defaults(bad_value): check = ClickhouseCheck('clickhouse', {}, [instance]) assert check._config.query_completions.samples_per_hour_per_query > 0 assert any('query_completions.samples_per_hour_per_query' in w for w in check._validation_result.warnings) + + +BASE_INSTANCE = {'server': 'myhost.example.com', 'port': 8123, 'username': 'default'} + + +def test_reported_hostname_explicit_config(): + instance = {**BASE_INSTANCE, 'reported_hostname': 'custom-host'} + check = ClickhouseCheck('clickhouse', {}, [instance]) + assert check.reported_hostname == 'custom-host' + + +@pytest.mark.parametrize('loopback', ['localhost', '127.0.0.1']) +def test_reported_hostname_loopback_substitutes_agent_hostname(loopback): + instance = {**BASE_INSTANCE, 'server': loopback} + with mock.patch('datadog_checks.clickhouse.clickhouse.resolve_db_host', return_value='my-agent-host'): + check = ClickhouseCheck('clickhouse', {}, [instance]) + assert check.reported_hostname == 'my-agent-host' + + +def test_reported_hostname_non_loopback(): + with mock.patch( + 'datadog_checks.clickhouse.clickhouse.resolve_db_host', return_value=BASE_INSTANCE['server'] + ) as mock_resolve: + check = ClickhouseCheck('clickhouse', {}, [BASE_INSTANCE]) + assert check.reported_hostname == BASE_INSTANCE['server'] + mock_resolve.assert_called_once_with(BASE_INSTANCE['server']) diff --git a/datadog_checks_base/changelog.d/23767.security b/datadog_checks_base/changelog.d/23767.security new file mode 100644 index 0000000000000..d28d5a0302e88 --- /dev/null +++ b/datadog_checks_base/changelog.d/23767.security @@ -0,0 +1 @@ +Bump urllib3 to 2.7.0 to address CVE-2026-44431 and CVE-2026-44432. diff --git a/datadog_checks_base/pyproject.toml b/datadog_checks_base/pyproject.toml index 6e3e531f991ed..d52b26f0a731a 100644 --- a/datadog_checks_base/pyproject.toml +++ b/datadog_checks_base/pyproject.toml @@ -50,7 +50,7 @@ deps = [ "requests-unixsocket2==1.0.1", "requests==2.33.0", "simplejson==3.20.2", - "urllib3==2.6.3", + "urllib3==2.7.0", "wrapt==2.1.2", ] http = [ diff --git a/ddev/changelog.d/23654.added b/ddev/changelog.d/23654.added new file mode 100644 index 0000000000000..dd8fd92b45e5f --- /dev/null +++ b/ddev/changelog.d/23654.added @@ -0,0 +1 @@ +Add Application.annotate_error/annotate_warning/annotate_display_queue helpers that emit GitHub Actions workflow annotations on CI. diff --git a/ddev/changelog.d/23748.added b/ddev/changelog.d/23748.added new file mode 100644 index 0000000000000..94f4acc0d09f3 --- /dev/null +++ b/ddev/changelog.d/23748.added @@ -0,0 +1 @@ +Add a `validate qa-label` check that fails CI unless the pull request carries exactly one of the `qa/required` or `qa/skip-qa` labels. diff --git a/ddev/src/ddev/cli/application.py b/ddev/src/ddev/cli/application.py index 2dd56f4efc332..e7610b593fcbd 100644 --- a/ddev/src/ddev/cli/application.py +++ b/ddev/src/ddev/cli/application.py @@ -5,6 +5,8 @@ import logging import os +from collections import defaultdict +from collections.abc import Iterable from functools import cached_property from typing import TYPE_CHECKING, cast @@ -12,6 +14,7 @@ from ddev.config.constants import AppEnvVars, ConfigEnvVars, VerbosityLevels from ddev.config.file import ConfigFileWithOverrides, RootConfig from ddev.repo.core import Repository +from ddev.utils.ci import AnnotationLevel, escape_workflow_data, escape_workflow_property, running_in_ci from ddev.utils.fs import Path from ddev.utils.github import GitHubManager from ddev.utils.platform import Platform @@ -113,6 +116,38 @@ def abort(self, text: str = '', code: int = 1, **kwargs: Any) -> NoReturn: self.display_error(text, **kwargs) self.__exit_func(code) + def annotate_error(self, file: str, message: str, line: int = 1) -> None: + """Emit a GitHub Actions ``error`` workflow annotation; no-op outside CI.""" + self._emit_github_annotation(AnnotationLevel.ERROR, file, message, line) + + def annotate_warning(self, file: str, message: str, line: int = 1) -> None: + """Emit a GitHub Actions ``warning`` workflow annotation; no-op outside CI.""" + self._emit_github_annotation(AnnotationLevel.WARNING, file, message, line) + + def annotate_display_queue( + self, file: str, display_queue: Iterable[tuple[AnnotationLevel, str]], line: int = 1 + ) -> None: + """Emit one annotation per level from a queue of ``(level, message)`` tuples. + + Messages at the same level are joined with a newline so they render as a single + multi-line annotation (``escape_workflow_data`` rewrites it to ``%0A``). + """ + grouped: defaultdict[AnnotationLevel, list[str]] = defaultdict(list) + for level, message in display_queue: + grouped[level].append(message) + + for level in AnnotationLevel: + if messages := grouped.get(level): + self._emit_github_annotation(level, file, '\n'.join(messages), line) + + def _emit_github_annotation(self, level: AnnotationLevel, file: str, message: str, line: int) -> None: + if not running_in_ci(): + return + # `print` avoids shell injection; escapers match @actions/core's escapeData/escapeProperty - do not remove. + escaped_file = escape_workflow_property(file) + escaped_message = escape_workflow_data(message) + print(f'::{level} file={escaped_file},line={line}::{escaped_message}') + # TODO: remove everything below when the old CLI is gone def initialize_old_cli(self): from copy import deepcopy diff --git a/ddev/src/ddev/cli/validate/__init__.py b/ddev/src/ddev/cli/validate/__init__.py index 8a40846b3585b..caf661ad3f965 100644 --- a/ddev/src/ddev/cli/validate/__init__.py +++ b/ddev/src/ddev/cli/validate/__init__.py @@ -27,6 +27,7 @@ from ddev.cli.validate.licenses import licenses from ddev.cli.validate.metadata import metadata from ddev.cli.validate.openmetrics import openmetrics +from ddev.cli.validate.qa_label import qa_label from ddev.cli.validate.version import version @@ -57,6 +58,7 @@ def validate(): validate.add_command(models) validate.add_command(openmetrics) validate.add_command(package) +validate.add_command(qa_label) validate.add_command(readmes) validate.add_command(saved_views) validate.add_command(service_checks) diff --git a/ddev/src/ddev/cli/validate/all/github.py b/ddev/src/ddev/cli/validate/all/github.py index 15f70aeade560..49a4c3c7cc4f1 100644 --- a/ddev/src/ddev/cli/validate/all/github.py +++ b/ddev/src/ddev/cli/validate/all/github.py @@ -8,7 +8,9 @@ import os from typing import TYPE_CHECKING -from ddev.utils.fs import Path +from pydantic import ValidationError + +from ddev.utils.github_actions import PullRequestEvent if TYPE_CHECKING: from ddev.cli.application import Application @@ -20,18 +22,10 @@ def parse_pr_number_from_event(event_path: str) -> int | None: """Extract the PR number from the GitHub Actions event JSON file.""" try: - event = json.loads(Path(event_path).read_text()) - except (json.JSONDecodeError, OSError): + return PullRequestEvent.load(event_path).pr_number + except (OSError, json.JSONDecodeError, ValueError, ValidationError): return None - pr = event.get("pull_request") - if isinstance(pr, dict): - number = pr.get("number") - if isinstance(number, int): - return number - - return None - def parse_pr_number_from_ref(ref: str) -> int | None: """Extract the PR number from a GITHUB_REF like refs/pull/123/merge.""" diff --git a/ddev/src/ddev/cli/validate/all/orchestrator.py b/ddev/src/ddev/cli/validate/all/orchestrator.py index ace5fe9960b3f..ba654708402cc 100644 --- a/ddev/src/ddev/cli/validate/all/orchestrator.py +++ b/ddev/src/ddev/cli/validate/all/orchestrator.py @@ -104,6 +104,10 @@ class ValidationConfig: "package": ValidationConfig( description="Validate Python package metadata and naming", ), + "qa-label": ValidationConfig( + description="Validate the pull request declares a QA decision label", + repo_wide=True, + ), "readmes": ValidationConfig( description="Validate README files have required sections", ), diff --git a/ddev/src/ddev/cli/validate/qa_label.py b/ddev/src/ddev/cli/validate/qa_label.py new file mode 100644 index 0000000000000..aa958bd2a53ca --- /dev/null +++ b/ddev/src/ddev/cli/validate/qa_label.py @@ -0,0 +1,84 @@ +# (C) Datadog, Inc. 2026-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +from __future__ import annotations + +import json +import os +from typing import TYPE_CHECKING + +import click +from pydantic import ValidationError + +from ddev.utils.github_actions import PullRequestEvent + +if TYPE_CHECKING: + from ddev.cli.application import Application + + +REQUIRED_LABELS: frozenset[str] = frozenset({'qa/skip-qa', 'qa/required'}) + +HELP_MESSAGE = ( + "Every pull request must declare its QA expectation by setting exactly one of:\n" + " - 'qa/required' if this PR ships changes that need to be validated during QA.\n" + " - 'qa/skip-qa' if this PR does not need QA validation (e.g., docs, tests, " + "developer tooling, or no agent-impacting changes).\n" +) + + +def _is_fork_pr(app: Application, event: PullRequestEvent) -> bool: + head_repo = event.head_repo + base_repo = os.environ.get('GITHUB_REPOSITORY') or event.base_repo + if not head_repo or not base_repo: + app.abort('pull_request event payload is missing head/base repo information.') + return head_repo != base_repo + + +@click.command(short_help='Validate the QA decision label on the current pull request') +@click.pass_obj +def qa_label(app: Application): + """Fail unless the current pull request has exactly one QA decision label. + + Skipped outside of pull_request events and on PRs from forks (the workflow + has no token to read labels there). + """ + if os.environ.get('GITHUB_EVENT_NAME') != 'pull_request': + app.display_info('Not running in a pull_request context; skipping qa-label validation.') + return + + event_path = os.environ.get('GITHUB_EVENT_PATH') + if not event_path: + app.display_info('GITHUB_EVENT_PATH is not set; skipping qa-label validation.') + return + + try: + event = PullRequestEvent.load(event_path) + except (OSError, json.JSONDecodeError, ValueError, ValidationError) as exc: + app.abort(f'Could not read GitHub event payload: {exc}') + + if _is_fork_pr(app, event): + app.display_info('Pull request is from a fork; skipping qa-label validation.') + return + + pr_number = event.pr_number + if pr_number is None: + app.display_warning('Could not determine pull request number; skipping qa-label validation.') + return + + labels = app.github.get_pull_request_labels(pr_number) + if labels is None: + app.abort(f'Could not fetch pull request #{pr_number} to read its labels.') + + qa_labels = sorted(set(labels) & REQUIRED_LABELS) + + if len(qa_labels) == 1: + app.display_success(f'QA label set: {qa_labels[0]}') + return + + if not qa_labels: + app.display_error(f'No QA decision label set on PR #{pr_number}.') + else: + app.display_error(f'PR #{pr_number} has more than one QA decision label: {", ".join(qa_labels)}.') + + app.display_info(HELP_MESSAGE) + app.abort() diff --git a/ddev/src/ddev/utils/ci.py b/ddev/src/ddev/utils/ci.py index e7f0a543c2344..59fc298aec572 100644 --- a/ddev/src/ddev/utils/ci.py +++ b/ddev/src/ddev/utils/ci.py @@ -2,6 +2,14 @@ # All rights reserved # Licensed under a 3-clause BSD style license (see LICENSE) import os +from enum import StrEnum + + +class AnnotationLevel(StrEnum): + """Severity levels supported by GitHub Actions workflow-command annotations.""" + + ERROR = 'error' + WARNING = 'warning' def running_in_ci(): @@ -10,3 +18,21 @@ def running_in_ci(): return True return False + + +def escape_workflow_data(value: str) -> str: + """Escape a value for the ``message`` portion of a workflow command. + + Mirrors ``escapeData`` from ``@actions/core``: + https://github.com/actions/toolkit/blob/main/packages/core/src/command.ts + """ + return value.replace('%', '%25').replace('\r', '%0D').replace('\n', '%0A') + + +def escape_workflow_property(value: str) -> str: + """Escape a value for a workflow-command property (``file=...``, ``line=...``). + + Mirrors ``escapeProperty`` from ``@actions/core``: same as ``escape_workflow_data`` + plus ``:`` and ``,`` so they don't terminate the property or the property list. + """ + return escape_workflow_data(value).replace(':', '%3A').replace(',', '%2C') diff --git a/ddev/src/ddev/utils/github.py b/ddev/src/ddev/utils/github.py index e258cabc0bb4e..ef314fb7d9fe7 100644 --- a/ddev/src/ddev/utils/github.py +++ b/ddev/src/ddev/utils/github.py @@ -207,6 +207,16 @@ def get_pr_head(self, pr_number: int) -> tuple[str, str]: data = response.json() return data['head']['sha'], data['head']['ref'] + def get_pull_request_labels(self, pr_number: int) -> list[str] | None: + """Return the label names on the given PR, or None if it could not be fetched.""" + from httpx import HTTPStatusError + + try: + response = self.__api_get(self.PULL_REQUEST_API.format(repo_id=self.repo_id, pr_number=pr_number)) + except HTTPStatusError: + return None + return [label['name'] for label in response.json().get('labels', [])] + def dispatch_workflow(self, workflow_id: str, ref: str, inputs: dict[str, Any]) -> None: """Trigger a workflow_dispatch event.""" self.__api_post( diff --git a/ddev/src/ddev/utils/github_actions.py b/ddev/src/ddev/utils/github_actions.py new file mode 100644 index 0000000000000..7656817db57fa --- /dev/null +++ b/ddev/src/ddev/utils/github_actions.py @@ -0,0 +1,72 @@ +# (C) Datadog, Inc. 2026-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +"""Utilities for code running inside GitHub Actions workflows.""" + +from __future__ import annotations + +import json + +from pydantic import BaseModel, ConfigDict + + +class Repo(BaseModel): + model_config = ConfigDict(extra='ignore') + + full_name: str | None = None + + +class PullRequestRef(BaseModel): + model_config = ConfigDict(extra='ignore') + + repo: Repo | None = None + + +class EventPullRequest(BaseModel): + model_config = ConfigDict(extra='ignore', strict=True) + + number: int | None = None + head: PullRequestRef | None = None + base: PullRequestRef | None = None + + +class PullRequestEvent(BaseModel): + """Subset of a GitHub Actions ``pull_request`` event payload.""" + + model_config = ConfigDict(extra='ignore') + + pull_request: EventPullRequest | None = None + + @classmethod + def load(cls, path: str) -> PullRequestEvent: + """Read and parse the event JSON file. + + Raises `OSError` if the file cannot be read, `json.JSONDecodeError` + if the contents are not valid JSON, and `ValueError` if the parsed + document is not a JSON object. + """ + with open(path, encoding='utf-8') as f: + data = json.load(f) + if not isinstance(data, dict): + raise ValueError(f'GitHub event payload at {path} is not a JSON object.') + return cls.model_validate(data) + + @property + def is_pull_request(self) -> bool: + return self.pull_request is not None + + @property + def pr_number(self) -> int | None: + return self.pull_request.number if self.pull_request else None + + @property + def head_repo(self) -> str | None: + if self.pull_request and self.pull_request.head and self.pull_request.head.repo: + return self.pull_request.head.repo.full_name + return None + + @property + def base_repo(self) -> str | None: + if self.pull_request and self.pull_request.base and self.pull_request.base.repo: + return self.pull_request.base.repo.full_name + return None diff --git a/ddev/tests/cli/test_application.py b/ddev/tests/cli/test_application.py new file mode 100644 index 0000000000000..32843eec63608 --- /dev/null +++ b/ddev/tests/cli/test_application.py @@ -0,0 +1,192 @@ +# (C) Datadog, Inc. 2026-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +from __future__ import annotations + +import pytest + +from ddev.utils.ci import AnnotationLevel, escape_workflow_data, escape_workflow_property + + +@pytest.fixture +def on_ci(monkeypatch): + monkeypatch.setenv('GITHUB_ACTIONS', 'true') + monkeypatch.delenv('CI', raising=False) + + +@pytest.fixture +def off_ci(monkeypatch): + monkeypatch.delenv('GITHUB_ACTIONS', raising=False) + monkeypatch.delenv('CI', raising=False) + + +@pytest.mark.parametrize( + 'method, expected_level', + [ + ('annotate_error', AnnotationLevel.ERROR), + ('annotate_warning', AnnotationLevel.WARNING), + ], +) +def test_annotate_emits_workflow_command_on_ci(app, capsys, on_ci, method, expected_level): + getattr(app, method)('path/to/file.py', 'boom') + + captured = capsys.readouterr() + assert captured.out == f'::{expected_level} file=path/to/file.py,line=1::boom\n' + assert captured.err == '' + + +@pytest.mark.parametrize('method', ['annotate_error', 'annotate_warning']) +def test_annotate_is_noop_outside_ci(app, capsys, off_ci, method): + getattr(app, method)('path/to/file.py', 'boom') + + captured = capsys.readouterr() + assert captured.out == '' + assert captured.err == '' + + +def test_annotate_uses_custom_line(app, capsys, on_ci): + app.annotate_error('file.py', 'msg', line=42) + + assert capsys.readouterr().out == '::error file=file.py,line=42::msg\n' + + +def test_annotate_preserves_special_characters(app, capsys, on_ci): + app.annotate_warning('a file.py', "shell-unsafe ' \" $(echo)") + + assert capsys.readouterr().out == "::warning file=a file.py,line=1::shell-unsafe ' \" $(echo)\n" + + +def test_annotation_level_is_str(): + """`AnnotationLevel` is a `StrEnum`; f-string interpolation yields the raw value.""" + assert AnnotationLevel.ERROR == 'error' + assert AnnotationLevel.WARNING == 'warning' + assert f'{AnnotationLevel.ERROR}' == 'error' + + +def test_annotate_display_queue_groups_levels(app, capsys, on_ci): + queue = [ + (AnnotationLevel.ERROR, 'first error'), + (AnnotationLevel.WARNING, 'first warning'), + (AnnotationLevel.ERROR, 'second error'), + (AnnotationLevel.WARNING, 'second warning'), + ] + app.annotate_display_queue('file.py', queue) + + out = capsys.readouterr().out + assert out == ( + '::error file=file.py,line=1::first error%0Asecond error\n' + '::warning file=file.py,line=1::first warning%0Asecond warning\n' + ) + + +def test_annotate_display_queue_emits_only_present_levels(app, capsys, on_ci): + queue = [(AnnotationLevel.ERROR, 'just an error')] + app.annotate_display_queue('file.py', queue) + + assert capsys.readouterr().out == '::error file=file.py,line=1::just an error\n' + + +def test_annotate_display_queue_is_noop_outside_ci(app, capsys, off_ci): + queue = [(AnnotationLevel.ERROR, 'err'), (AnnotationLevel.WARNING, 'warn')] + app.annotate_display_queue('file.py', queue) + + captured = capsys.readouterr() + assert captured.out == '' + assert captured.err == '' + + +def test_annotate_display_queue_empty_emits_nothing(app, capsys, on_ci): + app.annotate_display_queue('file.py', []) + + assert capsys.readouterr().out == '' + + +def test_annotate_display_queue_skips_unknown_levels(app, capsys, on_ci): + """Levels not declared on ``AnnotationLevel`` are silently dropped from the queue.""" + queue = [('notice', 'ignored'), (AnnotationLevel.ERROR, 'kept')] + app.annotate_display_queue('file.py', queue) + + assert capsys.readouterr().out == '::error file=file.py,line=1::kept\n' + + +def test_annotate_display_queue_orders_errors_before_warnings(app, capsys, on_ci): + """Output order follows `AnnotationLevel` declaration order regardless of input order.""" + queue = [ + (AnnotationLevel.WARNING, 'w1'), + (AnnotationLevel.ERROR, 'e1'), + (AnnotationLevel.WARNING, 'w2'), + ] + app.annotate_display_queue('file.py', queue) + + out = capsys.readouterr().out + assert out == '::error file=file.py,line=1::e1\n::warning file=file.py,line=1::w1%0Aw2\n' + + +@pytest.mark.parametrize( + 'raw, expected', + [ + ('plain ascii', 'plain ascii'), + ('100%', '100%25'), + ('line1\nline2', 'line1%0Aline2'), + ('line1\r\nline2', 'line1%0D%0Aline2'), + ('mix % \n and \r', 'mix %25 %0A and %0D'), + ('keeps : and , intact', 'keeps : and , intact'), + ], +) +def test_escape_workflow_data(raw, expected): + assert escape_workflow_data(raw) == expected + + +@pytest.mark.parametrize( + 'raw, expected', + [ + ('plain ascii', 'plain ascii'), + ('a,b:c', 'a%2Cb%3Ac'), + ('100%,end', '100%25%2Cend'), + ('line1\nline2', 'line1%0Aline2'), + ('C:\\path,with,commas', 'C%3A\\path%2Cwith%2Ccommas'), + ], +) +def test_escape_workflow_property(raw, expected): + assert escape_workflow_property(raw) == expected + + +def test_annotate_escapes_newlines_in_message(app, capsys, on_ci): + app.annotate_error('file.py', 'line one\nline two\nline three') + + assert capsys.readouterr().out == '::error file=file.py,line=1::line one%0Aline two%0Aline three\n' + + +def test_annotate_escapes_percent_in_message(app, capsys, on_ci): + app.annotate_warning('file.py', '100% broken') + + assert capsys.readouterr().out == '::warning file=file.py,line=1::100%25 broken\n' + + +def test_annotate_escapes_property_separators_in_file(app, capsys, on_ci): + app.annotate_error('weird,path:with,separators.py', 'msg') + + out = capsys.readouterr().out + assert out == '::error file=weird%2Cpath%3Awith%2Cseparators.py,line=1::msg\n' + + +def test_annotate_display_queue_joins_with_real_newline_escaped(app, capsys, on_ci): + """The join uses ``\\n`` so the escaper emits ``%0A`` cleanly (no double-encoding).""" + queue = [ + (AnnotationLevel.ERROR, 'first'), + (AnnotationLevel.ERROR, 'second'), + ] + app.annotate_display_queue('file.py', queue) + + assert capsys.readouterr().out == '::error file=file.py,line=1::first%0Asecond\n' + + +def test_annotate_display_queue_preserves_literal_percent_in_messages(app, capsys, on_ci): + """Per-message ``%`` is escaped to ``%25`` (not collapsed with the join separator).""" + queue = [ + (AnnotationLevel.ERROR, '100% bad'), + (AnnotationLevel.ERROR, 'newline\nin message'), + ] + app.annotate_display_queue('file.py', queue) + + assert capsys.readouterr().out == '::error file=file.py,line=1::100%25 bad%0Anewline%0Ain message\n' diff --git a/ddev/tests/cli/validate/all/test_github.py b/ddev/tests/cli/validate/all/test_github.py index e2701985f509b..a32d2f6915dde 100644 --- a/ddev/tests/cli/validate/all/test_github.py +++ b/ddev/tests/cli/validate/all/test_github.py @@ -30,6 +30,7 @@ [ pytest.param('{"pull_request": {"number": 42}}', 42, id="happy-path"), pytest.param("{bad json}", None, id="malformed-json"), + pytest.param("[]", None, id="not-an-object"), pytest.param("{}", None, id="missing-pr-key"), pytest.param('{"pull_request": "bad"}', None, id="pr-not-dict"), pytest.param('{"pull_request": {}}', None, id="missing-number"), diff --git a/ddev/tests/cli/validate/test_qa_label.py b/ddev/tests/cli/validate/test_qa_label.py new file mode 100644 index 0000000000000..312b5a53d2553 --- /dev/null +++ b/ddev/tests/cli/validate/test_qa_label.py @@ -0,0 +1,161 @@ +# (C) Datadog, Inc. 2026-present +# All rights reserved +# Licensed under a 3-clause BSD style license (see LICENSE) +import json + +import pytest + + +def _write_event(tmp_path, head_repo='DataDog/integrations-core', number=1234): + payload = { + 'pull_request': { + 'number': number, + 'head': {'repo': {'full_name': head_repo}}, + 'base': {'repo': {'full_name': 'DataDog/integrations-core'}}, + }, + } + event_path = tmp_path / 'event.json' + event_path.write_text(json.dumps(payload)) + return event_path + + +@pytest.fixture +def pr_context(monkeypatch, tmp_path): + """Pretend ddev is running inside a GitHub Actions pull_request event.""" + event_path = _write_event(tmp_path) + monkeypatch.setenv('GITHUB_EVENT_NAME', 'pull_request') + monkeypatch.setenv('GITHUB_EVENT_PATH', str(event_path)) + monkeypatch.setenv('GITHUB_REPOSITORY', 'DataDog/integrations-core') + + +@pytest.fixture +def fork_pr_context(monkeypatch, tmp_path): + event_path = _write_event(tmp_path, head_repo='someone-else/integrations-core') + monkeypatch.setenv('GITHUB_EVENT_NAME', 'pull_request') + monkeypatch.setenv('GITHUB_EVENT_PATH', str(event_path)) + monkeypatch.setenv('GITHUB_REPOSITORY', 'DataDog/integrations-core') + + +def _mock_labels(mocker, labels): + return mocker.patch( + 'ddev.utils.github.GitHubManager.get_pull_request_labels', + return_value=labels, + ) + + +@pytest.mark.parametrize('label', ['qa/required', 'qa/skip-qa']) +def test_passes_with_exactly_one_qa_label(ddev, pr_context, mocker, label): + _mock_labels(mocker, [label, 'integration/foo']) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 0, result.output + assert 'QA label set' in result.output + + +def test_fails_when_no_qa_label(ddev, pr_context, mocker): + _mock_labels(mocker, ['integration/foo', 'documentation']) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 1, result.output + assert 'No QA decision label set' in result.output + assert 'qa/required' in result.output + assert 'qa/skip-qa' in result.output + + +def test_fails_when_both_qa_labels(ddev, pr_context, mocker): + _mock_labels(mocker, ['qa/required', 'qa/skip-qa']) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 1, result.output + assert 'more than one QA decision label' in result.output + + +def test_skips_outside_pull_request_context(ddev, monkeypatch, mocker): + monkeypatch.delenv('GITHUB_EVENT_NAME', raising=False) + get_labels = _mock_labels(mocker, []) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 0, result.output + assert 'Not running in a pull_request context' in result.output + get_labels.assert_not_called() + + +def test_skips_on_fork_pull_request(ddev, fork_pr_context, mocker): + get_labels = _mock_labels(mocker, []) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 0, result.output + assert 'fork' in result.output.lower() + get_labels.assert_not_called() + + +@pytest.mark.parametrize( + ('contents', 'create_file'), + [ + pytest.param('{not valid json', True, id='malformed-json'), + pytest.param('"a JSON string is not an object"', True, id='non-object-json'), + pytest.param(None, False, id='missing-file'), + ], +) +def test_aborts_when_event_file_is_unreadable(ddev, monkeypatch, tmp_path, mocker, contents, create_file): + """Anything that prevents reading a valid event object must fail loudly, not silently skip.""" + event_path = tmp_path / 'event.json' + if create_file: + event_path.write_text(contents) + monkeypatch.setenv('GITHUB_EVENT_NAME', 'pull_request') + monkeypatch.setenv('GITHUB_EVENT_PATH', str(event_path)) + get_labels = _mock_labels(mocker, []) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 1, result.output + assert 'Could not read GitHub event payload' in result.output, result.output + get_labels.assert_not_called() + + +def test_skips_when_pr_number_is_missing(ddev, monkeypatch, tmp_path, mocker): + """If the event payload lacks pull_request.number we can't fetch labels.""" + event = tmp_path / 'event.json' + repo = {'repo': {'full_name': 'DataDog/integrations-core'}} + event.write_text(json.dumps({'pull_request': {'head': repo, 'base': repo}})) + monkeypatch.setenv('GITHUB_EVENT_NAME', 'pull_request') + monkeypatch.setenv('GITHUB_EVENT_PATH', str(event)) + monkeypatch.setenv('GITHUB_REPOSITORY', 'DataDog/integrations-core') + get_labels = _mock_labels(mocker, []) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 0, result.output + assert 'Could not determine pull request number' in result.output + get_labels.assert_not_called() + + +def test_aborts_when_head_or_base_repo_is_missing(ddev, monkeypatch, tmp_path, mocker): + """An event payload without head/base repo info is malformed; don't silently skip.""" + event = tmp_path / 'event.json' + event.write_text(json.dumps({'pull_request': {'number': 1, 'head': {}, 'base': {}}})) + monkeypatch.setenv('GITHUB_EVENT_NAME', 'pull_request') + monkeypatch.setenv('GITHUB_EVENT_PATH', str(event)) + monkeypatch.delenv('GITHUB_REPOSITORY', raising=False) + get_labels = _mock_labels(mocker, []) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 1, result.output + assert 'missing head/base repo information' in result.output + get_labels.assert_not_called() + + +def test_aborts_when_pr_labels_cannot_be_fetched(ddev, pr_context, mocker): + """A None return from the labels API call means we can't make a decision — fail closed.""" + _mock_labels(mocker, None) + + result = ddev('validate', 'qa-label') + + assert result.exit_code == 1, result.output + assert 'Could not fetch pull request' in result.output diff --git a/klaviyo/assets/account_config.json b/klaviyo/assets/account_config.json index 3c0eedd655aa0..a8638e4721a85 100644 --- a/klaviyo/assets/account_config.json +++ b/klaviyo/assets/account_config.json @@ -28,11 +28,6 @@ "required": false } ], - "dataflow_config": [ - { - "dataflow_id": "klaviyo-logs", - "additional_config_fields": [] - } - ] + "dataflow_config": [] } \ No newline at end of file diff --git a/ringcentral/assets/account_config.json b/ringcentral/assets/account_config.json index 6bf9746d4c017..6cffed715f26c 100644 --- a/ringcentral/assets/account_config.json +++ b/ringcentral/assets/account_config.json @@ -65,15 +65,6 @@ "default": true } ], - "dataflow_config": [ - { - "dataflow_id": "ringcentral-logs", - "additional_config_fields": [] - }, - { - "dataflow_id": "ringcentral-metrics", - "additional_config_fields": [] - } - ] + "dataflow_config": [] } \ No newline at end of file