| 33 | |
| 34 | |
| 35 | class InstrumentedServer: |
| 36 | def __init__(self, sio, auth=None, mode='development', read_only=False, |
| 37 | server_id=None, namespace='/admin', server_stats_interval=2): |
| 38 | """Instrument the Socket.IO server for monitoring with the `Socket.IO |
| 39 | Admin UI <https://socket.io/docs/v4/admin-ui/>`_. |
| 40 | """ |
| 41 | if auth is None: |
| 42 | raise ValueError('auth must be specified') |
| 43 | self.sio = sio |
| 44 | self.auth = auth |
| 45 | self.admin_namespace = namespace |
| 46 | self.read_only = read_only |
| 47 | self.server_id = server_id or ( |
| 48 | self.sio.manager.host_id if hasattr(self.sio.manager, 'host_id') |
| 49 | else HOSTNAME |
| 50 | ) |
| 51 | self.mode = mode |
| 52 | self.server_stats_interval = server_stats_interval |
| 53 | self.event_buffer = EventBuffer() |
| 54 | |
| 55 | # task that emits "server_stats" every 2 seconds |
| 56 | self.stop_stats_event = None |
| 57 | self.stats_task = None |
| 58 | |
| 59 | # monkey-patch the server to report metrics to the admin UI |
| 60 | self.instrument() |
| 61 | |
| 62 | def instrument(self): |
| 63 | self.sio.on('connect', self.admin_connect, |
| 64 | namespace=self.admin_namespace) |
| 65 | |
| 66 | if self.mode == 'development': |
| 67 | if not self.read_only: # pragma: no branch |
| 68 | self.sio.on('emit', self.admin_emit, |
| 69 | namespace=self.admin_namespace) |
| 70 | self.sio.on('join', self.admin_enter_room, |
| 71 | namespace=self.admin_namespace) |
| 72 | self.sio.on('leave', self.admin_leave_room, |
| 73 | namespace=self.admin_namespace) |
| 74 | self.sio.on('_disconnect', self.admin_disconnect, |
| 75 | namespace=self.admin_namespace) |
| 76 | |
| 77 | # track socket connection times |
| 78 | self.sio.manager._timestamps = {} |
| 79 | |
| 80 | # report socket.io connections, disconnections and received events |
| 81 | self.sio.__trigger_event = self.sio._trigger_event |
| 82 | self.sio._trigger_event = self._trigger_event |
| 83 | |
| 84 | # report join rooms |
| 85 | self.sio.manager.__basic_enter_room = \ |
| 86 | self.sio.manager.basic_enter_room |
| 87 | self.sio.manager.basic_enter_room = self._basic_enter_room |
| 88 | |
| 89 | # report leave rooms |
| 90 | self.sio.manager.__basic_leave_room = \ |
| 91 | self.sio.manager.basic_leave_room |
| 92 | self.sio.manager.basic_leave_room = self._basic_leave_room |
no outgoing calls
no test coverage detected
searching dependent graphs…