Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 33 additions & 26 deletions src/instana/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ def set_trace_configurations(self) -> None:
"trace_correlation", True
)

if "INSTANA_ASYNCIO_TASK_CONTEXT_PROPAGATION" in os.environ:
config["asyncio_task_context_propagation"]["enabled"] = is_truthy(
os.environ["INSTANA_ASYNCIO_TASK_CONTEXT_PROPAGATION"]
)

self.set_disable_trace_configurations()
self.set_stack_trace_configurations()
self.set_span_filter_configurations()
Expand Down Expand Up @@ -397,34 +402,10 @@ def set_tracing(self, tracing: Dict[str, Any]) -> None:
@return: None
"""
if "filter" in tracing and not self._has_high_priority_span_filter_source():
parsed = parse_filter_rules(tracing["filter"])
for policy in ("exclude", "include"):
rules = parsed.get(policy, [])
if rules:
if policy not in self.span_filters:
self.span_filters[policy] = []
self.span_filters[policy].extend(rules)
self._apply_agent_filter_config(tracing["filter"])

if "kafka" in tracing:
if (
"INSTANA_KAFKA_TRACE_CORRELATION" not in os.environ
and not (
isinstance(config.get("tracing"), dict)
and "kafka" in config["tracing"]
)
and "trace-correlation" in tracing["kafka"]
):
self.kafka_trace_correlation = is_truthy(
tracing["kafka"].get("trace-correlation", True)
)

if (
"header-format" in tracing["kafka"]
and tracing["kafka"]["header-format"] == "binary"
):
logger.warning(
"Binary header format for Kafka is deprecated. Please use string header format."
)
self._apply_agent_kafka_config(tracing["kafka"])

if "extra-http-headers" in tracing:
self.extra_http_headers = tracing["extra-http-headers"]
Expand All @@ -436,6 +417,32 @@ def set_tracing(self, tracing: Dict[str, Any]) -> None:
# Handle stack trace configuration from agent config
self.set_stack_trace_from_agent(tracing)

def _apply_agent_filter_config(self, filter_config: Any) -> None:
"""Apply span filter rules from agent config."""
parsed = parse_filter_rules(filter_config)
for policy in ("exclude", "include"):
rules = parsed.get(policy, [])
if rules:
if policy not in self.span_filters:
self.span_filters[policy] = []
self.span_filters[policy].extend(rules)

def _apply_agent_kafka_config(self, kafka_config: Dict[str, Any]) -> None:
"""Apply Kafka tracing configuration from agent config."""
no_env_override = "INSTANA_KAFKA_TRACE_CORRELATION" not in os.environ
no_code_override = not (
isinstance(config.get("tracing"), dict) and "kafka" in config["tracing"]
)
if no_env_override and no_code_override and "trace-correlation" in kafka_config:
self.kafka_trace_correlation = is_truthy(
kafka_config.get("trace-correlation", True)
)

if kafka_config.get("header-format") == "binary":
logger.warning(
"Binary header format for Kafka is deprecated. Please use string header format."
)

def _has_high_priority_span_filter_source(self) -> bool:
"""Return True if a higher-priority span filter source (env var, YAML, or in-code config)
has already been configured, in which case the agent-provided filter should be ignored."""
Expand Down
17 changes: 17 additions & 0 deletions tests/test_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -864,6 +864,23 @@ def test_tracing_filter_environment_variables(self) -> None:
],
}

def test_asyncio_task_context_propagation_default(self) -> None:
"""INSTANA_ASYNCIO_TASK_CONTEXT_PROPAGATION is False by default."""
self.base_options = BaseOptions()
assert config["asyncio_task_context_propagation"]["enabled"] is False

@patch.dict(os.environ, {"INSTANA_ASYNCIO_TASK_CONTEXT_PROPAGATION": "true"})
def test_asyncio_task_context_propagation_enabled_via_env(self) -> None:
"""INSTANA_ASYNCIO_TASK_CONTEXT_PROPAGATION=true enables the flag."""
self.base_options = BaseOptions()
assert config["asyncio_task_context_propagation"]["enabled"] is True

@patch.dict(os.environ, {"INSTANA_ASYNCIO_TASK_CONTEXT_PROPAGATION": "false"})
def test_asyncio_task_context_propagation_disabled_via_env(self) -> None:
"""INSTANA_ASYNCIO_TASK_CONTEXT_PROPAGATION=false keeps the flag disabled."""
self.base_options = BaseOptions()
assert config["asyncio_task_context_propagation"]["enabled"] is False


class TestStandardOptions:
@pytest.fixture(autouse=True)
Expand Down
Loading