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', :delta), boundaries: DEFAULT_BOUNDARIES, record_min_max: true) ⇒ 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
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 23

def initialize(
  aggregation_temporality: ENV.fetch('OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE', :delta), # TODO: the default should be :cumulative, see issue #1555
  boundaries: DEFAULT_BOUNDARIES,
  record_min_max: true
)
  @data_points = {}
  @aggregation_temporality = aggregation_temporality
  @boundaries = boundaries && !boundaries.empty? ? boundaries.sort : nil
  @record_min_max = record_min_max
end

Instance Attribute Details

#aggregation_temporalityObject (readonly)

Returns the value of attribute aggregation_temporality.



17
18
19
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 17

def aggregation_temporality
  @aggregation_temporality
end

Instance Method Details

#collect(start_time, end_time) ⇒ Object



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

def collect(start_time, end_time)
  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
      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
      hdp = hdp.dup
      hdp.bucket_counts = hdp.bucket_counts.dup
      hdp
    end
  end
end

#update(amount, attributes) ⇒ Object



56
57
58
59
60
61
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
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 56

def update(amount, attributes)
  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

  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