This is an automated email from the ASF dual-hosted git repository.

rahulvats pushed a commit to branch backport-61824
in repository https://gitbox.apache.org/repos/asf/airflow.git

commit 7b5362c53a6ef07aec369c507910f67bb88090df
Author: Jed Cunningham <[email protected]>
AuthorDate: Fri Feb 13 00:20:11 2026 -0700

    Fix timer.duration unit labels in logs (#61824)
    
    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.
    
    Co-authored-by: Cursor <[email protected]>
    (cherry picked from commit 10dcb3a55200fa34e754769bd106a3f71280a8b0)
---
 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
 
 

Reply via email to