From 1d892362e771532289e51adff5dab72b3710cfd8 Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 15:23:23 +0200 Subject: [PATCH 1/8] Update docker_run health wait default Co-authored-by: Cursor --- cassandra_nodetool/tests/conftest.py | 4 +- datadog_checks_dev/changelog.d/23436.changed | 1 + .../datadog_checks/dev/docker.py | 13 +++-- datadog_checks_dev/tests/test_docker.py | 51 ++++++++++++++++++- harbor/tests/conftest.py | 2 +- kafka/tests/conftest.py | 2 +- prefect/tests/conftest.py | 2 +- 7 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 datadog_checks_dev/changelog.d/23436.changed diff --git a/cassandra_nodetool/tests/conftest.py b/cassandra_nodetool/tests/conftest.py index 5c2287bc98bc6..00adf79b30a9f 100644 --- a/cassandra_nodetool/tests/conftest.py +++ b/cassandra_nodetool/tests/conftest.py @@ -50,14 +50,14 @@ def dd_environment(): compose_file, build=True, service_name=common.CASSANDRA_CONTAINER_NAME, - waith_for_health=True, + wait_for_health=True, ): cassandra_seed = get_container_ip("{}".format(common.CASSANDRA_CONTAINER_NAME)) env['CASSANDRA_SEEDS'] = cassandra_seed with docker_run( compose_file, service_name=common.CASSANDRA_CONTAINER_NAME_2, - waith_for_health=True, + wait_for_health=True, conditions=[WaitFor(create_keyspace, attempts=10, wait=10)], ): yield common.CONFIG_INSTANCE, E2E_METADATA diff --git a/datadog_checks_dev/changelog.d/23436.changed b/datadog_checks_dev/changelog.d/23436.changed new file mode 100644 index 0000000000000..bff31bbed0bfc --- /dev/null +++ b/datadog_checks_dev/changelog.d/23436.changed @@ -0,0 +1 @@ +Make docker_run wait for Docker Compose service health by default. \ No newline at end of file diff --git a/datadog_checks_dev/datadog_checks/dev/docker.py b/datadog_checks_dev/datadog_checks/dev/docker.py index bb3330cb6620b..5937508e6a42f 100644 --- a/datadog_checks_dev/datadog_checks/dev/docker.py +++ b/datadog_checks_dev/datadog_checks/dev/docker.py @@ -107,7 +107,7 @@ def shared_logs(example_log_configs, mount_whitelist=None): @contextmanager def docker_run( compose_file=None, - waith_for_health=False, + wait_for_health=True, build=False, service_name=None, up=None, @@ -132,7 +132,7 @@ 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): + wait_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 @@ -176,8 +176,7 @@ def docker_run( composeFileArgs = {'compose_file': compose_file, 'build': build, 'service_name': service_name} if capture is not None: composeFileArgs['capture'] = capture - if waith_for_health: - composeFileArgs['waith_for_health'] = waith_for_health + composeFileArgs['wait_for_health'] = wait_for_health set_up = ComposeFileUp(**composeFileArgs) if down is not None: tear_down = down @@ -244,16 +243,16 @@ def __init__( build: bool = False, service_name: str | None = None, capture: str | None = None, - waith_for_health: bool = False, + wait_for_health: bool = True, ): self.compose_file = compose_file self.build = build self.service_name = service_name self.capture = capture - self.waith_for_health = waith_for_health + self.wait_for_health = wait_for_health self.command = ['docker', 'compose', '-f', self.compose_file, 'up', '-d', '--force-recreate'] - if waith_for_health: + if wait_for_health: self.command.append('--wait') if self.build: diff --git a/datadog_checks_dev/tests/test_docker.py b/datadog_checks_dev/tests/test_docker.py index 52b4834d0c1d2..e71415bf06eaa 100644 --- a/datadog_checks_dev/tests/test_docker.py +++ b/datadog_checks_dev/tests/test_docker.py @@ -8,7 +8,7 @@ import tenacity from datadog_checks.dev.ci import running_on_ci -from datadog_checks.dev.docker import compose_file_active, docker_run +from datadog_checks.dev.docker import ComposeFileUp, compose_file_active, docker_run from datadog_checks.dev.subprocess import run_command from .common import not_windows_ci @@ -36,6 +36,33 @@ def test_up(self): class TestDockerRun: + def test_wait_for_health_default(self): + set_up = self.get_set_up() + + assert '--wait' in set_up.command + + def test_wait_for_health_explicit_disable(self): + set_up = self.get_set_up(wait_for_health=False) + + assert '--wait' not in set_up.command + + def test_wait_for_health_typo_rejected(self): + compose_file = os.path.join(DOCKER_DIR, 'test_default.yaml') + + with pytest.raises(TypeError, match='unexpected keyword argument'): + with docker_run(compose_file, waith_for_health=False): + pass + + def get_set_up(self, **kwargs): + compose_file = os.path.join(DOCKER_DIR, 'test_default.yaml') + + with mock.patch('datadog_checks.dev.docker.environment_run') as environment_run: + environment_run.return_value.__enter__.return_value = None + with docker_run(compose_file, **kwargs): + pass + + return environment_run.call_args[1]['up'] + @pytest.mark.parametrize( "capture", [ @@ -93,3 +120,25 @@ def test_retry_condition_failed_only_on_first_run(self): with docker_run(up=up, down=mock.MagicMock(), attempts=3, conditions=[condition], attempts_wait=0): assert condition.call_count == 2 + + +class TestComposeFileUp: + def test_wait_for_health_default(self): + compose_file = os.path.join(DOCKER_DIR, 'test_default.yaml') + + compose_file_up = ComposeFileUp(compose_file) + + assert '--wait' in compose_file_up.command + + def test_wait_for_health_explicit_disable(self): + compose_file = os.path.join(DOCKER_DIR, 'test_default.yaml') + + compose_file_up = ComposeFileUp(compose_file, wait_for_health=False) + + assert '--wait' not in compose_file_up.command + + def test_wait_for_health_typo_rejected(self): + compose_file = os.path.join(DOCKER_DIR, 'test_default.yaml') + + with pytest.raises(TypeError, match='unexpected keyword argument'): + ComposeFileUp(compose_file, waith_for_health=False) diff --git a/harbor/tests/conftest.py b/harbor/tests/conftest.py index 6c2b8040a0eb3..1b9d09826fe25 100644 --- a/harbor/tests/conftest.py +++ b/harbor/tests/conftest.py @@ -54,7 +54,7 @@ def dd_environment(e2e_instance): if os.environ.get('HARBOR_USE_SSL'): cert_dir = os.path.join(HERE, 'compose', 'common', 'cert') e2e_metadata['docker_volumes'] = ['{}:/home/harbor/tests/compose/common/cert'.format(cert_dir)] - with docker_run(compose_file, conditions=conditions, attempts=5, waith_for_health=True): + with docker_run(compose_file, conditions=conditions, attempts=5, wait_for_health=True): yield e2e_instance, e2e_metadata diff --git a/kafka/tests/conftest.py b/kafka/tests/conftest.py index 9ec6274382b0e..6ed2d9daff7de 100644 --- a/kafka/tests/conftest.py +++ b/kafka/tests/conftest.py @@ -31,6 +31,6 @@ def dd_environment(): service="kafka", ), ], - waith_for_health=True, + wait_for_health=True, ): yield load_jmx_config(), {'use_jmx': True} diff --git a/prefect/tests/conftest.py b/prefect/tests/conftest.py index c4dbb1955f9c4..e7b645608f4ce 100644 --- a/prefect/tests/conftest.py +++ b/prefect/tests/conftest.py @@ -60,7 +60,7 @@ def dd_environment(instance: Callable[[str], dict[str, str | dict[str, list[str] compose_file=str(COMPOSE_FILE_E2E), conditions=conditions, env_vars={"PREFECT_PORT": str(port)}, - waith_for_health=True, + wait_for_health=True, mount_logs=True, ): yield ( From 5d005bd70c9194e16452b3b2faed2af58244adaf Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 16:16:53 +0200 Subject: [PATCH 2/8] Opt out one-shot compose setups from health waiting Co-authored-by: Cursor --- .../changelog.d/{23436.changed => 23628.changed} | 2 +- http_check/tests/conftest.py | 1 + kong/tests/conftest.py | 4 +++- tls/tests/conftest.py | 4 +++- 4 files changed, 8 insertions(+), 3 deletions(-) rename datadog_checks_dev/changelog.d/{23436.changed => 23628.changed} (95%) diff --git a/datadog_checks_dev/changelog.d/23436.changed b/datadog_checks_dev/changelog.d/23628.changed similarity index 95% rename from datadog_checks_dev/changelog.d/23436.changed rename to datadog_checks_dev/changelog.d/23628.changed index bff31bbed0bfc..31d8515fb5734 100644 --- a/datadog_checks_dev/changelog.d/23436.changed +++ b/datadog_checks_dev/changelog.d/23628.changed @@ -1 +1 @@ -Make docker_run wait for Docker Compose service health by default. \ No newline at end of file +Make docker_run wait for Docker Compose service health by default. diff --git a/http_check/tests/conftest.py b/http_check/tests/conftest.py index 2759fab9c6110..570d4268194c4 100644 --- a/http_check/tests/conftest.py +++ b/http_check/tests/conftest.py @@ -29,6 +29,7 @@ def dd_environment(mock_local_http_dns): with docker_run( os.path.join(HERE, 'compose', 'docker-compose.yml'), build=True, + wait_for_health=False, log_patterns=["start worker process"], conditions=[WaitFor(call_endpoint, args=("https://127.0.0.1",))], ): diff --git a/kong/tests/conftest.py b/kong/tests/conftest.py index 597a42fbc8553..762a3bf82e8ab 100644 --- a/kong/tests/conftest.py +++ b/kong/tests/conftest.py @@ -17,7 +17,9 @@ def dd_environment(): Start a kong cluster """ with docker_run( - compose_file=os.path.join(common.HERE, 'compose', 'docker-compose.yml'), endpoints=common.STATUS_URL + compose_file=os.path.join(common.HERE, 'compose', 'docker-compose.yml'), + wait_for_health=False, + endpoints=common.STATUS_URL, ): yield common.openmetrics_instance diff --git a/tls/tests/conftest.py b/tls/tests/conftest.py index b606a64d0770e..70c88eb2eb8d0 100644 --- a/tls/tests/conftest.py +++ b/tls/tests/conftest.py @@ -39,7 +39,9 @@ def clean_fips_environment(): @pytest.fixture(scope='session') def dd_environment(instance_e2e, mock_local_tls_dns): - with docker_run(os.path.join(HERE, 'compose', 'docker-compose.yml'), build=True, sleep=20): + with docker_run( + os.path.join(HERE, 'compose', 'docker-compose.yml'), build=True, wait_for_health=False, sleep=20 + ): e2e_metadata = {'docker_volumes': ['{}:{}'.format(CA_CERT, CA_CERT_MOUNT_PATH)]} yield instance_e2e, e2e_metadata From 66fbfe782492f8142ff227918c2a67f232c3e8d5 Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 16:21:57 +0200 Subject: [PATCH 3/8] Fix tls formatting --- tls/tests/conftest.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tls/tests/conftest.py b/tls/tests/conftest.py index 70c88eb2eb8d0..d1c7e13c6c267 100644 --- a/tls/tests/conftest.py +++ b/tls/tests/conftest.py @@ -39,9 +39,7 @@ def clean_fips_environment(): @pytest.fixture(scope='session') def dd_environment(instance_e2e, mock_local_tls_dns): - with docker_run( - os.path.join(HERE, 'compose', 'docker-compose.yml'), build=True, wait_for_health=False, sleep=20 - ): + with docker_run(os.path.join(HERE, 'compose', 'docker-compose.yml'), build=True, wait_for_health=False, sleep=20): e2e_metadata = {'docker_volumes': ['{}:{}'.format(CA_CERT, CA_CERT_MOUNT_PATH)]} yield instance_e2e, e2e_metadata From 88994515782f744401a8eee6ae37c8add8b104e5 Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 16:43:26 +0200 Subject: [PATCH 4/8] Fix compose health checks for Envoy and KrakenD Co-authored-by: Cursor --- envoy/tests/docker/api_v3/Dockerfile-service | 2 +- envoy/tests/docker/api_v3/service-envoy.yaml | 4 +++- krakend/tests/docker/Dockerfile | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/envoy/tests/docker/api_v3/Dockerfile-service b/envoy/tests/docker/api_v3/Dockerfile-service index d2922eab67e73..66991f940039d 100644 --- a/envoy/tests/docker/api_v3/Dockerfile-service +++ b/envoy/tests/docker/api_v3/Dockerfile-service @@ -1,7 +1,7 @@ FROM envoyproxy/envoy:v1.31.0 RUN apt-get update && apt-get install -y python3 bash python3-pip RUN python3 --version && pip3 --version -RUN pip3 install -q Flask==2.1.2 requests==2.28.1 +RUN pip3 install -q Flask==2.1.2 requests==2.28.1 'Werkzeug<3' RUN mkdir /code ADD ./service.py /code ADD ./start_service.sh /usr/local/bin/start_service.sh diff --git a/envoy/tests/docker/api_v3/service-envoy.yaml b/envoy/tests/docker/api_v3/service-envoy.yaml index 85db8de33135b..ba839d605ca90 100644 --- a/envoy/tests/docker/api_v3/service-envoy.yaml +++ b/envoy/tests/docker/api_v3/service-envoy.yaml @@ -23,7 +23,9 @@ static_resources: - match: {prefix: "/service"} route: {cluster: local_service} http_filters: - - name: envoy.router + - name: envoy.filters.http.router + typed_config: + "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: local_service connect_timeout: 0.25s diff --git a/krakend/tests/docker/Dockerfile b/krakend/tests/docker/Dockerfile index 9624d4b84b7ee..72e92c7aef11f 100644 --- a/krakend/tests/docker/Dockerfile +++ b/krakend/tests/docker/Dockerfile @@ -4,6 +4,7 @@ WORKDIR /app COPY requirements.txt /app/requirements.txt COPY api.py /app/api.py +RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* RUN pip install -r requirements.txt # Run the application From 898b2da71b64e4db622098b6b815b9e1bfcad70a Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 16:58:34 +0200 Subject: [PATCH 5/8] Fix NiFi and Postgres compose health checks Co-authored-by: Cursor --- nifi/tests/docker/docker-compose.yaml | 2 +- postgres/tests/compose/docker-compose-replication.yaml | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/nifi/tests/docker/docker-compose.yaml b/nifi/tests/docker/docker-compose.yaml index 737c5a0f76240..974201cbeb73b 100644 --- a/nifi/tests/docker/docker-compose.yaml +++ b/nifi/tests/docker/docker-compose.yaml @@ -7,7 +7,7 @@ services: SINGLE_USER_CREDENTIALS_USERNAME: admin SINGLE_USER_CREDENTIALS_PASSWORD: ctsBtRBKHRAx69EqUghvvgEvjnaLjFEB healthcheck: - test: ["CMD-SHELL", "curl -sk -o /dev/null -w '%{http_code}' https://localhost:8443/nifi-api/flow/about | grep -qv 000"] + test: ["CMD-SHELL", "curl -sk -o /dev/null -w '%{http_code}' https://$$(hostname):8443/nifi-api/flow/about | grep -qv 000"] interval: 10s timeout: 5s retries: 30 diff --git a/postgres/tests/compose/docker-compose-replication.yaml b/postgres/tests/compose/docker-compose-replication.yaml index 4b2b56ff077f7..11a2cd4834263 100644 --- a/postgres/tests/compose/docker-compose-replication.yaml +++ b/postgres/tests/compose/docker-compose-replication.yaml @@ -9,6 +9,7 @@ services: test: ["CMD-SHELL", "pg_isready -U datadog -d datadog_test && if [[ ! -e /tmp/container_ready.txt ]]; then exit 1; fi"] interval: 1s timeout: 5s + start_period: 60s retries: 5 networks: - pg-net @@ -28,6 +29,7 @@ services: test: ["CMD-SHELL", "pg_isready -p 5433 -U datadog -d datadog_test && if [[ ! -e /tmp/container_ready.txt ]]; then exit 1; fi"] interval: 1s timeout: 5s + start_period: 60s retries: 5 networks: - pg-net @@ -47,6 +49,7 @@ services: test: ["CMD-SHELL", "pg_isready -p 5434 -U datadog -d datadog_test && if [[ ! -e /tmp/container_ready.txt ]]; then exit 1; fi"] interval: 1s timeout: 5s + start_period: 60s retries: 5 networks: - pg-net @@ -66,6 +69,7 @@ services: test: ["CMD-SHELL", "pg_isready -p 5435 -U datadog -d datadog_test && if [[ ! -e /tmp/container_ready.txt ]]; then exit 1; fi"] interval: 1s timeout: 5s + start_period: 60s retries: 5 networks: - pg-net From bb036f8cccf32168fc9c79b563b9c1703386f963 Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 17:06:51 +0200 Subject: [PATCH 6/8] Fix KrakenD and Marathon compose health checks Co-authored-by: Cursor --- krakend/tests/docker/docker-compose.yml | 5 +++-- krakend/tests/lab/docker-compose.yml | 5 +++-- marathon/tests/compose/docker-compose.yml | 4 +++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/krakend/tests/docker/docker-compose.yml b/krakend/tests/docker/docker-compose.yml index d4e59f7de464e..eb563893640c0 100644 --- a/krakend/tests/docker/docker-compose.yml +++ b/krakend/tests/docker/docker-compose.yml @@ -25,9 +25,10 @@ services: - ./krakend.json:/etc/krakend/krakend.json:ro command: ["run", "-d", "-c", "/etc/krakend/krakend.json"] depends_on: - - api + api: + condition: service_healthy healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/__health"] + test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/__health"] interval: 30s timeout: 10s retries: 3 diff --git a/krakend/tests/lab/docker-compose.yml b/krakend/tests/lab/docker-compose.yml index 29a2c4f9cbd5c..ff54fe4ae1dfc 100644 --- a/krakend/tests/lab/docker-compose.yml +++ b/krakend/tests/lab/docker-compose.yml @@ -25,11 +25,12 @@ services: - ../docker/krakend.json:/etc/krakend/krakend.json:ro command: ["run", "-d", "-c", "/etc/krakend/krakend.json"] depends_on: - - api + api: + condition: service_healthy labels: com.datadoghq.ad.checks: '{"krakend": {"instances": [{"openmetrics_endpoint": "http://localhost:9090/metrics"}], "logs": [{"source": "krakend", "service": "test-api", "type": "docker"}]}}' healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8080/__health"] + test: ["CMD", "wget", "-q", "--spider", "http://localhost:8080/__health"] interval: 30s timeout: 10s retries: 3 diff --git a/marathon/tests/compose/docker-compose.yml b/marathon/tests/compose/docker-compose.yml index e64c196848c74..8b02be7dd4641 100644 --- a/marathon/tests/compose/docker-compose.yml +++ b/marathon/tests/compose/docker-compose.yml @@ -35,7 +35,9 @@ services: - MESOS_WORK_DIR=/var/tmp/mesos - MESOS_MASTER=zk://zookeeper:2181/mesos - MESOS_SWITCH_USER=0 - - MESOS_CONTAINERIZERS=docker,mesos + - MESOS_CONTAINERIZERS=mesos + - MESOS_LAUNCHER=posix + - MESOS_SYSTEMD_ENABLE_SUPPORT=false volumes: - /sys/fs/cgroup:/sys/fs/cgroup - /var/run/docker.sock:/run/docker.sock From 4777e9b217e58ebe62b492dc8ac6f8deb7987cd3 Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Thu, 7 May 2026 17:11:06 +0200 Subject: [PATCH 7/8] Fix Postgres base compose health check timing Co-authored-by: Cursor --- postgres/tests/compose/docker-compose.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/postgres/tests/compose/docker-compose.yaml b/postgres/tests/compose/docker-compose.yaml index dc5ab631bdc0d..1089fef3780cf 100644 --- a/postgres/tests/compose/docker-compose.yaml +++ b/postgres/tests/compose/docker-compose.yaml @@ -7,6 +7,7 @@ services: test: ["CMD-SHELL", "pg_isready -U datadog -d datadog_test && if [[ ! -e /tmp/container_ready.txt ]]; then exit 1; fi"] interval: 1s timeout: 5s + start_period: 60s retries: 5 volumes: - ./resources:/docker-entrypoint-initdb.d/ From e952ce9801e233cd94326bde54be5b3f3ada541f Mon Sep 17 00:00:00 2001 From: Juanpe Araque Date: Fri, 8 May 2026 09:44:27 +0200 Subject: [PATCH 8/8] Fix TLS FIPS compose health checks Co-authored-by: Cursor --- tls/tests/fips/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tls/tests/fips/docker-compose.yml b/tls/tests/fips/docker-compose.yml index 8315ee02e0868..f1c0e569f061c 100644 --- a/tls/tests/fips/docker-compose.yml +++ b/tls/tests/fips/docker-compose.yml @@ -8,7 +8,7 @@ services: - ./ca.key:/etc/ssl/private/server.key command: ["/usr/local/bin/start-server.sh", "ECDHE-RSA-AES128-SHA256"] healthcheck: - test: ["CMD", "curl", "-f", "https://localhost:443"] + test: ["CMD-SHELL", "printf '' | timeout 5 openssl s_client -connect localhost:443 -brief"] interval: 30s timeout: 10s retries: 3 @@ -22,7 +22,7 @@ services: - ./ca.key:/etc/ssl/private/server.key command: ["/usr/local/bin/start-server.sh", "ECDHE-RSA-CHACHA20-POLY1305"] healthcheck: - test: ["CMD", "curl", "-f", "https://localhost:443"] + test: ["CMD-SHELL", "printf '' | timeout 5 openssl s_client -connect localhost:443 -brief"] interval: 30s timeout: 10s retries: 3