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