Skip to content

Commit 12a9a8c

Browse files
committed
Merge branch 'develop' into madlittlemods/18592-refactor-histogram
Conflicts: scripts-dev/mypy_synapse_plugin.py synapse/http/request_metrics.py synapse/replication/tcp/external_cache.py synapse/storage/database.py
2 parents 4c84ffa + 2c236be commit 12a9a8c

43 files changed

Lines changed: 638 additions & 236 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

changelog.d/18656.misc

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

scripts-dev/mypy_synapse_plugin.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def get_function_signature_hook(
6060
self, fullname: str
6161
) -> Optional[Callable[[FunctionSigContext], FunctionLike]]:
6262
if fullname in (
63+
"prometheus_client.metrics.Counter",
6364
"prometheus_client.metrics.Histogram",
6465
# TODO: Add other prometheus_client metrics that need checking as we
6566
# refactor, see https://github.com/element-hq/synapse/issues/18592

synapse/appservice/api.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
from synapse.events.utils import SerializeEventConfig, serialize_event
4949
from synapse.http.client import SimpleHttpClient, is_unknown_endpoint
5050
from synapse.logging import opentracing
51+
from synapse.metrics import SERVER_NAME_LABEL
5152
from synapse.types import DeviceListUpdates, JsonDict, JsonMapping, ThirdPartyInstanceID
5253
from synapse.util.caches.response_cache import ResponseCache
5354

@@ -59,29 +60,31 @@
5960
sent_transactions_counter = Counter(
6061
"synapse_appservice_api_sent_transactions",
6162
"Number of /transactions/ requests sent",
62-
["service"],
63+
labelnames=["service", SERVER_NAME_LABEL],
6364
)
6465

6566
failed_transactions_counter = Counter(
6667
"synapse_appservice_api_failed_transactions",
6768
"Number of /transactions/ requests that failed to send",
68-
["service"],
69+
labelnames=["service", SERVER_NAME_LABEL],
6970
)
7071

7172
sent_events_counter = Counter(
72-
"synapse_appservice_api_sent_events", "Number of events sent to the AS", ["service"]
73+
"synapse_appservice_api_sent_events",
74+
"Number of events sent to the AS",
75+
labelnames=["service", SERVER_NAME_LABEL],
7376
)
7477

7578
sent_ephemeral_counter = Counter(
7679
"synapse_appservice_api_sent_ephemeral",
7780
"Number of ephemeral events sent to the AS",
78-
["service"],
81+
labelnames=["service", SERVER_NAME_LABEL],
7982
)
8083

8184
sent_todevice_counter = Counter(
8285
"synapse_appservice_api_sent_todevice",
8386
"Number of todevice messages sent to the AS",
84-
["service"],
87+
labelnames=["service", SERVER_NAME_LABEL],
8588
)
8689

8790
HOUR_IN_MS = 60 * 60 * 1000
@@ -382,6 +385,7 @@ async def push_bulk(
382385
"left": list(device_list_summary.left),
383386
}
384387

388+
labels = {"service": service.id, SERVER_NAME_LABEL: self.server_name}
385389
try:
386390
args = None
387391
if self.config.use_appservice_legacy_authorization:
@@ -399,10 +403,10 @@ async def push_bulk(
399403
service.url,
400404
[event.get("event_id") for event in events],
401405
)
402-
sent_transactions_counter.labels(service.id).inc()
403-
sent_events_counter.labels(service.id).inc(len(serialized_events))
404-
sent_ephemeral_counter.labels(service.id).inc(len(ephemeral))
405-
sent_todevice_counter.labels(service.id).inc(len(to_device_messages))
406+
sent_transactions_counter.labels(**labels).inc()
407+
sent_events_counter.labels(**labels).inc(len(serialized_events))
408+
sent_ephemeral_counter.labels(**labels).inc(len(ephemeral))
409+
sent_todevice_counter.labels(**labels).inc(len(to_device_messages))
406410
return True
407411
except CodeMessageException as e:
408412
logger.warning(
@@ -421,7 +425,7 @@ async def push_bulk(
421425
ex.args,
422426
exc_info=logger.isEnabledFor(logging.DEBUG),
423427
)
424-
failed_transactions_counter.labels(service.id).inc()
428+
failed_transactions_counter.labels(**labels).inc()
425429
return False
426430

427431
async def claim_client_keys(

synapse/federation/federation_client.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
from synapse.http.client import is_unknown_endpoint
7575
from synapse.http.types import QueryParams
7676
from synapse.logging.opentracing import SynapseTags, log_kv, set_tag, tag_args, trace
77+
from synapse.metrics import SERVER_NAME_LABEL
7778
from synapse.types import JsonDict, StrCollection, UserID, get_domain_from_id
7879
from synapse.types.handlers.policy_server import RECOMMENDATION_OK, RECOMMENDATION_SPAM
7980
from synapse.util.async_helpers import concurrently_execute
@@ -85,7 +86,9 @@
8586

8687
logger = logging.getLogger(__name__)
8788

88-
sent_queries_counter = Counter("synapse_federation_client_sent_queries", "", ["type"])
89+
sent_queries_counter = Counter(
90+
"synapse_federation_client_sent_queries", "", labelnames=["type", SERVER_NAME_LABEL]
91+
)
8992

9093

9194
PDU_RETRY_TIME_MS = 1 * 60 * 1000
@@ -209,7 +212,10 @@ async def make_query(
209212
Returns:
210213
The JSON object from the response
211214
"""
212-
sent_queries_counter.labels(query_type).inc()
215+
sent_queries_counter.labels(
216+
type=query_type,
217+
**{SERVER_NAME_LABEL: self.server_name},
218+
).inc()
213219

214220
return await self.transport_layer.make_query(
215221
destination,
@@ -231,7 +237,10 @@ async def query_client_keys(
231237
Returns:
232238
The JSON object from the response
233239
"""
234-
sent_queries_counter.labels("client_device_keys").inc()
240+
sent_queries_counter.labels(
241+
type="client_device_keys",
242+
**{SERVER_NAME_LABEL: self.server_name},
243+
).inc()
235244
return await self.transport_layer.query_client_keys(
236245
destination, content, timeout
237246
)
@@ -242,7 +251,10 @@ async def query_user_devices(
242251
"""Query the device keys for a list of user ids hosted on a remote
243252
server.
244253
"""
245-
sent_queries_counter.labels("user_devices").inc()
254+
sent_queries_counter.labels(
255+
type="user_devices",
256+
**{SERVER_NAME_LABEL: self.server_name},
257+
).inc()
246258
return await self.transport_layer.query_user_devices(
247259
destination, user_id, timeout
248260
)
@@ -264,7 +276,10 @@ async def claim_client_keys(
264276
Returns:
265277
The JSON object from the response
266278
"""
267-
sent_queries_counter.labels("client_one_time_keys").inc()
279+
sent_queries_counter.labels(
280+
type="client_one_time_keys",
281+
**{SERVER_NAME_LABEL: self.server_name},
282+
).inc()
268283

269284
# Convert the query with counts into a stable and unstable query and check
270285
# if attempting to claim more than 1 OTK.

synapse/federation/federation_server.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,18 @@
105105

106106
logger = logging.getLogger(__name__)
107107

108-
received_pdus_counter = Counter("synapse_federation_server_received_pdus", "")
108+
received_pdus_counter = Counter(
109+
"synapse_federation_server_received_pdus", "", labelnames=[SERVER_NAME_LABEL]
110+
)
109111

110-
received_edus_counter = Counter("synapse_federation_server_received_edus", "")
112+
received_edus_counter = Counter(
113+
"synapse_federation_server_received_edus", "", labelnames=[SERVER_NAME_LABEL]
114+
)
111115

112116
received_queries_counter = Counter(
113-
"synapse_federation_server_received_queries", "", ["type"]
117+
"synapse_federation_server_received_queries",
118+
"",
119+
labelnames=["type", SERVER_NAME_LABEL],
114120
)
115121

116122
pdu_process_time = Histogram(
@@ -436,7 +442,9 @@ async def _handle_pdus_in_txn(
436442
report back to the sending server.
437443
"""
438444

439-
received_pdus_counter.inc(len(transaction.pdus))
445+
received_pdus_counter.labels(**{SERVER_NAME_LABEL: self.server_name}).inc(
446+
len(transaction.pdus)
447+
)
440448

441449
origin_host, _ = parse_server_name(origin)
442450

@@ -555,7 +563,7 @@ async def _handle_edus_in_txn(self, origin: str, transaction: Transaction) -> No
555563
"""Process the EDUs in a received transaction."""
556564

557565
async def _process_edu(edu_dict: JsonDict) -> None:
558-
received_edus_counter.inc()
566+
received_edus_counter.labels(**{SERVER_NAME_LABEL: self.server_name}).inc()
559567

560568
edu = Edu(
561569
origin=origin,
@@ -670,7 +678,10 @@ async def on_pdu_request(
670678
async def on_query_request(
671679
self, query_type: str, args: Dict[str, str]
672680
) -> Tuple[int, Dict[str, Any]]:
673-
received_queries_counter.labels(query_type).inc()
681+
received_queries_counter.labels(
682+
type=query_type,
683+
**{SERVER_NAME_LABEL: self.server_name},
684+
).inc()
674685
resp = await self.registry.on_query(query_type, args)
675686
return 200, resp
676687

synapse/federation/sender/__init__.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,13 @@
190190
sent_pdus_destination_dist_count = Counter(
191191
"synapse_federation_client_sent_pdu_destinations_count",
192192
"Number of PDUs queued for sending to one or more destinations",
193+
labelnames=[SERVER_NAME_LABEL],
193194
)
194195

195196
sent_pdus_destination_dist_total = Counter(
196197
"synapse_federation_client_sent_pdu_destinations",
197198
"Total number of PDUs queued for sending across all destinations",
199+
labelnames=[SERVER_NAME_LABEL],
198200
)
199201

200202
# Time (in s) to wait before trying to wake up destinations that have
@@ -710,13 +712,19 @@ async def handle_room_events(events: List[EventBase]) -> None:
710712
"federation_sender"
711713
).set(ts)
712714

713-
events_processed_counter.inc(len(event_entries))
715+
events_processed_counter.labels(
716+
**{SERVER_NAME_LABEL: self.server_name}
717+
).inc(len(event_entries))
714718

715-
event_processing_loop_room_count.labels("federation_sender").inc(
716-
len(events_by_room)
717-
)
719+
event_processing_loop_room_count.labels(
720+
name="federation_sender",
721+
**{SERVER_NAME_LABEL: self.server_name},
722+
).inc(len(events_by_room))
718723

719-
event_processing_loop_counter.labels("federation_sender").inc()
724+
event_processing_loop_counter.labels(
725+
name="federation_sender",
726+
**{SERVER_NAME_LABEL: self.server_name},
727+
).inc()
720728

721729
synapse.metrics.event_processing_positions.labels(
722730
"federation_sender"
@@ -737,8 +745,12 @@ async def _send_pdu(self, pdu: EventBase, destinations: Iterable[str]) -> None:
737745
if not destinations:
738746
return
739747

740-
sent_pdus_destination_dist_total.inc(len(destinations))
741-
sent_pdus_destination_dist_count.inc()
748+
sent_pdus_destination_dist_total.labels(
749+
**{SERVER_NAME_LABEL: self.server_name}
750+
).inc(len(destinations))
751+
sent_pdus_destination_dist_count.labels(
752+
**{SERVER_NAME_LABEL: self.server_name}
753+
).inc()
742754

743755
assert pdu.internal_metadata.stream_ordering
744756

synapse/federation/sender/per_destination_queue.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
from synapse.handlers.presence import format_user_presence_state
4141
from synapse.logging import issue9533_logger
4242
from synapse.logging.opentracing import SynapseTags, set_tag
43-
from synapse.metrics import sent_transactions_counter
43+
from synapse.metrics import SERVER_NAME_LABEL, sent_transactions_counter
4444
from synapse.metrics.background_process_metrics import run_as_background_process
4545
from synapse.types import JsonDict, ReadReceipt
4646
from synapse.util.retryutils import NotRetryingDestination, get_retry_limiter
@@ -56,13 +56,15 @@
5656

5757

5858
sent_edus_counter = Counter(
59-
"synapse_federation_client_sent_edus", "Total number of EDUs successfully sent"
59+
"synapse_federation_client_sent_edus",
60+
"Total number of EDUs successfully sent",
61+
labelnames=[SERVER_NAME_LABEL],
6062
)
6163

6264
sent_edus_by_type = Counter(
6365
"synapse_federation_client_sent_edus_by_type",
6466
"Number of sent EDUs successfully sent, by event type",
65-
["type"],
67+
labelnames=["type", SERVER_NAME_LABEL],
6668
)
6769

6870

@@ -368,10 +370,17 @@ async def _transaction_transmission_loop(self) -> None:
368370
self._destination, pending_pdus, pending_edus
369371
)
370372

371-
sent_transactions_counter.inc()
372-
sent_edus_counter.inc(len(pending_edus))
373+
sent_transactions_counter.labels(
374+
**{SERVER_NAME_LABEL: self.server_name}
375+
).inc()
376+
sent_edus_counter.labels(
377+
**{SERVER_NAME_LABEL: self.server_name}
378+
).inc(len(pending_edus))
373379
for edu in pending_edus:
374-
sent_edus_by_type.labels(edu.edu_type).inc()
380+
sent_edus_by_type.labels(
381+
type=edu.edu_type,
382+
**{SERVER_NAME_LABEL: self.server_name},
383+
).inc()
375384

376385
except NotRetryingDestination as e:
377386
logger.debug(
@@ -596,7 +605,9 @@ async def _catch_up_transmission_loop(self) -> None:
596605
self._destination, room_catchup_pdus, []
597606
)
598607

599-
sent_transactions_counter.inc()
608+
sent_transactions_counter.labels(
609+
**{SERVER_NAME_LABEL: self.server_name}
610+
).inc()
600611

601612
# We pulled this from the DB, so it'll be non-null
602613
assert pdu.internal_metadata.stream_ordering

synapse/handlers/appservice.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@
6969

7070
logger = logging.getLogger(__name__)
7171

72-
events_processed_counter = Counter("synapse_handlers_appservice_events_processed", "")
72+
events_processed_counter = Counter(
73+
"synapse_handlers_appservice_events_processed", "", labelnames=[SERVER_NAME_LABEL]
74+
)
7375

7476

7577
class ApplicationServicesHandler:
@@ -209,13 +211,19 @@ async def handle_room_events(events: Iterable[EventBase]) -> None:
209211
"appservice_sender"
210212
).set(upper_bound)
211213

212-
events_processed_counter.inc(len(events))
214+
events_processed_counter.labels(
215+
**{SERVER_NAME_LABEL: self.server_name}
216+
).inc(len(events))
213217

214-
event_processing_loop_room_count.labels("appservice_sender").inc(
215-
len(events_by_room)
216-
)
218+
event_processing_loop_room_count.labels(
219+
name="appservice_sender",
220+
**{SERVER_NAME_LABEL: self.server_name},
221+
).inc(len(events_by_room))
217222

218-
event_processing_loop_counter.labels("appservice_sender").inc()
223+
event_processing_loop_counter.labels(
224+
name="appservice_sender",
225+
**{SERVER_NAME_LABEL: self.server_name},
226+
).inc()
219227

220228
if events:
221229
now = self.clock.time_msec()

synapse/handlers/auth.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
from synapse.http.server import finish_request, respond_with_html
7171
from synapse.http.site import SynapseRequest
7272
from synapse.logging.context import defer_to_thread
73+
from synapse.metrics import SERVER_NAME_LABEL
7374
from synapse.metrics.background_process_metrics import run_as_background_process
7475
from synapse.storage.databases.main.registration import (
7576
LoginTokenExpired,
@@ -95,7 +96,7 @@
9596
invalid_login_token_counter = Counter(
9697
"synapse_user_login_invalid_login_tokens",
9798
"Counts the number of rejected m.login.token on /login",
98-
["reason"],
99+
labelnames=["reason", SERVER_NAME_LABEL],
99100
)
100101

101102

@@ -1478,11 +1479,20 @@ async def consume_login_token(self, login_token: str) -> LoginTokenLookupResult:
14781479
try:
14791480
return await self.store.consume_login_token(login_token)
14801481
except LoginTokenExpired:
1481-
invalid_login_token_counter.labels("expired").inc()
1482+
invalid_login_token_counter.labels(
1483+
reason="expired",
1484+
**{SERVER_NAME_LABEL: self.server_name},
1485+
).inc()
14821486
except LoginTokenReused:
1483-
invalid_login_token_counter.labels("reused").inc()
1487+
invalid_login_token_counter.labels(
1488+
reason="reused",
1489+
**{SERVER_NAME_LABEL: self.server_name},
1490+
).inc()
14841491
except NotFoundError:
1485-
invalid_login_token_counter.labels("not found").inc()
1492+
invalid_login_token_counter.labels(
1493+
reason="not found",
1494+
**{SERVER_NAME_LABEL: self.server_name},
1495+
).inc()
14861496

14871497
raise AuthError(403, "Invalid login token", errcode=Codes.FORBIDDEN)
14881498

0 commit comments

Comments
 (0)