-
Notifications
You must be signed in to change notification settings - Fork 249
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: adding is_monotonic flag to sum #1793
base: main
Are you sure you want to change the base?
Changes from 4 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -42,7 +42,7 @@ def add(increment, attributes: {}) | |
private | ||
|
||
def default_aggregation | ||
OpenTelemetry::SDK::Metrics::Aggregation::Sum.new | ||
OpenTelemetry::SDK::Metrics::Aggregation::Sum.new(is_monotonic: true) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was going to ask that is there any spec to define the default for monotonic, but found the spec that explain it. |
||
end | ||
end | ||
end | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -67,6 +67,8 @@ def update(value, attributes) | |
|
||
def aggregate_metric_data(start_time, end_time, aggregation: nil) | ||
aggregator = aggregation || @default_aggregation | ||
is_monotonic = aggregator.respond_to?(:is_monotonic) && aggregator.is_monotonic | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This will return false if aggregator doesn't respond to is_monotonic. Should we use nil instead of false?
|
||
|
||
MetricData.new( | ||
@name, | ||
@description, | ||
|
@@ -77,7 +79,8 @@ def aggregate_metric_data(start_time, end_time, aggregation: nil) | |
aggregator.collect(start_time, end_time, @data_points), | ||
aggregator.aggregation_temporality, | ||
start_time, | ||
end_time | ||
end_time, | ||
is_monotonic | ||
) | ||
end | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,8 +8,9 @@ | |
|
||
describe OpenTelemetry::SDK::Metrics::Aggregation::Sum do | ||
let(:data_points) { {} } | ||
let(:sum_aggregation) { OpenTelemetry::SDK::Metrics::Aggregation::Sum.new(aggregation_temporality: aggregation_temporality) } | ||
let(:sum_aggregation) { OpenTelemetry::SDK::Metrics::Aggregation::Sum.new(aggregation_temporality: aggregation_temporality, is_monotonic: is_monotonic) } | ||
let(:aggregation_temporality) { :delta } | ||
let(:is_monotonic) { false } | ||
|
||
# Time in nano | ||
let(:start_time) { (Time.now.to_r * 1_000_000_000).to_i } | ||
|
@@ -58,6 +59,14 @@ | |
_(ndps[1].attributes).must_equal('foo' => 'bar') | ||
end | ||
|
||
it 'aggregates and collects negative values' do | ||
sum_aggregation.update(1, {}, data_points) | ||
sum_aggregation.update(-2, {}, data_points) | ||
|
||
ndps = sum_aggregation.collect(start_time, end_time, data_points) | ||
_(ndps[0].value).must_equal(-1) | ||
end | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We may want more test case once the logic for mixing up temporality and monotonic is there |
||
it 'does not aggregate between collects' do | ||
sum_aggregation.update(1, {}, data_points) | ||
sum_aggregation.update(2, {}, data_points) | ||
|
@@ -94,4 +103,17 @@ | |
_(ndps[0].value).must_equal(4) | ||
end | ||
end | ||
|
||
describe 'when sum type is monotonic' do | ||
let(:aggregation_temporality) { :not_delta } | ||
let(:is_monotonic) { true } | ||
|
||
it 'does not allow negative values to accumulate' do | ||
sum_aggregation.update(1, {}, data_points) | ||
sum_aggregation.update(-2, {}, data_points) | ||
ndps = sum_aggregation.collect(start_time, end_time, data_points) | ||
|
||
_(ndps[0].value).must_equal(1) | ||
end | ||
end | ||
end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this suppose to be instance variable
@is_monotonic
?monotonic also need to check with aggregation_temporality
We also need to move this logic before
ndp = data_points[attributes] || data_points[attributes] = NumberDataPoint.new
; because update doesn't return anything; it will update direct on data_points hash.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think checking if increment is negative fulfills the specs for cumulative sums. for delta sums it might be the case that we need to check if the sum (value + increment) is negative? only checking if increment is negative ensures the sum value is never negative but might reject some valid increments. is my logic correct?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I think your logic is correct (also checked other implementation as your referenced).
The specification is somewhat confusing, but
In this case of metrics, this means the sum is nominally increasing
should reduce confusion. (Now I think the specification is actually wrong regarding "for delta" and "for cum," and they should be swapped.)For delta sum, it's kind tricky because the sum will be zeroed depends on when the instrument's value got exported. I see other implementations don't care about it. I would suggest follow their approach.