Opentelemetry.TraceTraces.
See the spec
type span = Span.tval make_resource_spans : 
  ?service_name:string ->
  ?attrs:
    (string
     * [< `Bool of bool
       | `Float of float
       | `Int of int
       | `None
       | `String of string ])
      list ->
  Proto.Trace.span list ->
  Proto.Trace.resource_spansval emit : 
  ?service_name:string ->
  ?attrs:
    (string
     * [< `Bool of bool
       | `Float of float
       | `Int of int
       | `None
       | `String of string ])
      list ->
  span list ->
  unitSync emitter.
This instructs the collector to forward the spans to some backend at a later point.
NOTE be careful not to call this inside a Gc alarm, as it can cause deadlocks.
type scope = Scope.t = {trace_id : Trace_id.t;span_id : Span_id.t;mutable events : Event.t list;mutable attrs : Span.key_value list;}val with_' : 
  ?force_new_trace_id:bool ->
  ?trace_state:string ->
  ?service_name:string ->
  ?attrs:(string * value) list ->
  ?kind:Span.kind ->
  ?trace_id:Trace_id.t ->
  ?parent:Span.id ->
  ?scope:Scope.t ->
  ?links:Span_link.t list ->
  string ->
  (scope -> 'a) ->
  (unit ->
  'b)
  * ((unit, string * Stdlib.Printexc.raw_backtrace) result ->
  unit)Sync span guard.
Notably, this includes implicit scope-tracking: if called without a ~scope argument (or ~parent/~trace_id), it will check in the Ambient_context for a surrounding environment, and use that as the scope. Similarly, it uses Scope.with_ambient_scope to set a new scope in the ambient context, so that any logically-nested calls to with_ will use this span as their parent.
NOTE be careful not to call this inside a Gc alarm, as it can cause deadlocks.
val with_ : 
  ?force_new_trace_id:bool ->
  ?trace_state:string ->
  ?service_name:string ->
  ?attrs:(string * value) list ->
  ?kind:Span.kind ->
  ?trace_id:Trace_id.t ->
  ?parent:Span.id ->
  ?scope:Scope.t ->
  ?links:Span_link.t list ->
  string ->
  (Scope.t -> 'a) ->
  'a0