diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py
index 40e6f65236..54f35900f8 100755
--- a/synapse/app/homeserver.py
+++ b/synapse/app/homeserver.py
@@ -51,7 +51,7 @@ from synapse.api.urls import (
from synapse.config.homeserver import HomeServerConfig
from synapse.crypto import context_factory
from synapse.util.logcontext import LoggingContext
-from synapse.metrics import register_memory_metrics
+from synapse.metrics import register_memory_metrics, get_metrics_for
from synapse.metrics.resource import MetricsResource, METRICS_PREFIX
from synapse.replication.resource import ReplicationResource, REPLICATION_PREFIX
from synapse.federation.transport.server import TransportLayerServer
@@ -385,6 +385,8 @@ def run(hs):
start_time = hs.get_clock().time()
+ stats = {}
+
@defer.inlineCallbacks
def phone_stats_home():
logger.info("Gathering stats for reporting")
@@ -393,7 +395,10 @@ def run(hs):
if uptime < 0:
uptime = 0
- stats = {}
+ # If the stats directory is empty then this is the first time we've
+ # reported stats.
+ first_time = not stats
+
stats["homeserver"] = hs.config.server_name
stats["timestamp"] = now
stats["uptime_seconds"] = uptime
@@ -406,6 +411,25 @@ def run(hs):
daily_messages = yield hs.get_datastore().count_daily_messages()
if daily_messages is not None:
stats["daily_messages"] = daily_messages
+ else:
+ stats.pop("daily_messages", None)
+
+ if first_time:
+ # Add callbacks to report the synapse stats as metrics whenever
+ # prometheus requests them, typically every 30s.
+ # As some of the stats are expensive to calculate we only update
+ # them when synapse phones home to matrix.org every 24 hours.
+ metrics = get_metrics_for("synapse.usage")
+ metrics.add_callback("timestamp", lambda: stats["timestamp"])
+ metrics.add_callback("uptime_seconds", lambda: stats["uptime_seconds"])
+ metrics.add_callback("total_users", lambda: stats["total_users"])
+ metrics.add_callback("total_room_count", lambda: stats["total_room_count"])
+ metrics.add_callback(
+ "daily_active_users", lambda: stats["daily_active_users"]
+ )
+ metrics.add_callback(
+ "daily_messages", lambda: stats.get("daily_messages", 0)
+ )
logger.info("Reporting stats to matrix.org: %s" % (stats,))
try:
|