@@ -57,16 +57,50 @@ def _set_metrics_to_zero(self) -> None:
5757 This method resets the metrics to zero before each test to ensure
5858 that each test starts with a clean slate.
5959 """
60- from opentelemetry import metrics
61- from opentelemetry .sdk .metrics import MeterProvider
62- from opentelemetry .sdk .metrics .export import InMemoryMetricReader
63-
64- # Create a fresh reader and provider
65- self .reader = InMemoryMetricReader ()
66- provider = MeterProvider (metric_readers = [self .reader ])
67- # Set the global provider
68- # Any new metric instruments created after this will use the clean state.
69- metrics .set_meter_provider (provider )
60+ from synapse .metrics import (
61+ SERVER_NAME_LABEL ,
62+ known_rooms_gauge ,
63+ locally_joined_rooms_gauge ,
64+ )
65+
66+ # Reset the gauge values to 0 for this server
67+ known_rooms_gauge .set (0 , {SERVER_NAME_LABEL : self .hs .hostname })
68+ locally_joined_rooms_gauge .set (0 , {SERVER_NAME_LABEL : self .hs .hostname })
69+
70+ def _get_gauge_values (
71+ self , metrics : list [tuple [str , dict [str , str ]]]
72+ ) -> list [Optional [float ]]:
73+ """
74+ Get multiple gauge values from the Prometheus registry in a single call.
75+
76+ The standard REGISTRY.get_sample_value() doesn't work for OpenTelemetry
77+ metrics because the OTel exporter doesn't register its metric names.
78+ Additionally, the OTel collector only returns data on the first collect()
79+ call, so we must collect all data once and then look up all values.
80+
81+ Args:
82+ metrics: List of (metric_name, labels) tuples to look up.
83+
84+ Returns:
85+ List of values in the same order as the input metrics.
86+ """
87+ # Collect all data from all collectors into a lookup dict
88+ all_samples : dict [tuple [str , tuple [tuple [str , str ], ...]], float ] = {}
89+ for collector in REGISTRY ._collector_to_names .keys ():
90+ try :
91+ for metric_family in collector .collect ():
92+ for sample in metric_family .samples :
93+ key = (metric_family .name , tuple (sorted (sample .labels .items ())))
94+ all_samples [key ] = sample .value
95+ except Exception :
96+ continue
97+
98+ # Look up each requested metric
99+ results : list [Optional [float ]] = []
100+ for metric_name , labels in metrics :
101+ key = (metric_name , tuple (sorted (labels .items ())))
102+ results .append (all_samples .get (key ))
103+ return results
70104
71105 def _add_background_updates (self ) -> None :
72106 """
@@ -184,19 +218,18 @@ def test_create_room(self) -> None:
184218 When we create a room, it should have statistics already ready.
185219 """
186220 self ._perform_background_initial_update ()
187- self .assertEqual (
188- REGISTRY .get_sample_value (
189- "synapse_known_rooms_total" , labels = {"server_name" : self .hs .hostname }
190- ),
191- 0.0 ,
192- )
193- self .assertEqual (
194- REGISTRY .get_sample_value (
195- "synapse_locally_joined_rooms_total" ,
196- labels = {"server_name" : self .hs .hostname },
197- ),
198- 0.0 ,
199- )
221+ known_rooms , locally_joined = self ._get_gauge_values (
222+ [
223+ ("synapse_known_rooms_total" , {"server_name" : self .hs .hostname }),
224+ (
225+ "synapse_locally_joined_rooms_total" ,
226+ {"server_name" : self .hs .hostname },
227+ ),
228+ ]
229+ )
230+ self .assertEqual (known_rooms , 0.0 )
231+ self .assertEqual (locally_joined , 0.0 )
232+
200233 u1 = self .register_user ("u1" , "pass" )
201234 u1token = self .login ("u1" , "pass" )
202235 r1 = self .helper .create_room_as (u1 , tok = u1token )
@@ -223,19 +256,17 @@ def test_create_room(self) -> None:
223256 self .assertEqual (r2stats ["banned_members" ], 0 )
224257
225258 # There are 2 rooms created. Check the room metrics were udpated.
226- self .assertEqual (
227- REGISTRY .get_sample_value (
228- "synapse_known_rooms_total" , labels = {"server_name" : self .hs .hostname }
229- ),
230- 2 ,
231- )
232- self .assertEqual (
233- REGISTRY .get_sample_value (
234- "synapse_locally_joined_rooms_total" ,
235- labels = {"server_name" : self .hs .hostname },
236- ),
237- 2 ,
238- )
259+ known_rooms , locally_joined = self ._get_gauge_values (
260+ [
261+ ("synapse_known_rooms_total" , {"server_name" : self .hs .hostname }),
262+ (
263+ "synapse_locally_joined_rooms_total" ,
264+ {"server_name" : self .hs .hostname },
265+ ),
266+ ]
267+ )
268+ self .assertEqual (known_rooms , 2 )
269+ self .assertEqual (locally_joined , 2 )
239270
240271 def test_updating_profile_information_does_not_increase_joined_members_count (
241272 self ,
@@ -647,19 +678,17 @@ def test_room_metrics(self) -> None:
647678 """
648679
649680 self ._perform_background_initial_update ()
650- self .assertEqual (
651- REGISTRY .get_sample_value (
652- "synapse_known_rooms_total" , labels = {"server_name" : self .hs .hostname }
653- ),
654- 0.0 ,
655- )
656- self .assertEqual (
657- REGISTRY .get_sample_value (
658- "synapse_locally_joined_rooms_total" ,
659- labels = {"server_name" : self .hs .hostname },
660- ),
661- 0.0 ,
662- )
681+ known_rooms , locally_joined = self ._get_gauge_values (
682+ [
683+ ("synapse_known_rooms_total" , {"server_name" : self .hs .hostname }),
684+ (
685+ "synapse_locally_joined_rooms_total" ,
686+ {"server_name" : self .hs .hostname },
687+ ),
688+ ]
689+ )
690+ self .assertEqual (known_rooms , 0.0 )
691+ self .assertEqual (locally_joined , 0.0 )
663692
664693 u1 = self .register_user ("u1" , "pass" )
665694 u1token = self .login ("u1" , "pass" )
@@ -670,19 +699,17 @@ def test_room_metrics(self) -> None:
670699 self .helper .leave (r2 , u1 , tok = u1token )
671700
672701 # Check the locally joined rooms metric after creating rooms
673- self .assertEqual (
674- REGISTRY .get_sample_value (
675- "synapse_locally_joined_rooms_total" ,
676- labels = {"server_name" : self .hs .hostname },
677- ),
678- 1 ,
679- )
680- self .assertEqual (
681- REGISTRY .get_sample_value (
682- "synapse_known_rooms_total" , labels = {"server_name" : self .hs .hostname }
683- ),
684- 2 ,
685- )
702+ known_rooms , locally_joined = self ._get_gauge_values (
703+ [
704+ ("synapse_known_rooms_total" , {"server_name" : self .hs .hostname }),
705+ (
706+ "synapse_locally_joined_rooms_total" ,
707+ {"server_name" : self .hs .hostname },
708+ ),
709+ ]
710+ )
711+ self .assertEqual (locally_joined , 1 )
712+ self .assertEqual (known_rooms , 2 )
686713
687714 # Check the stats for both rooms
688715 r1stats = self ._get_current_stats ("room" , r1 )
0 commit comments