12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182moduleP=CatapultmoduleTracing=P.TracingmoduleBackend=BackendmoduleWriter=WritermoduleEv_to_json=Ev_to_jsonlettrace_id=ref(trySys.getenv"TRACE_ID"with_->"")letset_trace_ids=trace_id:=sletfile=ref(trySys.getenv"TRACE_DB"with_->"")letset_filef=file:=fletsqlite_sync_=refNoneletset_sqlite_syncs=sqlite_sync_:=Somesletmultiproc_=reffalseletset_multiprocb=multiproc_:=b(* try to make a non-stupid default id, based on PID + date.
This is not perfect, use a UUID4 if possible. *)let[@inlinenever]invent_trace_id_():string=letpid=Unix.getpid()inletnow=Unix.gettimeofday()inlettm=Unix.gmtimenowinPrintf.sprintf"catapult-%d-%d-%0d-%02d-%02d-%02d-pid-%d"(1900+tm.tm_year)(tm.tm_mon+1)tm.tm_mdaytm.tm_hourtm.tm_mintm.tm_secpidlet[@inline]get_trace_id()=if!trace_id=""thentrace_id:=invent_trace_id_();!trace_idlettrace_in_env()=List.mem(Sys.getenv_opt"TRACE")[Some"1";Some"true"]letmk_lazy_enablegetenv=letr=reffalseinletenabled_thunk=lazy(!r||getenv())inlet[@inline]enabled()=Lazy.forceenabled_thunkinletenable()=ifnot!rthen(r:=true;)inenable,enabledletenable,enabled=mk_lazy_enabletrace_in_envmoduleDir=Directories.Project_dirs(structletqualifier="ai"letorganization="imandra"letapplication="catapult"end)letdir=ref@@matchDir.data_dirwithNone->"."|Somed->dletset_dird=dir:=dletsetup_=lazy(ifenabled()then(at_exitP.Control.teardown;lettrace_id=get_trace_id()inletfile=if!file=""thenNoneelseSome!fileinletappend=!multiproc_in(* do not truncate if others also write *)letwriter=Writer.create~append?sync:!sqlite_sync_?file~trace_id~dir:!dir()inletmoduleB=Backend.Make(structletwriter=writerend)inletbackend=(moduleB:P.BACKEND)inP.Control.setup(Somebackend);))letsetup()=Lazy.forcesetup_letteardown=P.Tracing.Control.teardownletwith_setupf=setup();tryletx=f()inteardown();xwithe->teardown();raisee