From 9c6863e1a7f2200e0517405ba1e7b41bee4b4ab2 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Thu, 15 May 2025 16:20:41 -0500 Subject: [PATCH] Remove `metrics` listener type in favor of `http` listener with `metrics` resource --- docs/metrics-howto.md | 6 +++-- .../configuration/config_documentation.md | 2 -- synapse/app/_base.py | 14 ----------- synapse/app/generic_worker.py | 23 ++++--------------- synapse/app/homeserver.py | 16 ------------- synapse/metrics/__init__.py | 15 ------------ 6 files changed, 8 insertions(+), 68 deletions(-) diff --git a/docs/metrics-howto.md b/docs/metrics-howto.md index eb6b90cec9..42f0be3c63 100644 --- a/docs/metrics-howto.md +++ b/docs/metrics-howto.md @@ -53,15 +53,17 @@ type: http x_forwarded: true bind_addresses: ['::1', '127.0.0.1'] - resources: - names: [client, federation] compress: false # beginning of the new metrics listener - port: 9000 - type: metrics + type: http bind_addresses: ['::1', '127.0.0.1'] + resources: + - names: [metrics] + compress: false ``` 1. Restart Synapse. diff --git a/docs/usage/configuration/config_documentation.md b/docs/usage/configuration/config_documentation.md index e688bc5cd8..edd5d9618d 100644 --- a/docs/usage/configuration/config_documentation.md +++ b/docs/usage/configuration/config_documentation.md @@ -513,8 +513,6 @@ See the docs [request log format](../administration/request_log.md). * `manhole`: (see the docs [here](../../manhole.md)), - * `metrics`: (see the docs [here](../../metrics-howto.md)), - * `tls`: set to true to enable TLS for this listener. Will use the TLS key/cert specified in tls_private_key_path / tls_certificate_path. * `x_forwarded`: Only valid for an 'http' listener. Set to true to use the X-Forwarded-For header as the client IP. Useful when Synapse is diff --git a/synapse/app/_base.py b/synapse/app/_base.py index 4cc260d551..d8e6db24bd 100644 --- a/synapse/app/_base.py +++ b/synapse/app/_base.py @@ -283,20 +283,6 @@ def register_start( reactor.callWhenRunning(lambda: defer.ensureDeferred(wrapper())) -def listen_metrics(bind_addresses: StrCollection, port: int) -> None: - """ - Start Prometheus metrics server. - """ - from prometheus_client import start_http_server as start_http_server_prometheus - - from synapse.metrics import RegistryProxy - - for host in bind_addresses: - logger.info("Starting metrics listener on %s:%d", host, port) - _set_prometheus_client_use_created_metrics(False) - start_http_server_prometheus(port, addr=host, registry=RegistryProxy) - - def _set_prometheus_client_use_created_metrics(new_value: bool) -> None: """ Sets whether prometheus_client should expose `_created`-suffixed metrics for diff --git a/synapse/app/generic_worker.py b/synapse/app/generic_worker.py index f495d5b7e4..0f59040a2b 100644 --- a/synapse/app/generic_worker.py +++ b/synapse/app/generic_worker.py @@ -49,7 +49,7 @@ from synapse.config.server import ListenerConfig, TCPListenerConfig from synapse.federation.transport.server import TransportLayerServer from synapse.http.server import JsonResource, OptionsResource from synapse.logging.context import LoggingContext -from synapse.metrics import METRICS_PREFIX, MetricsResource, RegistryProxy +from synapse.metrics import METRICS_PREFIX, MetricsResource from synapse.replication.http import REPLICATION_PREFIX, ReplicationRestResource from synapse.rest import ClientRestResource, admin from synapse.rest.health import HealthResource @@ -186,7 +186,9 @@ class GenericWorkerServer(HomeServer): for res in listener_config.http_options.resources: for name in res.names: if name == "metrics": - resources[METRICS_PREFIX] = MetricsResource(RegistryProxy) + resources[METRICS_PREFIX] = MetricsResource( + self.metrics_collector_registry + ) elif name == "client": resource: Resource = ClientRestResource(self) @@ -284,23 +286,6 @@ class GenericWorkerServer(HomeServer): "Can not using a unix socket for manhole at this time." ) - elif listener.type == "metrics": - if not self.config.metrics.enable_metrics: - logger.warning( - "Metrics listener configured, but " - "enable_metrics is not True!" - ) - else: - if isinstance(listener, TCPListenerConfig): - _base.listen_metrics( - listener.bind_addresses, - listener.port, - ) - else: - raise ConfigError( - "Can not use a unix socket for metrics at this time." - ) - else: logger.warning("Unsupported listener type: %s", listener.type) diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 2b68b96cf3..9ad4a38c7f 100644 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -288,22 +288,6 @@ class SynapseHomeServer(HomeServer): raise ConfigError( "Can not use a unix socket for manhole at this time." ) - elif listener.type == "metrics": - if not self.config.metrics.enable_metrics: - logger.warning( - "Metrics listener configured, but " - "enable_metrics is not True!" - ) - else: - if isinstance(listener, TCPListenerConfig): - _base.listen_metrics( - listener.bind_addresses, - listener.port, - ) - else: - raise ConfigError( - "Can not use a unix socket for metrics at this time." - ) else: # this shouldn't happen, as the listener type should have been checked diff --git a/synapse/metrics/__init__.py b/synapse/metrics/__init__.py index 3051b623d0..28f6ad14a1 100644 --- a/synapse/metrics/__init__.py +++ b/synapse/metrics/__init__.py @@ -67,21 +67,6 @@ all_gauges: Dict[str, Collector] = {} HAVE_PROC_SELF_STAT = os.path.exists("/proc/self/stat") -class _RegistryProxy: - @staticmethod - def collect() -> Iterable[Metric]: - for metric in REGISTRY.collect(): - if not metric.name.startswith("__"): - yield metric - - -# A little bit nasty, but collect() above is static so a Protocol doesn't work. -# _RegistryProxy matches the signature of a CollectorRegistry instance enough -# for it to be usable in the contexts in which we use it. -# TODO Do something nicer about this. -RegistryProxy = cast(CollectorRegistry, _RegistryProxy) - - @attr.s(slots=True, hash=True, auto_attribs=True) class LaterGauge(Collector): """A Gauge which periodically calls a user-provided callback to produce metrics."""