Ejemplo n.º 1
0
    def start_listening(self, listeners):
        config = self.get_config()

        for listener in listeners:
            if listener["type"] == "http":
                self._listening_services.extend(
                    self._listener_http(config, listener))
            elif listener["type"] == "manhole":
                listen_tcp(
                    listener["bind_addresses"],
                    listener["port"],
                    manhole(username="******",
                            password="******",
                            globals={"hs": self}),
                )
            elif listener["type"] == "replication":
                services = listen_tcp(
                    listener["bind_addresses"],
                    listener["port"],
                    ReplicationStreamProtocolFactory(self),
                )
                for s in services:
                    reactor.addSystemEventTrigger("before", "shutdown",
                                                  s.stopListening)
            elif listener["type"] == "metrics":
                if not self.get_config().enable_metrics:
                    logger.warn(("Metrics listener configured, but "
                                 "enable_metrics is not True!"))
                else:
                    _base.listen_metrics(listener["bind_addresses"],
                                         listener["port"])
            else:
                logger.warn("Unrecognized listener type: %s", listener["type"])
Ejemplo n.º 2
0
    def start_listening(self):
        config = self.get_config()

        for listener in config.listeners:
            if listener["type"] == "http":
                self._listener_http(config, listener)
            elif listener["type"] == "manhole":
                listen_tcp(
                    listener["bind_addresses"],
                    listener["port"],
                    manhole(
                        username="******",
                        password="******",
                        globals={"hs": self},
                    )
                )
            elif listener["type"] == "replication":
                bind_addresses = listener["bind_addresses"]
                for address in bind_addresses:
                    factory = ReplicationStreamProtocolFactory(self)
                    server_listener = reactor.listenTCP(
                        listener["port"], factory, interface=address
                    )
                    reactor.addSystemEventTrigger(
                        "before", "shutdown", server_listener.stopListening,
                    )
            elif listener["type"] == "metrics":
                if not self.get_config().enable_metrics:
                    logger.warn(("Metrics listener configured, but "
                                 "enable_metrics is not True!"))
                else:
                    _base.listen_metrics(listener["bind_addresses"],
                                         listener["port"])
            else:
                logger.warn("Unrecognized listener type: %s", listener["type"])
Ejemplo n.º 3
0
    def start_listening(self):
        config = self.get_config()

        for listener in config.listeners:
            if listener["type"] == "http":
                self._listener_http(config, listener)
            elif listener["type"] == "manhole":
                bind_addresses = listener["bind_addresses"]

                for address in bind_addresses:
                    reactor.listenTCP(listener["port"],
                                      manhole(
                                          username="******",
                                          password="******",
                                          globals={"hs": self},
                                      ),
                                      interface=address)
            elif listener["type"] == "replication":
                bind_addresses = listener["bind_addresses"]
                for address in bind_addresses:
                    factory = ReplicationStreamProtocolFactory(self)
                    server_listener = reactor.listenTCP(listener["port"],
                                                        factory,
                                                        interface=address)
                    reactor.addSystemEventTrigger(
                        "before",
                        "shutdown",
                        server_listener.stopListening,
                    )
            else:
                logger.warn("Unrecognized listener type: %s", listener["type"])
Ejemplo n.º 4
0
    def phone_stats_home():
        logger.info("Gathering stats for reporting")
        now = int(hs.get_clock().time())
        uptime = int(now - start_time)
        if uptime < 0:
            uptime = 0

        stats["homeserver"] = hs.config.server_name
        stats["timestamp"] = now
        stats["uptime_seconds"] = uptime
        stats["total_users"] = yield hs.get_datastore().count_all_users()

        total_nonbridged_users = yield hs.get_datastore().count_nonbridged_users()
        stats["total_nonbridged_users"] = total_nonbridged_users

        room_count = yield hs.get_datastore().get_room_count()
        stats["total_room_count"] = room_count

        stats["daily_active_users"] = yield hs.get_datastore().count_daily_users()
        stats["daily_active_rooms"] = yield hs.get_datastore().count_daily_active_rooms()
        stats["daily_messages"] = yield hs.get_datastore().count_daily_messages()

        daily_sent_messages = yield hs.get_datastore().count_daily_sent_messages()
        stats["daily_sent_messages"] = daily_sent_messages

        logger.info("Reporting stats to matrix.org: %s" % (stats,))
        try:
            yield hs.get_simple_http_client().put_json(
                "https://matrix.org/report-usage-stats/push",
                stats
            )
        except Exception as e:
            logger.warn("Error reporting stats: %s", e)
Ejemplo n.º 5
0
    def phone_stats_home():
        logger.info("Gathering stats for reporting")
        now = int(hs.get_clock().time())
        uptime = int(now - start_time)
        if uptime < 0:
            uptime = 0

        stats["homeserver"] = hs.config.server_name
        stats["timestamp"] = now
        stats["uptime_seconds"] = uptime
        version = sys.version_info
        stats["python_version"] = "{}.{}.{}".format(version.major,
                                                    version.minor,
                                                    version.micro)
        stats["total_users"] = yield hs.get_datastore().count_all_users()

        total_nonbridged_users = yield hs.get_datastore(
        ).count_nonbridged_users()
        stats["total_nonbridged_users"] = total_nonbridged_users

        daily_user_type_results = yield hs.get_datastore(
        ).count_daily_user_type()
        for name, count in iteritems(daily_user_type_results):
            stats["daily_user_type_" + name] = count

        room_count = yield hs.get_datastore().get_room_count()
        stats["total_room_count"] = room_count

        stats["daily_active_users"] = yield hs.get_datastore(
        ).count_daily_users()
        stats["daily_active_rooms"] = yield hs.get_datastore(
        ).count_daily_active_rooms()
        stats["daily_messages"] = yield hs.get_datastore(
        ).count_daily_messages()

        r30_results = yield hs.get_datastore().count_r30_users()
        for name, count in iteritems(r30_results):
            stats["r30_users_" + name] = count

        daily_sent_messages = yield hs.get_datastore(
        ).count_daily_sent_messages()
        stats["daily_sent_messages"] = daily_sent_messages
        stats["cache_factor"] = CACHE_SIZE_FACTOR
        stats["event_cache_size"] = hs.config.event_cache_size

        if len(stats_process) > 0:
            stats["memory_rss"] = 0
            stats["cpu_average"] = 0
            for process in stats_process:
                stats["memory_rss"] += process.memory_info().rss
                stats["cpu_average"] += int(process.cpu_percent(interval=None))

        logger.info("Reporting stats to matrix.org: %s" % (stats, ))
        try:
            yield hs.get_simple_http_client().put_json(
                "https://matrix.org/report-usage-stats/push", stats)
        except Exception as e:
            logger.warn("Error reporting stats: %s", e)
Ejemplo n.º 6
0
    def phone_stats_home():
        logger.info("Gathering stats for reporting")
        now = int(hs.get_clock().time())
        uptime = int(now - start_time)
        if uptime < 0:
            uptime = 0

        stats["homeserver"] = hs.config.server_name
        stats["server_context"] = hs.config.server_context
        stats["timestamp"] = now
        stats["uptime_seconds"] = uptime
        version = sys.version_info
        stats["python_version"] = "{}.{}.{}".format(
            version.major, version.minor, version.micro
        )
        stats["total_users"] = yield hs.get_datastore().count_all_users()

        total_nonbridged_users = yield hs.get_datastore().count_nonbridged_users()
        stats["total_nonbridged_users"] = total_nonbridged_users

        daily_user_type_results = yield hs.get_datastore().count_daily_user_type()
        for name, count in iteritems(daily_user_type_results):
            stats["daily_user_type_" + name] = count

        room_count = yield hs.get_datastore().get_room_count()
        stats["total_room_count"] = room_count

        stats["daily_active_users"] = yield hs.get_datastore().count_daily_users()
        stats["daily_active_rooms"] = yield hs.get_datastore().count_daily_active_rooms()
        stats["daily_messages"] = yield hs.get_datastore().count_daily_messages()

        r30_results = yield hs.get_datastore().count_r30_users()
        for name, count in iteritems(r30_results):
            stats["r30_users_" + name] = count

        daily_sent_messages = yield hs.get_datastore().count_daily_sent_messages()
        stats["daily_sent_messages"] = daily_sent_messages
        stats["cache_factor"] = CACHE_SIZE_FACTOR
        stats["event_cache_size"] = hs.config.event_cache_size

        if len(stats_process) > 0:
            stats["memory_rss"] = 0
            stats["cpu_average"] = 0
            for process in stats_process:
                stats["memory_rss"] += process.memory_info().rss
                stats["cpu_average"] += int(process.cpu_percent(interval=None))

        stats["database_engine"] = hs.get_datastore().database_engine_name
        stats["database_server_version"] = hs.get_datastore().get_server_version()
        logger.info("Reporting stats to matrix.org: %s" % (stats,))
        try:
            yield hs.get_simple_http_client().put_json(
                "https://matrix.org/report-usage-stats/push",
                stats
            )
        except Exception as e:
            logger.warn("Error reporting stats: %s", e)
Ejemplo n.º 7
0
    def phone_stats_home():
        logger.info("Gathering stats for reporting")
        now = int(hs.get_clock().time())
        uptime = int(now - start_time)
        if uptime < 0:
            uptime = 0

        # 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
        stats["total_users"] = yield hs.get_datastore().count_all_users()

        room_count = yield hs.get_datastore().get_room_count()
        stats["total_room_count"] = room_count

        stats["daily_active_users"] = yield hs.get_datastore(
        ).count_daily_users()
        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:
            yield hs.get_simple_http_client().put_json(
                "https://matrix.org/report-usage-stats/push", stats)
        except Exception as e:
            logger.warn("Error reporting stats: %s", e)
Ejemplo n.º 8
0
 def performance_stats_init():
     try:
         import psutil
         process = psutil.Process()
         # Ensure we can fetch both, and make the initial request for cpu_percent
         # so the next request will use this as the initial point.
         process.memory_info().rss
         process.cpu_percent(interval=None)
         logger.info("report_stats can use psutil")
         stats_process.append(process)
     except (ImportError, AttributeError):
         logger.warn(
             "report_stats enabled but psutil is not installed or incorrect version."
             " Disabling reporting of memory/cpu stats."
             " Ensuring psutil is available will help matrix.org track performance"
             " changes across releases.")
Ejemplo n.º 9
0
 def performance_stats_init():
     try:
         import psutil
         process = psutil.Process()
         # Ensure we can fetch both, and make the initial request for cpu_percent
         # so the next request will use this as the initial point.
         process.memory_info().rss
         process.cpu_percent(interval=None)
         logger.info("report_stats can use psutil")
         stats_process.append(process)
     except (ImportError, AttributeError):
         logger.warn(
             "report_stats enabled but psutil is not installed or incorrect version."
             " Disabling reporting of memory/cpu stats."
             " Ensuring psutil is available will help matrix.org track performance"
             " changes across releases."
         )
Ejemplo n.º 10
0
    def start_listening(self):
        config = self.get_config()

        for listener in config.listeners:
            if listener["type"] == "http":
                self._listener_http(config, listener)
            elif listener["type"] == "manhole":
                bind_addresses = listener["bind_addresses"]

                for address in bind_addresses:
                    reactor.listenTCP(listener["port"],
                                      manhole(
                                          username="******",
                                          password="******",
                                          globals={"hs": self},
                                      ),
                                      interface=address)
            else:
                logger.warn("Unrecognized listener type: %s", listener["type"])