Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
cec619a
feat(base): add agnostic HTTP protocol capabilities and auth/factory …
mwdd146980 Jul 10, 2026
d34efdd
fix(base): harden get_cookie and annotate agnostic auth adapter
mwdd146980 Jul 10, 2026
98751e8
fix(base): address review findings on the agnostic auth adapter
mwdd146980 Jul 10, 2026
6502511
fix(base): honor get_cookie contract and document url read-only in pr…
mwdd146980 Jul 11, 2026
e2cbc47
fix(base): adopt injected session trust_env in RequestsWrapper
mwdd146980 Jul 11, 2026
1f7d8b7
refactor(base): rename OutgoingRequest to HTTPRequest and create_http…
mwdd146980 Jul 13, 2026
6bebc9a
style(base): fix ruff import-order and B018 after the rename
mwdd146980 Jul 13, 2026
0873404
docs(base): document get_cookie ambiguous-collision fallback in contract
mwdd146980 Jul 13, 2026
01ce6d3
refactor(base): drop the HTTPRequestAuth hook seam
mwdd146980 Jul 13, 2026
cbb7c39
docs(base): drop stale auth-hook re-export comment
mwdd146980 Jul 13, 2026
ed6c311
Merge remote-tracking branch 'origin/mwdd146980/httpx-migration-base'…
mwdd146980 Jul 14, 2026
5165526
fix(base): address review findings on protocol capabilities
mwdd146980 Jul 15, 2026
c9cc13a
refactor(base): rename protocol classes to HTTPClient/HTTPResponse
mwdd146980 Jul 16, 2026
c868a8f
refactor(base): move MockHTTPResponse to datadog_checks_dev
mwdd146980 Jul 16, 2026
a82d4d1
feat(base): declare response attrs and get_peer_cert on protocol
mwdd146980 Jul 16, 2026
62a26cf
feat(base): add ResponseWrapper.get_peer_cert capability
mwdd146980 Jul 16, 2026
3fc77c0
feat(dev): enforce HTTPResponse surface on MockHTTPResponse
mwdd146980 Jul 16, 2026
3cb3f81
fix(dev): enforce guard on public protocol surface only
mwdd146980 Jul 16, 2026
7301cfc
fix(dev): add history attribute to mock response
mwdd146980 Jul 16, 2026
41d3f2f
fix(base): parse kubelet pod list via response.json instead of raw
mwdd146980 Jul 16, 2026
6cdaa1c
fix(http_check): read peer cert via get_peer_cert capability
mwdd146980 Jul 16, 2026
24674bd
chore: add changelog entries for HTTP response surface (#24516)
mwdd146980 Jul 16, 2026
c35ff8d
feat(base): extend HTTP client protocol surface
mwdd146980 Jul 16, 2026
6f520ec
chore(base): tighten HTTPResponse protocol comments
mwdd146980 Jul 16, 2026
3042004
chore(dev): tighten MockHTTPResponse guard comment
mwdd146980 Jul 16, 2026
63b5c05
chore(base): tighten HTTPClient protocol comments
mwdd146980 Jul 16, 2026
e02b626
style: fix import order flagged by ruff --fix
mwdd146980 Jul 16, 2026
f384177
chore: renumber changelog entries from 24516 to 22676
mwdd146980 Jul 16, 2026
6830a91
Agnosticize integrations HTTP error handling (batch 1 of 3) (#24546)
mwdd146980 Jul 17, 2026
3204547
Agnosticize integrations HTTP error handling (batch 2 of 3) (#24547)
mwdd146980 Jul 17, 2026
cffde7e
Agnosticize integrations HTTP error handling (batch 3 of 3) (#24548)
mwdd146980 Jul 17, 2026
0fc8fe7
Migrate openstack_controller to the backend-neutral HTTP protocol (#2…
NouemanKHAL Jul 17, 2026
6465fff
fix: repair HTTP symbol references broken by branch refactors
mwdd146980 Jul 17, 2026
fbda458
fix(http): address self-review gaps in agnostic surface
mwdd146980 Jul 17, 2026
f2adc46
chore(http): drop changelog entries until master-merge prep
mwdd146980 Jul 17, 2026
5d79646
Migrate remaining integrations to the backend-neutral HTTP protocol (…
NouemanKHAL Jul 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions activemq_xml/datadog_checks/activemq_xml/activemq_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
# Licensed under a 3-clause BSD style license (see LICENSE)
from xml.etree import ElementTree

import requests

from datadog_checks.base import AgentCheck
from datadog_checks.base.config import _is_affirmative
from datadog_checks.base.utils.http_exceptions import HTTPConnectionError, HTTPTimeoutError

QUEUE_URL = "/admin/xml/queues.jsp"
TOPIC_URL = "/admin/xml/topics.jsp"
Expand Down Expand Up @@ -57,7 +56,7 @@ def _fetch_data(self, base_url, xml_url, suppress_errors):
try:
r = self.http.get(url)
r.raise_for_status()
except requests.exceptions.ConnectionError:
except (HTTPConnectionError, HTTPTimeoutError):
if suppress_errors:
self.log.warning("ActiveMQ not contactable, but suppressing the error due to configuration.")
return False
Expand Down
2 changes: 1 addition & 1 deletion amazon_msk/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import mock
import pytest

from datadog_checks.base.utils.http_testing import MockHTTPResponse
from datadog_checks.dev import docker_run
from datadog_checks.dev.http import MockHTTPResponse

from . import common

Expand Down
7 changes: 3 additions & 4 deletions ambari/datadog_checks/ambari/ambari.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
# (C) Datadog, Inc. 2019-present
# All rights reserved
# Licensed under a 3-clause BSD style license (see LICENSE)
from requests.exceptions import ConnectionError, HTTPError, Timeout

from datadog_checks.base import AgentCheck
from datadog_checks.base.constants import ServiceCheck
from datadog_checks.base.errors import CheckException
from datadog_checks.base.utils.http_exceptions import HTTPConnectionError, HTTPStatusError, HTTPTimeoutError

from . import common

Expand Down Expand Up @@ -187,11 +186,11 @@ def _make_request(self, url):
try:
resp = self.http.get(url)
return resp.json()
except (HTTPError, ConnectionError) as e:
except (HTTPStatusError, HTTPConnectionError) as e:
self.warning(
"Couldn't connect to URL: %s with exception: %s. Please verify the address is reachable", url, e
)
except Timeout:
except HTTPTimeoutError:
self.warning("Connection timeout when connecting to %s", url)
except Exception as e:
self.warning("Couldn't connect to URL: %s with exception: %s.", url, e)
Expand Down
2 changes: 1 addition & 1 deletion apache/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
import requests

from datadog_checks.apache import Apache
from datadog_checks.base.utils.http_testing import MockHTTPResponse
from datadog_checks.dev import docker_run
from datadog_checks.dev.conditions import CheckEndpoints, WaitFor
from datadog_checks.dev.http import MockHTTPResponse

from .common import AUTO_STATUS_URL, BASE_URL, CHECK_NAME, HERE, STATUS_CONFIG, STATUS_URL

Expand Down
4 changes: 1 addition & 3 deletions arangodb/datadog_checks/arangodb/check.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
# Licensed under a 3-clause BSD style license (see LICENSE)
from urllib.parse import urlparse

from requests import HTTPError

from datadog_checks.base import OpenMetricsBaseCheckV2
from datadog_checks.base.utils.http_exceptions import HTTPStatusError

Expand Down Expand Up @@ -57,7 +55,7 @@ def get_server_tag(self, tag_name, endpoint):

return 'server_{}:{}'.format(tag_name, response.json()[tag_name])

except (HTTPError, HTTPStatusError):
except HTTPStatusError:
self.log.debug("Unable to get server %s, skipping `server_%s` tag.", tag_name, tag_name)
except Exception as e:
self.log.debug(
Expand Down
2 changes: 1 addition & 1 deletion arangodb/tests/test_arangodb.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

from datadog_checks.arangodb import ArangodbCheck
from datadog_checks.base.utils.http_exceptions import HTTPStatusError
from datadog_checks.base.utils.http_testing import MockHTTPResponse
from datadog_checks.dev.http import MockHTTPResponse
from datadog_checks.dev.utils import get_metadata_metrics

from .common import METRICS
Expand Down
4 changes: 2 additions & 2 deletions avi_vantage/datadog_checks/avi_vantage/check.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ def configure_scrapers(self):

@contextmanager
def login(self):
self.http._session = None
self.http.close()
login_url = self.base_url + "/login"
logout_url = self.base_url + "/logout"
try:
Expand All @@ -87,7 +87,7 @@ def login(self):
self.service_check("can_connect", AgentCheck.OK, tags=self.config.tags)

yield
csrf_token = self.http.session.cookies.get('csrftoken')
csrf_token = self.http.get_cookie('csrftoken')
if csrf_token:
logout_resp = self.http.post(
logout_url, extra_headers={'X-CSRFToken': csrf_token, 'Referer': self.base_url}
Expand Down
2 changes: 1 addition & 1 deletion avi_vantage/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@

import pytest

from datadog_checks.base.utils.http_testing import MockHTTPResponse
from datadog_checks.dev import docker_run, get_docker_hostname, get_here
from datadog_checks.dev.conditions import CheckDockerLogs
from datadog_checks.dev.http import MockHTTPResponse

HERE = get_here()

Expand Down
2 changes: 1 addition & 1 deletion cert_manager/tests/test_cert_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

import pytest

from datadog_checks.base.utils.http_testing import MockHTTPResponse
from datadog_checks.cert_manager import CertManagerCheck
from datadog_checks.dev.http import MockHTTPResponse

from .common import ACME_METRICS, CERT_METRICS, CONTROLLER_METRICS, MOCK_INSTANCE

Expand Down
2 changes: 1 addition & 1 deletion cilium/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
import pytest

from datadog_checks.base.utils.common import get_docker_hostname
from datadog_checks.base.utils.http_testing import MockHTTPResponse
from datadog_checks.cilium import CiliumCheck
from datadog_checks.dev import run_command
from datadog_checks.dev.conditions import WaitFor
from datadog_checks.dev.http import MockHTTPResponse
from datadog_checks.dev.kind import kind_run
from datadog_checks.dev.kube_port_forward import port_forward
from datadog_checks.dev.utils import get_active_env
Expand Down
2 changes: 1 addition & 1 deletion cisco_aci/datadog_checks/cisco_aci/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ def __init__(
self.sessions = {}

def close(self):
self.http.session.close()
self.http.close()

def setup_cert_login(self, aci_url):
session_wrapper = self.wrapper_factory(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import yaml

from datadog_checks.base import AgentCheck, ConfigurationError
from datadog_checks.base.utils.http import requests

from .metrics import build_metric

Expand All @@ -26,7 +25,7 @@ def _safely_process_metrics_response(data: ResponseWrapper) -> dict[str, dict]:
# See https://github.com/yaml/pyyaml/issues/443
try:
return data.json()
except (requests.exceptions.JSONDecodeError, StdJSONDecodeError):
except StdJSONDecodeError:
return yaml.load(data.content, Loader=yaml.SafeLoader)


Expand Down
2 changes: 1 addition & 1 deletion citrix_hypervisor/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

import pytest

from datadog_checks.base.utils.http_testing import MockHTTPResponse
from datadog_checks.dev import docker_run
from datadog_checks.dev.http import MockHTTPResponse

from . import common

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
from typing import Any, Dict, Generator, Tuple # noqa: F401
from urllib.parse import urlparse

from requests.exceptions import HTTPError as RequestsHTTPError
from requests.exceptions import RequestException
from semver import VersionInfo

from datadog_checks.base import AgentCheck
Expand Down Expand Up @@ -66,12 +64,12 @@ def discover_api(self):
self.log.info("Discovering Cloud Foundry API version and authentication endpoint")
try:
res = self.http.get(self._api_url)
except (RequestException, HTTPError):
except HTTPError:
self.log.exception("Error connecting to the API server")
raise
try:
res.raise_for_status()
except (RequestsHTTPError, HTTPStatusError):
except HTTPStatusError:
self.log.exception("Error querying API information: response: %s", res.text)
raise
try:
Expand Down Expand Up @@ -116,13 +114,13 @@ def get_oauth_token(self):
auth=(self._client_id, self._client_secret), # SKIP_HTTP_VALIDATION`
params={"grant_type": "client_credentials"},
)
except (RequestException, HTTPError):
except HTTPError:
self.log.exception("Error connecting to the UAA server")
self.service_check(UAA_SERVICE_CHECK_NAME, CloudFoundryApiCheck.CRITICAL, tags=sc_tags)
raise
try:
res.raise_for_status()
except (RequestsHTTPError, HTTPStatusError):
except HTTPStatusError:
self.log.exception("Error authenticating to the UAA server: response: %s", res.text)
self.service_check(UAA_SERVICE_CHECK_NAME, CloudFoundryApiCheck.CRITICAL, tags=sc_tags)
raise
Expand Down Expand Up @@ -259,14 +257,14 @@ def scroll_api_pages(self, url, params, headers):
self.log.debug("Fetching events page %s", page)
try:
res = self.http.get(url, params=params, headers=headers)
except (RequestException, HTTPError):
except HTTPError:
self.log.exception("Error connecting to the Cloud Controller API: URL %s", url)
self.service_check(API_SERVICE_CHECK_NAME, CloudFoundryApiCheck.CRITICAL, tags=sc_tags)
raised = True
return
try:
res.raise_for_status()
except (RequestsHTTPError, HTTPStatusError):
except HTTPStatusError:
self.log.exception("Error querying Cloud Controller API: URL %s - response %s", url, res.text)
self.service_check(API_SERVICE_CHECK_NAME, CloudFoundryApiCheck.CRITICAL, tags=sc_tags)
raised = True
Expand Down
8 changes: 3 additions & 5 deletions consul/datadog_checks/consul/consul.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,10 @@
from time import time as timestamp
from urllib.parse import urljoin

import requests
from cachetools import TTLCache
from requests import HTTPError

from datadog_checks.base import ConfigurationError, OpenMetricsBaseCheck, is_affirmative
from datadog_checks.base.utils.http_exceptions import HTTPTimeoutError
from datadog_checks.base.utils.http_exceptions import HTTPStatusError, HTTPTimeoutError
from datadog_checks.base.utils.serialization import json

from .common import (
Expand Down Expand Up @@ -169,7 +167,7 @@ def consul_request(self, endpoint):

resp.raise_for_status()

except (requests.exceptions.Timeout, HTTPTimeoutError) as e:
except HTTPTimeoutError as e:
msg = 'Consul request to {} timed out'.format(url)
self.log.exception(msg)
self.service_check(
Expand Down Expand Up @@ -724,7 +722,7 @@ def _check_prometheus_endpoint(self):
"Update Consul or set back `use_prometheus_endpoint` to false to remove this warning. %s",
str(e),
)
except HTTPError as e:
except HTTPStatusError as e:
if e.response.status_code == 404:
self.log.warning(
"This Consul version (< 1.1.0) does not support the prometheus endpoint. "
Expand Down
7 changes: 3 additions & 4 deletions control_m/datadog_checks/control_m/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
if TYPE_CHECKING:
from collections.abc import Callable

from requests import Response

from datadog_checks.base import AgentCheck
from datadog_checks.base.utils.http_protocol import HTTPResponse


class ControlMClient:
Expand Down Expand Up @@ -116,7 +115,7 @@ def ensure_token(self) -> None:
self._log.info("Refreshing Control-M API token")
self.login()

def request(self, method: str, url: str, **kwargs: Any) -> Response:
def request(self, method: str, url: str, **kwargs: Any) -> HTTPResponse:
# Route the request through static token or session login, with 401 fallback.
request_fn = getattr(self._http, method)

Expand All @@ -141,7 +140,7 @@ def request(self, method: str, url: str, **kwargs: Any) -> Response:
self._static_token_retry_after = time.monotonic() + self._static_token_retry_interval
return self._session_request(request_fn, url, **kwargs)

def _session_request(self, request_fn: Callable[..., Response], url: str, **kwargs: Any) -> Response:
def _session_request(self, request_fn: Callable[..., HTTPResponse], url: str, **kwargs: Any) -> HTTPResponse:
# Used in session login mode only. Make a request to the API using the session token.
self.ensure_token()
extra = {"Authorization": f"Bearer {self._token}"}
Expand Down
10 changes: 4 additions & 6 deletions couch/datadog_checks/couch/couch.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@
import math
from urllib.parse import quote, urljoin

import requests

from datadog_checks.base import AgentCheck
from datadog_checks.base.errors import CheckException, ConfigurationError
from datadog_checks.base.utils.headers import headers
from datadog_checks.base.utils.http_exceptions import HTTPTimeoutError
from datadog_checks.base.utils.http_exceptions import HTTPStatusError, HTTPTimeoutError
from datadog_checks.couch import errors


Expand Down Expand Up @@ -44,15 +42,15 @@ def get(self, url, service_check_tags, run_check=False):
AgentCheck.OK,
tags=service_check_tags,
)
except (requests.exceptions.Timeout, HTTPTimeoutError) as e:
except HTTPTimeoutError as e:
self.service_check(
self.SERVICE_CHECK_NAME,
AgentCheck.CRITICAL,
tags=service_check_tags,
message="Request timeout: {0}, {1}".format(url, e),
)
raise
except requests.exceptions.HTTPError as e:
except HTTPStatusError as e:
self.service_check(self.SERVICE_CHECK_NAME, AgentCheck.CRITICAL, tags=service_check_tags, message=str(e))
raise
except Exception as e:
Expand Down Expand Up @@ -176,7 +174,7 @@ def get_data(self, server, tags):
db_stats = None
try:
db_stats = self.agent_check.get(url, tags)
except requests.exceptions.HTTPError as e:
except HTTPStatusError as e:
couchdb['databases'][dbName] = None
if (e.response.status_code == 403) or (e.response.status_code == 401):
self.db_exclude[server].append(dbName)
Expand Down
Loading
Loading