diff --git a/synapse/metrics/__init__.py b/synapse/metrics/__init__.py
index 76d5998d75..a6b868775d 100644
--- a/synapse/metrics/__init__.py
+++ b/synapse/metrics/__init__.py
@@ -13,14 +13,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# Because otherwise 'resource' collides with synapse.metrics.resource
-from __future__ import absolute_import
-
import logging
-from resource import getrusage, RUSAGE_SELF
import functools
-import os
-import stat
import time
import gc
@@ -36,6 +30,7 @@ logger = logging.getLogger(__name__)
all_metrics = []
+all_collectors = []
class Metrics(object):
@@ -46,6 +41,9 @@ class Metrics(object):
def __init__(self, name):
self.name_prefix = name
+ def register_collector(self, func):
+ all_collectors.append(func)
+
def _register(self, metric_class, name, *args, **kwargs):
full_name = "%s_%s" % (self.name_prefix, name)
@@ -94,8 +92,8 @@ def get_metrics_for(pkg_name):
def render_all():
strs = []
- # TODO(paul): Internal hack
- update_resource_metrics()
+ for collector in all_collectors:
+ collector()
for metric in all_metrics:
try:
@@ -109,62 +107,6 @@ def render_all():
return "\n".join(strs)
-# Now register some standard process-wide state metrics, to give indications of
-# process resource usage
-
-rusage = None
-
-
-def update_resource_metrics():
- global rusage
- rusage = getrusage(RUSAGE_SELF)
-
-resource_metrics = get_metrics_for("process.resource")
-
-# msecs
-resource_metrics.register_callback("utime", lambda: rusage.ru_utime * 1000)
-resource_metrics.register_callback("stime", lambda: rusage.ru_stime * 1000)
-
-# kilobytes
-resource_metrics.register_callback("maxrss", lambda: rusage.ru_maxrss * 1024)
-
-TYPES = {
- stat.S_IFSOCK: "SOCK",
- stat.S_IFLNK: "LNK",
- stat.S_IFREG: "REG",
- stat.S_IFBLK: "BLK",
- stat.S_IFDIR: "DIR",
- stat.S_IFCHR: "CHR",
- stat.S_IFIFO: "FIFO",
-}
-
-
-def _process_fds():
- counts = {(k,): 0 for k in TYPES.values()}
- counts[("other",)] = 0
-
- # Not every OS will have a /proc/self/fd directory
- if not os.path.exists("/proc/self/fd"):
- return counts
-
- for fd in os.listdir("/proc/self/fd"):
- try:
- s = os.stat("/proc/self/fd/%s" % (fd))
- fmt = stat.S_IFMT(s.st_mode)
- if fmt in TYPES:
- t = TYPES[fmt]
- else:
- t = "other"
-
- counts[(t,)] += 1
- except OSError:
- # the dirh itself used by listdir() is usually missing by now
- pass
-
- return counts
-
-get_metrics_for("process").register_callback("fds", _process_fds, labels=["type"])
-
reactor_metrics = get_metrics_for("reactor")
tick_time = reactor_metrics.register_distribution("tick_time")
pending_calls_metric = reactor_metrics.register_distribution("pending_calls")
|