Browse Source

more fixes

pull/1164/head
Miguel Grinberg 2 years ago
parent
commit
b944b57466
Failed to extract signature
  1. 9
      src/socketio/admin.py
  2. 7
      src/socketio/async_admin.py
  3. 14
      src/socketio/async_server.py
  4. 13
      src/socketio/server.py
  5. 3
      tests/async/test_admin.py
  6. 3
      tests/common/test_admin.py

9
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 <https://socket.io/docs/v4/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,

7
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 <https://socket.io/docs/v4/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,

14
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 <https://socket.io/docs/v4/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."""

13
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 <https://socket.io/docs/v4/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."""

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

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

Loading…
Cancel
Save