This is an automated email from the ASF dual-hosted git repository.
rahulvats pushed a commit to branch v3-1-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-1-test by this push:
new 0c68a70f08e Fix timer.duration unit labels in logs (#61824) (#62757)
0c68a70f08e is described below
commit 0c68a70f08e253d13f4123648d64d0c7a4e228f6
Author: Rahul Vats <[email protected]>
AuthorDate: Tue Mar 3 14:21:35 2026 +0530
Fix timer.duration unit labels in logs (#61824) (#62757)
Update timer.duration labels and examples to milliseconds, and fix the
OTel timing docstring to match runtime behavior.
Historical context: #39908 introduced milliseconds alignment with a
compatibility flag, and #43975 removed that flag and standardized
milliseconds everywhere.
(cherry picked from commit 10dcb3a55200fa34e754769bd106a3f71280a8b0)
Co-authored-by: Jed Cunningham
<[email protected]>
Co-authored-by: Cursor <[email protected]>
---
airflow-core/src/airflow/jobs/scheduler_job_runner.py | 4 ++--
airflow-core/src/airflow/metrics/otel_logger.py | 2 +-
airflow-core/src/airflow/plugins_manager.py | 2 +-
airflow-core/src/airflow/serialization/serde.py | 2 +-
contributing-docs/05_pull_requests.rst | 2 +-
task-sdk/src/airflow/sdk/io/fs.py | 2 +-
6 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/airflow-core/src/airflow/jobs/scheduler_job_runner.py
b/airflow-core/src/airflow/jobs/scheduler_job_runner.py
index 81cce651435..53baf765bb2 100644
--- a/airflow-core/src/airflow/jobs/scheduler_job_runner.py
+++ b/airflow-core/src/airflow/jobs/scheduler_job_runner.py
@@ -1419,12 +1419,12 @@ class SchedulerJobRunner(BaseJobRunner, LoggingMixin):
next_event = timers.run(blocking=False)
self.log.debug("Next timed event is in %f", next_event)
- self.log.debug("Ran scheduling loop in %.2f seconds",
timer.duration)
+ self.log.debug("Ran scheduling loop in %.2f ms", timer.duration)
if span.is_recording():
span.add_event(
name="Ran scheduling loop",
attributes={
- "duration in seconds": timer.duration,
+ "duration in ms": timer.duration,
},
)
diff --git a/airflow-core/src/airflow/metrics/otel_logger.py
b/airflow-core/src/airflow/metrics/otel_logger.py
index 6b75428529c..ef4837f46d7 100644
--- a/airflow-core/src/airflow/metrics/otel_logger.py
+++ b/airflow-core/src/airflow/metrics/otel_logger.py
@@ -272,7 +272,7 @@ class SafeOtelLogger:
*,
tags: Attributes = None,
) -> None:
- """OTel does not have a native timer, stored as a Gauge whose value is
number of seconds elapsed."""
+ """OTel does not have a native timer, stored as a Gauge whose value is
elapsed ms."""
if self.metrics_validator.test(stat) and
name_is_otel_safe(self.prefix, stat):
if isinstance(dt, datetime.timedelta):
dt = dt.total_seconds() * 1000.0
diff --git a/airflow-core/src/airflow/plugins_manager.py
b/airflow-core/src/airflow/plugins_manager.py
index 6f74a8e958f..0f940a42881 100644
--- a/airflow-core/src/airflow/plugins_manager.py
+++ b/airflow-core/src/airflow/plugins_manager.py
@@ -360,7 +360,7 @@ def ensure_plugins_loaded():
load_providers_plugins()
if plugins:
- log.debug("Loading %d plugin(s) took %.2f seconds", len(plugins),
timer.duration)
+ log.debug("Loading %d plugin(s) took %.2f ms", len(plugins),
timer.duration)
def initialize_ui_plugins():
diff --git a/airflow-core/src/airflow/serialization/serde.py
b/airflow-core/src/airflow/serialization/serde.py
index 6faedd88417..1615f3bd752 100644
--- a/airflow-core/src/airflow/serialization/serde.py
+++ b/airflow-core/src/airflow/serialization/serde.py
@@ -390,7 +390,7 @@ def _register():
log.debug("registering %s for stringifying", c)
_stringifiers[c] = name
- log.debug("loading serializers took %.3f seconds", timer.duration)
+ log.debug("loading serializers took %.3f ms", timer.duration)
@functools.cache
diff --git a/contributing-docs/05_pull_requests.rst
b/contributing-docs/05_pull_requests.rst
index 3570ff55bb0..a7890192adf 100644
--- a/contributing-docs/05_pull_requests.rst
+++ b/contributing-docs/05_pull_requests.rst
@@ -324,7 +324,7 @@ or to time but not send a metric:
with Stats.timer() as timer:
...
- log.info("Code took %.3f seconds", timer.duration)
+ log.info("Code took %.3f ms", timer.duration)
For full docs on ``timer()`` check out `airflow/stats.py`_.
diff --git a/task-sdk/src/airflow/sdk/io/fs.py
b/task-sdk/src/airflow/sdk/io/fs.py
index a49d7c6ffcc..f1484537cc8 100644
--- a/task-sdk/src/airflow/sdk/io/fs.py
+++ b/task-sdk/src/airflow/sdk/io/fs.py
@@ -67,7 +67,7 @@ def _register_filesystems() -> Mapping[
raise ImportError(f"Filesystem {fs_module_name} does not
have a get_fs method")
scheme_to_fs[scheme] = method
- log.debug("loading filesystems from providers took %.3f seconds",
timer.duration)
+ log.debug("loading filesystems from providers took %.3f ms",
timer.duration)
return scheme_to_fs