1+ import datetime as dt
12import json
23import logging
34import time
4- from datetime import timedelta
5+ from datetime import timedelta , timezone
56
67from apscheduler .schedulers .asyncio import AsyncIOScheduler
78from apscheduler .triggers import interval
@@ -97,8 +98,15 @@ async def _job_func(self, job_id, conn, broker, tags, from_cache, refresh_rate_m
9798 f'Data publish (read time={ read_time :.2f} s): { ", " .join (to_publish [:120 ])} '
9899 )
99100 broker .publish_data (msg , headers = {"job_id" : job_id })
101+ self ._job_state [job_id ]["last_successful_timestamp" ] = str (
102+ dt .datetime .now (timezone .utc ).timestamp ()
103+ )
100104
101105 except Exception as e :
106+ self ._job_state [job_id ]["last_exception_timestamp" ] = str (
107+ dt .datetime .now (timezone .utc ).timestamp ()
108+ )
109+ self ._job_state [job_id ]["last_exception" ] = str (e )
102110 log .exception (f'Exception in job "{ job_id } " - { e } ' )
103111
104112 def list_jobs (self , conn_name = None ):
@@ -206,7 +214,12 @@ def _create_scan_job(self, job_id, conn_name, tags, seconds, from_cache):
206214 args = [job_id , conn , self ._broker_conn , tags , from_cache , refresh_rate_ms ],
207215 )
208216
209- self ._job_state [job_id ] = {"iter_counter" : 0 }
217+ self ._job_state [job_id ] = {
218+ "iter_counter" : 0 ,
219+ "last_successful_timestamp" : None ,
220+ "last_exception" : None ,
221+ "last_exception_timestamp" : None ,
222+ }
210223
211224 return job
212225
@@ -225,6 +238,24 @@ def remove_job(self, job_id, persist=True):
225238 if persist :
226239 self ._config .remove (f"{ DAQ_CONFIG_KEY } .{ j } " )
227240
241+ def job_info (self , job_id ):
242+ job = self .get_job (job_id )
243+ return {
244+ "job_id" : job_id ,
245+ "conn_name" : job .args [1 ].name ,
246+ "tags" : job .args [3 ],
247+ "seconds" : int (job .args [5 ] / 1000 ),
248+ "from_cache" : job .args [4 ],
249+ "total_iterations" : self ._job_state [job_id ]["iter_counter" ],
250+ "last_successful_timestamp" : self ._job_state [job_id ][
251+ "last_successful_timestamp"
252+ ],
253+ "last_exception" : self ._job_state [job_id ]["last_exception" ],
254+ "last_exception_timestamp" : self ._job_state [job_id ][
255+ "last_exception_timestamp"
256+ ],
257+ }
258+
228259 def list_tags (self , job_id ):
229260 job = self .get_job (job_id )
230261 return job .args [3 ]
0 commit comments