123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225includeTypesmoduleA=Atomic_moduleCollector=CollectormoduleLevel=LevelmoduleCore_ext=Core_extmoduleAmbient_span_provider=Ambient_span_providertypecollector=Collector.t(* ## globals ## *)(** Global collector. *)letcollector:collectorA.t=A.makeCollector.C_none(* default level for spans without a level *)letdefault_level_=A.makeLevel.Traceletcurrent_level_=A.makeLevel.Trace(** Global provider of span context *)letambient_span_provider:Ambient_span_provider.tA.t=A.makeAmbient_span_provider.ASP_none(* ## implementation ## *)let[@inline]option_or_af=matchawith|Some_->a|None->f()letdata_empty_build_()=[]let[@inline]enabled()=Collector.is_some(A.getcollector)let[@inline]get_default_level()=A.getdefault_level_let[@inline]set_default_levell=A.setdefault_level_llet[@inline]set_current_levell=A.setcurrent_level_llet[@inline]get_current_level()=A.getcurrent_level_let[@inline]check_level_~levelst(cbs:_Collector.Callbacks.t):bool=Level.leqlevel(A.getcurrent_level_)&&cbs.enabledstlevellet[@inline]current_span()=matchA.getambient_span_providerwith|ASP_none->None|ASP_some(st,cbs)->cbs.get_current_spanstlet[@inline]with_current_span_set_tospf=matchA.getambient_span_providerwith|ASP_none->fsp|ASP_some(st,cbs)->cbs.with_current_span_set_tostspfletparent_of_span_opt_opt=function|None->(matchcurrent_span()with|None->P_unknown|Somep->P_somep)|SomeNone->P_none|Some(Somep)->P_somepletenter_span_stst(cbs:_Collector.Callbacks.t)?__FUNCTION__~__FILE__~__LINE__~level?parent?(params=[])?(data=data_empty_build_)name:span=letparent=parent_of_span_opt_optparentinletdata=data()incbs.enter_spanst~__FUNCTION__~__FILE__~__LINE__~level~parent~params~datanameletwith_span_collector_st(cbs:_Collector.Callbacks.t)?__FUNCTION__~__FILE__~__LINE__~level?parent?params?datanamef=letsp:span=enter_span_ststcbs?__FUNCTION__~__FILE__~__LINE__~level?parent?params?datanameinmatch(* set [sp] as current span before calling [f sp] *)with_current_span_set_tospfwith|res->cbs.exit_spanstsp;res|exceptionexn->letbt=Printexc.get_raw_backtrace()incbs.exit_spanstsp;Printexc.raise_with_backtraceexnbtlet[@inline]with_span?(level=A.getdefault_level_)?__FUNCTION__~__FILE__~__LINE__?parent?params?datanamef=matchA.getcollectorwith|C_some(st,cbs)whencheck_level_~levelstcbs->with_span_collector_stcbs?__FUNCTION__~__FILE__~__LINE__~level?parent?params?datanamef|_->(* fast path: no collector, no span *)fCollector.dummy_spanlet[@inline]enter_span?(level=A.getdefault_level_)?__FUNCTION__~__FILE__~__LINE__?flavor?parent?(params=[])?dataname:span=matchA.getcollectorwith|C_some(st,cbs)whencheck_level_~levelstcbs->letparams=matchflavorwith|None->params|Somef->Core_ext.Extension_span_flavorf::paramsin(enter_span_st[@inlinednever])stcbs?__FUNCTION__~__FILE__~__LINE__~level?parent~params?dataname|_->Collector.dummy_spanlet[@inline]exit_spansp:unit=matchA.getcollectorwith|C_none->()|C_some(st,cbs)->cbs.exit_spanstsplet[@inline]add_data_to_spanspdata:unit=ifsp!=Collector.dummy_span&&data<>[]then(matchA.getcollectorwith|C_none->()|C_some(st,cbs)->cbs.add_data_to_spanstspdata)letmessage_collector_st(cbs:_Collector.Callbacks.t)~level?span?(params=[])?(data=data_empty_build_)msg:unit=letdata=data()inletspan=option_or_spancurrent_spanincbs.messagest~level~span~params~datamsglet[@inline]message?(level=A.getdefault_level_)?span?params?datamsg:unit=matchA.getcollectorwith|C_some(st,cbs)whencheck_level_~levelstcbs->(message_collector_[@inlinednever])stcbs~level?span?params?datamsg|_->()letmessagef?(level=A.getdefault_level_)?span?params?datak=matchA.getcollectorwith|C_some(st,cbs)whencheck_level_~levelstcbs->k(funfmt->Format.kasprintf(funstr->message_collector_stcbs~level?span?params?datastr)fmt)|_->()letmetric?(level=A.getdefault_level_)?(params=[])?(data=data_empty_build_)namem:unit=matchA.getcollectorwith|C_some(st,cbs)whencheck_level_~levelstcbs->letdata=data()incbs.metricst~level~params~datanamem|_->()letcounter_int?level?params?datanamen:unit=metric?level?params?dataname(Core_ext.Metric_intn)letcounter_float?level?params?datanamen:unit=metric?level?params?dataname(Core_ext.Metric_floatn)letsetup_collectorc:unit=whileletcur=A.getcollectorinmatchcurwith|C_some_->invalid_arg"trace: collector already present"|C_none->not(A.compare_and_setcollectorcurc)do()done;(* initialize collector *)matchcwith|C_none->()|C_some(st,cb)->cb.initstletshutdown()=matchA.exchangecollectorC_nonewith|C_none->()|C_some(st,cbs)->cbs.shutdownstletwith_setup_collectorcf=setup_collectorc;Fun.protect~finally:shutdownfletset_ambient_context_providerp=A.setambient_span_providerptypeextension_event=Types.extension_event=..let[@inline]extension_event?(level=A.getdefault_level_)ev:unit=matchA.getcollectorwith|C_some(st,cbs)whencheck_level_~levelstcbs->cbs.extensionst~levelev|_->()letset_thread_namename:unit=extension_event@@Core_ext.Extension_set_thread_namenameletset_process_namename:unit=extension_event@@Core_ext.Extension_set_process_namenamemoduleInternal_=structmoduleAtomic_=Atomic_end(* ### deprecated *)[@@@ocaml.alert"-deprecated"]letenter_manual_span~parent?flavor?level?__FUNCTION__~__FILE__~__LINE__?dataname:explicit_span=letparams=matchflavorwith|None->[]|Somef->[Core_ext.Extension_span_flavorf]inenter_span~parent~params?level?__FUNCTION__~__FILE__~__LINE__?datanameletenter_manual_toplevel_span?flavor?level?__FUNCTION__~__FILE__~__LINE__?dataname:explicit_span=enter_manual_span~parent:None?flavor?level?__FUNCTION__~__FILE__~__LINE__?datanameletenter_manual_sub_span~parent?flavor?level?__FUNCTION__~__FILE__~__LINE__?dataname:explicit_span=enter_manual_span~parent:(Someparent)?flavor?level?__FUNCTION__~__FILE__~__LINE__?datanameletexit_manual_span=exit_spanletadd_data_to_manual_span=add_data_to_span[@@@ocaml.alert"+deprecated"]