Troubleshooting Homeserver Prometheus Metrics Setup for Chat

Running a real-time community chat room alongside traditional discussion boards requires close observation of server load. When administrators attempt to gather telemetry from their homeserver using Prometheus, scrapes often fail quietly or return empty data. Diagnosing these issues requires reviewing configuration files line by line to verify listener directives, endpoint paths, and process permissions.
Diagnosing Missing Metrics: The Main Configuration Directive
If Prometheus reports that your chat homeserver target cannot be scraped or is completely absent, the primary issue is often an unactivated flag in the server configuration. In homeserver.yaml, tracking will not function unless the primary flag is explicitly declared. Administrators must verify that enable_metrics is set to True within this file. If this setting remains commented out or omitted, the homeserver software will refuse to generate metric data entirely, regardless of how listeners are set up.
When hosting an interactive chat system like a Synapse Matrix homeserver, enabling this parameter is the foundational requirement before any internal endpoint can process incoming telemetry requests. Review the official instructions in the Synapse monitoring documentation whenever modifying root configuration files.
Resolving Listener Conflicts: Shared Web Server vs. Dedicated Port
Once telemetry generation is toggled on, Prometheus must be able to reach the endpoint. Synapse serves these statistics at the /_synapse/metrics path using one of two listener architectures. Choosing the wrong method or misconfiguring listener entries will lead to unreachable endpoints.
The first approach binds metrics collection to the primary web listener, which frequently handles client and federation traffic on port 8008. Under the existing listener definition, administrators add the resource directly:
listeners:
- port: 8008
tls: false
type: http
x_forwarded: true
bind_addresses: ['::1', '127.0.0.1']
resources:
- names: [client, federation, metrics]
compress: false
While simple, this method exposes the statistics on the standard HTTP port. If you do not want internal statistics publicly exposed to outside visitors, you must filter the path out at your reverse proxy or load balancer. Alternatively, you can use the second listener method, which launches a dedicated server on a separate port, such as port 9000, running in an isolated thread:
- port: 9000
type: metrics
bind_addresses: ['::1', '127.0.0.1']
A separate thread prevents heavy chat traffic from starving the metrics retrieval process. Dedicated listeners operate over HTTP only and are simpler to isolate within internal networks.
Correcting Scrape Target Errors in Prometheus
A common failure point occurs when Prometheus successfully connects to the homeserver IP and port but reports an error finding data. By default, Prometheus looks for telemetry at a root path, whereas Synapse requires targeting /_synapse/metrics. To resolve this mismatch, administrators must explicitly define metrics_path under the scrape configuration inside Prometheus.
Review your Prometheus scrape configuration to ensure the target matches these parameters:
- Set
job_nameto"synapse". - Define
scrape_intervalto15s. - Set
metrics_pathto"/_synapse/metrics". - Under
static_configs, specifytargets: ["my.server.here:port"], replacing the values with your homeserver IP address and the listener port assigned to the metrics resource. - If operating an older deployment where Prometheus is older than 1.5.2, replace
static_configswithtarget_groupsto maintain compatibility.
Fixing Incomplete Telemetry Across Scaled Worker Instances
Communities handling heavy messaging volume often transition from a monolithic process to background workers. A frequent troubleshooting confusion arises when the main metrics dashboard shows missing worker activity. Worker processes do not send their telemetry through the main homeserver process. Instead, each worker exposes its own metrics independently.
To collect data across a distributed setup, administrators must add a dedicated listener under worker_listeners in each worker configuration:
worker_listeners:
- type: metrics
bind_address: ''
port: 9101
The bind_address and port must be reachable by Prometheus without conflicting with neighboring worker services. With this configuration, Prometheus collects statistics directly from the worker at http://127.0.0.1:9101. When defining the Prometheus scrape target, administrators can attach custom labels—such as setting job to "master" or "generic_worker", alongside an index value like 1 or 2—to properly organize graphs in Grafana. For broader discussions on maintaining platform responsiveness, see our guide on performance optimization.
Step-by-Step Service Verification Sequence
Configuration changes to homeserver listeners and scrape jobs do not apply dynamically. Follow this sequence to restore telemetry flow:
- Validate syntax in
homeserver.yamland ensureenable_metricsis set toTrue. - Verify that listener definitions bind to loopback addresses like
127.0.0.1and::1, or the appropriate internal interface. - Restart the Synapse homeserver process to initialize the new metric thread or listener resource.
- Update the Prometheus configuration file with the non-default
/_synapse/metricspath. - Restart Prometheus to apply the new scrape targets.
For more detailed breakdowns on recording rules and dashboard setup, refer to the Synapse monitoring documentation.
Sources
Technical guidance and listener examples adapted from the Monitoring - Synapse reference documentation.
Published October 31, 2026. No affiliate links on this page. Facts come from the sources linked above; check them for updates.