diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py
index a5b135193f..449bfacdb9 100755
--- a/synapse/app/homeserver.py
+++ b/synapse/app/homeserver.py
@@ -34,6 +34,7 @@ from synapse.module_api import ModuleApi
from synapse.http.additional_resource import AdditionalResource
from synapse.http.server import RootRedirect
from synapse.http.site import SynapseSite
+from synapse.metrics import RegistryProxy
from synapse.metrics.resource import METRICS_PREFIX
from synapse.python_dependencies import CONDITIONAL_REQUIREMENTS, \
check_requirements
@@ -60,6 +61,8 @@ from twisted.web.resource import EncodingResourceWrapper, NoResource
from twisted.web.server import GzipEncoderFactory
from twisted.web.static import File
+from prometheus_client.twisted import MetricsResource
+
logger = logging.getLogger("synapse.app.homeserver")
@@ -229,8 +232,7 @@ class SynapseHomeServer(HomeServer):
resources[WEB_CLIENT_PREFIX] = build_resource_for_web_client(self)
if name == "metrics" and self.get_config().enable_metrics:
- from prometheus_client.twisted import MetricsResource
- resources[METRICS_PREFIX] = MetricsResource()
+ resources[METRICS_PREFIX] = MetricsResource(RegistryProxy())
if name == "replication":
resources[REPLICATION_PREFIX] = ReplicationRestResource(self)
diff --git a/synapse/federation/transaction_queue.py b/synapse/federation/transaction_queue.py
index 778924a13c..2049351fdd 100644
--- a/synapse/federation/transaction_queue.py
+++ b/synapse/federation/transaction_queue.py
@@ -64,7 +64,7 @@ class TransactionQueue(object):
# done
self.pending_transactions = {}
- LaterGauge("pending_destinations", "", [],
+ LaterGauge("synapse_federation_client_pending_destinations", "", [],
lambda: len(self.pending_transactions),
)
@@ -89,11 +89,11 @@ class TransactionQueue(object):
self.pending_edus_keyed_by_dest = edus_keyed = {}
LaterGauge(
- "pending_pdus", "", [],
+ "synapse_federation_client_pending_pdus", "", [],
lambda: sum(map(len, pdus.values())),
)
LaterGauge(
- "pending_edus", "", [],
+ "synapse_federation_client_pending_edus", "", [],
lambda: (
sum(map(len, edus.values()))
+ sum(map(len, presence.values()))
diff --git a/synapse/metrics/__init__.py b/synapse/metrics/__init__.py
index ab0b921497..38408efb54 100644
--- a/synapse/metrics/__init__.py
+++ b/synapse/metrics/__init__.py
@@ -29,12 +29,20 @@ from twisted.internet import reactor
logger = logging.getLogger(__name__)
-
running_on_pypy = platform.python_implementation() == 'PyPy'
all_metrics = []
all_collectors = []
all_gauges = {}
+
+class RegistryProxy(object):
+
+ def collect(self):
+ for metric in REGISTRY.collect():
+ if not metric.name.startswith("__"):
+ yield metric
+
+
@attr.s(hash=True)
class LaterGauge(object):
@@ -45,7 +53,7 @@ class LaterGauge(object):
def collect(self):
- g = GaugeMetricFamily(self.name, self.desc, self.labels)
+ g = GaugeMetricFamily(self.name, self.desc, labels=self.labels)
try:
calls = self.caller()
diff --git a/synapse/notifier.py b/synapse/notifier.py
index 123e6f1840..40cc553918 100644
--- a/synapse/notifier.py
+++ b/synapse/notifier.py
@@ -194,14 +194,14 @@ class Notifier(object):
all_user_streams.add(x)
return sum(stream.count_listeners() for stream in all_user_streams)
- LaterGauge("listeners", "", [], count_listeners)
+ LaterGauge("synapse_notifier_listeners", "", [], count_listeners)
LaterGauge(
- "rooms", "", [],
+ "synapse_notifier_rooms", "", [],
lambda: count(bool, self.room_to_user_streams.values()),
)
LaterGauge(
- "users", "", [],
+ "synapse_notifier_users", "", [],
lambda: len(self.user_to_user_stream),
)
diff --git a/synapse/push/httppusher.py b/synapse/push/httppusher.py
index e22088ad6f..bf7ff74a1a 100644
--- a/synapse/push/httppusher.py
+++ b/synapse/push/httppusher.py
@@ -28,9 +28,9 @@ from prometheus_client import Counter
logger = logging.getLogger(__name__)
-http_push_processed_counter = Counter("http_pushes_processed", "")
+http_push_processed_counter = Counter("synapse_http_httppusher_http_pushes_processed", "")
-http_push_failed_counter = Counter("http_pushes_failed", "")
+http_push_failed_counter = Counter("synapse_http_httppusher_http_pushes_failed", "")
class HttpPusher(object):
diff --git a/synapse/util/caches/__init__.py b/synapse/util/caches/__init__.py
index 438dcddf55..1c511a7072 100644
--- a/synapse/util/caches/__init__.py
+++ b/synapse/util/caches/__init__.py
@@ -13,7 +13,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-from prometheus_client.core import GaugeMetricFamily, REGISTRY
+from prometheus_client.core import Gauge, REGISTRY, GaugeMetricFamily
import os
@@ -22,10 +22,20 @@ CACHE_SIZE_FACTOR = float(os.environ.get("SYNAPSE_CACHE_FACTOR", 0.5))
caches_by_name = {}
collectors_by_name = {}
-def register_cache(name, cache_name, cache):
+cache_size = Gauge("synapse_util_caches_cache:size", "", ["name"])
+cache_hits = Gauge("synapse_util_caches_cache:hits", "", ["name"])
+cache_evicted = Gauge("synapse_util_caches_cache:evicted_size", "", ["name"])
+cache_total = Gauge("synapse_util_caches_cache:total", "", ["name"])
+
+response_cache_size = Gauge("synapse_util_caches_response_cache:size", "", ["name"])
+response_cache_hits = Gauge("synapse_util_caches_response_cache:hits", "", ["name"])
+response_cache_evicted = Gauge("synapse_util_caches_response_cache:evicted_size", "", ["name"])
+response_cache_total = Gauge("synapse_util_caches_response_cache:total", "", ["name"])
+
+def register_cache(cache_type, cache_name, cache):
# Check if the metric is already registered. Unregister it, if so.
- metric_name = "synapse_util_caches_%s:%s" % (name, cache_name,)
+ metric_name = "cache_%s_%s" % (cache_type, cache_name,)
if metric_name in collectors_by_name.keys():
REGISTRY.unregister(collectors_by_name[metric_name])
@@ -44,15 +54,22 @@ def register_cache(name, cache_name, cache):
def inc_evictions(self, size=1):
self.evicted_size += size
- def collect(self):
- cache_size = len(cache)
+ def describe(self):
+ return []
- gm = GaugeMetricFamily(metric_name, "", labels=["size", "hits", "misses", "total"])
- gm.add_metric(["size"], cache_size)
- gm.add_metric(["hits"], self.hits)
- gm.add_metric(["misses"], self.misses)
- gm.add_metric(["total"], self.hits + self.misses)
- yield gm
+ def collect(self):
+ if cache_type == "response_cache":
+ response_cache_size.labels(cache_name).set(len(cache))
+ response_cache_hits.labels(cache_name).set(self.hits)
+ response_cache_evicted.labels(cache_name).set(self.evicted_size)
+ response_cache_total.labels(cache_name).set(self.hits + self.misses)
+ else:
+ cache_size.labels(cache_name).set(len(cache))
+ cache_hits.labels(cache_name).set(self.hits)
+ cache_evicted.labels(cache_name).set(self.evicted_size)
+ cache_total.labels(cache_name).set(self.hits + self.misses)
+
+ yield GaugeMetricFamily("__unused", "")
metric = CacheMetric()
REGISTRY.register(metric)
@@ -60,6 +77,7 @@ def register_cache(name, cache_name, cache):
collectors_by_name[metric_name] = metric
return metric
+
KNOWN_KEYS = {
key: key for key in
(
diff --git a/synapse/util/caches/descriptors.py b/synapse/util/caches/descriptors.py
index a4188eb099..8a9dcb2fc2 100644
--- a/synapse/util/caches/descriptors.py
+++ b/synapse/util/caches/descriptors.py
@@ -80,7 +80,7 @@ class Cache(object):
self.name = name
self.keylen = keylen
self.thread = None
- self.metrics = register_cache("descriptor", name, self.cache)
+ self.metrics = register_cache("cache", name, self.cache)
def _on_evicted(self, evicted_count):
self.metrics.inc_evictions(evicted_count)
|