diff --git a/CHANGELOG.md b/CHANGELOG.md index e65f7f4ba..fa330bdca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## Unreleased +* [Fixed] Fix missing transport attribute when flushing telemetry. + ## v0.52.0 / 2025-07-08 * [Added] Add Cardinality common field. See [#883](https://github.com/DataDog/datadogpy/pull/883) diff --git a/datadog/dogstatsd/base.py b/datadog/dogstatsd/base.py index 84c1500f7..5f9bd2f63 100644 --- a/datadog/dogstatsd/base.py +++ b/datadog/dogstatsd/base.py @@ -534,6 +534,7 @@ def socket(self, new_socket): except AttributeError: # _socket can't have a type if it doesn't have sockopts log.info("Unexpected socket provided with no support for getsockopt") self._socket_kind = None + self._transport = "udp" # When the socket is None, we use the UDP optimal payload length self._max_payload_size = UDP_OPTIMAL_PAYLOAD_LENGTH diff --git a/tests/unit/dogstatsd/test_statsd.py b/tests/unit/dogstatsd/test_statsd.py index 0e1ee688d..6b2da3b17 100644 --- a/tests/unit/dogstatsd/test_statsd.py +++ b/tests/unit/dogstatsd/test_statsd.py @@ -2192,3 +2192,21 @@ def send(self, _): statsd.increment("test", 1) assert statsd.socket is not None + + def test_transport_attribute_present_on_connection_error(self): + """ + Ensure `_transport` attribute is present for telemetry even if the socket is None. + """ + # This test will fail with an AttributeError before the fix. + # Use a non-resolvable host to trigger a connection error. + statsd = DogStatsd( + host='non.existent.host.datadog.internal', + telemetry_min_flush_interval=0 # Flush telemetry immediately + ) + + # This call will attempt to send a metric, fail to create a socket, + # and then attempt to send telemetry, which requires `_transport`. + statsd.gauge('test.metric', 1) + + assert statsd.socket is None + assert statsd._transport is not None \ No newline at end of file