mirror of
https://github.com/ocaml-tracing/ocaml-opentelemetry.git
synced 2026-03-14 14:36:20 -04:00
(doc new) Improve docs for Opentelemetry_lwt
This commit is contained in:
parent
dcf13581e5
commit
c5d0bbcb03
2 changed files with 31 additions and 2 deletions
|
|
@ -11,6 +11,10 @@ module GC_metrics = GC_metrics
|
||||||
module Metrics_callbacks = Metrics_callbacks
|
module Metrics_callbacks = Metrics_callbacks
|
||||||
module Trace_context = Trace_context
|
module Trace_context = Trace_context
|
||||||
|
|
||||||
|
(** See {!Opentelemetry.Scope}; but with several functions overridden to use
|
||||||
|
[Lwt.Sequence_associated_storage] instead of our homegrown {!Thread_local}.
|
||||||
|
|
||||||
|
@see <https://github.com/ocsigen/lwt/blob/5.4.1/src/core/lwt.ml#L739-L775> Lwt.Sequence_associated_storage *)
|
||||||
module Scope = struct
|
module Scope = struct
|
||||||
include Scope
|
include Scope
|
||||||
|
|
||||||
|
|
@ -20,6 +24,10 @@ module Scope = struct
|
||||||
|
|
||||||
(**/**)
|
(**/**)
|
||||||
|
|
||||||
|
(** Obtain current scope from Lwt's sequence-associated storage, if one
|
||||||
|
exists; see {!with_scope}.
|
||||||
|
|
||||||
|
@see <https://ocaml.org/p/lwt/5.5.0/doc/Lwt/index.html#val-get> Lwt.get *)
|
||||||
let get_surrounding ?scope () : t option =
|
let get_surrounding ?scope () : t option =
|
||||||
let surrounding = Lwt.get _global_scope_key in
|
let surrounding = Lwt.get _global_scope_key in
|
||||||
match scope, surrounding with
|
match scope, surrounding with
|
||||||
|
|
@ -27,6 +35,12 @@ module Scope = struct
|
||||||
| None, Some _ -> surrounding
|
| None, Some _ -> surrounding
|
||||||
| None, None -> None
|
| None, None -> None
|
||||||
|
|
||||||
|
(** [with_scope sc f] calls [f()] in a context where [sc] is the
|
||||||
|
sequence-local implicit {!Scope.t}; then reverts to the previous local
|
||||||
|
scope, if any. Lwt will suspend and restore this implicit scope as tasks
|
||||||
|
are suspended and restored.
|
||||||
|
|
||||||
|
@see <https://ocaml.org/p/lwt/5.5.0/doc/Lwt/index.html#val-with_value> Lwt.with_value *)
|
||||||
let[@inline] with_scope (sc : t) (f : unit -> 'a) : 'a =
|
let[@inline] with_scope (sc : t) (f : unit -> 'a) : 'a =
|
||||||
Lwt.with_value _global_scope_key (Some sc) f
|
Lwt.with_value _global_scope_key (Some sc) f
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -530,14 +530,24 @@ module Scope = struct
|
||||||
|
|
||||||
(**/**)
|
(**/**)
|
||||||
|
|
||||||
(** Obtain current scope from thread-local storage, if available *)
|
(** Obtain current scope from thread-local storage, if available.
|
||||||
|
|
||||||
|
{b NOTE} In an Lwt context, make sure to use
|
||||||
|
{!Opentelemetry_lwt.Scope.get_surrounding} instead, as thread-local
|
||||||
|
storage will probably not interact with suspension/resumption of green
|
||||||
|
threads as expected. *)
|
||||||
let get_surrounding ?scope () : t option =
|
let get_surrounding ?scope () : t option =
|
||||||
match scope with
|
match scope with
|
||||||
| Some _ -> scope
|
| Some _ -> scope
|
||||||
| None -> Thread_local.get _global_scope
|
| None -> Thread_local.get _global_scope
|
||||||
|
|
||||||
(** [with_scope sc f] calls [f()] in a context where [sc] is the
|
(** [with_scope sc f] calls [f()] in a context where [sc] is the
|
||||||
(thread)-local scope, then reverts to the previous local scope, if any. *)
|
(thread)-local scope, then reverts to the previous local scope, if any.
|
||||||
|
|
||||||
|
{b NOTE} In an Lwt context, make sure to use
|
||||||
|
{!Opentelemetry_lwt.Scope.with_scope} instead, as thread-local storage
|
||||||
|
will probably not interact with suspension/resumption of green threads as
|
||||||
|
expected. *)
|
||||||
let[@inline] with_scope (sc : t) (f : unit -> 'a) : 'a =
|
let[@inline] with_scope (sc : t) (f : unit -> 'a) : 'a =
|
||||||
Thread_local.with_ _global_scope sc (fun _ -> f ())
|
Thread_local.with_ _global_scope sc (fun _ -> f ())
|
||||||
end
|
end
|
||||||
|
|
@ -728,6 +738,11 @@ module Trace = struct
|
||||||
surrounding context, or [scope], or [trace_id], but will always
|
surrounding context, or [scope], or [trace_id], but will always
|
||||||
create a fresh new trace ID.
|
create a fresh new trace ID.
|
||||||
|
|
||||||
|
{b NOTE} In an Lwt context, make sure to use
|
||||||
|
{!Opentelemetry_lwt.Trace.with_} instead, as thread-local storage will
|
||||||
|
probably not interact with suspension/resumption of green threads as
|
||||||
|
expected.
|
||||||
|
|
||||||
{b NOTE} be careful not to call this inside a Gc alarm, as it can
|
{b NOTE} be careful not to call this inside a Gc alarm, as it can
|
||||||
cause deadlocks. *)
|
cause deadlocks. *)
|
||||||
let with_ ?(force_new_trace_id = false) ?trace_state ?service_name
|
let with_ ?(force_new_trace_id = false) ?trace_state ?service_name
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue