Skip to content

Commit 8278f99

Browse files
adding log page
1 parent 0a8d5dd commit 8278f99

File tree

9 files changed

+193
-143
lines changed

9 files changed

+193
-143
lines changed

asset-manifest.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"files": {
33
"main.css": "/static/css/main.a3dbeddd.css",
4-
"main.js": "/static/js/main.beb6453b.js",
4+
"main.js": "/static/js/main.99b2efcf.js",
55
"static/media/roboto-all-500-normal.woff": "/static/media/roboto-all-500-normal.0ab669b7a0d19b178f57.woff",
66
"static/media/roboto-all-700-normal.woff": "/static/media/roboto-all-700-normal.a457fde362a540fcadff.woff",
77
"static/media/roboto-all-400-normal.woff": "/static/media/roboto-all-400-normal.c5d001fa922fa66a147f.woff",
@@ -36,10 +36,10 @@
3636
"static/media/roboto-greek-ext-700-normal.woff2": "/static/media/roboto-greek-ext-700-normal.bd9854c751441ccc1a70.woff2",
3737
"index.html": "/index.html",
3838
"main.a3dbeddd.css.map": "/static/css/main.a3dbeddd.css.map",
39-
"main.beb6453b.js.map": "/static/js/main.beb6453b.js.map"
39+
"main.99b2efcf.js.map": "/static/js/main.99b2efcf.js.map"
4040
},
4141
"entrypoints": [
4242
"static/css/main.a3dbeddd.css",
43-
"static/js/main.beb6453b.js"
43+
"static/js/main.99b2efcf.js"
4444
]
4545
}

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Pioreactor"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><script defer="defer" src="/static/js/main.beb6453b.js"></script><link href="/static/css/main.a3dbeddd.css" rel="stylesheet"></head><body><div id="root"></div></body></html>
1+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Pioreactor"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><script defer="defer" src="/static/js/main.99b2efcf.js"></script><link href="/static/css/main.a3dbeddd.css" rel="stylesheet"></head><body><div id="root"></div></body></html>

pioreactorui/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,16 @@ def handle_server_error(e):
105105
return app
106106

107107

108-
def msg_to_JSON(msg: str, task: str, level: str, timestamp: None | str = None) -> bytes:
108+
def msg_to_JSON(
109+
msg: str, task: str, level: str, timestamp: None | str = None, source: str = "ui"
110+
) -> bytes:
109111
if timestamp is None:
110112
timestamp = datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
111113
return dumps(
112114
{
113115
"message": msg.strip(),
114116
"task": task,
115-
"source": "ui",
117+
"source": source,
116118
"level": level,
117119
"timestamp": timestamp,
118120
}

pioreactorui/api.py

Lines changed: 81 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,9 @@ def get_running_jobs_on_unit(pioreactor_unit: str) -> ResponseReturnValue:
240240
@api.route("/workers/<pioreactor_unit>/blink", methods=["POST"])
241241
def blink_worker(pioreactor_unit: str) -> ResponseReturnValue:
242242
msg = client.publish(
243-
f"pioreactor/{pioreactor_unit}/$experiment/monitor/flicker_led_response_okay", 1, qos=0
243+
f"pioreactor/{pioreactor_unit}/{UNIVERSAL_EXPERIMENT}/monitor/flicker_led_response_okay",
244+
1,
245+
qos=0,
244246
)
245247
msg.wait_for_publish(timeout=2.0)
246248
return Response(status=202)
@@ -329,32 +331,56 @@ def shutdown_units() -> ResponseReturnValue:
329331
## Logs
330332

331333

332-
@api.route("/experiments/<experiment>/logs", methods=["GET"])
333-
def get_logs(experiment: str) -> ResponseReturnValue:
334-
"""Shows event logs from all units"""
334+
# util
335+
def get_level_string(min_level: str) -> str:
336+
levels = {
337+
"DEBUG": ["ERROR", "WARNING", "NOTICE", "INFO", "DEBUG"],
338+
"INFO": ["ERROR", "NOTICE", "INFO", "WARNING"],
339+
"WARNING": ["ERROR", "WARNING"],
340+
"ERROR": ["ERROR"],
341+
}
342+
selected_levels = levels.get(min_level, levels["INFO"])
343+
return " or ".join(f'level == "{level}"' for level in selected_levels)
335344

336-
def get_level_string(min_level: str) -> str:
337-
levels = {
338-
"DEBUG": ["ERROR", "WARNING", "NOTICE", "INFO", "DEBUG"],
339-
"INFO": ["ERROR", "NOTICE", "INFO", "WARNING"],
340-
"WARNING": ["ERROR", "WARNING"],
341-
"ERROR": ["ERROR"],
342-
}
343345

344-
selected_levels = levels.get(min_level, levels["INFO"])
345-
return " or ".join(f'level == "{level}"' for level in selected_levels)
346+
@api.route("/experiments/<experiment>/recent_logs", methods=["GET"])
347+
def get_recent_logs(experiment: str) -> ResponseReturnValue:
348+
"""Shows event logs from all units"""
346349

347350
min_level = request.args.get("min_level", "INFO")
348351

349352
try:
350353
recent_logs = query_app_db(
351354
f"""SELECT l.timestamp, level, l.pioreactor_unit, message, task
352355
FROM logs AS l
353-
WHERE (l.experiment=? OR l.experiment='$experiment')
356+
WHERE (l.experiment=? OR l.experiment=?)
354357
AND ({get_level_string(min_level)})
355358
AND l.timestamp >= MAX( strftime('%Y-%m-%dT%H:%M:%S', datetime('now', '-24 hours')), (SELECT created_at FROM experiments where experiment=?) )
356359
ORDER BY l.timestamp DESC LIMIT 50;""",
357-
(experiment, experiment),
360+
(experiment, UNIVERSAL_EXPERIMENT, experiment),
361+
)
362+
363+
except Exception as e:
364+
publish_to_error_log(str(e), "get_recent_logs")
365+
return Response(status=500)
366+
367+
return jsonify(recent_logs)
368+
369+
370+
@api.route("/experiments/<experiment>/logs", methods=["GET"])
371+
def get_logs(experiment: str) -> ResponseReturnValue:
372+
"""Shows event logs from all units, uses pagination."""
373+
374+
skip = int(request.args.get("skip", 0))
375+
376+
try:
377+
recent_logs = query_app_db(
378+
f"""SELECT l.timestamp, level, l.pioreactor_unit, message, task
379+
FROM logs AS l
380+
WHERE (l.experiment=?)
381+
AND ({get_level_string("DEBUG")})
382+
ORDER BY l.timestamp DESC LIMIT 50 OFFSET {skip};""",
383+
(experiment,),
358384
)
359385

360386
except Exception as e:
@@ -370,41 +396,63 @@ def publish_new_log(experiment: str) -> ResponseReturnValue:
370396
topic = f"pioreactor/{body['pioreactor_unit']}/{experiment}/logs/ui/info"
371397
client.publish(
372398
topic,
373-
msg_to_JSON(body["message"], body["source"] or "user", "info", timestamp=body["timestamp"]),
399+
msg_to_JSON(
400+
msg=body["message"],
401+
source="user",
402+
level="info",
403+
timestamp=body["timestamp"],
404+
task=body["source"] or "",
405+
),
374406
)
375407
return Response(status=202)
376408

377409

378-
@api.route("/workers/<pioreactor_unit>/experiments/<experiment>/logs", methods=["GET"])
379-
def get_logs_for_unit_and_experiment(experiment: str, pioreactor_unit: str) -> ResponseReturnValue:
380-
"""Shows event logs for a specific worker within an experiment"""
381-
382-
def get_level_string(min_level: str) -> str:
383-
levels = {
384-
"DEBUG": ["ERROR", "WARNING", "NOTICE", "INFO", "DEBUG"],
385-
"INFO": ["ERROR", "NOTICE", "INFO", "WARNING"],
386-
"WARNING": ["ERROR", "WARNING"],
387-
"ERROR": ["ERROR"],
388-
}
389-
selected_levels = levels.get(min_level, levels["INFO"])
390-
return " or ".join(f'level == "{level}"' for level in selected_levels)
410+
@api.route("/workers/<pioreactor_unit>/experiments/<experiment>/recent_logs", methods=["GET"])
411+
def get_recent_logs_for_unit_and_experiment(
412+
pioreactor_unit: str, experiment: str
413+
) -> ResponseReturnValue:
414+
"""Shows event logs for a specific unit within an experiment"""
391415

392416
min_level = request.args.get("min_level", "INFO")
393417

394418
try:
395419
recent_logs = query_app_db(
396420
f"""SELECT l.timestamp, level, l.pioreactor_unit, message, task
397421
FROM logs AS l
398-
WHERE (l.experiment=? OR l.experiment='$experiment')
399-
AND l.pioreactor_unit=?
422+
WHERE (l.experiment=? OR l.experiment=?)
423+
AND (l.pioreactor_unit=? or l.pioreactor_unit=?)
400424
AND ({get_level_string(min_level)})
401425
AND l.timestamp >= MAX( strftime('%Y-%m-%dT%H:%M:%S', datetime('now', '-24 hours')), (SELECT created_at FROM experiments where experiment=?) )
402426
ORDER BY l.timestamp DESC LIMIT 50;""",
403-
(experiment, pioreactor_unit, experiment),
427+
(experiment, UNIVERSAL_EXPERIMENT, pioreactor_unit, UNIVERSAL_IDENTIFIER, experiment),
428+
)
429+
430+
except Exception as e:
431+
publish_to_error_log(str(e), "get_recent_logs_for_unit_and_experiment")
432+
return Response(status=500)
433+
434+
return jsonify(recent_logs)
435+
436+
437+
@api.route("/units/<pioreactor_unit>/experiments/<experiment>/logs", methods=["GET"])
438+
def get_logs_for_unit_and_experiment(pioreactor_unit: str, experiment: str) -> ResponseReturnValue:
439+
"""Shows event logs from all units, uses pagination."""
440+
441+
skip = int(request.args.get("skip", 0))
442+
443+
try:
444+
recent_logs = query_app_db(
445+
f"""SELECT l.timestamp, level, l.pioreactor_unit, message, task
446+
FROM logs AS l
447+
WHERE (l.experiment=?)
448+
AND (l.pioreactor_unit=? or l.pioreactor_unit=?)
449+
AND ({get_level_string("DEBUG")})
450+
ORDER BY l.timestamp DESC LIMIT 50 OFFSET {skip};""",
451+
(experiment, pioreactor_unit, UNIVERSAL_IDENTIFIER),
404452
)
405453

406454
except Exception as e:
407-
publish_to_error_log(str(e), "get_logs_for_unit_and_experiment")
455+
publish_to_error_log(str(e), "get_get_logs_for_unit_and_experimentlogs")
408456
return Response(status=500)
409457

410458
return jsonify(recent_logs)

static/js/main.99b2efcf.js

Lines changed: 103 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

static/js/main.99b2efcf.js.map

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

static/js/main.beb6453b.js

Lines changed: 0 additions & 103 deletions
This file was deleted.

static/js/main.beb6453b.js.map

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)