merge any_signal/signal into resource_signal, dedup

we had duplication there! my bad.
This commit is contained in:
Simon Cruanes 2025-12-20 23:28:53 -05:00
parent 3dfbd14508
commit 95e8c78ff8
No known key found for this signature in database
GPG key ID: EBFFF6F283F3A2B4
10 changed files with 96 additions and 63 deletions

View file

@ -1,40 +0,0 @@
open Common_
open Opentelemetry.Proto
(** A resource *)
type t =
| R_metrics of Metrics.resource_metrics list
| R_spans of Trace.resource_spans list
| R_logs of Logs.resource_logs list
open struct
let of_x_or_empty ?service_name ?attrs ~f l =
if l = [] then
[]
else
[ f ?service_name ?attrs l ]
end
let of_logs ?service_name ?attrs logs : t =
R_logs [ Util_resources.make_resource_logs ?service_name ?attrs logs ]
let of_logs_or_empty ?service_name ?attrs logs =
of_x_or_empty ?service_name ?attrs ~f:of_logs logs
let of_spans ?service_name ?attrs spans : t =
R_spans [ Util_resources.make_resource_spans ?service_name ?attrs spans ]
let of_spans_or_empty ?service_name ?attrs spans =
of_x_or_empty ?service_name ?attrs ~f:of_spans spans
let of_metrics ?service_name ?attrs m : t =
R_metrics [ Util_resources.make_resource_metrics ?service_name ?attrs m ]
let of_metrics_or_empty ?service_name ?attrs ms =
of_x_or_empty ?service_name ?attrs ~f:of_metrics ms
let of_signal_l ?service_name ?attrs (s : OTEL.Any_signal_l.t) : t =
match s with
| Logs logs -> of_logs ?service_name ?attrs logs
| Spans sp -> of_spans ?service_name ?attrs sp
| Metrics ms -> of_metrics ?service_name ?attrs ms

View file

@ -45,5 +45,5 @@ end
type any_signal_l_builder = OTEL.Any_signal_l.t Builder.t type any_signal_l_builder = OTEL.Any_signal_l.t Builder.t
type any_resource_builder = Any_resource.t Builder.t type resource_signal_builder = Resource_signal.t Builder.t
(** The type that's useful for HTTP backends *) (** The type that's useful for HTTP backends *)

View file

@ -61,14 +61,14 @@ end = struct
let send (self : t) (sigs : OTEL.Any_signal_l.t) : (unit, error) result IO.t let send (self : t) (sigs : OTEL.Any_signal_l.t) : (unit, error) result IO.t
= =
let res = Any_resource.of_signal_l sigs in let res = Resource_signal.of_signal_l sigs in
let url = let url =
match res with match res with
| R_logs _ -> self.config.url_logs | Logs _ -> self.config.url_logs
| R_spans _ -> self.config.url_traces | Traces _ -> self.config.url_traces
| R_metrics _ -> self.config.url_metrics | Metrics _ -> self.config.url_metrics
in in
let data = Signal.Encode.any ~encoder:self.encoder res in let data = Resource_signal.Encode.any ~encoder:self.encoder res in
Httpc.send self.http ~url ~decode:(`Ret ()) data Httpc.send self.http ~url ~decode:(`Ret ()) data
end end

View file

@ -1,17 +1,40 @@
open Common_
module Trace_service = Opentelemetry.Proto.Trace_service module Trace_service = Opentelemetry.Proto.Trace_service
module Metrics_service = Opentelemetry.Proto.Metrics_service module Metrics_service = Opentelemetry.Proto.Metrics_service
module Logs_service = Opentelemetry.Proto.Logs_service module Logs_service = Opentelemetry.Proto.Logs_service
module Span = Opentelemetry.Span module Span = Opentelemetry.Span
let ( let@ ) = ( @@ ) open struct
let of_x_or_empty ?service_name ?attrs ~f l =
module Proto = Opentelemetry.Proto if l = [] then
[]
else
[ f ?service_name ?attrs l ]
end
type t = type t =
| Traces of Proto.Trace.resource_spans list | Traces of Proto.Trace.resource_spans list
| Metrics of Proto.Metrics.resource_metrics list | Metrics of Proto.Metrics.resource_metrics list
| Logs of Proto.Logs.resource_logs list | Logs of Proto.Logs.resource_logs list
let of_logs ?service_name ?attrs logs : t =
Logs [ Util_resources.make_resource_logs ?service_name ?attrs logs ]
let of_logs_or_empty ?service_name ?attrs logs =
of_x_or_empty ?service_name ?attrs ~f:of_logs logs
let of_spans ?service_name ?attrs spans : t =
Traces [ Util_resources.make_resource_spans ?service_name ?attrs spans ]
let of_spans_or_empty ?service_name ?attrs spans =
of_x_or_empty ?service_name ?attrs ~f:of_spans spans
let of_metrics ?service_name ?attrs m : t =
Metrics [ Util_resources.make_resource_metrics ?service_name ?attrs m ]
let of_metrics_or_empty ?service_name ?attrs ms =
of_x_or_empty ?service_name ?attrs ~f:of_metrics ms
let to_traces = function let to_traces = function
| Traces xs -> Some xs | Traces xs -> Some xs
| _ -> None | _ -> None
@ -36,6 +59,12 @@ let is_logs = function
| Logs _ -> true | Logs _ -> true
| _ -> false | _ -> false
let of_signal_l ?service_name ?attrs (s : OTEL.Any_signal_l.t) : t =
match s with
| Logs logs -> of_logs ?service_name ?attrs logs
| Spans sp -> of_spans ?service_name ?attrs sp
| Metrics ms -> of_metrics ?service_name ?attrs ms
module Encode = struct module Encode = struct
let resource_to_string ~encoder ~ctor ~enc resource : string = let resource_to_string ~encoder ~ctor ~enc resource : string =
let encoder = let encoder =
@ -78,11 +107,11 @@ module Encode = struct
Trace_service.make_export_trace_service_request ~resource_spans:r ()) Trace_service.make_export_trace_service_request ~resource_spans:r ())
~enc:Trace_service.encode_pb_export_trace_service_request ~enc:Trace_service.encode_pb_export_trace_service_request
let any ?encoder (r : Any_resource.t) : string = let any ?encoder (r : t) : string =
match r with match r with
| R_logs l -> logs ?encoder l | Logs l -> logs ?encoder l
| R_spans sp -> traces ?encoder sp | Traces sp -> traces ?encoder sp
| R_metrics ms -> metrics ?encoder ms | Metrics ms -> metrics ?encoder ms
end end
module Decode = struct module Decode = struct

View file

@ -1,5 +1,8 @@
(** Constructing and managing OTel (** Constructing and managing OTel
{{:https://opentelemetry.io/docs/concepts/signals/} signals} *) {{:https://opentelemetry.io/docs/concepts/signals/} signals} at the resource
(batch) level *)
open Common_
(** The type of signals (** The type of signals
@ -11,6 +14,45 @@ type t =
| Metrics of Opentelemetry_proto.Metrics.resource_metrics list | Metrics of Opentelemetry_proto.Metrics.resource_metrics list
| Logs of Opentelemetry_proto.Logs.resource_logs list | Logs of Opentelemetry_proto.Logs.resource_logs list
val of_logs :
?service_name:string ->
?attrs:OTEL.Key_value.t list ->
Proto.Logs.log_record list ->
t
val of_logs_or_empty :
?service_name:string ->
?attrs:OTEL.Key_value.t list ->
Proto.Logs.log_record list ->
t list
val of_spans :
?service_name:string -> ?attrs:OTEL.Key_value.t list -> OTEL.Span.t list -> t
val of_spans_or_empty :
?service_name:string ->
?attrs:OTEL.Key_value.t list ->
OTEL.Span.t list ->
t list
val of_metrics :
?service_name:string ->
?attrs:OTEL.Key_value.t list ->
Proto.Metrics.metric list ->
t
val of_metrics_or_empty :
?service_name:string ->
?attrs:OTEL.Key_value.t list ->
Proto.Metrics.metric list ->
t list
val of_signal_l :
?service_name:string ->
?attrs:OTEL.Key_value.t list ->
OTEL.Any_signal_l.t ->
t
val to_traces : t -> Opentelemetry_proto.Trace.resource_spans list option val to_traces : t -> Opentelemetry_proto.Trace.resource_spans list option
val to_metrics : t -> Opentelemetry_proto.Metrics.resource_metrics list option val to_metrics : t -> Opentelemetry_proto.Metrics.resource_metrics list option
@ -49,7 +91,7 @@ module Encode : sig
@param encoder provide an encoder state to reuse *) @param encoder provide an encoder state to reuse *)
val any : ?encoder:Pbrt.Encoder.t -> Any_resource.t -> string val any : ?encoder:Pbrt.Encoder.t -> t -> string
end end
(** Decode signals from protobuf encoded strings, received over the wire *) (** Decode signals from protobuf encoded strings, received over the wire *)

View file

@ -45,6 +45,8 @@ let k_span_ctx = Span_ctx.k_span_ctx
(** {2 Attributes and conventions} *) (** {2 Attributes and conventions} *)
module Conventions = Conventions module Conventions = Conventions
module Value = Value
module Key_value = Key_value
type value = Value.t type value = Value.t
(** A value in a key/value attribute *) (** A value in a key/value attribute *)

View file

@ -6,13 +6,13 @@ module Client = Opentelemetry_client
module Proto = Opentelemetry.Proto module Proto = Opentelemetry.Proto
open Containers open Containers
let batch_size : Client.Signal.t -> int = function let batch_size : Client.Resource_signal.t -> int = function
| Traces ts -> List.length ts | Traces ts -> List.length ts
| Logs ls -> List.length ls | Logs ls -> List.length ls
| Metrics ms -> List.length ms | Metrics ms -> List.length ms
let avg_batch_size (p : Client.Signal.t -> bool) let avg_batch_size (p : Client.Resource_signal.t -> bool)
(batches : Client.Signal.t list) : int = (batches : Client.Resource_signal.t list) : int =
let sum = let sum =
List.fold_left List.fold_left
(fun acc b -> (fun acc b ->
@ -24,7 +24,7 @@ let avg_batch_size (p : Client.Signal.t -> bool)
in in
sum / List.length batches sum / List.length batches
let signals_from_batch (signal_batch : Client.Signal.t) = let signals_from_batch (signal_batch : Client.Resource_signal.t) =
match signal_batch with match signal_batch with
| Traces ts -> List.map (fun t -> `Trace t) ts | Traces ts -> List.map (fun t -> `Trace t) ts
| Logs ls -> List.map (fun l -> `Log l) ls | Logs ls -> List.map (fun l -> `Log l) ls

View file

@ -1,7 +1,7 @@
(* A runs tests against a OTel-instrumented program *) (* A runs tests against a OTel-instrumented program *)
module Client = Opentelemetry_client module Client = Opentelemetry_client
module Signal = Client.Signal module Signal = Client.Resource_signal
open Lwt.Syntax open Lwt.Syntax
let debug = let debug =

View file

@ -2,7 +2,7 @@
server that can receive the signals make them available for inspection. *) server that can receive the signals make them available for inspection. *)
val gather_signals : val gather_signals :
?port:int -> string list -> Opentelemetry_client.Signal.t list Lwt.t ?port:int -> string list -> Opentelemetry_client.Resource_signal.t list Lwt.t
(** [gather_signals program_to_test] is a list of all the signals emitted by the (** [gather_signals program_to_test] is a list of all the signals emitted by the
[program_to_test], which the server was able to record. This function [program_to_test], which the server was able to record. This function
assumes that the program to test will be sending its signals to the assumes that the program to test will be sending its signals to the

View file

@ -9,11 +9,11 @@ let url = Printf.sprintf "http://localhost:%d" port
let cmd = [ "emit_logs_cohttp"; "--url"; url ] let cmd = [ "emit_logs_cohttp"; "--url"; url ]
let tests (signal_batches : Client.Signal.t list) = let tests (signal_batches : Client.Resource_signal.t list) =
ignore signal_batches; ignore signal_batches;
let cur_time = ref 0 in let cur_time = ref 0 in
List.iter List.iter
(fun (signal_batch : Client.Signal.t) -> (fun (signal_batch : Client.Resource_signal.t) ->
match signal_batch with match signal_batch with
| Logs ls -> | Logs ls ->
ls (* Mask out the times so tests don't change in between runs *) ls (* Mask out the times so tests don't change in between runs *)