mirror of
https://github.com/ocaml-tracing/ocaml-opentelemetry.git
synced 2026-03-08 03:47:59 -04:00
76 lines
2.6 KiB
OCaml
76 lines
2.6 KiB
OCaml
open Opentelemetry_emitter
|
|
|
|
open struct
|
|
let provider_ : Logger.t Atomic.t = Atomic.make Logger.dummy
|
|
end
|
|
|
|
let get () : Logger.t = Atomic.get provider_
|
|
|
|
let set (t : Logger.t) : unit = Atomic.set provider_ t
|
|
|
|
let clear () : unit = Atomic.set provider_ Logger.dummy
|
|
|
|
(** Get a logger pre-configured with a fixed set of attributes added to every
|
|
log record it emits, forwarding to the current global logger. Intended to be
|
|
called once at the top of a library module.
|
|
|
|
@param name instrumentation scope name (recorded as [otel.scope.name])
|
|
@param version
|
|
instrumentation scope version (recorded as [otel.scope.version])
|
|
@param __MODULE__
|
|
the OCaml module name, typically the [__MODULE__] literal (recorded as
|
|
[code.namespace])
|
|
@param attrs additional fixed attributes *)
|
|
let get_logger ?name ?version ?(attrs : (string * [< Value.t ]) list = [])
|
|
?__MODULE__ () : Logger.t =
|
|
let extra =
|
|
Scope_attributes.make_attrs ?name ?version ~attrs ?__MODULE__ ()
|
|
in
|
|
{
|
|
Logger.emit =
|
|
Emitter.make ~signal_name:"logs"
|
|
~enabled:(fun () -> Emitter.enabled (Atomic.get provider_).emit)
|
|
~emit:(fun logs ->
|
|
(match extra with
|
|
| [] -> ()
|
|
| _ -> List.iter (fun log -> Log_record.add_attrs log extra) logs);
|
|
Emitter.emit (Atomic.get provider_).emit logs)
|
|
();
|
|
clock = { Clock.now = (fun () -> Clock.now (Clock.Main.get ())) };
|
|
}
|
|
|
|
(** A Logger.t that lazily reads the global at emit time *)
|
|
let default_logger : Logger.t = get_logger ()
|
|
|
|
open Log_record
|
|
|
|
(** Create log record and emit it on [logger] *)
|
|
let log ?(logger = default_logger) ?attrs ?trace_id ?span_id
|
|
?(severity : severity option) (msg : string) : unit =
|
|
if Logger.enabled logger then (
|
|
let now = Clock.now logger.clock in
|
|
let dyn_attrs = Dynamic_enricher.collect () in
|
|
let attrs =
|
|
match dyn_attrs with
|
|
| [] -> attrs
|
|
| _ ->
|
|
let base = Option.value ~default:[] attrs in
|
|
Some (List.rev_append dyn_attrs base)
|
|
in
|
|
let logrec =
|
|
Log_record.make_str ?attrs ?trace_id ?span_id ?severity
|
|
~observed_time_unix_nano:now msg
|
|
in
|
|
Logger.emit1 logger logrec
|
|
)
|
|
|
|
(** Helper to create a log record, with a suspension, like in [Logs].
|
|
|
|
Example usage:
|
|
[logf ~severity:Severity_number_warn (fun k->k"oh no!! %s it's bad: %b"
|
|
"help" true)] *)
|
|
let logf ?(logger = default_logger) ?attrs ?trace_id ?span_id ?severity msgf :
|
|
unit =
|
|
if Logger.enabled logger then
|
|
msgf (fun fmt ->
|
|
Format.kasprintf (log ~logger ?attrs ?trace_id ?span_id ?severity) fmt)
|