Class: OpenTelemetry::SDK::Metrics::Aggregation::ExplicitBucketHistogram
- Inherits:
-
Object
- Object
- OpenTelemetry::SDK::Metrics::Aggregation::ExplicitBucketHistogram
- Defined in:
- lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb
Overview
Contains the implementation of the ExplicitBucketHistogram aggregation https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/sdk.md#explicit-bucket-histogram-aggregation
Constant Summary collapse
- OVERFLOW_ATTRIBUTE_SET =
{ 'otel.metric.overflow' => true }.freeze
Instance Attribute Summary collapse
-
#exemplar_reservoir ⇒ Object
readonly
Returns the value of attribute exemplar_reservoir.
Instance Method Summary collapse
- #aggregation_temporality ⇒ Object
- #collect(start_time, end_time, data_points) ⇒ Object
-
#initialize(aggregation_temporality: ENV.fetch('OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE', :cumulative), boundaries: DEFAULT_BOUNDARIES, record_min_max: true, exemplar_reservoir: nil) ⇒ ExplicitBucketHistogram
constructor
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).
- #update(amount, attributes, data_points, cardinality_limit, exemplar_offer: false) ⇒ Object
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)
24 25 26 27 28 29 30 31 32 33 34 35 |
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 24 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_reservoir ⇒ Object (readonly)
Returns the value of attribute exemplar_reservoir.
15 16 17 |
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 15 def exemplar_reservoir @exemplar_reservoir end |
Instance Method Details
#aggregation_temporality ⇒ Object
76 77 78 |
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 76 def aggregation_temporality @aggregation_temporality.temporality end |
#collect(start_time, end_time, data_points) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 37 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, cardinality_limit, exemplar_offer: false) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/opentelemetry/sdk/metrics/aggregation/explicit_bucket_histogram.rb', line 63 def update(amount, attributes, data_points, cardinality_limit, exemplar_offer: false) hdp = if data_points.key?(attributes) data_points[attributes] elsif data_points.size >= cardinality_limit - 1 data_points[OVERFLOW_ATTRIBUTE_SET] || create_new_data_point(OVERFLOW_ATTRIBUTE_SET, data_points) else create_new_data_point(attributes, data_points) end update_histogram_data_point(hdp, amount, exemplar_offer: exemplar_offer) nil end |