Skip to content

Commit

Permalink
Add metrics to the threadpools (matrix-org#11178)
Browse files Browse the repository at this point in the history
  • Loading branch information
erikjohnston authored Nov 1, 2021
1 parent 2451003 commit 82d2168
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 1 deletion.
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

0 comments on commit 82d2168

Please sign in to comment.