diff --git a/src/trace/common_.ml b/src/trace/common_.ml index 09086d69..c5744107 100644 --- a/src/trace/common_.ml +++ b/src/trace/common_.ml @@ -1,6 +1,6 @@ module OTEL = Opentelemetry -module Otrace = Trace_core (* ocaml-trace *) -module Ambient_context = Opentelemetry_ambient_context +module Trace = Trace_core (* ocaml-trace *) +module Ambient_context = Ambient_context let ( let@ ) = ( @@ ) diff --git a/src/trace/dune b/src/trace/dune index 5814053c..c03bf9f2 100644 --- a/src/trace/dune +++ b/src/trace/dune @@ -5,7 +5,7 @@ (optional) ; trace (flags :standard -open Opentelemetry_util -open Opentelemetry_atomic) (libraries - (re_export opentelemetry.ambient-context) + (re_export ambient-context) (re_export opentelemetry.util) opentelemetry.atomic (re_export opentelemetry) diff --git a/src/trace/opentelemetry_trace.ml b/src/trace/opentelemetry_trace.ml index 89f235fa..20592af8 100644 --- a/src/trace/opentelemetry_trace.ml +++ b/src/trace/opentelemetry_trace.ml @@ -1,19 +1,19 @@ open Common_ module Extensions = struct - type Otrace.span += Span_otel of OTEL.Span.t + type Trace.span += Span_otel of OTEL.Span.t - type Otrace.extension_event += - | Ev_link_span of Otrace.span * OTEL.Span_ctx.t + type Trace.extension_event += + | Ev_link_span of Trace.span * OTEL.Span_ctx.t | Ev_record_exn of { - sp: Otrace.span; + sp: Trace.span; exn: exn; bt: Printexc.raw_backtrace; } - | Ev_set_span_kind of Otrace.span * OTEL.Span_kind.t - | Ev_set_span_status of Otrace.span * OTEL.Span_status.t + | Ev_set_span_kind of Trace.span * OTEL.Span_kind.t + | Ev_set_span_status of Trace.span * OTEL.Span_status.t - type Otrace.metric += + type Trace.metric += | Metric_hist of OTEL.Metrics.histogram_data_point | Metric_sum_int of int | Metric_sum_float of float @@ -39,12 +39,12 @@ open struct OTEL.Span_ctx.k_ambient let enter_span (self : state) ~__FUNCTION__ ~__FILE__ ~__LINE__ ~level:_ - ~params:_ ~(data : (_ * Otrace.user_data) list) ~parent name : Otrace.span + ~params:_ ~(data : (_ * Trace.user_data) list) ~parent name : Trace.span = let start_time = OTEL.Clock.now self.clock in let trace_id, parent_id = match parent with - | Otrace.P_some (Span_otel sp) -> + | Trace.P_some (Span_otel sp) -> OTEL.Span.trace_id sp, Some (OTEL.Span.id sp) | _ -> (match Ambient_context.get k_span_ctx with @@ -103,7 +103,7 @@ open struct self.exporter.OTEL.Exporter.export (OTEL.Any_signal_l.Spans [ span ]) | _ -> () - let add_data_to_span _self span (data : (_ * Otrace.user_data) list) = + let add_data_to_span _self span (data : (_ * Trace.user_data) list) = match span with | Span_otel sp -> OTEL.Span.add_attrs sp data | _ -> () @@ -177,16 +177,35 @@ open struct let shutdown self = OTEL.Exporter.shutdown self.exporter - let callbacks : state Otrace.Collector.Callbacks.t = - Otrace.Collector.Callbacks.make ~enter_span ~exit_span ~add_data_to_span + let callbacks : state Trace.Collector.Callbacks.t = + Trace.Collector.Callbacks.make ~enter_span ~exit_span ~add_data_to_span ~message ~metric ~extension ~shutdown () end +module Ambient_span_provider_ = struct + let get_current_span () = + match OTEL.Ambient_span.get () with + | None -> None + | Some sp -> Some (Span_otel sp) + + let with_current_span_set_to () span f = + match span with + | Span_otel sp -> OTEL.Ambient_span.with_ambient sp (fun () -> f span) + | _ -> f span + + let callbacks : unit Trace.Ambient_span_provider.Callbacks.t = + { get_current_span; with_current_span_set_to } + + let provider = Trace.Ambient_span_provider.ASP_some ((), callbacks) +end + +let ambient_span_provider = Ambient_span_provider_.provider + let collector_of_exporter (exporter : OTEL.Exporter.t) : Trace_core.collector = let st = create_state ~exporter () in Trace_core.Collector.C_some (st, callbacks) -let with_ambient_span (sp : Otrace.span) f = +let with_ambient_span (sp : Trace.span) f = match sp with | Span_otel sp -> Ambient_context.with_key_bound_to k_span_ctx (OTEL.Span.to_span_ctx sp) f @@ -195,30 +214,30 @@ let with_ambient_span (sp : Otrace.span) f = let with_ambient_span_ctx (sp : OTEL.Span_ctx.t) f = Ambient_context.with_key_bound_to k_span_ctx sp f -let link_span_to_otel_ctx (sp1 : Otrace.span) (sp2 : OTEL.Span_ctx.t) : unit = - if Otrace.enabled () then Otrace.extension_event @@ Ev_link_span (sp1, sp2) +let link_span_to_otel_ctx (sp1 : Trace.span) (sp2 : OTEL.Span_ctx.t) : unit = + if Trace.enabled () then Trace.extension_event @@ Ev_link_span (sp1, sp2) -let link_spans (sp1 : Otrace.span) (sp2 : Otrace.span) : unit = - if Otrace.enabled () then ( +let link_spans (sp1 : Trace.span) (sp2 : Trace.span) : unit = + if Trace.enabled () then ( match sp2 with | Span_otel sp2 -> - Otrace.extension_event @@ Ev_link_span (sp1, OTEL.Span.to_span_ctx sp2) + Trace.extension_event @@ Ev_link_span (sp1, OTEL.Span.to_span_ctx sp2) | _ -> () ) let[@inline] set_span_kind sp k : unit = - if Otrace.enabled () then Otrace.extension_event @@ Ev_set_span_kind (sp, k) + if Trace.enabled () then Trace.extension_event @@ Ev_set_span_kind (sp, k) let[@inline] set_span_status sp status : unit = - if Otrace.enabled () then - Otrace.extension_event @@ Ev_set_span_status (sp, status) + if Trace.enabled () then + Trace.extension_event @@ Ev_set_span_status (sp, status) let record_exception sp exn bt : unit = - if Otrace.enabled () then - Otrace.extension_event @@ Ev_record_exn { sp; exn; bt } + if Trace.enabled () then + Trace.extension_event @@ Ev_record_exn { sp; exn; bt } (** Collector that forwards to the {b currently installed} OTEL exporter. *) -let collector_main_otel_exporter () : Otrace.collector = +let collector_main_otel_exporter () : Trace.collector = (* Create a dynamic exporter that forwards to the currently installed main exporter at call time. *) let dynamic_exp : OTEL.Exporter.t = @@ -240,12 +259,14 @@ let (collector = collector_main_otel_exporter -let setup () = Otrace.setup_collector @@ collector_main_otel_exporter () +let setup () = + Trace.set_ambient_context_provider Ambient_span_provider_.provider; + Trace.setup_collector @@ collector_main_otel_exporter () let setup_with_otel_exporter exp : unit = let coll = collector_of_exporter exp in OTEL.Sdk.set exp; - Otrace.setup_collector coll + Trace.setup_collector coll let setup_with_otel_backend = setup_with_otel_exporter diff --git a/src/trace/opentelemetry_trace.mli b/src/trace/opentelemetry_trace.mli index 4b590869..995ab0e7 100644 --- a/src/trace/opentelemetry_trace.mli +++ b/src/trace/opentelemetry_trace.mli @@ -59,6 +59,9 @@ val collector : unit -> Trace_core.collector (** Make a Trace collector that uses the main OTEL backend to send spans and logs *) +val ambient_span_provider : Trace_core.Ambient_span_provider.t +(** Uses {!Ambient_context} to provide contextual spans in {!Trace_core}.*) + val link_spans : Otrace.span -> Otrace.span -> unit (** [link_spans sp1 sp2] modifies [sp1] by adding a span link to [sp2]. @since 0.11 *)