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:
Shon Feder 2025-06-20 16:19:55 -04:00
parent 740a142581
commit 8f7d74f591
No known key found for this signature in database
4 changed files with 36 additions and 19 deletions

View file

@ -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 =

View file

@ -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

View file

@ -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
()) ())

View file

@ -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