diff --git a/AGENT_CHANGELOG.md b/AGENT_CHANGELOG.md index 208fa0d29b493..b136df37fac7a 100644 --- a/AGENT_CHANGELOG.md +++ b/AGENT_CHANGELOG.md @@ -1,3 +1,7 @@ +## Datadog Agent version [7.69.1](https://github.com/DataDog/datadog-agent/blob/master/CHANGELOG.rst#7691) + +* There were no integration updates for this version of the Agent. + ## Datadog Agent version [7.69.0](https://github.com/DataDog/datadog-agent/blob/master/CHANGELOG.rst#7690) * Aerospike [5.0.0](https://github.com/DataDog/integrations-core/blob/master/aerospike/CHANGELOG.md) **BREAKING CHANGE** diff --git a/AGENT_INTEGRATIONS.md b/AGENT_INTEGRATIONS.md index 52c0aa916d2e8..51abd8f815064 100644 --- a/AGENT_INTEGRATIONS.md +++ b/AGENT_INTEGRATIONS.md @@ -1,3 +1,245 @@ +## Datadog Agent version 7.69.1 + +* datadog-active-directory: 4.2.0 +* datadog-activemq-xml: 5.1.0 +* datadog-activemq: 5.0.0 +* datadog-aerospike: 5.0.0 +* datadog-airflow: 7.0.0 +* datadog-amazon-msk: 7.0.0 +* datadog-ambari: 6.1.0 +* datadog-apache: 7.0.0 +* datadog-appgate-sdp: 2.0.0 +* datadog-arangodb: 4.0.0 +* datadog-argo-rollouts: 3.0.0 +* datadog-argo-workflows: 3.0.0 +* datadog-argocd: 4.0.0 +* datadog-aspdotnet: 4.2.0 +* datadog-avi-vantage: 6.0.0 +* datadog-aws-neuron: 3.0.0 +* datadog-azure-iot-edge: 6.1.0 +* datadog-boundary: 4.0.0 +* datadog-btrfs: 4.0.0 +* datadog-cacti: 4.0.0 +* datadog-calico: 5.0.0 +* datadog-cassandra-nodetool: 3.0.0 +* datadog-cassandra: 3.0.0 +* datadog-celery: 2.0.0 +* datadog-ceph: 4.1.0 +* datadog-cert-manager: 6.0.0 +* datadog-checkpoint-quantum-firewall: 1.0.0 +* datadog-checks-base: 37.16.0 +* datadog-checks-dependency-provider: 3.0.0 +* datadog-checks-downloader: 8.0.0 +* datadog-cilium: 6.0.0 +* datadog-cisco-aci: 4.8.0 +* datadog-cisco-secure-firewall: 1.0.0 +* datadog-cisco-secure-web-appliance: 1.0.0 +* datadog-citrix-hypervisor: 6.0.0 +* datadog-clickhouse: 5.3.0 +* datadog-cloud-foundry-api: 5.2.0 +* datadog-cloudera: 3.2.0 +* datadog-cockroachdb: 6.0.0 +* datadog-confluent-platform: 3.0.0 +* datadog-consul: 5.0.0 +* datadog-coredns: 6.0.0 +* datadog-couch: 9.0.0 +* datadog-couchbase: 6.0.0 +* datadog-crio: 5.0.0 +* datadog-datadog-cluster-agent: 6.0.0 +* datadog-dcgm: 4.0.0 +* datadog-delinea-privilege-manager: 1.0.0 +* datadog-delinea-secret-server: 1.0.0 +* datadog-directory: 4.0.1 +* datadog-disk: 7.1.0 +* datadog-dns-check: 5.1.0 +* datadog-dotnetclr: 4.2.0 +* datadog-druid: 5.0.0 +* datadog-duckdb: 1.0.0 +* datadog-ecs-fargate: 7.0.0 +* datadog-eks-fargate: 6.1.0 +* datadog-elastic: 9.0.0 +* datadog-envoy: 6.0.0 +* datadog-eset-protect: 1.0.0 +* datadog-esxi: 4.0.0 +* datadog-etcd: 9.0.0 +* datadog-exchange-server: 4.2.0 +* datadog-external-dns: 6.0.0 +* datadog-falco: 2.0.0 +* datadog-flink: 3.0.0 +* datadog-fluentd: 5.1.0 +* datadog-fluxcd: 3.0.0 +* datadog-fly-io: 3.0.0 +* datadog-foundationdb: 3.3.1 +* datadog-gearmand: 5.0.0 +* datadog-gitlab-runner: 7.0.0 +* datadog-gitlab: 10.0.0 +* datadog-glusterfs: 3.0.2 +* datadog-go-expvar: 5.0.0 +* datadog-gunicorn: 4.1.1 +* datadog-haproxy: 8.0.0 +* datadog-harbor: 6.0.0 +* datadog-hazelcast: 6.2.0 +* datadog-hdfs-datanode: 7.0.0 +* datadog-hdfs-namenode: 7.0.0 +* datadog-hive: 2.1.0 +* datadog-hivemq: 2.1.0 +* datadog-http-check: 12.0.0 +* datadog-hudi: 4.0.0 +* datadog-hyperv: 3.0.0 +* datadog-ibm-ace: 4.1.0 +* datadog-ibm-db2: 4.0.1 +* datadog-ibm-i: 4.1.0 +* datadog-ibm-mq: 8.3.0 +* datadog-ibm-was: 5.1.0 +* datadog-iboss: 1.0.0 +* datadog-ignite: 3.1.0 +* datadog-iis: 5.2.0 +* datadog-impala: 4.0.0 +* datadog-infiniband: 1.1.0 +* datadog-istio: 9.0.0 +* datadog-ivanti-connect-secure: 1.0.0 +* datadog-jboss-wildfly: 3.1.0 +* datadog-journald: 3.0.0 +* datadog-juniper-srx-firewall: 1.0.0 +* datadog-kafka-consumer: 6.6.1 +* datadog-kafka: 4.0.0 +* datadog-karpenter: 3.0.0 +* datadog-keda: 2.0.0 +* datadog-keycloak: 1.0.0 +* datadog-kong: 6.0.0 +* datadog-krakend: 1.0.0 +* datadog-kube-apiserver-metrics: 7.0.0 +* datadog-kube-controller-manager: 8.0.0 +* datadog-kube-dns: 7.0.0 +* datadog-kube-metrics-server: 6.0.0 +* datadog-kube-proxy: 9.0.0 +* datadog-kube-scheduler: 7.0.0 +* datadog-kubeflow: 2.0.0 +* datadog-kubelet: 10.0.0 +* datadog-kubernetes-cluster-autoscaler: 3.0.0 +* datadog-kubernetes-state: 10.1.0 +* datadog-kubevirt-api: 2.0.0 +* datadog-kubevirt-controller: 2.0.0 +* datadog-kubevirt-handler: 2.0.0 +* datadog-kuma: 2.0.0 +* datadog-kyototycoon: 4.1.0 +* datadog-kyverno: 3.0.0 +* datadog-lighttpd: 5.1.0 +* datadog-linkerd: 7.0.0 +* datadog-linux-audit-logs: 1.0.0 +* datadog-linux-proc-extras: 4.0.0 +* datadog-litellm: 2.0.0 +* datadog-lustre: 1.0.0 +* datadog-mac-audit-logs: 1.0.0 +* datadog-mapr: 3.0.0 +* datadog-mapreduce: 7.0.0 +* datadog-marathon: 5.0.0 +* datadog-marklogic: 6.1.2 +* datadog-mcache: 6.1.0 +* datadog-mesos-master: 6.0.0 +* datadog-mesos-slave: 6.0.0 +* datadog-microsoft-dns: 1.0.0 +* datadog-microsoft-sysmon: 1.0.0 +* datadog-milvus: 2.0.0 +* datadog-mongo: 10.2.1 +* datadog-mysql: 15.7.1 +* datadog-nagios: 3.0.0 +* datadog-network: 5.3.0 +* datadog-nfsstat: 3.1.0 +* datadog-nginx-ingress-controller: 5.0.0 +* datadog-nginx: 9.0.0 +* datadog-nvidia-nim: 2.0.0 +* datadog-nvidia-triton: 3.0.0 +* datadog-octopus-deploy: 2.0.0 +* datadog-openldap: 3.0.0 +* datadog-openmetrics: 7.0.0 +* datadog-openstack-controller: 9.0.0 +* datadog-openstack: 4.0.1 +* datadog-openvpn: 1.0.0 +* datadog-oracle: 6.0.0 +* datadog-ossec-security: 2.0.0 +* datadog-palo-alto-panorama: 1.0.0 +* datadog-pan-firewall: 3.0.0 +* datadog-pdh-check: 4.2.0 +* datadog-pgbouncer: 8.3.0 +* datadog-php-fpm: 6.0.0 +* datadog-ping-federate: 2.0.0 +* datadog-postfix: 3.0.0 +* datadog-postgres: 22.16.0 +* datadog-powerdns-recursor: 5.0.0 +* datadog-presto: 3.1.0 +* datadog-process: 5.1.0 +* datadog-prometheus: 6.0.0 +* datadog-proxmox: 1.0.0 +* datadog-proxysql: 7.2.0 +* datadog-pulsar: 3.2.0 +* datadog-quarkus: 2.0.0 +* datadog-rabbitmq: 8.0.0 +* datadog-ray: 3.0.0 +* datadog-redisdb: 8.0.0 +* datadog-rethinkdb: 5.1.0 +* datadog-riak: 5.1.0 +* datadog-riakcs: 4.7.0 +* datadog-sap-hana: 5.1.0 +* datadog-scylla: 5.0.0 +* datadog-sidekiq: 3.0.0 +* datadog-silk: 4.1.0 +* datadog-silverstripe-cms: 1.2.0 +* datadog-singlestore: 4.1.0 +* datadog-slurm: 2.0.2 +* datadog-snmp: 10.1.1 +* datadog-snowflake: 7.6.0 +* datadog-solr: 2.1.0 +* datadog-sonarqube: 5.3.0 +* datadog-sonatype-nexus: 2.0.0 +* datadog-sonicwall-firewall: 1.0.0 +* datadog-spark: 7.0.0 +* datadog-sqlserver: 22.7.1 +* datadog-squid: 5.0.0 +* datadog-ssh-check: 4.2.1 +* datadog-statsd: 3.0.0 +* datadog-strimzi: 4.0.0 +* datadog-supabase: 2.0.0 +* datadog-supervisord: 4.0.0 +* datadog-suricata: 2.0.0 +* datadog-symantec-endpoint-protection: 1.0.0 +* datadog-system-core: 4.0.0 +* datadog-system-swap: 3.0.0 +* datadog-tcp-check: 6.0.0 +* datadog-teamcity: 7.0.0 +* datadog-tekton: 3.0.0 +* datadog-teleport: 3.0.0 +* datadog-temporal: 4.0.0 +* datadog-tenable: 3.0.0 +* datadog-teradata: 4.0.0 +* datadog-tibco-ems: 2.1.0 +* datadog-tls: 5.0.0 +* datadog-tokumx: 3.2.1 +* datadog-tomcat: 4.0.0 +* datadog-torchserve: 4.0.0 +* datadog-traefik-mesh: 3.0.0 +* datadog-traffic-server: 3.2.0 +* datadog-twemproxy: 3.0.0 +* datadog-twistlock: 6.0.0 +* datadog-varnish: 4.0.0 +* datadog-vault: 7.0.0 +* datadog-velero: 3.0.0 +* datadog-vertica: 6.1.0 +* datadog-vllm: 3.0.0 +* datadog-voltdb: 6.0.0 +* datadog-vsphere: 9.0.0 +* datadog-watchguard-firebox: 1.0.0 +* datadog-wazuh: 1.0.0 +* datadog-weaviate: 4.0.0 +* datadog-weblogic: 3.0.0 +* datadog-win32-event-log: 5.2.1 +* datadog-windows-performance-counters: 3.1.0 +* datadog-windows-service: 6.2.0 +* datadog-wmi-check: 3.2.0 +* datadog-yarn: 8.0.0 +* datadog-zeek: 1.0.0 +* datadog-zk: 6.1.0 + ## Datadog Agent version 7.69.0 * datadog-active-directory: 4.2.0 diff --git a/anthropic_usage_and_costs/README.md b/anthropic_usage_and_costs/README.md index c856960342e97..82ccde179a320 100644 --- a/anthropic_usage_and_costs/README.md +++ b/anthropic_usage_and_costs/README.md @@ -26,7 +26,7 @@ You will need an [Admin API key][5] from Anthropic. This key allows access to us ### 2. Configure the Datadog Integration -1. In Datadog, go to [**Integrations > Anthropic**](https://app.datadoghq.com/integrations?integrationId=anthropic-usage-and-costs). +1. In Datadog, go to [**Integrations > Anthropic Usage and Costs**](https://app.datadoghq.com/integrations?integrationId=anthropic-usage-and-costs). 2. In the configuration panel, provide the **Admin API Key** by pasting the key you generated from Anthropic. 3. Click **Save Configuration**. diff --git a/datadog_checks_dev/changelog.d/21104.added b/datadog_checks_dev/changelog.d/21104.added new file mode 100644 index 0000000000000..7b5e4ba75e2e9 --- /dev/null +++ b/datadog_checks_dev/changelog.d/21104.added @@ -0,0 +1 @@ +Add option to specify container to check logs from and to wait for health when running docker compose up \ No newline at end of file diff --git a/datadog_checks_dev/datadog_checks/dev/conditions.py b/datadog_checks_dev/datadog_checks/dev/conditions.py index 8123b717b2941..321a2a538fad9 100644 --- a/datadog_checks_dev/datadog_checks/dev/conditions.py +++ b/datadog_checks_dev/datadog_checks/dev/conditions.py @@ -5,7 +5,7 @@ import socket import time from contextlib import closing -from typing import Callable, Dict, List, Tuple, Union # noqa: F401 +from typing import Any, Callable, Dict, List, Tuple, Union # noqa: F401 from urllib.request import urlopen from .errors import RetryError @@ -17,11 +17,11 @@ class WaitFor(LazyFunction): def __init__( self, - func, # type: Callable - attempts=60, # type: int - wait=1, # type: int - args=(), # type: Tuple - kwargs=None, # type: Dict + func: Callable, + attempts: int = 60, + wait: int = 1, + args: Tuple = (), + kwargs: Dict[str, Any] | None = None, ): if kwargs is None: kwargs = {} @@ -61,10 +61,10 @@ def __call__(self): class CheckEndpoints(LazyFunction): def __init__( self, - endpoints, # type: Union[str, List[str]] - timeout=1, # type: int - attempts=60, # type: int - wait=1, # type: int + endpoints: Union[str, List[str]], + timeout: int = 1, + attempts: int = 60, + wait: int = 1, send_request=None, ): self.endpoints = [endpoints] if isinstance(endpoints, str) else endpoints @@ -101,13 +101,13 @@ def __call__(self): class CheckCommandOutput(LazyFunction): def __init__( self, - command, # type: Union[str, List[str]] - patterns, # type: Union[str, List[str]] - matches=1, # type: Union[str, int] #Either 'all' or a number - stdout=True, # type: bool - stderr=True, # type: bool - attempts=60, # type: int - wait=1, # type: int + command: Union[str, List[str]], + patterns: Union[str, List[str]], + matches: Union[str, int] = 1, # Either 'all' or a number + stdout: bool = True, + stderr: bool = True, + attempts: int = 60, + wait: int = 1, ): """ Checks if the provided patterns are present in the output of a command @@ -182,13 +182,14 @@ def __call__(self): class CheckDockerLogs(CheckCommandOutput): def __init__( self, - identifier, # type: str - patterns, # type: Union[str, List[str]] - matches=1, # type: Union[str, int] - stdout=True, # type: bool - stderr=True, # type: bool - attempts=60, # type: int - wait=1, # type: int + identifier: str, + patterns: Union[str, List[str]], + matches: Union[str, int] = 1, + stdout: bool = True, + stderr: bool = True, + attempts: int = 60, + wait: int = 1, + service: str | None = None, ): """ Checks if the provided patterns are present in docker logs @@ -200,9 +201,12 @@ def __init__( :param stderr: Whether to search for the provided patterns in stderr :param attempts: How many times to try searching for the patterns :param wait: How long, in seconds, to wait between attempts + :param service: The service name to check the logs for when using docker compose """ if file_exists(identifier): command = ['docker', 'compose', '-f', identifier, 'logs'] + if service: + command.append(service) else: command = ['docker', 'logs', identifier] diff --git a/datadog_checks_dev/datadog_checks/dev/docker.py b/datadog_checks_dev/datadog_checks/dev/docker.py index 8a6579683c436..83175db7fa083 100644 --- a/datadog_checks_dev/datadog_checks/dev/docker.py +++ b/datadog_checks_dev/datadog_checks/dev/docker.py @@ -107,6 +107,7 @@ def shared_logs(example_log_configs, mount_whitelist=None): @contextmanager def docker_run( compose_file=None, + waith_for_health=False, build=False, service_name=None, up=None, @@ -131,6 +132,8 @@ def docker_run( compose_file (str): A path to a Docker compose file. A custom tear down is not required when using this. + waith_for_health (bool): + Whether or not to wait for the health of the service to be healthy before yielding. build (bool): Whether or not to build images for when `compose_file` is provided service_name (str): @@ -233,13 +236,24 @@ def docker_run( class ComposeFileUp(LazyFunction): - def __init__(self, compose_file, build=False, service_name=None, capture=None): + def __init__( + self, + compose_file: str, + build: bool = False, + service_name: str | None = None, + capture: str | None = None, + waith_for_health: bool = False, + ): self.compose_file = compose_file self.build = build self.service_name = service_name self.capture = capture + self.waith_for_health = waith_for_health self.command = ['docker', 'compose', '-f', self.compose_file, 'up', '-d', '--force-recreate'] + if waith_for_health: + self.command.append('--wait') + if self.build: self.command.append('--build') diff --git a/datadog_checks_dev/tests/docker/test_default.yaml b/datadog_checks_dev/tests/docker/test_default.yaml index 4d5fa3ff0a040..edee758a4af69 100644 --- a/datadog_checks_dev/tests/docker/test_default.yaml +++ b/datadog_checks_dev/tests/docker/test_default.yaml @@ -12,3 +12,8 @@ services: - VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200 ports: - "8200:8200" + + logging-service: + image: alpine + container_name: ddev_logging_service + command: sh -c 'while true; do echo "I am a logging service"; sleep 1; done' diff --git a/datadog_checks_dev/tests/test_conditions.py b/datadog_checks_dev/tests/test_conditions.py index a4e96660e7fb3..6850e196a0221 100644 --- a/datadog_checks_dev/tests/test_conditions.py +++ b/datadog_checks_dev/tests/test_conditions.py @@ -94,6 +94,20 @@ def test_matches(self): finally: run_command(['docker', 'compose', '-f', compose_file, 'down'], capture=True) + def test_matches_service(self): + compose_file = os.path.join(DOCKER_DIR, 'test_default.yaml') + check_logging_service = CheckDockerLogs(compose_file, 'I am a logging service', service='logging-service') + check_vault = CheckDockerLogs(compose_file, 'Vault server started', service='logging-service') + try: + run_command(['docker', 'compose', '-f', compose_file, 'up', '-d'], check=True) + check_logging_service() + + # Only the logs for the specified service should be matched + with pytest.raises(RetryError): + check_vault() + finally: + run_command(['docker', 'compose', '-f', compose_file, 'down'], capture=True) + class TestCheckEndpoints: def test_fail(self):