| 14 | |
| 15 | |
| 16 | class InstrumentedAsyncServer: |
| 17 | def __init__(self, sio, auth=None, namespace='/admin', read_only=False, |
| 18 | server_id=None, mode='development', server_stats_interval=2): |
| 19 | """Instrument the Socket.IO server for monitoring with the `Socket.IO |
| 20 | Admin UI <https://socket.io/docs/v4/admin-ui/>`_. |
| 21 | """ |
| 22 | if auth is None: |
| 23 | raise ValueError('auth must be specified') |
| 24 | self.sio = sio |
| 25 | self.auth = auth |
| 26 | self.admin_namespace = namespace |
| 27 | self.read_only = read_only |
| 28 | self.server_id = server_id or ( |
| 29 | self.sio.manager.host_id if hasattr(self.sio.manager, 'host_id') |
| 30 | else HOSTNAME |
| 31 | ) |
| 32 | self.mode = mode |
| 33 | self.server_stats_interval = server_stats_interval |
| 34 | self.admin_queue = [] |
| 35 | self.event_buffer = EventBuffer() |
| 36 | |
| 37 | # task that emits "server_stats" every 2 seconds |
| 38 | self.stop_stats_event = None |
| 39 | self.stats_task = None |
| 40 | |
| 41 | # monkey-patch the server to report metrics to the admin UI |
| 42 | self.instrument() |
| 43 | |
| 44 | def instrument(self): |
| 45 | self.sio.on('connect', self.admin_connect, |
| 46 | namespace=self.admin_namespace) |
| 47 | |
| 48 | if self.mode == 'development': |
| 49 | if not self.read_only: # pragma: no branch |
| 50 | self.sio.on('emit', self.admin_emit, |
| 51 | namespace=self.admin_namespace) |
| 52 | self.sio.on('join', self.admin_enter_room, |
| 53 | namespace=self.admin_namespace) |
| 54 | self.sio.on('leave', self.admin_leave_room, |
| 55 | namespace=self.admin_namespace) |
| 56 | self.sio.on('_disconnect', self.admin_disconnect, |
| 57 | namespace=self.admin_namespace) |
| 58 | |
| 59 | # track socket connection times |
| 60 | self.sio.manager._timestamps = {} |
| 61 | |
| 62 | # report socket.io connections, disconnections and received events |
| 63 | self.sio.__trigger_event = self.sio._trigger_event |
| 64 | self.sio._trigger_event = self._trigger_event |
| 65 | |
| 66 | # report join rooms |
| 67 | self.sio.manager.__basic_enter_room = \ |
| 68 | self.sio.manager.basic_enter_room |
| 69 | self.sio.manager.basic_enter_room = self._basic_enter_room |
| 70 | |
| 71 | # report leave rooms |
| 72 | self.sio.manager.__basic_leave_room = \ |
| 73 | self.sio.manager.basic_leave_room |
no outgoing calls
no test coverage detected
searching dependent graphs…