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 open Proto in
let open Lwt.Syntax in
let module Conv = Signal.Converter () in
let module Conv = Signal.Converter in
(* local helpers *)
let open struct
let timeout =

View file

@ -201,7 +201,7 @@ end = struct
in
conv l |> send_http_ ~stop ~config ~url client
in
let module Conv = Signal.Converter () in
let module Conv = Signal.Converter in
try
while not (Atomic.get stop) do
let msg = B_queue.pop self.send_q in

View file

@ -5,34 +5,37 @@ module Span = Opentelemetry.Span
let ( let@ ) = ( @@ )
module Converter () = struct
let encoder = Pbrt.Encoder.create ()
let resource_to_string ~ctor ~enc resource =
module Converter = struct
let resource_to_string ~encoder ~ctor ~enc resource =
let encoder =
match encoder with
| Some e -> e
| None -> Pbrt.Encoder.create ()
in
let x = ctor resource in
let@ _sc = Self_trace.with_ ~kind:Span.Span_kind_internal "encode-proto" in
Pbrt.Encoder.reset encoder;
enc x encoder;
Pbrt.Encoder.to_string encoder
let logs resource_logs =
let logs ?encoder resource_logs =
resource_logs
|> resource_to_string
|> resource_to_string ~encoder
~ctor:(fun r ->
Logs_service.default_export_logs_service_request ~resource_logs:r ())
~enc:Logs_service.encode_pb_export_logs_service_request
let metrics resource_metrics =
let metrics ?encoder resource_metrics =
resource_metrics
|> resource_to_string
|> resource_to_string ~encoder
~ctor:(fun r ->
Metrics_service.default_export_metrics_service_request
~resource_metrics:r ())
~enc:Metrics_service.encode_pb_export_metrics_service_request
let traces resource_spans =
let traces ?encoder resource_spans =
resource_spans
|> resource_to_string
|> resource_to_string ~encoder
~ctor:(fun 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
system thread should have its own [Converter] instance *)
module Converter : functor () -> sig
val logs : Opentelemetry_proto.Logs.resource_logs list -> string
(** [logs ls] is a protobuf encoded string of the logs [ls] *)
module Converter : sig
val logs :
?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
(** [metrics ms] is a protobuf encoded string of the metrics [ms] *)
@param encoder provide an encoder state to reuse *)
val traces : Opentelemetry_proto.Trace.resource_spans list -> string
(** [metrics ts] is a protobuf encoded string of the traces [ts] *)
val metrics :
?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