Prevent log flooding in frame helper (#61085)

Co-authored-by: epenet <epenet@users.noreply.github.com>
This commit is contained in:
epenet 2021-12-07 00:26:31 +01:00 committed by GitHub
parent 4aa7f36a53
commit b8b4855b8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 0 deletions

View File

@ -12,6 +12,9 @@ from homeassistant.exceptions import HomeAssistantError
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
# Keep track of integrations already reported to prevent flooding
_REPORTED_INTEGRATIONS: set[str] = set()
CALLABLE_T = TypeVar("CALLABLE_T", bound=Callable) # pylint: disable=invalid-name CALLABLE_T = TypeVar("CALLABLE_T", bound=Callable) # pylint: disable=invalid-name
@ -85,6 +88,12 @@ def report_integration(
""" """
found_frame, integration, path = integration_frame found_frame, integration, path = integration_frame
# Keep track of integrations already reported to prevent flooding
key = f"{found_frame.filename}:{found_frame.lineno}"
if key in _REPORTED_INTEGRATIONS:
return
_REPORTED_INTEGRATIONS.add(key)
index = found_frame.filename.index(path) index = found_frame.filename.index(path)
if path == "custom_components/": if path == "custom_components/":
extra = " to the custom component author" extra = " to the custom component author"

View File

@ -1,4 +1,5 @@
"""Test the frame helper.""" """Test the frame helper."""
# pylint: disable=protected-access
from unittest.mock import Mock, patch from unittest.mock import Mock, patch
import pytest import pytest
@ -70,3 +71,24 @@ async def test_extract_frame_no_integration(caplog):
], ],
), pytest.raises(frame.MissingIntegrationFrame): ), pytest.raises(frame.MissingIntegrationFrame):
frame.get_integration_frame() frame.get_integration_frame()
@pytest.mark.usefixtures("mock_integration_frame")
@patch.object(frame, "_REPORTED_INTEGRATIONS", set())
async def test_prevent_flooding(caplog):
"""Test to ensure a report is only written once to the log."""
what = "accessed hi instead of hello"
key = "/home/paulus/homeassistant/components/hue/light.py:23"
frame.report(what, error_if_core=False)
assert what in caplog.text
assert key in frame._REPORTED_INTEGRATIONS
assert len(frame._REPORTED_INTEGRATIONS) == 1
caplog.clear()
frame.report(what, error_if_core=False)
assert what not in caplog.text
assert key in frame._REPORTED_INTEGRATIONS
assert len(frame._REPORTED_INTEGRATIONS) == 1