-
Notifications
You must be signed in to change notification settings - Fork 1.4k
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 batch processor metrics reorder, improve performance #3034
Changes from all 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 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
@@ -19,56 +19,52 @@ import ( | |||||||||
) | ||||||||||
|
||||||||||
// splitMetrics removes metrics from the input data and returns a new data of the specified size. | ||||||||||
func splitMetrics(size int, toSplit pdata.Metrics) pdata.Metrics { | ||||||||||
if toSplit.MetricCount() <= size { | ||||||||||
return toSplit | ||||||||||
func splitMetrics(size int, src pdata.Metrics) pdata.Metrics { | ||||||||||
if src.MetricCount() <= size { | ||||||||||
return src | ||||||||||
} | ||||||||||
copiedMetrics := 0 | ||||||||||
result := pdata.NewMetrics() | ||||||||||
result.ResourceMetrics().Resize(toSplit.ResourceMetrics().Len()) | ||||||||||
rms := toSplit.ResourceMetrics() | ||||||||||
totalCopiedMetrics := 0 | ||||||||||
dest := pdata.NewMetrics() | ||||||||||
|
||||||||||
rmsCount := 0 | ||||||||||
for i := rms.Len() - 1; i >= 0; i-- { | ||||||||||
rmsCount++ | ||||||||||
rm := rms.At(i) | ||||||||||
destRs := result.ResourceMetrics().At(result.ResourceMetrics().Len() - 1 - i) | ||||||||||
rm.Resource().CopyTo(destRs.Resource()) | ||||||||||
|
||||||||||
destRs.InstrumentationLibraryMetrics().Resize(rm.InstrumentationLibraryMetrics().Len()) | ||||||||||
src.ResourceMetrics().RemoveIf(func(srcRm pdata.ResourceMetrics) bool { | ||||||||||
// If we are done skip everything else. | ||||||||||
if totalCopiedMetrics == size { | ||||||||||
return false | ||||||||||
} | ||||||||||
|
||||||||||
ilmCount := 0 | ||||||||||
for j := rm.InstrumentationLibraryMetrics().Len() - 1; j >= 0; j-- { | ||||||||||
ilmCount++ | ||||||||||
instMetrics := rm.InstrumentationLibraryMetrics().At(j) | ||||||||||
destInstMetrics := destRs.InstrumentationLibraryMetrics().At(destRs.InstrumentationLibraryMetrics().Len() - 1 - j) | ||||||||||
instMetrics.InstrumentationLibrary().CopyTo(destInstMetrics.InstrumentationLibrary()) | ||||||||||
destRs := dest.ResourceMetrics().AppendEmpty() | ||||||||||
srcRm.Resource().CopyTo(destRs.Resource()) | ||||||||||
|
||||||||||
if size-copiedMetrics >= instMetrics.Metrics().Len() { | ||||||||||
destInstMetrics.Metrics().Resize(instMetrics.Metrics().Len()) | ||||||||||
} else { | ||||||||||
destInstMetrics.Metrics().Resize(size - copiedMetrics) | ||||||||||
} | ||||||||||
for k, destIdx := instMetrics.Metrics().Len()-1, 0; k >= 0 && copiedMetrics < size; k, destIdx = k-1, destIdx+1 { | ||||||||||
metric := instMetrics.Metrics().At(k) | ||||||||||
metric.CopyTo(destInstMetrics.Metrics().At(destIdx)) | ||||||||||
copiedMetrics++ | ||||||||||
// remove metric | ||||||||||
instMetrics.Metrics().Resize(instMetrics.Metrics().Len() - 1) | ||||||||||
srcRm.InstrumentationLibraryMetrics().RemoveIf(func(srcIm pdata.InstrumentationLibraryMetrics) bool { | ||||||||||
// If we are done skip everything else. | ||||||||||
if totalCopiedMetrics == size { | ||||||||||
return false | ||||||||||
} | ||||||||||
if instMetrics.Metrics().Len() == 0 { | ||||||||||
rm.InstrumentationLibraryMetrics().Resize(rm.InstrumentationLibraryMetrics().Len() - 1) | ||||||||||
} | ||||||||||
if copiedMetrics == size { | ||||||||||
result.ResourceMetrics().Resize(rmsCount) | ||||||||||
return result | ||||||||||
|
||||||||||
destIms := destRs.InstrumentationLibraryMetrics().AppendEmpty() | ||||||||||
srcIm.InstrumentationLibrary().CopyTo(destIms.InstrumentationLibrary()) | ||||||||||
|
||||||||||
// If possible to move all metrics do that. | ||||||||||
srcMetricsLen := srcIm.Metrics().Len() | ||||||||||
if size-totalCopiedMetrics >= srcMetricsLen { | ||||||||||
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 might read a little cleaner:
Suggested change
|
||||||||||
totalCopiedMetrics += srcMetricsLen | ||||||||||
srcIm.Metrics().MoveAndAppendTo(destIms.Metrics()) | ||||||||||
return true | ||||||||||
} | ||||||||||
} | ||||||||||
destRs.InstrumentationLibraryMetrics().Resize(ilmCount) | ||||||||||
if rm.InstrumentationLibraryMetrics().Len() == 0 { | ||||||||||
rms.Resize(rms.Len() - 1) | ||||||||||
} | ||||||||||
} | ||||||||||
result.ResourceMetrics().Resize(rmsCount) | ||||||||||
return result | ||||||||||
|
||||||||||
srcIm.Metrics().RemoveIf(func(srcMetric pdata.Metric) bool { | ||||||||||
// If we are done skip everything else. | ||||||||||
if totalCopiedMetrics == size { | ||||||||||
return false | ||||||||||
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. Nit: it would be nicer if RemoveIf had a way to break the iteration. In this case we will continue to iterate but there is no need, it is pointless. (BTW, RemoveAt would allow this :-) ) 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 know, was thinking to actually return a slice of pdata to benefit of the fact that we iterate over all anyway, but I like your suggestion about returning an enum. Will do a quick benchmark to confirm the switch does not affect too much. |
||||||||||
} | ||||||||||
srcMetric.CopyTo(destIms.Metrics().AppendEmpty()) | ||||||||||
totalCopiedMetrics++ | ||||||||||
return true | ||||||||||
}) | ||||||||||
return false | ||||||||||
}) | ||||||||||
return srcRm.InstrumentationLibraryMetrics().Len() == 0 | ||||||||||
}) | ||||||||||
|
||||||||||
return dest | ||||||||||
} |
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.
The
return true
andreturn false
operations for RemoveIf callbacks here are a bit difficult to understand (return false
is not self-explanatory). Please add comments to explain what is happening.A nicer approach perhaps would be to change RemoveIf's callback to return an enum instead of bool. In that case we could write e.g.
return pdata.Remove
,return pdata.Keep
orreturn pdata.BreakIteration
or similar.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 like it, the "problem" is that we will avoid calling the callback but we still need to iterate over all to shift them to the left in case something was removed.