Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add metrics to the threadpools #11178

Merged
merged 3 commits into from
Nov 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/11178.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add metrics for thread pool usage.
5 changes: 5 additions & 0 deletions synapse/app/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
from synapse.events.third_party_rules import load_legacy_third_party_event_rules
from synapse.handlers.auth import load_legacy_password_auth_providers
from synapse.logging.context import PreserveLoggingContext
from synapse.metrics import register_threadpool
from synapse.metrics.background_process_metrics import wrap_as_background_process
from synapse.metrics.jemalloc import setup_jemalloc_stats
from synapse.util.caches.lrucache import setup_expire_lru_cache_entries
Expand Down Expand Up @@ -351,6 +352,10 @@ async def start(hs: "HomeServer"):
GAIResolver(reactor, getThreadPool=lambda: resolver_threadpool)
)

# Register the threadpools with our metrics.
register_threadpool("default", reactor.getThreadPool())
register_threadpool("gai_resolver", resolver_threadpool)

# Set up the SIGHUP machinery.
if hasattr(signal, "SIGHUP"):

Expand Down
37 changes: 37 additions & 0 deletions synapse/metrics/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
)

from twisted.internet import reactor
from twisted.python.threadpool import ThreadPool

import synapse
from synapse.metrics._exposition import (
Expand Down Expand Up @@ -526,6 +527,42 @@ def collect(self):
labelnames=("type", "reason"),
)

threadpool_total_threads = Gauge(
"synapse_threadpool_total_threads",
"Total number of threads currently in the threadpool",
["name"],
)

threadpool_total_working_threads = Gauge(
"synapse_threadpool_working_threads",
"Number of threads currently working in the threadpool",
["name"],
)

threadpool_total_min_threads = Gauge(
"synapse_threadpool_min_threads",
"Minimum number of threads configured in the threadpool",
["name"],
)

threadpool_total_max_threads = Gauge(
"synapse_threadpool_max_threads",
"Maximum number of threads configured in the threadpool",
["name"],
)


def register_threadpool(name: str, threadpool: ThreadPool) -> None:
"""Add metrics for the threadpool."""

threadpool_total_min_threads.labels(name).set(threadpool.min)
threadpool_total_max_threads.labels(name).set(threadpool.max)

threadpool_total_threads.labels(name).set_function(lambda: len(threadpool.threads))
threadpool_total_working_threads.labels(name).set_function(
lambda: len(threadpool.working)
)


class ReactorLastSeenMetric:
def collect(self):
Expand Down
7 changes: 6 additions & 1 deletion synapse/storage/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
current_context,
make_deferred_yieldable,
)
from synapse.metrics import register_threadpool
from synapse.metrics.background_process_metrics import run_as_background_process
from synapse.storage.background_updates import BackgroundUpdater
from synapse.storage.engines import BaseDatabaseEngine, PostgresEngine, Sqlite3Engine
Expand Down Expand Up @@ -104,13 +105,17 @@ def _on_new_connection(conn):
LoggingDatabaseConnection(conn, engine, "on_new_connection")
)

return adbapi.ConnectionPool(
connection_pool = adbapi.ConnectionPool(
db_config.config["name"],
cp_reactor=reactor,
cp_openfun=_on_new_connection,
**db_args,
)

register_threadpool(f"database-{db_config.name}", connection_pool.threadpool)

return connection_pool


def make_conn(
db_config: DatabaseConnectionConfig,
Expand Down