Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add task.execute detail span around task execute callable - #67877

Merged
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span
Jul 1, 2026
Merged

Add task.execute detail span around task execute callable#67877
dstandish merged 1 commit into
apache:mainfrom
astronomer:add-task-execute-detail-span

Conversation

@dstandish

Copy link
Copy Markdown
Contributor

Extracts the execute-callable invocation (including the execution-timeout wrapper) from _execute_task into a dedicated _run_execute_callable helper decorated with @detail_span("task.execute"). This emits a child span around the actual task execution when the task span detail level is greater than 1, giving finer-grained tracing of where time is spent within a task run.

Regular task failures mark the span as errored automatically via OpenTelemetry. AirflowTaskTimeout inherits from BaseException, which OpenTelemetry does not auto-record, so the timeout handler sets the span status to ERROR explicitly.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 4.8)

Generated-by: Claude Code (Opus 4.8) following the guidelines

Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py
Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py Outdated

@uranusjruranusjr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pending Kaxil’s feedback

Comment threadtask-sdk/tests/task_sdk/execution_time/test_task_runner.py
Comment threadtask-sdk/src/airflow/sdk/execution_time/task_runner.py

@kaxilkaxil left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM -- clean extraction, and the task.execute span now correctly nests the operator's child spans (verified the nesting mechanism end to end). Approving.

Two non-blocking questions left inline: the safeguard-tracker test doesn't assert tracker non-leakage (one extra assertion would pin it), and a confirm-intent note on the copy_context() snapshot now being taken after the pre-execute hooks. Neither gates merge. The timeout span-status follow-up is tracked in #69146.

When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
@dstandish
dstandishforce-pushed the add-task-execute-detail-span branch from e8eaacf to 68e21b7CompareJune 30, 2026 19:44
@dstandish
dstandish merged commit b006a97 into apache:mainJul 1, 2026
195 of 196 checks passed
@dstandish
dstandish deleted the add-task-execute-detail-span branch July 1, 2026 19:06
jason810496 added a commit that referenced this pull request Jul 2, 2026
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
github-actionsBot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit to jason810496/airflow that referenced this pull request Jul 2, 2026
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like apache#67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
aws-airflow-bot pushed a commit to aws-mwaa/upstream-to-airflow that referenced this pull request Jul 2, 2026
apache#69236)
PR apache#67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
jason810496 added a commit that referenced this pull request Jul 3, 2026
#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
… code changes (#69250)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 3, 2026
#69236)
PR #67877 wrapped the operator execute callable in a new task.execute
detail span, so operator-emitted spans now nest under it instead of
directly under _execute_task. Integration tests do not run on regular
PRs, so the expected span hierarchy in the OTel integration test was
not updated there and the canary build started failing.
(cherry picked from commit 55cdf67)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jul 3, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
@potiukpotiuk added this to the Airflow 3.3.1 milestone Jul 3, 2026
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 7, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Jul 9, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
…69359)
When task span detail level is greater than 1, the actual execute call was not separately traced, making it hard to see how much of a task's runtime was spent in the operator's own work versus the surrounding setup. Wrapping the execute call in its own span gives that finer-grained breakdown.
The contextvars context the callable runs in is snapshotted inside the new helper, after the span is current, so spans the operator emits during execute nest under it rather than alongside it.
(cherry picked from commit b006a97)
Co-authored-by: Daniel Standish <15932138+dstandish@users.noreply.github.com>
vatsrahul1001 pushed a commit that referenced this pull request Aug 5, 2026
… code changes (#69250) (#69285)
The otel core integration was only triggered by observability sources,
so PRs changing the spans the task runner emits (like #67877) or the
otel integration tests themselves passed CI without running the tests
that assert the span hierarchy, and breakage surfaced only in canary
builds.
(cherry picked from commit 5298431)
Co-authored-by: Jason(Zhe-You) Liu <68415893+jason810496@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@dstandish@uranusjr@kaxil@potiuk