@@ -477,6 +477,82 @@ module TracerProvider = struct
477477  let  get_endpoints  t  =  t.endpoints
478478
479479  let  get_enabled  t  =  t.enabled
480+ 
481+   let  lock =  Mutex. create () 
482+ 
483+   let  tracer_providers =  Hashtbl. create 100 
484+ 
485+   let  create  ~enabled   ~attributes   ~endpoints   ~name_label   ~uuid   = 
486+     let  provider  : t  = 
487+       let  endpoints =  List. map endpoint_of_string endpoints in 
488+       let  attributes =  Attributes. of_list attributes in 
489+       {name_label; attributes; endpoints; enabled}
490+     in 
491+     Xapi_stdext_threads.Threadext.Mutex. execute lock (fun  ()  ->
492+         ( match  Hashtbl. find_opt tracer_providers uuid with 
493+         |  None  ->
494+             Hashtbl. add tracer_providers uuid provider
495+         |  Some  _  ->
496+             (*  CP-45469: It is ok not to have an exception here since it is unlikely that the
497+                user has caused the issue, so no need to propagate back. It is also 
498+                handy to not change the control flow since calls like cluster_pool_resync 
499+                might not be aware that a TracerProvider has already been created.*)  
500+             error " Tracing : TracerProvider %s already exists" 
501+         ) ;
502+         if  enabled then  set_observe true 
503+     )
504+ 
505+   let  get_tracer_providers_unlocked  ()  = 
506+     Hashtbl. fold (fun  _  provider  acc  -> provider :: acc) tracer_providers [] 
507+ 
508+   let  get_tracer_providers  ()  = 
509+     Xapi_stdext_threads.Threadext.Mutex. execute lock
510+       get_tracer_providers_unlocked
511+ 
512+   let  set  ?enabled   ?attributes   ?endpoints   ~uuid   ()  = 
513+     let  update_provider  (provider  : t ) enabled  attributes  endpoints  = 
514+       let  enabled =  Option. value ~default: provider.enabled enabled in 
515+       let  attributes  : string Attributes.t  = 
516+         Option. fold ~none: provider.attributes ~some: Attributes. of_list
517+           attributes
518+       in 
519+       let  endpoints = 
520+         Option. fold ~none: provider.endpoints
521+           ~some: (List. map endpoint_of_string)
522+           endpoints
523+       in 
524+       {provider with  enabled; attributes; endpoints}
525+     in 
526+ 
527+     Xapi_stdext_threads.Threadext.Mutex. execute lock (fun  ()  ->
528+         let  provider = 
529+           match  Hashtbl. find_opt tracer_providers uuid with 
530+           |  Some  (provider  : t ) ->
531+               update_provider provider enabled attributes endpoints
532+           |  None  ->
533+               failwith
534+                 (Printf. sprintf " The TracerProvider : %s does not exist" 
535+         in 
536+         Hashtbl. replace tracer_providers uuid provider ;
537+         if 
538+           List. for_all
539+             (fun  provider  -> not  provider.enabled)
540+             (get_tracer_providers_unlocked () )
541+         then  (
542+           set_observe false  ;
543+           Xapi_stdext_threads.Threadext.Mutex. execute Spans. lock (fun  ()  ->
544+               Hashtbl. clear Spans. spans ;
545+               Hashtbl. clear Spans. finished_spans
546+           )
547+         ) else 
548+           set_observe true 
549+     )
550+ 
551+   let  destroy  ~uuid   = 
552+     Xapi_stdext_threads.Threadext.Mutex. execute lock (fun  ()  ->
553+         let  _ =  Hashtbl. remove tracer_providers uuid in 
554+         if  Hashtbl. length tracer_providers =  0  then  set_observe false  else  () 
555+     )
480556end 
481557
482558module  Tracer  =  struct 
@@ -495,6 +571,19 @@ module Tracer = struct
495571    in 
496572    {name=  " " 
497573
574+   let  get_tracer  ~name   = 
575+     let  providers = 
576+       Xapi_stdext_threads.Threadext.Mutex. execute TracerProvider. lock
577+         TracerProvider. get_tracer_providers_unlocked
578+     in 
579+ 
580+     match  List. find_opt TracerProvider. get_enabled providers with 
581+     |  Some  provider  ->
582+         create ~name  ~provider 
583+     |  None  ->
584+         warn " No provider found for tracing %s" 
585+         no_op
586+ 
498587  let  span_of_span_context  context  name  : Span.t  = 
499588    {
500589      context
@@ -549,100 +638,12 @@ module Tracer = struct
549638    Spans. finished_span_hashtbl_is_empty () 
550639end 
551640
552- let  lock =  Mutex. create () 
553- 
554- let  tracer_providers =  Hashtbl. create 100 
555- 
556- let  get_tracer_providers_unlocked  ()  = 
557-   Hashtbl. fold (fun  _  provider  acc  -> provider :: acc) tracer_providers [] 
558- 
559- let  get_tracer_providers  ()  = 
560-   Xapi_stdext_threads.Threadext.Mutex. execute lock get_tracer_providers_unlocked
561- 
562- let  set  ?enabled   ?attributes   ?endpoints   ~uuid   ()  = 
563-   let  update_provider  (provider  : TracerProvider.t ) enabled  attributes  endpoints 
564-       = 
565-     let  enabled =  Option. value ~default: provider.enabled enabled in 
566-     let  attributes  : string Attributes.t  = 
567-       Option. fold ~none: provider.attributes ~some: Attributes. of_list attributes
568-     in 
569-     let  endpoints = 
570-       Option. fold ~none: provider.endpoints
571-         ~some: (List. map endpoint_of_string)
572-         endpoints
573-     in 
574-     {provider with  enabled; attributes; endpoints}
575-   in 
576- 
577-   Xapi_stdext_threads.Threadext.Mutex. execute lock (fun  ()  ->
578-       let  provider = 
579-         match  Hashtbl. find_opt tracer_providers uuid with 
580-         |  Some  (provider  : TracerProvider.t ) ->
581-             update_provider provider enabled attributes endpoints
582-         |  None  ->
583-             failwith
584-               (Printf. sprintf " The TracerProvider : %s does not exist" 
585-       in 
586-       Hashtbl. replace tracer_providers uuid provider ;
587-       if 
588-         List. for_all
589-           (fun  provider  -> not  provider.TracerProvider. enabled)
590-           (get_tracer_providers_unlocked () )
591-       then  (
592-         set_observe false  ;
593-         Xapi_stdext_threads.Threadext.Mutex. execute Spans. lock (fun  ()  ->
594-             Hashtbl. clear Spans. spans ;
595-             Hashtbl. clear Spans. finished_spans
596-         )
597-       ) else 
598-         set_observe true 
599-   )
600- 
601- let  create  ~enabled   ~attributes   ~endpoints   ~name_label   ~uuid   = 
602-   let  provider  : TracerProvider.t  = 
603-     let  endpoints =  List. map endpoint_of_string endpoints in 
604-     let  attributes =  Attributes. of_list attributes in 
605-     {name_label; attributes; endpoints; enabled}
606-   in 
607-   Xapi_stdext_threads.Threadext.Mutex. execute lock (fun  ()  ->
608-       ( match  Hashtbl. find_opt tracer_providers uuid with 
609-       |  None  ->
610-           Hashtbl. add tracer_providers uuid provider
611-       |  Some  _  ->
612-           (*  CP-45469: It is ok not to have an exception here since it is unlikely that the
613-              user has caused the issue, so no need to propagate back. It is also 
614-              handy to not change the control flow since calls like cluster_pool_resync 
615-              might not be aware that a TracerProvider has already been created.*)  
616-           error " Tracing : TracerProvider %s already exists" 
617-       ) ;
618-       if  enabled then  set_observe true 
619-   )
620- 
621- let  destroy  ~uuid   = 
622-   Xapi_stdext_threads.Threadext.Mutex. execute lock (fun  ()  ->
623-       let  _ =  Hashtbl. remove tracer_providers uuid in 
624-       if  Hashtbl. length tracer_providers =  0  then  set_observe false  else  () 
625-   )
626- 
627- let  get_tracer  ~name   = 
628-   let  providers = 
629-     Xapi_stdext_threads.Threadext.Mutex. execute lock
630-       get_tracer_providers_unlocked
631-   in 
632- 
633-   match  List. find_opt TracerProvider. get_enabled providers with 
634-   |  Some  provider  ->
635-       Tracer. create ~name  ~provider 
636-   |  None  ->
637-       (*  warn "No provider found for tracing %s" name ; *) 
638-       Tracer. no_op
639- 
640641let  enable_span_garbage_collector  ?(timeout  = 86400. )  ()  = 
641642  Spans.GC. initialise_thread ~timeout 
642643
643644let  with_tracing  ?(attributes  = [] )  ?(parent  = None )  ~name   f  = 
644645  if  Atomic. get observe then  (
645-     let  tracer =  get_tracer ~name  in 
646+     let  tracer =  Tracer. get_tracer ~name  in 
646647    match  Tracer. start ~tracer  ~attributes  ~name  ~parent  ()  with 
647648    |  Ok  span  -> (
648649      try 
0 commit comments