|
2 | 2 |
|
3 | 3 | .. versionadded:: 2.0
|
4 | 4 | """
|
5 |
| -import logging |
| 5 | +import json |
6 | 6 | from datetime import datetime
|
7 | 7 | from typing import Any, Dict, Optional
|
8 | 8 |
|
9 |
| -from jupyter_telemetry.eventlog import _skip_message |
10 |
| -from pythonjsonlogger import jsonlogger |
| 9 | +from jupyter_events import EventLogger |
11 | 10 | from tornado import web, websocket
|
12 | 11 |
|
13 | 12 | from jupyter_server.auth import authorized
|
|
18 | 17 | AUTH_RESOURCE = "events"
|
19 | 18 |
|
20 | 19 |
|
21 |
| -class WebSocketLoggingHandler(logging.Handler): |
22 |
| - """Python logging handler that routes records to a Tornado websocket.""" |
23 |
| - |
24 |
| - def __init__(self, websocket, *args, **kwargs): |
25 |
| - super().__init__(*args, **kwargs) |
26 |
| - self.websocket = websocket |
27 |
| - |
28 |
| - def emit(self, record): |
29 |
| - """Emit the message across the websocket""" |
30 |
| - self.websocket.write_message(record.msg) |
31 |
| - |
32 |
| - |
33 | 20 | class SubscribeWebsocket(
|
34 | 21 | JupyterHandler,
|
35 | 22 | websocket.WebSocketHandler,
|
@@ -58,26 +45,23 @@ async def get(self, *args, **kwargs):
|
58 | 45 | res = super().get(*args, **kwargs)
|
59 | 46 | await res
|
60 | 47 |
|
| 48 | + async def event_listener(self, logger: EventLogger, schema_id: str, data: dict) -> None: |
| 49 | + capsule = dict(schema_id=schema_id, **data) |
| 50 | + self.write_message(json.dumps(capsule)) |
| 51 | + |
61 | 52 | def open(self):
|
62 | 53 | """Routes events that are emitted by Jupyter Server's
|
63 | 54 | EventBus to a WebSocket client in the browser.
|
64 | 55 | """
|
65 |
| - self.logging_handler = WebSocketLoggingHandler(self) |
66 |
| - # Add a JSON formatter to the handler. |
67 |
| - formatter = jsonlogger.JsonFormatter(json_serializer=_skip_message) |
68 |
| - self.logging_handler.setFormatter(formatter) |
69 |
| - # To do: add an eventlog.add_handler method to jupyter_telemetry. |
70 |
| - self.event_bus.log.addHandler(self.logging_handler) |
71 |
| - self.event_bus.handlers.append(self.logging_handler) |
| 56 | + self.event_logger.add_listener(listener=self.event_listener) |
72 | 57 |
|
73 | 58 | def on_close(self):
|
74 |
| - self.event_bus.log.removeHandler(self.logging_handler) |
75 |
| - self.event_bus.handlers.remove(self.logging_handler) |
| 59 | + self.event_logger.remove_listener(listener=self.event_listener) |
76 | 60 |
|
77 | 61 |
|
78 | 62 | def validate_model(data: Dict[str, Any]) -> None:
|
79 | 63 | """Validates for required fields in the JSON request body"""
|
80 |
| - required_keys = {"schema_name", "version", "event"} |
| 64 | + required_keys = {"schema_id", "version", "data"} |
81 | 65 | for key in required_keys:
|
82 | 66 | if key not in data:
|
83 | 67 | raise web.HTTPError(400, f"Missing `{key}` in the JSON request body.")
|
@@ -115,10 +99,9 @@ async def post(self):
|
115 | 99 |
|
116 | 100 | try:
|
117 | 101 | validate_model(payload)
|
118 |
| - self.event_bus.record_event( |
119 |
| - schema_name=payload.get("schema_name"), |
120 |
| - version=payload.get("version"), |
121 |
| - event=payload.get("event"), |
| 102 | + self.event_logger.emit( |
| 103 | + schema_id=payload.get("schema_id"), |
| 104 | + data=payload.get("data"), |
122 | 105 | timestamp_override=get_timestamp(payload),
|
123 | 106 | )
|
124 | 107 | self.set_status(204)
|
|
0 commit comments