diff --git a/src/client-cohttp-lwt/opentelemetry_client_cohttp_lwt.ml b/src/client-cohttp-lwt/opentelemetry_client_cohttp_lwt.ml index e96ca664..fcdc611a 100644 --- a/src/client-cohttp-lwt/opentelemetry_client_cohttp_lwt.ml +++ b/src/client-cohttp-lwt/opentelemetry_client_cohttp_lwt.ml @@ -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 = diff --git a/src/client-ocurl/opentelemetry_client_ocurl.ml b/src/client-ocurl/opentelemetry_client_ocurl.ml index a62c750d..c0e5eaaa 100644 --- a/src/client-ocurl/opentelemetry_client_ocurl.ml +++ b/src/client-ocurl/opentelemetry_client_ocurl.ml @@ -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 diff --git a/src/client/signal.ml b/src/client/signal.ml index effc4883..691cc6f8 100644 --- a/src/client/signal.ml +++ b/src/client/signal.ml @@ -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 ()) diff --git a/src/client/signal.mli b/src/client/signal.mli index b445184c..ef2a6e24 100644 --- a/src/client/signal.mli +++ b/src/client/signal.mli @@ -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