From f771b2ef49b0afd3aeb265aadbe58ee4816d61e0 Mon Sep 17 00:00:00 2001 From: Pankaj Koti Date: Thu, 18 Dec 2025 13:54:53 +0000 Subject: [PATCH 1/2] Replace map_index with is_mapped_task boolean Change task telemetry to emit is_mapped_task boolean instead of raw map_index integer value for better privacy and clearer intent --- cosmos/listeners/task_instance_listener.py | 2 +- tests/listeners/test_task_instance_listener.py | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/cosmos/listeners/task_instance_listener.py b/cosmos/listeners/task_instance_listener.py index 0a64c3a61a..b81c761325 100644 --- a/cosmos/listeners/task_instance_listener.py +++ b/cosmos/listeners/task_instance_listener.py @@ -119,7 +119,7 @@ def _build_task_metrics(task_instance: TaskInstance, status: str) -> dict[str, o "is_cosmos_operator_subclass": _is_cosmos_subclass(task_instance), "invocation_mode": _invocation_mode(task_instance), "execution_mode": _execution_mode_from_task(task_instance), - "map_index": task_instance.map_index, + "is_mapped_task": task_instance.map_index >= 0, } dbt_command = _dbt_command(task_instance) diff --git a/tests/listeners/test_task_instance_listener.py b/tests/listeners/test_task_instance_listener.py index bbf6de6184..3f052837eb 100644 --- a/tests/listeners/test_task_instance_listener.py +++ b/tests/listeners/test_task_instance_listener.py @@ -94,9 +94,19 @@ def test_build_task_metrics_records_core_fields(): assert metrics["invocation_mode"] == InvocationMode.DBT_RUNNER.value assert metrics["execution_mode"] == "local" assert metrics["is_cosmos_operator_subclass"] is False + assert metrics["is_mapped_task"] is False assert metrics["dag_run_id"] == "run-1" +def test_build_task_metrics_detects_mapped_task(): + operator = DummyDbtOperator() + ti = _make_task_instance(operator, map_index=2) + + metrics = task_instance_listener._build_task_metrics(ti, status="success") + + assert metrics["is_mapped_task"] is True + + def test_build_task_metrics_ignores_missing_install_deps(): operator = DummyDbtOperatorNoDeps() ti = _make_task_instance(operator) From 9ec4bdf185bcc37445c3fff0ad92912db967ce62 Mon Sep 17 00:00:00 2001 From: Pankaj Koti Date: Thu, 18 Dec 2025 14:04:32 +0000 Subject: [PATCH 2/2] Add comment explaining is_mapped_task logic --- cosmos/listeners/task_instance_listener.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cosmos/listeners/task_instance_listener.py b/cosmos/listeners/task_instance_listener.py index b81c761325..75381e81cd 100644 --- a/cosmos/listeners/task_instance_listener.py +++ b/cosmos/listeners/task_instance_listener.py @@ -119,6 +119,7 @@ def _build_task_metrics(task_instance: TaskInstance, status: str) -> dict[str, o "is_cosmos_operator_subclass": _is_cosmos_subclass(task_instance), "invocation_mode": _invocation_mode(task_instance), "execution_mode": _execution_mode_from_task(task_instance), + # map_index is -1 for non-mapped tasks, >= 0 for mapped tasks "is_mapped_task": task_instance.map_index >= 0, }