Skip to content

Commit fc10a5e

Browse files
Refactor Measure block metrics to be homeserver-scoped (v2) (#18601)
Refactor `Measure` block metrics to be homeserver-scoped (add `server_name` label to block metrics). Part of #18592 ### Testing strategy #### See behavior of previous `metrics` listener 1. Add the `metrics` listener in your `homeserver.yaml` ```yaml listeners: - port: 9323 type: metrics bind_addresses: ['127.0.0.1'] ``` 1. Start the homeserver: `poetry run synapse_homeserver --config-path homeserver.yaml` 1. Fetch `http://localhost:9323/metrics` 1. Observe response includes the block metrics (`synapse_util_metrics_block_count`, `synapse_util_metrics_block_in_flight`, etc) #### See behavior of the `http` `metrics` resource 1. Add the `metrics` resource to a new or existing `http` listeners in your `homeserver.yaml` ```yaml listeners: - port: 9322 type: http bind_addresses: ['127.0.0.1'] resources: - names: [metrics] compress: false ``` 1. Start the homeserver: `poetry run synapse_homeserver --config-path homeserver.yaml` 1. Fetch `http://localhost:9322/_synapse/metrics` (it's just a `GET` request so you can even do in the browser) 1. Observe response includes the block metrics (`synapse_util_metrics_block_count`, `synapse_util_metrics_block_in_flight`, etc)
1 parent d72c278 commit fc10a5e

35 files changed

+380
-94
lines changed

changelog.d/18601.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Refactor `Measure` block metrics to be homeserver-scoped.

synapse/federation/send_queue.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ def _clear_queue(self) -> None:
156156

157157
def _clear_queue_before_pos(self, position_to_delete: int) -> None:
158158
"""Clear all the queues from before a given position"""
159-
with Measure(self.clock, "send_queue._clear"):
159+
with Measure(
160+
self.clock, name="send_queue._clear", server_name=self.server_name
161+
):
160162
# Delete things out of presence maps
161163
keys = self.presence_destinations.keys()
162164
i = self.presence_destinations.bisect_left(position_to_delete)

synapse/federation/sender/__init__.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,11 @@ async def handle_room_events(events: List[EventBase]) -> None:
657657
logger.debug(
658658
"Handling %i events in room %s", len(events), events[0].room_id
659659
)
660-
with Measure(self.clock, "handle_room_events"):
660+
with Measure(
661+
self.clock,
662+
name="handle_room_events",
663+
server_name=self.server_name,
664+
):
661665
for event in events:
662666
await handle_event(event)
663667

synapse/federation/sender/transaction_manager.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class TransactionManager:
5858
"""
5959

6060
def __init__(self, hs: "synapse.server.HomeServer"):
61-
self._server_name = hs.hostname
61+
self.server_name = hs.hostname # nb must be called this for @measure_func
6262
self.clock = hs.get_clock() # nb must be called this for @measure_func
6363
self._store = hs.get_datastores().main
6464
self._transaction_actions = TransactionActions(self._store)
@@ -116,7 +116,7 @@ async def send_new_transaction(
116116
transaction = Transaction(
117117
origin_server_ts=int(self.clock.time_msec()),
118118
transaction_id=txn_id,
119-
origin=self._server_name,
119+
origin=self.server_name,
120120
destination=destination,
121121
pdus=[p.get_pdu_json() for p in pdus],
122122
edus=[edu.get_dict() for edu in edus],

synapse/handlers/appservice.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373

7474
class ApplicationServicesHandler:
7575
def __init__(self, hs: "HomeServer"):
76+
self.server_name = hs.hostname
7677
self.store = hs.get_datastores().main
7778
self.is_mine_id = hs.is_mine_id
7879
self.appservice_api = hs.get_application_service_api()
@@ -120,7 +121,9 @@ def notify_interested_services(self, max_token: RoomStreamToken) -> None:
120121

121122
@wrap_as_background_process("notify_interested_services")
122123
async def _notify_interested_services(self, max_token: RoomStreamToken) -> None:
123-
with Measure(self.clock, "notify_interested_services"):
124+
with Measure(
125+
self.clock, name="notify_interested_services", server_name=self.server_name
126+
):
124127
self.is_processing = True
125128
try:
126129
upper_bound = -1
@@ -329,7 +332,11 @@ async def _notify_interested_services_ephemeral(
329332
users: Collection[Union[str, UserID]],
330333
) -> None:
331334
logger.debug("Checking interested services for %s", stream_key)
332-
with Measure(self.clock, "notify_interested_services_ephemeral"):
335+
with Measure(
336+
self.clock,
337+
name="notify_interested_services_ephemeral",
338+
server_name=self.server_name,
339+
):
333340
for service in services:
334341
if stream_key == StreamKeyType.TYPING:
335342
# Note that we don't persist the token (via set_appservice_stream_type_pos)

synapse/handlers/delayed_events.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454

5555
class DelayedEventsHandler:
5656
def __init__(self, hs: "HomeServer"):
57+
self.server_name = hs.hostname
5758
self._store = hs.get_datastores().main
5859
self._storage_controllers = hs.get_storage_controllers()
5960
self._config = hs.config
@@ -159,7 +160,9 @@ async def _unsafe_process_new_event(self) -> None:
159160

160161
# Loop round handling deltas until we're up to date
161162
while True:
162-
with Measure(self._clock, "delayed_events_delta"):
163+
with Measure(
164+
self._clock, name="delayed_events_delta", server_name=self.server_name
165+
):
163166
room_max_stream_ordering = self._store.get_room_max_stream_ordering()
164167
if self._event_pos == room_max_stream_ordering:
165168
return

synapse/handlers/device.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,8 @@ class DeviceHandler(DeviceWorkerHandler):
526526
def __init__(self, hs: "HomeServer"):
527527
super().__init__(hs)
528528

529+
self.server_name = hs.hostname # nb must be called this for @measure_func
530+
self.clock = hs.get_clock() # nb must be called this for @measure_func
529531
self.federation_sender = hs.get_federation_sender()
530532
self._account_data_handler = hs.get_account_data_handler()
531533
self._storage_controllers = hs.get_storage_controllers()
@@ -1215,7 +1217,8 @@ class DeviceListUpdater(DeviceListWorkerUpdater):
12151217
def __init__(self, hs: "HomeServer", device_handler: DeviceHandler):
12161218
self.store = hs.get_datastores().main
12171219
self.federation = hs.get_federation_client()
1218-
self.clock = hs.get_clock()
1220+
self.server_name = hs.hostname # nb must be called this for @measure_func
1221+
self.clock = hs.get_clock() # nb must be called this for @measure_func
12191222
self.device_handler = device_handler
12201223
self._notifier = hs.get_notifier()
12211224

synapse/handlers/message.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -476,16 +476,16 @@ async def _expire_event(self, event_id: str) -> None:
476476
class EventCreationHandler:
477477
def __init__(self, hs: "HomeServer"):
478478
self.hs = hs
479+
self.validator = EventValidator()
480+
self.event_builder_factory = hs.get_event_builder_factory()
481+
self.server_name = hs.hostname # nb must be called this for @measure_func
482+
self.clock = hs.get_clock() # nb must be called this for @measure_func
479483
self.auth_blocking = hs.get_auth_blocking()
480484
self._event_auth_handler = hs.get_event_auth_handler()
481485
self.store = hs.get_datastores().main
482486
self._storage_controllers = hs.get_storage_controllers()
483487
self.state = hs.get_state_handler()
484-
self.clock = hs.get_clock()
485-
self.validator = EventValidator()
486488
self.profile_handler = hs.get_profile_handler()
487-
self.event_builder_factory = hs.get_event_builder_factory()
488-
self.server_name = hs.hostname
489489
self.notifier = hs.get_notifier()
490490
self.config = hs.config
491491
self.require_membership_for_aliases = (

synapse/handlers/presence.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,7 @@ async def bump_presence_active_time(
747747
class PresenceHandler(BasePresenceHandler):
748748
def __init__(self, hs: "HomeServer"):
749749
super().__init__(hs)
750+
self.server_name = hs.hostname
750751
self.wheel_timer: WheelTimer[str] = WheelTimer()
751752
self.notifier = hs.get_notifier()
752753

@@ -941,7 +942,9 @@ async def _update_states(
941942

942943
now = self.clock.time_msec()
943944

944-
with Measure(self.clock, "presence_update_states"):
945+
with Measure(
946+
self.clock, name="presence_update_states", server_name=self.server_name
947+
):
945948
# NOTE: We purposefully don't await between now and when we've
946949
# calculated what we want to do with the new states, to avoid races.
947950

@@ -1497,7 +1500,9 @@ async def _process_presence() -> None:
14971500
async def _unsafe_process(self) -> None:
14981501
# Loop round handling deltas until we're up to date
14991502
while True:
1500-
with Measure(self.clock, "presence_delta"):
1503+
with Measure(
1504+
self.clock, name="presence_delta", server_name=self.server_name
1505+
):
15011506
room_max_stream_ordering = self.store.get_room_max_stream_ordering()
15021507
if self._event_pos == room_max_stream_ordering:
15031508
return
@@ -1759,6 +1764,7 @@ def __init__(self, hs: "HomeServer"):
17591764
# Same with get_presence_router:
17601765
#
17611766
# AuthHandler -> Notifier -> PresenceEventSource -> ModuleApi -> AuthHandler
1767+
self.server_name = hs.hostname
17621768
self.get_presence_handler = hs.get_presence_handler
17631769
self.get_presence_router = hs.get_presence_router
17641770
self.clock = hs.get_clock()
@@ -1792,7 +1798,9 @@ async def get_new_events(
17921798
user_id = user.to_string()
17931799
stream_change_cache = self.store.presence_stream_cache
17941800

1795-
with Measure(self.clock, "presence.get_new_events"):
1801+
with Measure(
1802+
self.clock, name="presence.get_new_events", server_name=self.server_name
1803+
):
17961804
if from_key is not None:
17971805
from_key = int(from_key)
17981806

synapse/handlers/sync.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ class E2eeSyncResult:
329329

330330
class SyncHandler:
331331
def __init__(self, hs: "HomeServer"):
332+
self.server_name = hs.hostname
332333
self.hs_config = hs.config
333334
self.store = hs.get_datastores().main
334335
self.notifier = hs.get_notifier()
@@ -710,7 +711,9 @@ async def ephemeral_by_room(
710711

711712
sync_config = sync_result_builder.sync_config
712713

713-
with Measure(self.clock, "ephemeral_by_room"):
714+
with Measure(
715+
self.clock, name="ephemeral_by_room", server_name=self.server_name
716+
):
714717
typing_key = since_token.typing_key if since_token else 0
715718

716719
room_ids = sync_result_builder.joined_room_ids
@@ -783,7 +786,9 @@ async def _load_filtered_recents(
783786
and current token to send down to clients.
784787
newly_joined_room
785788
"""
786-
with Measure(self.clock, "load_filtered_recents"):
789+
with Measure(
790+
self.clock, name="load_filtered_recents", server_name=self.server_name
791+
):
787792
timeline_limit = sync_config.filter_collection.timeline_limit()
788793
block_all_timeline = (
789794
sync_config.filter_collection.blocks_all_room_timeline()
@@ -1174,7 +1179,9 @@ async def compute_state_delta(
11741179
# updates even if they occurred logically before the previous event.
11751180
# TODO(mjark) Check for new redactions in the state events.
11761181

1177-
with Measure(self.clock, "compute_state_delta"):
1182+
with Measure(
1183+
self.clock, name="compute_state_delta", server_name=self.server_name
1184+
):
11781185
# The memberships needed for events in the timeline.
11791186
# Only calculated when `lazy_load_members` is on.
11801187
members_to_fetch: Optional[Set[str]] = None
@@ -1791,7 +1798,9 @@ async def unread_notifs_for_room_id(
17911798
# the DB.
17921799
return RoomNotifCounts.empty()
17931800

1794-
with Measure(self.clock, "unread_notifs_for_room_id"):
1801+
with Measure(
1802+
self.clock, name="unread_notifs_for_room_id", server_name=self.server_name
1803+
):
17951804
return await self.store.get_unread_event_push_actions_by_room_for_user(
17961805
room_id,
17971806
sync_config.user.to_string(),

0 commit comments

Comments
 (0)