Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(flare): handle non-dict AGENT_CONFIG products from RC #10985

Merged
merged 9 commits into from
Oct 17, 2024
6 changes: 4 additions & 2 deletions ddtrace/internal/flare/_subscribers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 "
Expand Down Expand Up @@ -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":
Expand All @@ -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)
1 change: 0 additions & 1 deletion ddtrace/internal/flare/flare.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 16 additions & 2 deletions ddtrace/internal/flare/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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.
Expand All @@ -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()
Expand All @@ -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(
Expand Down
5 changes: 5 additions & 0 deletions releasenotes/notes/fix-tracer-flare-e4003d01b434267a.yaml
Original file line number Diff line number Diff line change
@@ -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.
2 changes: 1 addition & 1 deletion tests/internal/test_tracer_flare.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
{
Expand Down
Loading