Put some gauge metrics on the number of notifier listeners, and notified-on objects (users, rooms, appservices)

This commit is contained in:
Paul "LeoNerd" Evans 2015-03-05 15:12:39 +00:00
parent 25187ab674
commit 6d146e15df
1 changed files with 39 additions and 0 deletions

View File

@ -19,12 +19,25 @@ from synapse.util.logutils import log_function
from synapse.util.logcontext import PreserveLoggingContext from synapse.util.logcontext import PreserveLoggingContext
from synapse.util.async import run_on_reactor from synapse.util.async import run_on_reactor
from synapse.types import StreamToken from synapse.types import StreamToken
import synapse.metrics
import logging import logging
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
metrics = synapse.metrics.get_metrics_for(__name__)
# TODO(paul): Should be shared somewhere
def count(func, l):
"""Return the number of items in l for which func returns true."""
n = 0
for x in l:
if func(x):
n += 1
return n
class _NotificationListener(object): class _NotificationListener(object):
""" This represents a single client connection to the events stream. """ This represents a single client connection to the events stream.
@ -95,6 +108,32 @@ class Notifier(object):
"user_joined_room", self._user_joined_room "user_joined_room", self._user_joined_room
) )
# This is not a very cheap test to perform, but it's only executed
# when rendering the metrics page, which is likely once per minute at
# most when scraping it.
def count_listeners():
all_listeners = set()
for x in self.room_to_listeners.values():
all_listeners |= x
for x in self.user_to_listeners.values():
all_listeners |= x
for x in self.appservice_to_listeners.values():
all_listeners |= x
return len(all_listeners)
metrics.register_callback("all_listeners", count_listeners)
metrics.register_callback("rooms",
lambda: count(bool, self.room_to_listeners.values())
)
metrics.register_callback("users",
lambda: count(bool, self.user_to_listeners.values())
)
metrics.register_callback("appservices",
lambda: count(bool, self.appservice_to_listeners.values())
)
@log_function @log_function
@defer.inlineCallbacks @defer.inlineCallbacks
def on_new_room_event(self, event, extra_users=[]): def on_new_room_event(self, event, extra_users=[]):