Class: OpenTelemetry::SDK::Metrics::Aggregation::ExplicitBucketHistogram

Inherits:
Object
  • Object
show all
Defined in:
lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb

Overview

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(aggregation_temporality: ENV.fetch('OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE', :cumulative), boundaries: DEFAULT_BOUNDARIES, record_min_max: true, exemplar_reservoir: nil) ⇒ ExplicitBucketHistogram

The default value for boundaries represents the following buckets: (-inf, 0], (0, 5.0], (5.0, 10.0], (10.0, 25.0], (25.0, 50.0], (50.0, 75.0], (75.0, 100.0], (100.0, 250.0], (250.0, 500.0], (500.0, 1000.0], (1000.0, +inf)



23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 23

def initialize(
  aggregation_temporality: ENV.fetch('OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE', :cumulative),
  boundaries: DEFAULT_BOUNDARIES,
  record_min_max: true,
  exemplar_reservoir: nil
)
  @aggregation_temporality = AggregationTemporality.determine_temporality(aggregation_temporality: aggregation_temporality, default: :cumulative)
  @boundaries = boundaries && !boundaries.empty? ? boundaries.sort : nil
  @record_min_max = record_min_max
  @exemplar_reservoir = exemplar_reservoir || Metrics::Exemplar::AlignedHistogramBucketExemplarReservoir.new(boundaries: @boundaries)
  @exemplar_reservoir_storage = {}
end

Instance Attribute Details

#exemplar_reservoirObject (readonly)

Returns the value of attribute exemplar_reservoir.



14
15
16
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 14

def exemplar_reservoir
  @exemplar_reservoir
end

Instance Method Details

#aggregation_temporalityObject



111
112
113
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 111

def aggregation_temporality
  @aggregation_temporality.temporality
end

#collect(start_time, end_time, data_points) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 36

def collect(start_time, end_time, data_points)
  if @aggregation_temporality.delta?
    # Set timestamps and 'move' data point values to result.
    hdps = data_points.values.map! do |hdp|
      hdp.start_time_unix_nano = start_time
      hdp.time_unix_nano = end_time
      reservoir = @exemplar_reservoir_storage[hdp.attributes]
      hdp.exemplars = reservoir&.collect(attributes: hdp.attributes, aggregation_temporality: @aggregation_temporality)
      hdp
    end
    data_points.clear
    hdps
  else
    # Update timestamps and take a snapshot.
    data_points.values.map! do |hdp|
      hdp.start_time_unix_nano ||= start_time # Start time of a data point is from the first observation.
      hdp.time_unix_nano = end_time
      reservoir = @exemplar_reservoir_storage[hdp.attributes]
      hdp.exemplars = reservoir&.collect(attributes: hdp.attributes, aggregation_temporality: @aggregation_temporality)
      hdp = hdp.dup
      hdp.bucket_counts = hdp.bucket_counts.dup
      hdp
    end
  end
end

#update(amount, attributes, data_points, exemplar_offer: false) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 62

def update(amount, attributes, data_points, exemplar_offer: false)
  hdp = data_points.fetch(attributes) do
    if @record_min_max
      min = Float::INFINITY
      max = -Float::INFINITY
    end

    data_points[attributes] = HistogramDataPoint.new(
      attributes,
      nil,                 # :start_time_unix_nano
      nil,                 # :time_unix_nano
      0,                   # :count
      0,                   # :sum
      empty_bucket_counts, # :bucket_counts
      @boundaries,         # :explicit_bounds
      nil,                 # :exemplars
      min,                 # :min
      max                  # :max
    )
  end

  reservoir = @exemplar_reservoir_storage[attributes]
  unless reservoir
    reservoir = @exemplar_reservoir.dup
    reservoir.reset
    @exemplar_reservoir_storage[attributes] = reservoir
  end

  if exemplar_offer
    reservoir.offer(value: amount,
                    timestamp: OpenTelemetry::Common::Utilities.time_in_nanoseconds,
                    attributes: attributes,
                    context: OpenTelemetry::Context.current)
  end

  if @record_min_max
    hdp.max = amount if amount > hdp.max
    hdp.min = amount if amount < hdp.min
  end

  hdp.sum += amount
  hdp.count += 1
  if @boundaries
    bucket_index = @boundaries.bsearch_index { |i| i >= amount } || @boundaries.size
    hdp.bucket_counts[bucket_index] += 1
  end
  nil
end