diff --git a/src/socketio/admin.py b/src/socketio/admin.py index 2973404..f317ea2 100644 --- a/src/socketio/admin.py +++ b/src/socketio/admin.py @@ -33,8 +33,8 @@ class EventBuffer: class InstrumentedServer: - def __init__(self, sio, auth=None, namespace='/admin', read_only=False, - server_id=None, mode='development'): + def __init__(self, sio, auth=None, mode='development', read_only=False, + server_id=None, namespace='/admin', server_stats_interval=2): """Instrument the Socket.IO server for monitoring with the `Socket.IO Admin UI `_. """ @@ -49,6 +49,7 @@ class InstrumentedServer: else HOSTNAME ) self.mode = mode + self.server_stats_interval = server_stats_interval self.event_buffer = EventBuffer() # task that emits "server_stats" every 2 seconds @@ -338,7 +339,7 @@ class InstrumentedServer: ws.wait = functools.partial(_wait, ws) return socket.__websocket_handler(ws) - def _eio_send_ping(socket, self): + def _eio_send_ping(socket, self): # pragma: no cover eio_sid = socket.sid t = time.time() for namespace in self.sio.manager.get_namespaces(): @@ -357,7 +358,7 @@ class InstrumentedServer: namespaces = list(self.sio.handlers.keys()) namespaces.sort() while not self.stop_stats_event.is_set(): - self.sio.sleep(2) + self.sio.sleep(self.server_stats_interval) self.sio.emit('server_stats', { 'serverId': self.server_id, 'hostname': HOSTNAME, diff --git a/src/socketio/async_admin.py b/src/socketio/async_admin.py index b8bb0ed..162c566 100644 --- a/src/socketio/async_admin.py +++ b/src/socketio/async_admin.py @@ -14,7 +14,7 @@ PID = os.getpid() class InstrumentedAsyncServer: def __init__(self, sio, auth=None, namespace='/admin', read_only=False, - server_id=None, mode='development'): + server_id=None, mode='development', server_stats_interval=2): """Instrument the Socket.IO server for monitoring with the `Socket.IO Admin UI `_. """ @@ -29,6 +29,7 @@ class InstrumentedAsyncServer: else HOSTNAME ) self.mode = mode + self.server_stats_interval = server_stats_interval self.admin_queue = [] self.event_buffer = EventBuffer() @@ -327,7 +328,7 @@ class InstrumentedAsyncServer: ws.wait = functools.partial(_wait, ws) return await socket.__websocket_handler(ws) - async def _eio_send_ping(socket, self): + async def _eio_send_ping(socket, self): # pragma: no cover eio_sid = socket.sid t = time.time() for namespace in self.sio.manager.get_namespaces(): @@ -346,7 +347,7 @@ class InstrumentedAsyncServer: namespaces = list(self.sio.handlers.keys()) namespaces.sort() while not self.stop_stats_event.is_set(): - await self.sio.sleep(2) + await self.sio.sleep(self.server_stats_interval) await self.sio.emit('server_stats', { 'serverId': self.server_id, 'hostname': HOSTNAME, diff --git a/src/socketio/async_server.py b/src/socketio/async_server.py index 93fe676..99af067 100644 --- a/src/socketio/async_server.py +++ b/src/socketio/async_server.py @@ -468,7 +468,8 @@ class AsyncServer(base_server.BaseServer): return await self.eio.sleep(seconds) def instrument(self, auth=None, mode='development', read_only=False, - server_id=None, namespace='/admin'): + server_id=None, namespace='/admin', + server_stats_interval=2): """Instrument the Socket.IO server for monitoring with the `Socket.IO Admin UI `_. @@ -495,12 +496,15 @@ class AsyncServer(base_server.BaseServer): name. :param namespace: The Socket.IO namespace to use for the admin interface. The default is ``/admin``. + :param server_stats_interval: The interval in seconds at which the + server emits a summary of it stats to all + connected admins. """ from .async_admin import InstrumentedAsyncServer - return InstrumentedAsyncServer(self, auth=auth, mode=mode, - read_only=read_only, - server_id=server_id, - namespace=namespace) + return InstrumentedAsyncServer( + self, auth=auth, mode=mode, read_only=read_only, + server_id=server_id, namespace=namespace, + server_stats_interval=server_stats_interval) async def _send_packet(self, eio_sid, pkt): """Send a Socket.IO packet to a client.""" diff --git a/src/socketio/server.py b/src/socketio/server.py index 2bc82e0..2081337 100644 --- a/src/socketio/server.py +++ b/src/socketio/server.py @@ -455,7 +455,8 @@ class Server(base_server.BaseServer): return self.eio.sleep(seconds) def instrument(self, auth=None, mode='development', read_only=False, - server_id=None, namespace='/admin'): + server_id=None, namespace='/admin', + server_stats_interval=2): """Instrument the Socket.IO server for monitoring with the `Socket.IO Admin UI `_. @@ -482,11 +483,15 @@ class Server(base_server.BaseServer): name. :param namespace: The Socket.IO namespace to use for the admin interface. The default is ``/admin``. + :param server_stats_interval: The interval in seconds at which the + server emits a summary of it stats to all + connected admins. """ from .admin import InstrumentedServer - return InstrumentedServer(self, auth=auth, mode=mode, - read_only=read_only, server_id=server_id, - namespace=namespace) + return InstrumentedServer( + self, auth=auth, mode=mode, read_only=read_only, + server_id=server_id, namespace=namespace, + server_stats_interval=server_stats_interval) def _send_packet(self, eio_sid, pkt): """Send a Socket.IO packet to a client.""" diff --git a/tests/async/test_admin.py b/tests/async/test_admin.py index cdc93ba..f9a0c58 100644 --- a/tests/async/test_admin.py +++ b/tests/async/test_admin.py @@ -41,6 +41,9 @@ def with_instrumented_server(auth=False, **ikwargs): await instrumented_server.shutdown() await sio.shutdown() + if 'server_stats_interval' not in ikwargs: + ikwargs['server_stats_interval'] = 0.1 + instrumented_server = sio.instrument(auth=auth, **ikwargs) server = SocketIOWebServer(sio, on_shutdown=shutdown) server.start() diff --git a/tests/common/test_admin.py b/tests/common/test_admin.py index e65d3cf..0118a07 100644 --- a/tests/common/test_admin.py +++ b/tests/common/test_admin.py @@ -33,6 +33,9 @@ def with_instrumented_server(auth=False, **ikwargs): def connect(sid, environ, auth): pass + if 'server_stats_interval' not in ikwargs: + ikwargs['server_stats_interval'] = 0.1 + instrumented_server = sio.instrument(auth=auth, **ikwargs) server = SocketIOWebServer(sio) server.start()