diff --git a/cosmos/listeners/task_instance_listener.py b/cosmos/listeners/task_instance_listener.py index 0a64c3a61a..75381e81cd 100644 --- a/cosmos/listeners/task_instance_listener.py +++ b/cosmos/listeners/task_instance_listener.py @@ -119,7 +119,8 @@ 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, + # map_index is -1 for non-mapped tasks, >= 0 for mapped tasks + "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)