mirror of
https://github.com/ocaml-tracing/ocaml-opentelemetry.git
synced 2026-03-08 20:07:55 -04:00
client: add debug_exporter, stdout_exporter, resource helpers
This commit is contained in:
parent
f349c31368
commit
8692976f3e
5 changed files with 124 additions and 2 deletions
4
src/client/common_.ml
Normal file
4
src/client/common_.ml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
module OTEL = Opentelemetry
|
||||||
|
module Proto = Opentelemetry_proto
|
||||||
|
|
||||||
|
let ( let@ ) = ( @@ )
|
||||||
36
src/client/debug_exporter.ml
Normal file
36
src/client/debug_exporter.ml
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
open Common_
|
||||||
|
|
||||||
|
(** [debug exporter] behaves like [exporter], but will print signals on [stderr]
|
||||||
|
before passing them to [exporter] *)
|
||||||
|
class debug ?(out = Format.err_formatter) (exp : #OTEL.Exporter.t) :
|
||||||
|
OTEL.Exporter.t =
|
||||||
|
let open Proto in
|
||||||
|
object
|
||||||
|
method send_trace l =
|
||||||
|
Format.fprintf out "SPANS: %a@." (Format.pp_print_list Trace.pp_span) l;
|
||||||
|
exp#send_trace l
|
||||||
|
|
||||||
|
method send_metrics l =
|
||||||
|
Format.fprintf out "METRICS: %a@."
|
||||||
|
(Format.pp_print_list Metrics.pp_metric)
|
||||||
|
l;
|
||||||
|
exp#send_metrics l
|
||||||
|
|
||||||
|
method send_logs l =
|
||||||
|
Format.fprintf out "LOGS: %a@."
|
||||||
|
(Format.pp_print_list Logs.pp_log_record)
|
||||||
|
l;
|
||||||
|
exp#send_logs l
|
||||||
|
|
||||||
|
method tick () = exp#tick ()
|
||||||
|
|
||||||
|
method add_on_tick_callback cb = exp#add_on_tick_callback cb
|
||||||
|
|
||||||
|
method cleanup ~on_done () =
|
||||||
|
Format.fprintf out "CLEANUP@.";
|
||||||
|
exp#cleanup ~on_done ()
|
||||||
|
end
|
||||||
|
|
||||||
|
(** Exporter that simply debugs on [stderr] *)
|
||||||
|
let debug_only : OTEL.Exporter.t =
|
||||||
|
new debug ~out:Format.err_formatter OTEL.Exporter.dummy
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
(library
|
(library
|
||||||
(name opentelemetry_client)
|
(name opentelemetry_client)
|
||||||
(public_name opentelemetry.client)
|
(public_name opentelemetry.client)
|
||||||
(libraries opentelemetry pbrt mtime mtime.clock.os)
|
(libraries opentelemetry opentelemetry.proto pbrt mtime mtime.clock.os)
|
||||||
(synopsis "Common types and logic shared between client implementations"))
|
(synopsis
|
||||||
|
"Basic exporters, as well as Common types and logic shared between exporters"))
|
||||||
|
|
|
||||||
34
src/client/signal_resource_builder.ml
Normal file
34
src/client/signal_resource_builder.ml
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
(** Group signals into [resource_xxx] objects *)
|
||||||
|
|
||||||
|
open Common_
|
||||||
|
|
||||||
|
let make_resource_logs (logs : Proto.Logs.log_record list) :
|
||||||
|
Proto.Logs.resource_logs =
|
||||||
|
let attributes = OTEL.Globals.mk_attributes () in
|
||||||
|
let resource = Proto.Resource.make_resource ~attributes () in
|
||||||
|
let ll =
|
||||||
|
Proto.Logs.make_scope_logs ~scope:OTEL.Globals.instrumentation_library
|
||||||
|
~log_records:logs ()
|
||||||
|
in
|
||||||
|
Proto.Logs.make_resource_logs ~resource ~scope_logs:[ ll ] ()
|
||||||
|
|
||||||
|
let make_resource_spans ?service_name ?attrs spans : Proto.Trace.resource_spans
|
||||||
|
=
|
||||||
|
let ils =
|
||||||
|
Proto.Trace.make_scope_spans ~scope:OTEL.Globals.instrumentation_library
|
||||||
|
~spans ()
|
||||||
|
in
|
||||||
|
let attributes = OTEL.Globals.mk_attributes ?service_name ?attrs () in
|
||||||
|
let resource = Proto.Resource.make_resource ~attributes () in
|
||||||
|
Proto.Trace.make_resource_spans ~resource ~scope_spans:[ ils ] ()
|
||||||
|
|
||||||
|
(** Aggregate metrics into a {!Proto.Metrics.resource_metrics} *)
|
||||||
|
let make_resource_metrics ?service_name ?attrs (l : OTEL.Metrics.t list) :
|
||||||
|
Proto.Metrics.resource_metrics =
|
||||||
|
let open Proto.Metrics in
|
||||||
|
let lm =
|
||||||
|
make_scope_metrics ~scope:OTEL.Globals.instrumentation_library ~metrics:l ()
|
||||||
|
in
|
||||||
|
let attributes = OTEL.Globals.mk_attributes ?service_name ?attrs () in
|
||||||
|
let resource = Proto.Resource.make_resource ~attributes () in
|
||||||
|
Proto.Metrics.make_resource_metrics ~scope_metrics:[ lm ] ~resource ()
|
||||||
47
src/client/stdout_exporter.ml
Normal file
47
src/client/stdout_exporter.ml
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
(** A simple exporter that prints on stdout *)
|
||||||
|
|
||||||
|
open Common_
|
||||||
|
open OTEL
|
||||||
|
|
||||||
|
open struct
|
||||||
|
let pp_span out (sp : Span.t) =
|
||||||
|
Format.fprintf out
|
||||||
|
"@[<2>SPAN@ trace_id: %a@ span_id: %a@ name: %S@ start: %a@ end: %a@]@."
|
||||||
|
Trace_id.pp
|
||||||
|
(Trace_id.of_bytes sp.trace_id)
|
||||||
|
Span_id.pp
|
||||||
|
(Span_id.of_bytes sp.span_id)
|
||||||
|
sp.name Timestamp_ns.pp_debug sp.start_time_unix_nano
|
||||||
|
Timestamp_ns.pp_debug sp.end_time_unix_nano
|
||||||
|
|
||||||
|
let pp_vlist mutex pp out l =
|
||||||
|
if l != [] then (
|
||||||
|
let@ () = Util_mutex.protect mutex in
|
||||||
|
Format.fprintf out "@[<v>";
|
||||||
|
List.iteri
|
||||||
|
(fun i x ->
|
||||||
|
if i > 0 then Format.fprintf out "@,";
|
||||||
|
pp out x)
|
||||||
|
l;
|
||||||
|
Format.fprintf out "@]@."
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
class stdout : OTEL.Exporter.t =
|
||||||
|
let out = Format.std_formatter in
|
||||||
|
let mutex = Mutex.create () in
|
||||||
|
|
||||||
|
let ticker = Tick_callbacks.create () in
|
||||||
|
object
|
||||||
|
method send_trace l = pp_vlist mutex pp_span out l
|
||||||
|
|
||||||
|
method send_metrics l = pp_vlist mutex Proto.Metrics.pp_metric out l
|
||||||
|
|
||||||
|
method send_logs l = pp_vlist mutex Proto.Logs.pp_log_record out l
|
||||||
|
|
||||||
|
method tick () = Tick_callbacks.tick ticker
|
||||||
|
|
||||||
|
method add_on_tick_callback cb = Tick_callbacks.on_tick ticker cb
|
||||||
|
|
||||||
|
method cleanup ~on_done () = on_done ()
|
||||||
|
end
|
||||||
Loading…
Add table
Reference in a new issue