Skip to content

Commit f683d87

Browse files
committed
Add test
1 parent 33d6a3c commit f683d87

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

tests/metrics/test_metrics.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@ def test_cache_metric(self) -> None:
159159
name=CACHE_NAME, server_name=self.hs.hostname, max_entries=777
160160
)
161161

162+
# Collect the latest metrics from the registry and filter them down to just the
163+
# relevant cache metrics.
162164
items = {
163165
x.split(b"{")[0].decode("ascii"): x.split(b" ")[1].decode("ascii")
164166
for x in filter(
@@ -170,8 +172,11 @@ def test_cache_metric(self) -> None:
170172
self.assertEqual(items["synapse_util_caches_cache_size"], "0.0")
171173
self.assertEqual(items["synapse_util_caches_cache_max_size"], "777.0")
172174

175+
# Add something to both caches to change the numbers
173176
cache.prefill("1", "hi")
174177

178+
# Collect the latest metrics from the registry and filter them down to just the
179+
# relevant cache metrics.
175180
items = {
176181
x.split(b"{")[0].decode("ascii"): x.split(b" ")[1].decode("ascii")
177182
for x in filter(
@@ -182,3 +187,106 @@ def test_cache_metric(self) -> None:
182187

183188
self.assertEqual(items["synapse_util_caches_cache_size"], "1.0")
184189
self.assertEqual(items["synapse_util_caches_cache_max_size"], "777.0")
190+
191+
def test_cache_metric_multiple_servers(self) -> None:
192+
"""
193+
Test that cache metrics are reported correctly across multiple servers. We will
194+
have an metrics entry for each homeserver that is labeled with the `server_name`
195+
label.
196+
"""
197+
CACHE_NAME = "cache_metric_multiple_servers_test"
198+
cache1: DeferredCache[str, str] = DeferredCache(
199+
name=CACHE_NAME, server_name="hs1", max_entries=777
200+
)
201+
cache2: DeferredCache[str, str] = DeferredCache(
202+
name=CACHE_NAME, server_name="hs2", max_entries=777
203+
)
204+
205+
# Collect the latest metrics from the registry and filter them down to just the
206+
# relevant cache metrics.
207+
items = {
208+
x.split(b" ")[0].decode("ascii"): x.split(b" ")[1].decode("ascii")
209+
for x in filter(
210+
lambda x: CACHE_NAME.encode("ascii") in x,
211+
generate_latest(REGISTRY).split(b"\n"),
212+
)
213+
}
214+
215+
hs1CacheSizeMetric = (
216+
f'synapse_util_caches_cache_size{{name="{CACHE_NAME}",server_name="hs1"}}'
217+
)
218+
hs2CacheSizeMetric = (
219+
f'synapse_util_caches_cache_size{{name="{CACHE_NAME}",server_name="hs2"}}'
220+
)
221+
hs1CacheMaxSizeMetric = f'synapse_util_caches_cache_max_size{{name="{CACHE_NAME}",server_name="hs1"}}'
222+
hs2CacheMaxSizeMetric = f'synapse_util_caches_cache_max_size{{name="{CACHE_NAME}",server_name="hs2"}}'
223+
224+
# Find the metrics for the caches from both homeservers
225+
hs1CacheSizeMetricValue = items.get(hs1CacheSizeMetric)
226+
self.assertIsNotNone(
227+
hs1CacheSizeMetricValue,
228+
f"Missing metric {hs1CacheSizeMetric} in cache metrics {items}",
229+
)
230+
hs2CacheSizeMetricValue = items.get(hs2CacheSizeMetric)
231+
self.assertIsNotNone(
232+
hs2CacheSizeMetricValue,
233+
f"Missing metric {hs2CacheSizeMetric} in cache metrics {items}",
234+
)
235+
hs1CacheMaxSizeMetricValue = items.get(hs1CacheMaxSizeMetric)
236+
self.assertIsNotNone(
237+
hs1CacheMaxSizeMetricValue,
238+
f"Missing metric {hs1CacheMaxSizeMetric} in cache metrics {items}",
239+
)
240+
hs2CacheMaxSizeMetricValue = items.get(hs2CacheMaxSizeMetric)
241+
self.assertIsNotNone(
242+
hs2CacheMaxSizeMetricValue,
243+
f"Missing metric {hs2CacheMaxSizeMetric} in cache metrics {items}",
244+
)
245+
246+
# Sanity check the metric values
247+
self.assertEqual(hs1CacheSizeMetricValue, "0.0")
248+
self.assertEqual(hs2CacheSizeMetricValue, "0.0")
249+
self.assertEqual(hs1CacheMaxSizeMetricValue, "777.0")
250+
self.assertEqual(hs2CacheMaxSizeMetricValue, "777.0")
251+
252+
# Add something to both caches to change the numbers
253+
cache1.prefill("1", "hi")
254+
cache2.prefill("2", "ho")
255+
256+
# Collect the latest metrics from the registry and filter them down to just the
257+
# relevant cache metrics.
258+
items = {
259+
x.split(b" ")[0].decode("ascii"): x.split(b" ")[1].decode("ascii")
260+
for x in filter(
261+
lambda x: CACHE_NAME.encode("ascii") in x,
262+
generate_latest(REGISTRY).split(b"\n"),
263+
)
264+
}
265+
266+
# Find the metrics for the caches from both homeservers
267+
hs1CacheSizeMetricValue = items.get(hs1CacheSizeMetric)
268+
self.assertIsNotNone(
269+
hs1CacheSizeMetricValue,
270+
f"Missing metric {hs1CacheSizeMetric} in cache metrics {items}",
271+
)
272+
hs2CacheSizeMetricValue = items.get(hs2CacheSizeMetric)
273+
self.assertIsNotNone(
274+
hs2CacheSizeMetricValue,
275+
f"Missing metric {hs2CacheSizeMetric} in cache metrics {items}",
276+
)
277+
hs1CacheMaxSizeMetricValue = items.get(hs1CacheMaxSizeMetric)
278+
self.assertIsNotNone(
279+
hs1CacheMaxSizeMetricValue,
280+
f"Missing metric {hs1CacheMaxSizeMetric} in cache metrics {items}",
281+
)
282+
hs2CacheMaxSizeMetricValue = items.get(hs2CacheMaxSizeMetric)
283+
self.assertIsNotNone(
284+
hs2CacheMaxSizeMetricValue,
285+
f"Missing metric {hs2CacheMaxSizeMetric} in cache metrics {items}",
286+
)
287+
288+
# Sanity check the metric values
289+
self.assertEqual(hs1CacheSizeMetricValue, "1.0")
290+
self.assertEqual(hs2CacheSizeMetricValue, "1.0")
291+
self.assertEqual(hs1CacheMaxSizeMetricValue, "777.0")
292+
self.assertEqual(hs2CacheMaxSizeMetricValue, "777.0")

0 commit comments

Comments
 (0)