From d770aa0c0a897ef1c54c208540207e289375d469 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Tue, 20 Feb 2024 19:07:43 -0500 Subject: [PATCH 1/6] Stringify value for dictifiable metrics. This is indicated as always being a string in typing in both the class and API endpoint for job info, and without this change the latter throws a type exception. --- lib/galaxy/job_metrics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/job_metrics/__init__.py b/lib/galaxy/job_metrics/__init__.py index 0a315ffdf31d..97c06b0762fb 100644 --- a/lib/galaxy/job_metrics/__init__.py +++ b/lib/galaxy/job_metrics/__init__.py @@ -107,7 +107,7 @@ def raw_to_dictifiable(raw_metric: RawMetric) -> DictifiableMetric: safety = DEFAULT_SAFETY return DictifiableMetric( title, - value, + str(value), str(metric_value), metric_name, metric_plugin, From 404001c48299cc086432366df8a438417e700840 Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Tue, 20 Feb 2024 20:30:47 -0500 Subject: [PATCH 2/6] Fix cgroup jobmetric formatter to always return properly formatted strings, add typing to specify, instead of casting this higher in the stack. --- lib/galaxy/job_metrics/__init__.py | 2 +- lib/galaxy/job_metrics/instrumenters/cgroup.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/galaxy/job_metrics/__init__.py b/lib/galaxy/job_metrics/__init__.py index 97c06b0762fb..0a315ffdf31d 100644 --- a/lib/galaxy/job_metrics/__init__.py +++ b/lib/galaxy/job_metrics/__init__.py @@ -107,7 +107,7 @@ def raw_to_dictifiable(raw_metric: RawMetric) -> DictifiableMetric: safety = DEFAULT_SAFETY return DictifiableMetric( title, - str(value), + value, str(metric_value), metric_name, metric_plugin, diff --git a/lib/galaxy/job_metrics/instrumenters/cgroup.py b/lib/galaxy/job_metrics/instrumenters/cgroup.py index 62caef9c81dc..66da4f9389f9 100644 --- a/lib/galaxy/job_metrics/instrumenters/cgroup.py +++ b/lib/galaxy/job_metrics/instrumenters/cgroup.py @@ -114,18 +114,18 @@ class CgroupPluginFormatter(formatting.JobMetricFormatter): - def format(self, key, value): + def format(self, key: str, value: Any) -> formatting.FormattedMetric: title = TITLES.get(key, key) if key in CONVERSION: - return title, CONVERSION[key](value) + return formatting.FormattedMetric(title, CONVERSION[key](value)) elif key.endswith("_bytes"): try: - return title, nice_size(value) + return formatting.FormattedMetric(title, nice_size(value)) except ValueError: pass elif isinstance(value, (decimal.Decimal, numbers.Integral, numbers.Real)) and value == int(value): value = int(value) - return title, value + return formatting.FormattedMetric(title, str(value)) class CgroupPlugin(InstrumentPlugin): From 8bab51063a13f4c67e8f086f71f208e7f733341f Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 21 Feb 2024 07:45:08 -0500 Subject: [PATCH 3/6] More explicit typing for JobMetricFormatter implementations --- lib/galaxy/job_metrics/instrumenters/hostname.py | 5 +++-- lib/galaxy/job_metrics/instrumenters/meminfo.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/job_metrics/instrumenters/hostname.py b/lib/galaxy/job_metrics/instrumenters/hostname.py index 721fa1aca419..d4d01402a879 100644 --- a/lib/galaxy/job_metrics/instrumenters/hostname.py +++ b/lib/galaxy/job_metrics/instrumenters/hostname.py @@ -1,6 +1,7 @@ """The module describes the ``hostname`` job metrics plugin.""" import logging +from typing import Any from . import InstrumentPlugin from .. import formatting @@ -9,8 +10,8 @@ class HostnameFormatter(formatting.JobMetricFormatter): - def format(self, key, value): - return key, value + def format(self, key: str, value: Any): + return formatting.FormattedMetric(key, value) class HostnamePlugin(InstrumentPlugin): diff --git a/lib/galaxy/job_metrics/instrumenters/meminfo.py b/lib/galaxy/job_metrics/instrumenters/meminfo.py index 80e523d97308..a6ec359e730a 100644 --- a/lib/galaxy/job_metrics/instrumenters/meminfo.py +++ b/lib/galaxy/job_metrics/instrumenters/meminfo.py @@ -1,6 +1,7 @@ """The module describes the ``meminfo`` job metrics plugin.""" import re +from typing import Any from galaxy import util from . import InstrumentPlugin @@ -14,9 +15,9 @@ class MemInfoFormatter(formatting.JobMetricFormatter): - def format(self, key, value): + def format(self, key: str, value: Any): title = MEMINFO_TITLES.get(key, key) - return title, util.nice_size(value * 1000) # kB = *1000, KB = *1024 - wikipedia + return formatting.FormattedMetric(title, util.nice_size(value * 1000)) # kB = *1000, KB = *1024 - wikipedia class MemInfoPlugin(InstrumentPlugin): From a210a6fdf64f9df910a7aab0b6509881302a304d Mon Sep 17 00:00:00 2001 From: Dannon Baker Date: Wed, 21 Feb 2024 14:11:49 -0500 Subject: [PATCH 4/6] Drop hostname formatter completely -- the default jobmetricformatter is fine here and does the same thing --- lib/galaxy/job_metrics/instrumenters/hostname.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/lib/galaxy/job_metrics/instrumenters/hostname.py b/lib/galaxy/job_metrics/instrumenters/hostname.py index d4d01402a879..867dd627b008 100644 --- a/lib/galaxy/job_metrics/instrumenters/hostname.py +++ b/lib/galaxy/job_metrics/instrumenters/hostname.py @@ -4,21 +4,14 @@ from typing import Any from . import InstrumentPlugin -from .. import formatting log = logging.getLogger(__name__) -class HostnameFormatter(formatting.JobMetricFormatter): - def format(self, key: str, value: Any): - return formatting.FormattedMetric(key, value) - - class HostnamePlugin(InstrumentPlugin): """Gather hostname""" plugin_type = "hostname" - formatter = HostnameFormatter() def __init__(self, **kwargs): pass From 60d5442375ad8c5efeac15ad27a3a1c4db1cdd4e Mon Sep 17 00:00:00 2001 From: Dannon Date: Wed, 21 Feb 2024 14:12:19 -0500 Subject: [PATCH 5/6] Apply suggestions from code review Co-authored-by: Nicola Soranzo --- lib/galaxy/job_metrics/instrumenters/meminfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/job_metrics/instrumenters/meminfo.py b/lib/galaxy/job_metrics/instrumenters/meminfo.py index a6ec359e730a..9e1d9be1de27 100644 --- a/lib/galaxy/job_metrics/instrumenters/meminfo.py +++ b/lib/galaxy/job_metrics/instrumenters/meminfo.py @@ -15,7 +15,7 @@ class MemInfoFormatter(formatting.JobMetricFormatter): - def format(self, key: str, value: Any): + def format(self, key: str, value: Any) -> formatting.FormattedMetric: title = MEMINFO_TITLES.get(key, key) return formatting.FormattedMetric(title, util.nice_size(value * 1000)) # kB = *1000, KB = *1024 - wikipedia From 027e1ac23b25411cdde782b39507bb73caa4d4d1 Mon Sep 17 00:00:00 2001 From: Dannon Date: Wed, 21 Feb 2024 15:37:16 -0500 Subject: [PATCH 6/6] Update lib/galaxy/job_metrics/instrumenters/hostname.py Co-authored-by: Nicola Soranzo --- lib/galaxy/job_metrics/instrumenters/hostname.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/galaxy/job_metrics/instrumenters/hostname.py b/lib/galaxy/job_metrics/instrumenters/hostname.py index 867dd627b008..1d7ea07165b3 100644 --- a/lib/galaxy/job_metrics/instrumenters/hostname.py +++ b/lib/galaxy/job_metrics/instrumenters/hostname.py @@ -1,7 +1,6 @@ """The module describes the ``hostname`` job metrics plugin.""" import logging -from typing import Any from . import InstrumentPlugin