summary refs log tree commit diff
diff options
context:
space:
mode:
authorAndrew Morgan <1342360+anoadragon453@users.noreply.github.com>2021-04-06 16:32:04 +0100
committerGitHub <noreply@github.com>2021-04-06 16:32:04 +0100
commit0d87c6bd121d043d5474cc20e352794ff8cf5625 (patch)
tree26afd51df477905f6eda1cb87430ea6bc4e8e9f6
parentAdd a Synapse Module for configuring presence update routing (#9491) (diff)
downloadsynapse-0d87c6bd121d043d5474cc20e352794ff8cf5625.tar.xz
Don't report anything from GaugeBucketCollector metrics until data is present (#8926)
This PR modifies `GaugeBucketCollector` to only report data once it has been updated, rather than initially reporting a value of 0. Fixes zero values being reported for some metrics on startup until a background job to update the metric's value runs later.
-rw-r--r--changelog.d/8926.bugfix1
-rw-r--r--synapse/metrics/__init__.py16
2 files changed, 14 insertions, 3 deletions
diff --git a/changelog.d/8926.bugfix b/changelog.d/8926.bugfix
new file mode 100644
index 0000000000..aad7bd83ce
--- /dev/null
+++ b/changelog.d/8926.bugfix
@@ -0,0 +1 @@
+Prevent `synapse_forward_extremities` and `synapse_excess_extremity_events` Prometheus metrics from initially reporting zero-values after startup.
diff --git a/synapse/metrics/__init__.py b/synapse/metrics/__init__.py
index 3b499efc07..13a5bc4558 100644
--- a/synapse/metrics/__init__.py
+++ b/synapse/metrics/__init__.py
@@ -214,7 +214,12 @@ class GaugeBucketCollector:
     Prometheus, and optimise for that case.
     """
 
-    __slots__ = ("_name", "_documentation", "_bucket_bounds", "_metric")
+    __slots__ = (
+        "_name",
+        "_documentation",
+        "_bucket_bounds",
+        "_metric",
+    )
 
     def __init__(
         self,
@@ -242,11 +247,16 @@ class GaugeBucketCollector:
         if self._bucket_bounds[-1] != float("inf"):
             self._bucket_bounds.append(float("inf"))
 
-        self._metric = self._values_to_metric([])
+        # We initially set this to None. We won't report metrics until
+        # this has been initialised after a successful data update
+        self._metric = None  # type: Optional[GaugeHistogramMetricFamily]
+
         registry.register(self)
 
     def collect(self):
-        yield self._metric
+        # Don't report metrics unless we've already collected some data
+        if self._metric is not None:
+            yield self._metric
 
     def update_data(self, values: Iterable[float]):
         """Update the data to be reported by the metric