From 888a7b7d1277239eea146aef576dbab87ee140c0 Mon Sep 17 00:00:00 2001
From: Richard Tief <richard.tief@sap.com>
Date: Tue, 27 Feb 2024 09:57:51 +0100
Subject: [PATCH] ensure json.loads()

---
 collectors/PropertiesCollector.py     |  7 +++++++
 collectors/SDRSPropertiesCollector.py | 12 ++++++++++--
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/collectors/PropertiesCollector.py b/collectors/PropertiesCollector.py
index a4131c20..d69bc609 100644
--- a/collectors/PropertiesCollector.py
+++ b/collectors/PropertiesCollector.py
@@ -66,8 +66,15 @@ def collect(self):
                 metric_value = value_entry.get('values', [False])[0]
 
                 if statkey in self.nested_value_metric_keys:
+
                     add_labels, add_label_value_list, add_value = self.unlock_nested_values(statkey, metric_value)
 
+                    if not add_labels:
+                        metric_suffix = metrics[statkey]['metric_suffix']
+                        self.add_metric_labels(metrics[statkey]['gauge'], [metric_suffix])
+                        metrics[statkey]['gauge'].add_metric(labels=labels+[metric_suffix], value=0)
+                        continue
+
                     self.add_metric_labels(metrics[statkey]['gauge'], add_labels)
 
                     for add_label_value in add_label_value_list:
diff --git a/collectors/SDRSPropertiesCollector.py b/collectors/SDRSPropertiesCollector.py
index 10c77eed..857db30e 100644
--- a/collectors/SDRSPropertiesCollector.py
+++ b/collectors/SDRSPropertiesCollector.py
@@ -1,5 +1,8 @@
 from collectors.PropertiesCollector import PropertiesCollector
 import json
+import logging
+
+logger = logging.getLogger('vrops-exporter')
 
 class SDRSPropertiesCollector(PropertiesCollector):
 
@@ -27,9 +30,14 @@ def unlock_nested_values(self, statkey, metric_value):
 
     def config_sdrsconfig_vmStorageAntiAffinityRules(self, metric_value):
 
-        metric_value = json.loads(metric_value)
-        rules = metric_value.get("rules") or []
+        try:
+            metric_value = json.loads(metric_value)
 
+        except (TypeError, json.decoder.JSONDecodeError) as e:
+            logger.warning(f'metric_value is not a valid json: {e.args}, {metric_value}')
+            return [], [], 0
+
+        rules = metric_value.get("rules") or []
         amount_rules = len(rules)
 
         rule_labels = ['rule', 'rule_name', 'rule_type', 'valid', 'virtualmachine']