[PATCH v1] rt-tests: hwlatdetect: Add --time-format argument

Costa Shulyupin <[email protected]>
Newsgroups org.kernel.vger.linux-rt-users
Message-ID <[email protected]>
Add --time-format argument to customize timestamp output format using
strftime directives. By default raw timestamps are output for
backward compatibility.

Add %n directive processing for nanoseconds (9 digits) since strftime
doesn't support it.

Signed-off-by: Costa Shulyupin <[email protected]>
---
 src/hwlatdetect/hwlatdetect.py | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/src/hwlatdetect/hwlatdetect.py b/src/hwlatdetect/hwlatdetect.py
index 18ca930487f0..34fe5af4844a 100755
--- a/src/hwlatdetect/hwlatdetect.py
+++ b/src/hwlatdetect/hwlatdetect.py
@@ -14,6 +14,7 @@
 import subprocess
 import sys
 import time
+from datetime import datetime
 
 version = "0.8"
 debugging = False
@@ -255,6 +256,7 @@     def detect(self):
         'private class for tracer sample data'
         __slots__ = 'cpu', 'timestamp', 'delta', 'inner', 'outer', 'count'
         prev = float('nan')
+        time_format = None
 
         def __init__(self, line):
             fields = line.split()
@@ -284,8 +286,17 @@         def __init__(self, line):
             self.outer = int(o)
             self.count = int(kv["count"]) if "count" in kv else None
 
+        def format_timestamp(self):
+            """Format timestamp with %n (nanoseconds) support.
+            Float precision is safe for microseconds until year 2242 (2^33 seconds)."""
+            if not self.time_format:
+                return self.timestamp
+            t, ns = self.timestamp.split('.')
+            return datetime.fromtimestamp(float(f"{t}.{ns[:6]}")).strftime(self.time_format.replace('%n', ns))
+
         def __str__(self):
-            s = f"ts: {self.timestamp}, delta:{self.delta:.6f}, inner:{self.inner}, outer:{self.outer}, cpu:{self.cpu}"
+            s = f"ts: {self.format_timestamp()}"
+            s += f", delta:{self.delta:.6f}, inner:{self.inner}, outer:{self.outer}, cpu:{self.cpu}"
             return s if self.count is None else s + f", count:{self.count}"
 
         def display(self):
@@ -472,6 +483,9 @@     def cleanup(self):
                         dest="watch",
                         help="print sample data to stdout as it arrives")
 
+    parser.add_argument("--time-format",
+                        help="strftime format for timestamps (e.g. %%H:%%M:%%S.%%n)")
+
     args = parser.parse_args()
 
     # need these before creating detector instance
@@ -525,6 +539,8 @@     def cleanup(self):
     if args.watch:
         watch = True
 
+    Tracer.Sample.time_format = args.time_format
+
     reportfile = args.report
 
     if args.cpulist:
-- 
2.53.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.