Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@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

Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@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

Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@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

Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@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

Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@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

Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@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

Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@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

Fix OTel timer metrics using Gauge instead of Histogram - #64207

Merged
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram
Apr 20, 2026
Merged

Fix OTel timer metrics using Gauge instead of Histogram#64207
kaxil merged 3 commits into
apache:mainfrom
namratachaudhary:fix/otel-timer-gauge-to-histogram

Conversation

@namratachaudhary

@namratachaudharynamratachaudhary commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

Timer and timing metrics in the OTel logger were recorded using a Gauge instrument, which does not preserve multiple observations within an export interval. In practice, if the scheduler loop runs many times between exports, only a single value is retained, and the distribution of durations is lost.

This PR switches timing() and timer() to use a Histogram instrument, which captures duration distributions via count, sum, and bucketed observations. This enables accurate downstream analysis such as percentiles (p50, p95, p99).

The OTel supplementary guidelines recommend Histogram for measurements where "the statistics about this thing are likely to be meaningful" and durations are a canonical example.

Changes

  • _OtelTimer.stop() and SafeOtelLogger.timing() now call record_histogram_value() instead of set_gauge_value()
  • New InternalHistogram class wrapping meter.create_histogram(unit="ms")
  • New MetricsMap.record_histogram_value() method
  • get_otel_logger() configures the MeterProvider with a View that applies ExponentialBucketHistogramAggregation to all Histogram instruments — bucket boundaries adapt automatically to the observed data range without requiring hand-tuned explicit boundaries for metrics that span very different scales (ms to hours)
  • Tests updated: test_timing_existing_metric now verifies both observations are recorded (record.call_count == 2), not just the last value; new test verifies the exponential histogram view is wired into the MeterProvider

Users affected

Affected metrics: all timer/timing metrics emitted via the OTel logger (e.g. scheduler.scheduler_loop_duration, dagrun.dependency-check, task.duration, etc.)

OTel users: the instrument type for timer/timing metrics changes from Gauge to Histogram. Dashboards or alerts treating these as Gauges may need to be updated.

Backend compatibility: exponential (native) histograms require Prometheus 2.40+ with native histogram scraping enabled and OTel Collector 0.70+. Deployments on older backends will have the collector downconvert to explicit buckets automatically — no data is lost, but the adaptive bucketing benefit is reduced. Both query styles work:

Before (Gauge):

airflow_task_duration{dag_id="my_dag", task_id="my_task"}

After (Histogram — explicit buckets, works on all backends):

# p95
histogram_quantile(0.95,
rate(airflow_task_duration_bucket{dag_id="my_dag", task_id="my_task"}[5m])
)
# Average duration
rate(airflow_task_duration_sum{dag_id="my_dag", task_id="my_task"}[5m])
/ rate(airflow_task_duration_count{dag_id="my_dag", task_id="my_task"}[5m])

After (Histogram — native histogram queries, Prometheus 2.40+):

histogram_quantile(0.95, rate(airflow_task_duration[5m]))

Was generative AI tooling used to co-author this PR?
  • Yes (please specify the tool below)

Generated-by: Claude Sonnet 4.6 following the guidelines


  • Read the Pull Request Guidelines for more information. Note: commit author/co-author name and email in commits become permanently public when merged.
  • For fundamental code changes, an Airflow Improvement Proposal (AIP) is needed.
  • When adding dependency, check compliance with the ASF 3rd Party License Policy.
  • For significant user-facing changes create newsfragment: {pr_number}.significant.rst, in airflow-core/newsfragments. You can add this file in a follow-up commit after the PR is created so you know the PR number.

@boring-cyborg

Copy link
Copy Markdown

Congratulations on your first Pull Request and welcome to the Apache Airflow community! If you have any issues or are unsure about any anything please check our Contributors' Guide (https://github.com/apache/airflow/blob/main/contributing-docs/README.rst)
Here are some useful points:

  • Pay attention to the quality of your code (ruff, mypy and type annotations). Our prek-hooks will help you with that.
  • In case of a new feature add useful documentation (in docstrings or in docs/ directory). Adding a new operator? Check this short guide Consider adding an example DAG that shows how users should use it.
  • Consider using Breeze environment for testing locally, it's a heavy docker but it ships with a working Airflow and a lot of integrations.
  • Be patient and persistent. It might take some time to get a review or get the final approval from Committers.
  • Please follow ASF Code of Conduct for all communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.
  • Be sure to read the Airflow Coding style.
  • Always keep your Pull Requests rebased, otherwise your build might fail due to changes not related to your commits.
    Apache Airflow is a community-driven project and together we are making it better 🚀.
    In case of doubts contact the developers at:
    Mailing List: dev@airflow.apache.org
    Slack: https://s.apache.org/airflow-slack

@potiukpotiuk added the ready for maintainer review Set after triaging when all criteria pass. label Apr 1, 2026
@kaxil
kaxil requested a review from CopilotApril 2, 2026 00:43
CopilotAI reviewed Apr 2, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 33c6c43 to b7d877dCompareApril 2, 2026 17:12
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b7d877d to 7720860CompareApril 2, 2026 17:16
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from 7720860 to b07f961CompareApril 20, 2026 11:46
@rawwar
rawwar requested a review from CopilotApril 20, 2026 11:50

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.

@kaxilkaxil added this to the Airflow 3.2.2 milestone Apr 20, 2026
@namratachaudhary
namratachaudharyforce-pushed the fix/otel-timer-gauge-to-histogram branch from b07f961 to 876d194CompareApril 20, 2026 12:30
@kaxil
kaxil merged commit b2dadd2 into apache:mainApr 20, 2026
77 checks passed
@boring-cyborg

Copy link
Copy Markdown

Awesome work, congrats on your first merged pull request! You are invited to check our Issue Tracker for additional contributions.

@vatsrahul1001

Copy link
Copy Markdown
Contributor

Manual backport up for review #66865

potiuk pushed a commit that referenced this pull request May 13, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 20, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 21, 2026
)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
vatsrahul1001 added a commit to choo121600/airflow that referenced this pull request May 21, 2026
apache#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
bbovenzi pushed a commit that referenced this pull request May 21, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
vatsrahul1001 added a commit that referenced this pull request May 25, 2026
…te range request (#66874) (#67250)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* [v3-2-test] Prevent AlreadyRunningBackfill error caused by invalid date range request (#66874)
When a backfill is requested with from_date after to_date, the Backfill
record was committed before _get_info_list() returned an empty list, leaving
an orphaned record that blocked subsequent backfills with
AlreadyRunningBackfill until the scheduler's 2-minute cleanup ran.
Add an InvalidBackfillDateRange exception and validate from_date <= to_date
at the top of _validate_backfill_params(), before any DB operations.
(cherry picked from commit 1536238)
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Park Jiwon <57484954+david-parkk@users.noreply.github.com>
potiuk added a commit that referenced this pull request Jun 2, 2026
…ister non-default extras with a one-line change (#67130) (#67139)
* Fix OTel timer metrics using Gauge instead of Histogram (#64207) (#66865)
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
* Add name fields to SDK deadline alerts (#64926) (#65601)
* Add deadlines support with name and description fields in alerts and UI
* Add 'viewAll' label to deadlineStatus in dag.json
* Refactor deadlineAlerts referenceType structure
* Refine deadline alert translations in dag.json
Updated deadline alert messages for clarity and consistency.
* Add completion rule text for deadline alerts in UI
* Remove duplicate completionRule entry in deadlineAlerts
* Remove alert description from DeadlineAlert and related models
* Enhance deadline handling: return name updates alongside UUID mapping in SerializedDagModel
* Add alert_id field to DeadlineResponse and update tests for alert handling
* Remove DEADLINES option from MenuItem enum
* Update airflow-core/src/airflow/serialization/encoders.py
---------
(cherry picked from commit e9d1066)
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
* [v3-2-test] Allow accessing a TaskGroup's members via `[]` (#64430) (#65707)
(cherry picked from commit aa54031)
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
* [v3-2-test] Skip test_schedule_tis_start_trigger pending #55068 backport decision (#66315)
The `start_from_trigger` deferred-at-schedule path is commented out
on v3-2-test (disabled in 91e1029 as a TODO) and was only
re-enabled on main by #55068, which landed one day after the v3-2
branch was cut. The test asserts the feature works and fails on
v3-2-test CI.
Skip the test on the 3.2 line and link the tracking issue from both
the test skip-reason and the disabled production-code site so the
follow-up isn't lost. Decision (backport #55068 or formally drop
the feature on 3.2) is tracked in #66307.
* [v3-2-test] Aggregate CI-image dependency groups so providers can register non-default extras with a one-line change (#67130)
(cherry picked from commit e61640e)
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
---------
Co-authored-by: Rahul Vats <43964496+vatsrahul1001@users.noreply.github.com>
Co-authored-by: namratachaudhary <namratachaudhary@users.noreply.github.com>
Co-authored-by: Pierre Jeambrun <pierrejbrun@gmail.com>
Co-authored-by: Richard Wu <richard9@ualberta.ca>
Co-authored-by: D. Ferruzzi <ferruzzi@amazon.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Dev-iL <6509619+Dev-iL@users.noreply.github.com>
Co-authored-by: Jarek Potiuk <jarek@potiuk.com>
Co-authored-by: Bugra Ozturk <bugraoz93@users.noreply.github.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 14, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histograms
(*_count, *_duration, *_delay) still pick bucket boundaries at each
call site. This change moves that decision into a single declarative
map keyed by metric-name suffix glob, and layers the resulting Views
on top of the existing instrument-type baseline.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
1fanwang added a commit to 1fanwang/airflow that referenced this pull request Jun 19, 2026
Follow-up to apache#64207, which set ExponentialBucketHistogramAggregation as
the instrument-type default for OTel histograms. Non-timer histogram
families (*_count, *_duration, *_delay) span very different value ranges
yet still inherit one bucket layout chosen at each call site, so their
distributions are poorly resolved. A single value range cannot serve a
millisecond latency and an hours-long delay equally well.
Closesapache#66801
Signed-off-by: 1fanwang <1fannnw@gmail.com>
xBis7 pushed a commit to xBis7/airflow that referenced this pull request Aug 5, 2026
* Fix OTel timer metrics using Gauge instead of Histogram
* Use ExponentialBucketHistogramAggregation for timing metrics
* Use public API import path for ExponentialBucketHistogramAggregation and fix histogram map isolation
(cherry picked from commit b2dadd2)
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready for maintainer reviewSet after triaging when all criteria pass.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@namratachaudhary@vatsrahul1001@kaxil@potiuk