@@ -240,7 +240,9 @@ def get_running_jobs_on_unit(pioreactor_unit: str) -> ResponseReturnValue:
240240@api .route ("/workers/<pioreactor_unit>/blink" , methods = ["POST" ])
241241def 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 )
0 commit comments