Skip to content

Commit 2b45814

Browse files
committed
raise CB only for 429/503
Signed-off-by: Nikhil Suri <[email protected]>
1 parent b527e7c commit 2b45814

File tree

5 files changed

+10
-52
lines changed

5 files changed

+10
-52
lines changed

src/databricks/sql/exc.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,5 +131,3 @@ class CursorAlreadyClosedError(RequestError):
131131
class TelemetryRateLimitError(Exception):
132132
"""Raised when telemetry endpoint returns 429 or 503, indicating rate limiting or service unavailable.
133133
This exception is used exclusively by the circuit breaker to track telemetry rate limiting events."""
134-
135-
pass

src/databricks/sql/telemetry/circuit_breaker_manager.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -179,16 +179,3 @@ def _create_noop_circuit_breaker(cls) -> CircuitBreaker:
179179
name="noop-circuit-breaker",
180180
)
181181
return breaker
182-
183-
184-
def is_circuit_breaker_error(exception: Exception) -> bool:
185-
"""
186-
Check if an exception is a circuit breaker error.
187-
188-
Args:
189-
exception: The exception to check
190-
191-
Returns:
192-
True if the exception is a circuit breaker error
193-
"""
194-
return isinstance(exception, CircuitBreakerError)

src/databricks/sql/telemetry/telemetry_client.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -272,23 +272,14 @@ def _send_telemetry(self, events):
272272
logger.debug("Failed to submit telemetry request: %s", e)
273273

274274
def _send_with_unified_client(self, url, data, headers, timeout=900):
275-
"""
276-
Helper method to send telemetry using the telemetry push client.
277-
278-
The push client implementation handles circuit breaker logic internally,
279-
so this method just forwards the request and handles any errors generically.
280-
"""
275+
"""Helper method to send telemetry using the unified HTTP client."""
281276
try:
282277
response = self._telemetry_push_client.request(
283278
HttpMethod.POST, url, body=data, headers=headers, timeout=timeout
284279
)
285280
return response
286281
except Exception as e:
287-
logger.debug(
288-
"Failed to send telemetry for connection %s: %s",
289-
self._session_id_hex,
290-
e,
291-
)
282+
logger.error("Failed to send telemetry with unified client: %s", e)
292283
raise
293284

294285
def _telemetry_request_callback(self, future, sent_count: int):

src/databricks/sql/telemetry/telemetry_push_client.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@
1919
from databricks.sql.common.unified_http_client import UnifiedHttpClient
2020
from databricks.sql.common.http import HttpMethod
2121
from databricks.sql.exc import TelemetryRateLimitError, RequestError
22-
from databricks.sql.telemetry.circuit_breaker_manager import (
23-
CircuitBreakerManager,
24-
is_circuit_breaker_error,
25-
)
22+
from databricks.sql.telemetry.circuit_breaker_manager import CircuitBreakerManager
2623

2724
logger = logging.getLogger(__name__)
2825

tests/unit/test_circuit_breaker_manager.py

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from databricks.sql.telemetry.circuit_breaker_manager import (
1111
CircuitBreakerManager,
12-
is_circuit_breaker_error,
12+
CircuitBreakerConfig,
1313
DEFAULT_MINIMUM_CALLS as MINIMUM_CALLS,
1414
DEFAULT_RESET_TIMEOUT as RESET_TIMEOUT,
1515
DEFAULT_NAME as CIRCUIT_BREAKER_NAME,
@@ -24,10 +24,13 @@ def setup_method(self):
2424
"""Set up test fixtures."""
2525
# Clear any existing instances
2626
CircuitBreakerManager._instances.clear()
27+
# Initialize with default config
28+
CircuitBreakerManager.initialize(CircuitBreakerConfig())
2729

2830
def teardown_method(self):
2931
"""Clean up after tests."""
3032
CircuitBreakerManager._instances.clear()
33+
CircuitBreakerManager._config = None
3134

3235
def test_get_circuit_breaker_creates_instance(self):
3336
"""Test getting circuit breaker creates instance with correct config."""
@@ -83,37 +86,19 @@ def get_breaker(host):
8386
assert all(b is host0_breakers[0] for b in host0_breakers)
8487

8588

86-
class TestCircuitBreakerErrorDetection:
87-
"""Test cases for circuit breaker error detection."""
88-
89-
def test_is_circuit_breaker_error_true(self):
90-
"""Test detecting circuit breaker errors."""
91-
error = CircuitBreakerError("Circuit breaker is open")
92-
assert is_circuit_breaker_error(error) is True
93-
94-
def test_is_circuit_breaker_error_false(self):
95-
"""Test detecting non-circuit breaker errors."""
96-
error = ValueError("Some other error")
97-
assert is_circuit_breaker_error(error) is False
98-
99-
error = RuntimeError("Another error")
100-
assert is_circuit_breaker_error(error) is False
101-
102-
def test_is_circuit_breaker_error_none(self):
103-
"""Test with None input."""
104-
assert is_circuit_breaker_error(None) is False
105-
106-
10789
class TestCircuitBreakerIntegration:
10890
"""Integration tests for circuit breaker functionality."""
10991

11092
def setup_method(self):
11193
"""Set up test fixtures."""
11294
CircuitBreakerManager._instances.clear()
95+
# Initialize with default config
96+
CircuitBreakerManager.initialize(CircuitBreakerConfig())
11397

11498
def teardown_method(self):
11599
"""Clean up after tests."""
116100
CircuitBreakerManager._instances.clear()
101+
CircuitBreakerManager._config = None
117102

118103
def test_circuit_breaker_state_transitions(self):
119104
"""Test circuit breaker state transitions."""

0 commit comments

Comments
 (0)