refactor duplication of irate and idelta functions implementations

This commit is contained in:
Frederic Branczyk 2016-08-08 10:52:00 +02:00
parent dbf83666bb
commit f02df4138c

View file

@ -145,8 +145,17 @@ func funcIncrease(ev *evaluator, args Expressions) model.Value {
// === irate(node model.ValMatrix) Vector === // === irate(node model.ValMatrix) Vector ===
func funcIrate(ev *evaluator, args Expressions) model.Value { func funcIrate(ev *evaluator, args Expressions) model.Value {
return instantValue(ev, args[0], true)
}
// === idelta(node model.ValMatric) Vector ===
func funcIdelta(ev *evaluator, args Expressions) model.Value {
return instantValue(ev, args[0], false)
}
func instantValue(ev *evaluator, arg Expr, isRate bool) model.Value {
resultVector := vector{} resultVector := vector{}
for _, samples := range ev.evalMatrix(args[0]) { for _, samples := range ev.evalMatrix(arg) {
// No sense in trying to compute a rate without at least two points. Drop // No sense in trying to compute a rate without at least two points. Drop
// this vector element. // this vector element.
if len(samples.Values) < 2 { if len(samples.Values) < 2 {
@ -157,7 +166,7 @@ func funcIrate(ev *evaluator, args Expressions) model.Value {
previousSample := samples.Values[len(samples.Values)-2] previousSample := samples.Values[len(samples.Values)-2]
var resultValue model.SampleValue var resultValue model.SampleValue
if lastSample.Value < previousSample.Value { if isRate && lastSample.Value < previousSample.Value {
// Counter reset. // Counter reset.
resultValue = lastSample.Value resultValue = lastSample.Value
} else { } else {
@ -169,38 +178,10 @@ func funcIrate(ev *evaluator, args Expressions) model.Value {
// Avoid dividing by 0. // Avoid dividing by 0.
continue continue
} }
// Convert to per-second.
resultValue /= model.SampleValue(sampledInterval.Seconds())
resultSample := &sample{ if isRate {
Metric: samples.Metric, // Convert to per-second.
Value: resultValue, resultValue /= model.SampleValue(sampledInterval.Seconds())
Timestamp: ev.Timestamp,
}
resultSample.Metric.Del(model.MetricNameLabel)
resultVector = append(resultVector, resultSample)
}
return resultVector
}
// === idelta(node model.ValMatric) Vector ===
func funcIdelta(ev *evaluator, args Expressions) model.Value {
resultVector := vector{}
for _, samples := range ev.evalMatrix(args[0]) {
// No sense in trying to compute a rate without at least two points. Drop
// this vector element.
if len(samples.Values) < 2 {
continue
}
lastSample := samples.Values[len(samples.Values)-1]
previousSample := samples.Values[len(samples.Values)-2]
resultValue := lastSample.Value - previousSample.Value
sampledInterval := lastSample.Timestamp.Sub(previousSample.Timestamp)
if sampledInterval == 0 {
// Avoid dividing by 0.
continue
} }
resultSample := &sample{ resultSample := &sample{