mirror of
https://github.com/ocaml-tracing/ocaml-opentelemetry.git
synced 2026-03-09 12:23:32 -04:00
Allow optional reuse of encoder state
This allows clien implementors to micromanage the state of the protobuf `encoder` if they want, or to just let the library handle allocation and garbage collection of encoder states when that level of resource managment is not required.
This commit is contained in:
parent
740a142581
commit
8f7d74f591
4 changed files with 36 additions and 19 deletions
|
|
@ -271,7 +271,7 @@ end
|
||||||
let mk_emitter ~stop ~(config : Config.t) () : (module EMITTER) =
|
let mk_emitter ~stop ~(config : Config.t) () : (module EMITTER) =
|
||||||
let open Proto in
|
let open Proto in
|
||||||
let open Lwt.Syntax in
|
let open Lwt.Syntax in
|
||||||
let module Conv = Signal.Converter () in
|
let module Conv = Signal.Converter in
|
||||||
(* local helpers *)
|
(* local helpers *)
|
||||||
let open struct
|
let open struct
|
||||||
let timeout =
|
let timeout =
|
||||||
|
|
|
||||||
|
|
@ -201,7 +201,7 @@ end = struct
|
||||||
in
|
in
|
||||||
conv l |> send_http_ ~stop ~config ~url client
|
conv l |> send_http_ ~stop ~config ~url client
|
||||||
in
|
in
|
||||||
let module Conv = Signal.Converter () in
|
let module Conv = Signal.Converter in
|
||||||
try
|
try
|
||||||
while not (Atomic.get stop) do
|
while not (Atomic.get stop) do
|
||||||
let msg = B_queue.pop self.send_q in
|
let msg = B_queue.pop self.send_q in
|
||||||
|
|
|
||||||
|
|
@ -5,34 +5,37 @@ module Span = Opentelemetry.Span
|
||||||
|
|
||||||
let ( let@ ) = ( @@ )
|
let ( let@ ) = ( @@ )
|
||||||
|
|
||||||
module Converter () = struct
|
module Converter = struct
|
||||||
let encoder = Pbrt.Encoder.create ()
|
let resource_to_string ~encoder ~ctor ~enc resource =
|
||||||
|
let encoder =
|
||||||
let resource_to_string ~ctor ~enc resource =
|
match encoder with
|
||||||
|
| Some e -> e
|
||||||
|
| None -> Pbrt.Encoder.create ()
|
||||||
|
in
|
||||||
let x = ctor resource in
|
let x = ctor resource in
|
||||||
let@ _sc = Self_trace.with_ ~kind:Span.Span_kind_internal "encode-proto" in
|
let@ _sc = Self_trace.with_ ~kind:Span.Span_kind_internal "encode-proto" in
|
||||||
Pbrt.Encoder.reset encoder;
|
Pbrt.Encoder.reset encoder;
|
||||||
enc x encoder;
|
enc x encoder;
|
||||||
Pbrt.Encoder.to_string encoder
|
Pbrt.Encoder.to_string encoder
|
||||||
|
|
||||||
let logs resource_logs =
|
let logs ?encoder resource_logs =
|
||||||
resource_logs
|
resource_logs
|
||||||
|> resource_to_string
|
|> resource_to_string ~encoder
|
||||||
~ctor:(fun r ->
|
~ctor:(fun r ->
|
||||||
Logs_service.default_export_logs_service_request ~resource_logs:r ())
|
Logs_service.default_export_logs_service_request ~resource_logs:r ())
|
||||||
~enc:Logs_service.encode_pb_export_logs_service_request
|
~enc:Logs_service.encode_pb_export_logs_service_request
|
||||||
|
|
||||||
let metrics resource_metrics =
|
let metrics ?encoder resource_metrics =
|
||||||
resource_metrics
|
resource_metrics
|
||||||
|> resource_to_string
|
|> resource_to_string ~encoder
|
||||||
~ctor:(fun r ->
|
~ctor:(fun r ->
|
||||||
Metrics_service.default_export_metrics_service_request
|
Metrics_service.default_export_metrics_service_request
|
||||||
~resource_metrics:r ())
|
~resource_metrics:r ())
|
||||||
~enc:Metrics_service.encode_pb_export_metrics_service_request
|
~enc:Metrics_service.encode_pb_export_metrics_service_request
|
||||||
|
|
||||||
let traces resource_spans =
|
let traces ?encoder resource_spans =
|
||||||
resource_spans
|
resource_spans
|
||||||
|> resource_to_string
|
|> resource_to_string ~encoder
|
||||||
~ctor:(fun r ->
|
~ctor:(fun r ->
|
||||||
Trace_service.default_export_trace_service_request ~resource_spans:r
|
Trace_service.default_export_trace_service_request ~resource_spans:r
|
||||||
())
|
())
|
||||||
|
|
|
||||||
|
|
@ -5,13 +5,27 @@
|
||||||
|
|
||||||
NOTE: The converters share an underlying stateful encoder, so each domain or
|
NOTE: The converters share an underlying stateful encoder, so each domain or
|
||||||
system thread should have its own [Converter] instance *)
|
system thread should have its own [Converter] instance *)
|
||||||
module Converter : functor () -> sig
|
module Converter : sig
|
||||||
val logs : Opentelemetry_proto.Logs.resource_logs list -> string
|
val logs :
|
||||||
(** [logs ls] is a protobuf encoded string of the logs [ls] *)
|
?encoder:Pbrt.Encoder.t ->
|
||||||
|
Opentelemetry_proto.Logs.resource_logs list ->
|
||||||
|
string
|
||||||
|
(** [logs ls] is a protobuf encoded string of the logs [ls]
|
||||||
|
|
||||||
val metrics : Opentelemetry_proto.Metrics.resource_metrics list -> string
|
@param encoder provide an encoder state to reuse *)
|
||||||
(** [metrics ms] is a protobuf encoded string of the metrics [ms] *)
|
|
||||||
|
|
||||||
val traces : Opentelemetry_proto.Trace.resource_spans list -> string
|
val metrics :
|
||||||
(** [metrics ts] is a protobuf encoded string of the traces [ts] *)
|
?encoder:Pbrt.Encoder.t ->
|
||||||
|
Opentelemetry_proto.Metrics.resource_metrics list ->
|
||||||
|
string
|
||||||
|
(** [metrics ms] is a protobuf encoded string of the metrics [ms]
|
||||||
|
@param encoder provide an encoder state to reuse *)
|
||||||
|
|
||||||
|
val traces :
|
||||||
|
?encoder:Pbrt.Encoder.t ->
|
||||||
|
Opentelemetry_proto.Trace.resource_spans list ->
|
||||||
|
string
|
||||||
|
(** [metrics ts] is a protobuf encoded string of the traces [ts]
|
||||||
|
|
||||||
|
@param encoder provide an encoder state to reuse *)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue