AAP-60452 Remove the dynamic log level filter for the dispatcherd main process (#16200)

* Remove the dynamic filter on dispatcher startup

Configure the dynamic logging level only on startup

* Special case for log level on settings change

* Add unit test for new behavior

* Add test for initial config

* Mark test django DB

* Do necessary requirement bump

* Delete cache in live test fixture
This commit is contained in:
Alan Rominger
2026-01-02 15:45:06 -05:00
committed by GitHub
parent 40059512d8
commit 48c7534b57
5 changed files with 103 additions and 2 deletions

View File

@@ -1,10 +1,15 @@
import copy
import json
import logging
import os
import tempfile
import shutil
from unittest import mock
import pytest
from awx.main.tasks.system import CleanupImagesAndFiles, execution_node_health_check, inspect_established_receptor_connections
from awx.main.tasks.system import CleanupImagesAndFiles, execution_node_health_check, inspect_established_receptor_connections, clear_setting_cache
from awx.main.management.commands.run_dispatcher import Command
from awx.main.models import Instance, Job, ReceptorAddress, InstanceLink
@@ -98,3 +103,64 @@ def test_folder_cleanup_multiple_running_jobs(job_folder_factory, me_inst):
CleanupImagesAndFiles.run(grace_period=0)
assert [os.path.exists(d) for d in dirs] == [True for i in range(num_jobs)]
@pytest.mark.django_db
def test_clear_setting_cache_log_level_branch(settings):
settings.LOG_AGGREGATOR_LEVEL = 'DEBUG'
settings.CLUSTER_HOST_ID = 'control-node'
published_messages = []
class DummyBroker:
def publish_message(self, channel, message):
published_messages.append((channel, message))
def close(self):
pass
dummy_broker = DummyBroker()
with mock.patch('dispatcherd.control.get_broker', return_value=dummy_broker) as mock_get_broker:
clear_setting_cache(['LOG_AGGREGATOR_LEVEL'])
mock_get_broker.assert_called_once()
assert published_messages, 'control command was not sent through the broker'
queue, payload = published_messages[-1]
assert queue == 'control-node'
body = json.loads(payload)
assert body['control'] == 'set_log_level'
assert body['control_data'] == {'level': 'DEBUG'}
@pytest.mark.django_db
def test_configure_dispatcher_logging_updates_level(settings):
original_logging_settings = copy.deepcopy(settings.LOGGING)
settings.LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'dynamic_level_filter': {
'()': 'logging.Filter',
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'filters': ['dynamic_level_filter'],
'stream': 'ext://sys.stdout',
}
},
'loggers': {
'dispatcherd': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
}
},
}
settings.LOG_AGGREGATOR_LEVEL = 'WARNING'
Command().configure_dispatcher_logging()
assert logging.getLogger('dispatcherd').level == logging.WARNING
settings.LOGGING = original_logging_settings

View File

@@ -8,6 +8,7 @@ import logging
import pytest
from django.conf import settings
from django.core.cache import cache
from awx.api.versioning import reverse
@@ -60,6 +61,7 @@ def live_tmp_folder():
subprocess.run(GIT_COMMANDS, cwd=source_dir, shell=True)
if path not in settings.AWX_ISOLATION_SHOW_PATHS:
settings.AWX_ISOLATION_SHOW_PATHS = settings.AWX_ISOLATION_SHOW_PATHS + [path]
cache.delete_many(['AWX_ISOLATION_SHOW_PATHS'])
return path