@@ -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