12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667moduleP=CatapultmoduleTracing=P.TracingmoduleEndpoint_address=P.Endpoint_addresslettrace_id=ref(trySys.getenv"TRACE_ID"with_->"")letset_trace_ids=trace_id:=s(* 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_idletdefault_endpoint=P.Endpoint_address.defaultletendpoint=ref(tryP.Endpoint_address.of_string_exn(Sys.getenv"TRACE_ENDPOINT")with_->default_endpoint)letset_endpointe=endpoint:=eletget_endpoint()=!endpointletset_tcp_endpointhp=set_endpoint(P.Endpoint_address.Tcp(h,p))letset_ipc_endpointfile=set_endpoint(P.Endpoint_address.Unixfile)lettef_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_enabletef_in_envletsetup_=lazy(ifenabled()then(at_exitP.Control.teardown;lettrace_id=get_trace_id()inletconn=Connections.create~addr:!endpoint~trace_id()inletmoduleB=Backend.Make(structletconn=connend)inletbackend=(moduleB:P.BACKEND)inP.Control.setup(Somebackend);))letsetup()=Lazy.forcesetup_letteardown=P.Tracing.Control.teardownletwith_setupf=setup();tryletx=f()inteardown();xwithe->teardown();raisee