diff --git a/ddtrace/internal/flare/_subscribers.py b/ddtrace/internal/flare/_subscribers.py index 29ea0bea658..046f51b0105 100644 --- a/ddtrace/internal/flare/_subscribers.py +++ b/ddtrace/internal/flare/_subscribers.py @@ -36,7 +36,7 @@ def has_stale_flare(self) -> bool: return flare_age >= stale_age return False - def _get_data_from_connector_and_exec(self): + def _get_data_from_connector_and_exec(self, _=None): if self.has_stale_flare(): log.info( "Tracer flare request started at %s is stale, reverting " @@ -67,6 +67,7 @@ def _get_data_from_connector_and_exec(self): str(self.current_request_start), ) continue + log.info("Preparing tracer flare") if _prepare_tracer_flare(self.flare, configs): self.current_request_start = datetime.now() elif product_type == "AGENT_TASK": @@ -75,7 +76,8 @@ def _get_data_from_connector_and_exec(self): if self.current_request_start is None: log.warning("There is no tracer flare job to complete. Skipping new request.") continue + log.info("Generating and sending tracer flare") if _generate_tracer_flare(self.flare, configs): self.current_request_start = None else: - log.debug("Received unexpected product type for tracer flare: {}", product_type) + log.warning("Received unexpected product type for tracer flare: {}", product_type) diff --git a/ddtrace/internal/flare/flare.py b/ddtrace/internal/flare/flare.py index b37d6e8e013..5f9a582ae29 100644 --- a/ddtrace/internal/flare/flare.py +++ b/ddtrace/internal/flare/flare.py @@ -98,7 +98,6 @@ def send(self, flare_send_req: FlareSendRequest): before sending the flare. """ self.revert_configs() - # We only want the flare to be sent once, even if there are # multiple tracer instances lock_path = self.flare_dir / TRACER_FLARE_LOCK diff --git a/ddtrace/internal/flare/handler.py b/ddtrace/internal/flare/handler.py index 75ddac35188..efc5e872cb8 100644 --- a/ddtrace/internal/flare/handler.py +++ b/ddtrace/internal/flare/handler.py @@ -30,6 +30,7 @@ def __init__(self, callback: Callable, flare: Flare): def _handle_tracer_flare(flare: Flare, data: dict, cleanup: bool = False): if cleanup: + log.info("Reverting tracer flare configurations and cleaning up any generated files") flare.revert_configs() flare.clean_up_files() return @@ -51,7 +52,7 @@ def _handle_tracer_flare(flare: Flare, data: dict, cleanup: bool = False): log.warning("Received unexpected tracer flare product type: %s", product_type) -def _prepare_tracer_flare(flare: Flare, configs: List[dict]) -> bool: +def _prepare_tracer_flare(flare: Flare, configs: List[Any]) -> bool: """ Update configurations to start sending tracer logs to a file to be sent in a flare later. @@ -60,7 +61,13 @@ def _prepare_tracer_flare(flare: Flare, configs: List[dict]) -> bool: # AGENT_CONFIG is currently being used for multiple purposes # We only want to prepare for a tracer flare if the config name # starts with 'flare-log-level' + if not isinstance(c, dict): + log.debug("Config item is not type dict, received type %s instead. Skipping...", str(type(c))) + continue if not c.get("name", "").startswith("flare-log-level"): + log.debug( + "Config item name does not start with flare-log-level, received %s instead. Skipping...", c.get("name") + ) continue flare_log_level = c.get("config", {}).get("log_level").upper() @@ -78,7 +85,14 @@ def _generate_tracer_flare(flare: Flare, configs: List[Any]) -> bool: # AGENT_TASK is currently being used for multiple purposes # We only want to generate the tracer flare if the task_type is # 'tracer_flare' - if type(c) != dict or c.get("task_type") != "tracer_flare": + if not isinstance(c, dict): + log.debug("Config item is not type dict, received type %s instead. Skipping...", str(type(c))) + continue + if c.get("task_type") != "tracer_flare": + log.debug( + "Config item does not have the expected task_type. Expected [tracer_flare], received [%s]. Skipping...", + c.get("task_type"), + ) continue args = c.get("args", {}) flare_request = FlareSendRequest( diff --git a/releasenotes/notes/fix-tracer-flare-e4003d01b434267a.yaml b/releasenotes/notes/fix-tracer-flare-e4003d01b434267a.yaml new file mode 100644 index 00000000000..d3f8c7a3a99 --- /dev/null +++ b/releasenotes/notes/fix-tracer-flare-e4003d01b434267a.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + tracing(flare): Resolves the issue where tracer flares would not be generated if unexpected + types were received in the AGENT_CONFIG remote configuration product. diff --git a/tests/internal/test_tracer_flare.py b/tests/internal/test_tracer_flare.py index af8237c92e4..02a9684d3d5 100644 --- a/tests/internal/test_tracer_flare.py +++ b/tests/internal/test_tracer_flare.py @@ -234,7 +234,7 @@ def write(self): class TracerFlareSubscriberTests(TestCase): - agent_config = [{"name": "flare-log-level", "config": {"log_level": "DEBUG"}}] + agent_config = [False, {"name": "flare-log-level", "config": {"log_level": "DEBUG"}}] agent_task = [ False, {