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: class InstrumentedServer:
def __init__(self, sio, auth=None, namespace='/admin', read_only=False, def __init__(self, sio, auth=None, mode='development', read_only=False,
server_id=None, mode='development'): server_id=None, namespace='/admin', server_stats_interval=2):
"""Instrument the Socket.IO server for monitoring with the `Socket.IO """Instrument the Socket.IO server for monitoring with the `Socket.IO
Admin UI <https://socket.io/docs/v4/admin-ui/>`_. Admin UI <https://socket.io/docs/v4/admin-ui/>`_.
""" """
@ -49,6 +49,7 @@ class InstrumentedServer:
else HOSTNAME else HOSTNAME
) )
self.mode = mode self.mode = mode
self.server_stats_interval = server_stats_interval
self.event_buffer = EventBuffer() self.event_buffer = EventBuffer()
# task that emits "server_stats" every 2 seconds # task that emits "server_stats" every 2 seconds
@ -338,7 +339,7 @@ class InstrumentedServer:
ws.wait = functools.partial(_wait, ws) ws.wait = functools.partial(_wait, ws)
return socket.__websocket_handler(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 eio_sid = socket.sid
t = time.time() t = time.time()
for namespace in self.sio.manager.get_namespaces(): for namespace in self.sio.manager.get_namespaces():
@ -357,7 +358,7 @@ class InstrumentedServer:
namespaces = list(self.sio.handlers.keys()) namespaces = list(self.sio.handlers.keys())
namespaces.sort() namespaces.sort()
while not self.stop_stats_event.is_set(): while not self.stop_stats_event.is_set():
self.sio.sleep(2) self.sio.sleep(self.server_stats_interval)
self.sio.emit('server_stats', { self.sio.emit('server_stats', {
'serverId': self.server_id, 'serverId': self.server_id,
'hostname': HOSTNAME, 'hostname': HOSTNAME,

7
src/socketio/async_admin.py

@ -14,7 +14,7 @@ PID = os.getpid()
class InstrumentedAsyncServer: class InstrumentedAsyncServer:
def __init__(self, sio, auth=None, namespace='/admin', read_only=False, 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 """Instrument the Socket.IO server for monitoring with the `Socket.IO
Admin UI <https://socket.io/docs/v4/admin-ui/>`_. Admin UI <https://socket.io/docs/v4/admin-ui/>`_.
""" """
@ -29,6 +29,7 @@ class InstrumentedAsyncServer:
else HOSTNAME else HOSTNAME
) )
self.mode = mode self.mode = mode
self.server_stats_interval = server_stats_interval
self.admin_queue = [] self.admin_queue = []
self.event_buffer = EventBuffer() self.event_buffer = EventBuffer()
@ -327,7 +328,7 @@ class InstrumentedAsyncServer:
ws.wait = functools.partial(_wait, ws) ws.wait = functools.partial(_wait, ws)
return await socket.__websocket_handler(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 eio_sid = socket.sid
t = time.time() t = time.time()
for namespace in self.sio.manager.get_namespaces(): for namespace in self.sio.manager.get_namespaces():
@ -346,7 +347,7 @@ class InstrumentedAsyncServer:
namespaces = list(self.sio.handlers.keys()) namespaces = list(self.sio.handlers.keys())
namespaces.sort() namespaces.sort()
while not self.stop_stats_event.is_set(): 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', { await self.sio.emit('server_stats', {
'serverId': self.server_id, 'serverId': self.server_id,
'hostname': HOSTNAME, 'hostname': HOSTNAME,

14
src/socketio/async_server.py

@ -468,7 +468,8 @@ class AsyncServer(base_server.BaseServer):
return await self.eio.sleep(seconds) return await self.eio.sleep(seconds)
def instrument(self, auth=None, mode='development', read_only=False, 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 """Instrument the Socket.IO server for monitoring with the `Socket.IO
Admin UI <https://socket.io/docs/v4/admin-ui/>`_. Admin UI <https://socket.io/docs/v4/admin-ui/>`_.
@ -495,12 +496,15 @@ class AsyncServer(base_server.BaseServer):
name. name.
:param namespace: The Socket.IO namespace to use for the admin :param namespace: The Socket.IO namespace to use for the admin
interface. The default is ``/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 from .async_admin import InstrumentedAsyncServer
return InstrumentedAsyncServer(self, auth=auth, mode=mode, return InstrumentedAsyncServer(
read_only=read_only, self, auth=auth, mode=mode, read_only=read_only,
server_id=server_id, server_id=server_id, namespace=namespace,
namespace=namespace) server_stats_interval=server_stats_interval)
async def _send_packet(self, eio_sid, pkt): async def _send_packet(self, eio_sid, pkt):
"""Send a Socket.IO packet to a client.""" """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) return self.eio.sleep(seconds)
def instrument(self, auth=None, mode='development', read_only=False, 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 """Instrument the Socket.IO server for monitoring with the `Socket.IO
Admin UI <https://socket.io/docs/v4/admin-ui/>`_. Admin UI <https://socket.io/docs/v4/admin-ui/>`_.
@ -482,11 +483,15 @@ class Server(base_server.BaseServer):
name. name.
:param namespace: The Socket.IO namespace to use for the admin :param namespace: The Socket.IO namespace to use for the admin
interface. The default is ``/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 from .admin import InstrumentedServer
return InstrumentedServer(self, auth=auth, mode=mode, return InstrumentedServer(
read_only=read_only, server_id=server_id, self, auth=auth, mode=mode, read_only=read_only,
namespace=namespace) server_id=server_id, namespace=namespace,
server_stats_interval=server_stats_interval)
def _send_packet(self, eio_sid, pkt): def _send_packet(self, eio_sid, pkt):
"""Send a Socket.IO packet to a client.""" """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 instrumented_server.shutdown()
await sio.shutdown() await sio.shutdown()
if 'server_stats_interval' not in ikwargs:
ikwargs['server_stats_interval'] = 0.1
instrumented_server = sio.instrument(auth=auth, **ikwargs) instrumented_server = sio.instrument(auth=auth, **ikwargs)
server = SocketIOWebServer(sio, on_shutdown=shutdown) server = SocketIOWebServer(sio, on_shutdown=shutdown)
server.start() server.start()

3
tests/common/test_admin.py

@ -33,6 +33,9 @@ def with_instrumented_server(auth=False, **ikwargs):
def connect(sid, environ, auth): def connect(sid, environ, auth):
pass pass
if 'server_stats_interval' not in ikwargs:
ikwargs['server_stats_interval'] = 0.1
instrumented_server = sio.instrument(auth=auth, **ikwargs) instrumented_server = sio.instrument(auth=auth, **ikwargs)
server = SocketIOWebServer(sio) server = SocketIOWebServer(sio)
server.start() server.start()

Loading…
Cancel
Save