mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Prevent log flooding in frame helper (#61085)
Co-authored-by: epenet <epenet@users.noreply.github.com>
This commit is contained in:
parent
4aa7f36a53
commit
b8b4855b8e
@ -12,6 +12,9 @@ from homeassistant.exceptions import HomeAssistantError
|
||||
|
||||
_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
|
||||
|
||||
|
||||
@ -85,6 +88,12 @@ def report_integration(
|
||||
"""
|
||||
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)
|
||||
if path == "custom_components/":
|
||||
extra = " to the custom component author"
|
||||
|
@ -1,4 +1,5 @@
|
||||
"""Test the frame helper."""
|
||||
# pylint: disable=protected-access
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
import pytest
|
||||
@ -70,3 +71,24 @@ async def test_extract_frame_no_integration(caplog):
|
||||
],
|
||||
), pytest.raises(frame.MissingIntegrationFrame):
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user