From 2149bb0714a1da52f8bf5447467a9311527ea3f5 Mon Sep 17 00:00:00 2001 From: Simon Cruanes Date: Tue, 26 Apr 2022 10:08:56 -0400 Subject: [PATCH] fix: proper starting point for cumulative metrics use the start of the program as a fixed reference point. see: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/datamodel.md#temporality --- src/opentelemetry.ml | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/opentelemetry.ml b/src/opentelemetry.ml index c607b52a..5d09e8c9 100644 --- a/src/opentelemetry.ml +++ b/src/opentelemetry.ml @@ -582,24 +582,26 @@ module Metrics = struct type t = Metrics_types.metric + let _program_start = Timestamp_ns.now_unix_ns() + (** Number data point, as a float *) - let float ?start_time_unix_nano + let float ?(start_time_unix_nano=_program_start) ?(now=Timestamp_ns.now_unix_ns()) ?(attrs=[]) (d:float) : number_data_point = let attributes = attrs |> List.map _conv_key_value in default_number_data_point - ?start_time_unix_nano ~time_unix_nano:now + ~start_time_unix_nano ~time_unix_nano:now ~attributes ~value:(As_double d) () (** Number data point, as an int *) - let int ?start_time_unix_nano + let int ?(start_time_unix_nano=_program_start) ?(now=Timestamp_ns.now_unix_ns()) ?(attrs=[]) (i:int) : number_data_point = let attributes = attrs |> List.map _conv_key_value in - default_number_data_point ?start_time_unix_nano ~time_unix_nano:now + default_number_data_point ~start_time_unix_nano ~time_unix_nano:now ~attributes ~value:(As_int (Int64.of_int i)) () @@ -768,34 +770,30 @@ end = struct let word_to_bytes n = n * bytes_per_word let word_to_bytes_f n = n *. float bytes_per_word - (* TODO: use atomic *) - let last = ref (Timestamp_ns.now_unix_ns()) - let get_metrics () : Metrics.t list = let gc = Gc.quick_stat () in - let start_time_unix_nano = !last in - last := Timestamp_ns.now_unix_ns(); + let now = Timestamp_ns.now_unix_ns() in let open Metrics in let open Conventions.Metrics in [ gauge ~name:Process.Runtime.Ocaml.GC.major_heap ~unit_:"B" - [ int (word_to_bytes gc.Gc.heap_words) ]; + [ int ~now (word_to_bytes gc.Gc.heap_words) ]; sum ~name:Process.Runtime.Ocaml.GC.minor_allocated ~aggregation_temporality:Metrics.Aggregation_temporality_cumulative ~is_monotonic:true ~unit_:"B" - [ float ~start_time_unix_nano (word_to_bytes_f gc.Gc.minor_words) ]; + [ float ~now (word_to_bytes_f gc.Gc.minor_words) ]; sum ~name:Process.Runtime.Ocaml.GC.minor_collections ~aggregation_temporality:Metrics.Aggregation_temporality_cumulative ~is_monotonic:true - [ int ~start_time_unix_nano gc.Gc.minor_collections ]; + [ int ~now gc.Gc.minor_collections ]; sum ~name:Process.Runtime.Ocaml.GC.major_collections ~aggregation_temporality:Metrics.Aggregation_temporality_cumulative ~is_monotonic:true - [ int ~start_time_unix_nano gc.Gc.major_collections ]; + [ int ~now gc.Gc.major_collections ]; sum ~name:Process.Runtime.Ocaml.GC.compactions ~aggregation_temporality:Metrics.Aggregation_temporality_cumulative ~is_monotonic:true - [ int ~start_time_unix_nano gc.Gc.compactions ]; + [ int ~now gc.Gc.compactions ]; ] end