Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
100 changes: 45 additions & 55 deletions packages/google-auth/google/auth/_regional_access_boundary_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,10 +219,9 @@ def start_blocking_refresh(self, credentials, request):
"""
# Async credentials do not support blocking lookups.
if inspect.iscoroutinefunction(credentials._lookup_regional_access_boundary):
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Blocking Regional Access Boundary lookup is not supported for async credentials."
)
_LOGGER.info(
"Blocking Regional Access Boundary lookup is not supported for async credentials."
)
self.process_regional_access_boundary_info(None)
return

Expand All @@ -234,12 +233,11 @@ def start_blocking_refresh(self, credentials, request):
credentials._lookup_regional_access_boundary(request, fail_fast=True)
)
except Exception as e:
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Blocking Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
_LOGGER.info(
"Blocking Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
regional_access_boundary_info = None

self.process_regional_access_boundary_info(regional_access_boundary_info)
Expand All @@ -265,12 +263,11 @@ async def start_blocking_refresh_async(self, credentials, request):
)
)
except Exception as e:
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
_LOGGER.info(
"Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
regional_access_boundary_info = None

self.process_regional_access_boundary_info(regional_access_boundary_info)
Expand All @@ -297,14 +294,12 @@ def process_regional_access_boundary_info(self, regional_access_boundary_info):
cooldown_expiry=None,
cooldown_duration=DEFAULT_REGIONAL_ACCESS_BOUNDARY_COOLDOWN,
)
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.debug("Regional Access Boundary lookup successful.")
_LOGGER.info("Regional Access Boundary lookup successful.")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This change promotes the successful lookup log from DEBUG to INFO, which increases log noise for the happy path. Since the goal of this PR is to reduce log noise, successful lookups should remain at the DEBUG level.

Suggested change
_LOGGER.info("Regional Access Boundary lookup successful.")
_LOGGER.debug("Regional Access Boundary lookup successful.")

else:
# On failure, calculate cooldown and update state.
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Regional Access Boundary lookup failed. Entering cooldown."
)
_LOGGER.info(
"Regional Access Boundary lookup failed. Entering cooldown."
)

next_cooldown_expiry = (
_helpers.utcnow() + current_data.cooldown_duration
Expand Down Expand Up @@ -367,12 +362,11 @@ def run(self):
self._credentials._lookup_regional_access_boundary(self._request)
)
except Exception as e:
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Asynchronous Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
_LOGGER.info(
"Asynchronous Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
regional_access_boundary_info = None

self._rab_manager.process_regional_access_boundary_info(
Expand Down Expand Up @@ -419,13 +413,12 @@ def start_refresh(self, credentials, request, rab_manager):
try:
copied_request = copy.deepcopy(request)
except Exception as e:
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Could not deepcopy transport for background RAB refresh. "
"Skipping background refresh to avoid thread safety issues. "
"Exception: %s",
e,
)
_LOGGER.info(
"Could not deepcopy transport for background RAB refresh. "
"Skipping background refresh to avoid thread safety issues. "
"Exception: %s",
e,
)
return

self._worker = _RegionalAccessBoundaryRefreshThread(
Expand Down Expand Up @@ -479,14 +472,13 @@ async def _close_cloned_request(lookup_request, is_cloned):
if is_async := inspect.isawaitable(maybe_coro):
await maybe_coro
except Exception as e:
if _helpers.is_logging_enabled(_LOGGER):
adapter_type = " asynchronous " if is_async else " "
_LOGGER.warning(
"Failed to cleanly close cloned%srequest transport: %s",
adapter_type,
e,
exc_info=True,
)
adapter_type = " asynchronous " if is_async else " "
_LOGGER.info(
"Failed to cleanly close cloned%srequest transport: %s",
adapter_type,
e,
exc_info=True,
)


class _AsyncRegionalAccessBoundaryRefreshManager(object):
Expand Down Expand Up @@ -532,12 +524,11 @@ def start_refresh(self, credentials, request, rab_manager):
is_cloned,
) = _prepare_async_lookup_callable(request)
except Exception as e:
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Synchronous cloning of request for Regional Access Boundary lookup failed: %s",
e,
exc_info=True,
)
_LOGGER.info(
"Synchronous cloning of request for Regional Access Boundary lookup failed: %s",
e,
exc_info=True,
)
rab_manager.process_regional_access_boundary_info(None)
return

Expand All @@ -549,12 +540,11 @@ async def _worker():
)
)
except Exception as e:
if _helpers.is_logging_enabled(_LOGGER):
_LOGGER.warning(
"Asynchronous Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
_LOGGER.info(
"Asynchronous Regional Access Boundary lookup raised an exception: %s",
e,
exc_info=True,
)
regional_access_boundary_info = None
finally:
await _close_cloned_request(lookup_request, is_cloned)
Expand Down
2 changes: 1 addition & 1 deletion packages/google-auth/google/auth/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -535,7 +535,7 @@ def _lookup_regional_access_boundary(

url = self._build_regional_access_boundary_lookup_url(request=request)
if not url:
_LOGGER.warning("Failed to build Regional Access Boundary lookup URL.")
_LOGGER.info("Failed to build Regional Access Boundary lookup URL.")
return None

headers: Dict[str, str] = {}
Expand Down
2 changes: 1 addition & 1 deletion packages/google-auth/google/oauth2/_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -582,7 +582,7 @@ def _lookup_regional_access_boundary_request(
request, url, can_retry=can_retry, headers=headers, fail_fast=fail_fast
)
if not response_status_ok:
_LOGGER.warning(
_LOGGER.info(
"Regional Access Boundary HTTP request failed after retries: response_data=%s, retryable_error=%s",
response_data,
retryable_error,
Expand Down
2 changes: 1 addition & 1 deletion packages/google-auth/google/oauth2/_client_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ async def _lookup_regional_access_boundary_request(
request, url, can_retry=can_retry, headers=headers, fail_fast=fail_fast
)
if not response_status_ok:
client._LOGGER.warning(
client._LOGGER.info(
"Regional Access Boundary HTTP request failed after retries: response_data=%s, retryable_error=%s",
response_data,
retryable_error,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
# limitations under the License.

import datetime
import logging
from unittest import mock

import pytest # type: ignore
Expand All @@ -24,6 +25,21 @@
from google.oauth2 import credentials as oauth2_credentials


@pytest.fixture
def rab_caplog(caplog):
"""Fixture to configure logging capture and ensure propagation for RAB utilities."""

caplog.set_level(logging.INFO, logger="google.auth._regional_access_boundary_utils")

google_logger = logging.getLogger("google")
original_propagate = google_logger.propagate
google_logger.propagate = True
try:
yield caplog
finally:
google_logger.propagate = original_propagate


class CredentialsImpl(credentials.CredentialsWithRegionalAccessBoundary):
def __init__(self, universe_domain=None):
super(CredentialsImpl, self).__init__()
Expand Down Expand Up @@ -379,7 +395,7 @@ def test_lookup_regional_access_boundary_success(self, mock_lookup_rab):
assert rab_manager._data.cooldown_expiry is None

@mock.patch.object(CredentialsImpl, "_lookup_regional_access_boundary")
def test_lookup_regional_access_boundary_failure(self, mock_lookup_rab):
def test_lookup_regional_access_boundary_failure(self, mock_lookup_rab, rab_caplog):
creds = CredentialsImpl()
request = mock.Mock()
rab_manager = _regional_access_boundary_utils._RegionalAccessBoundaryManager()
Expand All @@ -396,6 +412,14 @@ def test_lookup_regional_access_boundary_failure(self, mock_lookup_rab):
assert rab_manager._data.expiry is None
assert rab_manager._data.cooldown_expiry is not None

assert (
"Regional Access Boundary lookup failed. Entering cooldown."
in rab_caplog.text
)
# RAB failures should be logged at INFO level.
warning_logs = [t for t in rab_caplog.record_tuples if t[1] == logging.WARNING]
assert not warning_logs, f"Unexpected warnings emitted: {warning_logs}"

def test_lookup_regional_access_boundary_null_url(self):
creds = oauth2_credentials.Credentials(token="token")
request = mock.Mock()
Expand Down Expand Up @@ -441,7 +465,9 @@ def test_regional_access_boundary_refresh_thread_run_success(self, mock_utcnow):
assert rab_manager._data.cooldown_expiry is None

@mock.patch("google.auth._helpers.utcnow")
def test_regional_access_boundary_refresh_thread_run_failure(self, mock_utcnow):
def test_regional_access_boundary_refresh_thread_run_failure(
self, mock_utcnow, rab_caplog
):
mock_now = datetime.datetime(2025, 1, 1, 12, 0, 0)
mock_utcnow.return_value = mock_now

Expand All @@ -466,6 +492,18 @@ def test_regional_access_boundary_refresh_thread_run_failure(self, mock_utcnow):
assert rab_manager._data.cooldown_expiry == expected_cooldown_expiry
assert rab_manager._data.cooldown_duration == initial_cooldown * 2

assert (
"Asynchronous Regional Access Boundary lookup raised an exception"
in rab_caplog.text
)
assert (
"Regional Access Boundary lookup failed. Entering cooldown."
in rab_caplog.text
)
# RAB failures should be logged at INFO level.
warning_logs = [t for t in rab_caplog.record_tuples if t[1] == logging.WARNING]
assert not warning_logs, f"Unexpected warnings emitted: {warning_logs}"

@mock.patch("google.auth._helpers.utcnow")
def test_regional_access_boundary_refresh_thread_run_failure_hard_expiry(
self, mock_utcnow
Expand Down
Loading