From 9f1a97b3144fede2774b0610e5c18dd053a4ea82 Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Fri, 2 Aug 2024 09:13:25 +0200
Subject: [PATCH] Moved metrics to PyCommon

---
 .../PyCommon}/metrics.py                      | 30 +++++++++++++++----
 .../qa_statistics_service/CMakeLists.txt      |  1 -
 .../qa_statistics_service.py                  |  2 +-
 3 files changed, 25 insertions(+), 8 deletions(-)
 rename {SAS/TMSS/backend/services/qa_statistics_service => LCS/PyCommon}/metrics.py (64%)

diff --git a/SAS/TMSS/backend/services/qa_statistics_service/metrics.py b/LCS/PyCommon/metrics.py
similarity index 64%
rename from SAS/TMSS/backend/services/qa_statistics_service/metrics.py
rename to LCS/PyCommon/metrics.py
index a7c8bd25981..b0e77d5bea0 100644
--- a/SAS/TMSS/backend/services/qa_statistics_service/metrics.py
+++ b/LCS/PyCommon/metrics.py
@@ -17,18 +17,36 @@
 
 import time
 
-from prometheus_client import start_http_server, disable_created_metrics, Gauge
+from prometheus_client import start_http_server, disable_created_metrics, Gauge, Histogram
 
-
-def add_default_metrics():
+def _add_default_metrics():
+    """Create generic metrics that we expose by default."""
+  
     uptime = Gauge("uptime", "Uptime of the service")
-
     start_time = time.time()
     uptime.set_function(lambda: time.time() - start_time)
 
-
 def start_metrics_server(port: int = 8000):
+    """Start a Prometheus endpoint to scrape."""
+
     disable_created_metrics()
     start_http_server(port)
 
-    add_default_metrics()
+    _add_default_metrics()
+
+def metric_track_duration():
+    """Decorator for functions, to expose their call durations as a
+    Histogram in Prometheus."""
+
+    def inner(func):
+        func_name = func.__qualname__.replace(".","_")
+        metric = Histogram(f"{func_name}_duration")
+
+        @wraps(func)
+        def metric_wrapper(*args, **kwargs):
+            with metric.time():
+                return func(*args, **kwargs)
+
+        return metric_wrapper
+
+    return inner
diff --git a/SAS/TMSS/backend/services/qa_statistics_service/CMakeLists.txt b/SAS/TMSS/backend/services/qa_statistics_service/CMakeLists.txt
index 3c9c1876a21..673aae17dbd 100644
--- a/SAS/TMSS/backend/services/qa_statistics_service/CMakeLists.txt
+++ b/SAS/TMSS/backend/services/qa_statistics_service/CMakeLists.txt
@@ -5,7 +5,6 @@ include(PythonInstall)
 
 set(_py_files
     qa_statistics_service.py
-    metrics.py
 )
 
 python_install(${_py_files}
diff --git a/SAS/TMSS/backend/services/qa_statistics_service/qa_statistics_service.py b/SAS/TMSS/backend/services/qa_statistics_service/qa_statistics_service.py
index 7a1447f70db..9717c0614eb 100755
--- a/SAS/TMSS/backend/services/qa_statistics_service/qa_statistics_service.py
+++ b/SAS/TMSS/backend/services/qa_statistics_service/qa_statistics_service.py
@@ -28,7 +28,7 @@ from prometheus_client import Counter, Gauge
 from lofar.stationmodel.antennafields import (
     antennafields_for_antennaset_and_station,
 )
-from lofar.sas.tmss.services.metrics import (
+from lofar.common.metrics import (
     start_metrics_server,
 )
 from lofar.sas.tmss.services.tuna.job_dispatcher import (
-- 
GitLab