This commit is contained in:
Amber Brown 2018-05-22 16:28:23 -05:00
parent 228f1f584e
commit 85ba83eb51
7 changed files with 52 additions and 24 deletions

View file

@ -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)

View file

@ -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()))

View file

@ -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()

View file

@ -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),
)

View file

@ -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):

View file

@ -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
(

View file

@ -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)