mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-25 05:34:05 -08:00
Merge pull request #15527 from NeerajGartia21/promql/funcResets
Some checks are pending
buf.build / lint and publish (push) Waiting to run
CI / Go tests (push) Waiting to run
CI / More Go tests (push) Waiting to run
CI / Go tests with previous Go version (push) Waiting to run
CI / UI tests (push) Waiting to run
CI / Go tests on Windows (push) Waiting to run
CI / Mixins tests (push) Waiting to run
CI / Build Prometheus for common architectures (0) (push) Waiting to run
CI / Build Prometheus for common architectures (1) (push) Waiting to run
CI / Build Prometheus for common architectures (2) (push) Waiting to run
CI / Build Prometheus for all architectures (0) (push) Waiting to run
CI / Build Prometheus for all architectures (1) (push) Waiting to run
CI / Build Prometheus for all architectures (10) (push) Waiting to run
CI / Build Prometheus for all architectures (11) (push) Waiting to run
CI / Build Prometheus for all architectures (2) (push) Waiting to run
CI / Build Prometheus for all architectures (3) (push) Waiting to run
CI / Build Prometheus for all architectures (4) (push) Waiting to run
CI / Build Prometheus for all architectures (5) (push) Waiting to run
CI / Build Prometheus for all architectures (6) (push) Waiting to run
CI / Build Prometheus for all architectures (7) (push) Waiting to run
CI / Build Prometheus for all architectures (8) (push) Waiting to run
CI / Build Prometheus for all architectures (9) (push) Waiting to run
CI / Report status of build Prometheus for all architectures (push) Blocked by required conditions
CI / Check generated parser (push) Waiting to run
CI / golangci-lint (push) Waiting to run
CI / fuzzing (push) Waiting to run
CI / codeql (push) Waiting to run
CI / Publish main branch artifacts (push) Blocked by required conditions
CI / Publish release artefacts (push) Blocked by required conditions
CI / Publish UI on npm Registry (push) Blocked by required conditions
Scorecards supply-chain security / Scorecards analysis (push) Waiting to run
Some checks are pending
buf.build / lint and publish (push) Waiting to run
CI / Go tests (push) Waiting to run
CI / More Go tests (push) Waiting to run
CI / Go tests with previous Go version (push) Waiting to run
CI / UI tests (push) Waiting to run
CI / Go tests on Windows (push) Waiting to run
CI / Mixins tests (push) Waiting to run
CI / Build Prometheus for common architectures (0) (push) Waiting to run
CI / Build Prometheus for common architectures (1) (push) Waiting to run
CI / Build Prometheus for common architectures (2) (push) Waiting to run
CI / Build Prometheus for all architectures (0) (push) Waiting to run
CI / Build Prometheus for all architectures (1) (push) Waiting to run
CI / Build Prometheus for all architectures (10) (push) Waiting to run
CI / Build Prometheus for all architectures (11) (push) Waiting to run
CI / Build Prometheus for all architectures (2) (push) Waiting to run
CI / Build Prometheus for all architectures (3) (push) Waiting to run
CI / Build Prometheus for all architectures (4) (push) Waiting to run
CI / Build Prometheus for all architectures (5) (push) Waiting to run
CI / Build Prometheus for all architectures (6) (push) Waiting to run
CI / Build Prometheus for all architectures (7) (push) Waiting to run
CI / Build Prometheus for all architectures (8) (push) Waiting to run
CI / Build Prometheus for all architectures (9) (push) Waiting to run
CI / Report status of build Prometheus for all architectures (push) Blocked by required conditions
CI / Check generated parser (push) Waiting to run
CI / golangci-lint (push) Waiting to run
CI / fuzzing (push) Waiting to run
CI / codeql (push) Waiting to run
CI / Publish main branch artifacts (push) Blocked by required conditions
CI / Publish release artefacts (push) Blocked by required conditions
CI / Publish UI on npm Registry (push) Blocked by required conditions
Scorecards supply-chain security / Scorecards analysis (push) Waiting to run
[BUGFIX] PromQL: Fix `resets` function for histograms
This commit is contained in:
commit
6a6630d2a7
|
@ -1400,27 +1400,41 @@ func funcResets(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelpe
|
|||
floats := vals[0].(Matrix)[0].Floats
|
||||
histograms := vals[0].(Matrix)[0].Histograms
|
||||
resets := 0
|
||||
|
||||
if len(floats) > 1 {
|
||||
prev := floats[0].F
|
||||
for _, sample := range floats[1:] {
|
||||
current := sample.F
|
||||
if current < prev {
|
||||
resets++
|
||||
}
|
||||
prev = current
|
||||
}
|
||||
if len(floats) == 0 && len(histograms) == 0 {
|
||||
return enh.Out, nil
|
||||
}
|
||||
|
||||
if len(histograms) > 1 {
|
||||
prev := histograms[0].H
|
||||
for _, sample := range histograms[1:] {
|
||||
current := sample.H
|
||||
if current.DetectReset(prev) {
|
||||
var prevSample, curSample Sample
|
||||
for iFloat, iHistogram := 0, 0; iFloat < len(floats) || iHistogram < len(histograms); {
|
||||
switch {
|
||||
// Process a float sample if no histogram sample remains or its timestamp is earlier.
|
||||
// Process a histogram sample if no float sample remains or its timestamp is earlier.
|
||||
case iHistogram >= len(histograms) || iFloat < len(floats) && floats[iFloat].T < histograms[iHistogram].T:
|
||||
curSample.F = floats[iFloat].F
|
||||
curSample.H = nil
|
||||
iFloat++
|
||||
case iFloat >= len(floats) || iHistogram < len(histograms) && floats[iFloat].T > histograms[iHistogram].T:
|
||||
curSample.H = histograms[iHistogram].H
|
||||
iHistogram++
|
||||
}
|
||||
// Skip the comparison for the first sample, just initialize prevSample.
|
||||
if iFloat+iHistogram == 1 {
|
||||
prevSample = curSample
|
||||
continue
|
||||
}
|
||||
switch {
|
||||
case prevSample.H == nil && curSample.H == nil:
|
||||
if curSample.F < prevSample.F {
|
||||
resets++
|
||||
}
|
||||
case prevSample.H != nil && curSample.H == nil, prevSample.H == nil && curSample.H != nil:
|
||||
resets++
|
||||
case prevSample.H != nil && curSample.H != nil:
|
||||
if curSample.H.DetectReset(prevSample.H) {
|
||||
resets++
|
||||
}
|
||||
prev = current
|
||||
}
|
||||
prevSample = curSample
|
||||
}
|
||||
|
||||
return append(enh.Out, Sample{F: float64(resets)}), nil
|
||||
|
@ -1441,16 +1455,12 @@ func funcChanges(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelp
|
|||
// Process a float sample if no histogram sample remains or its timestamp is earlier.
|
||||
// Process a histogram sample if no float sample remains or its timestamp is earlier.
|
||||
case iHistogram >= len(histograms) || iFloat < len(floats) && floats[iFloat].T < histograms[iHistogram].T:
|
||||
{
|
||||
curSample.F = floats[iFloat].F
|
||||
curSample.H = nil
|
||||
iFloat++
|
||||
}
|
||||
curSample.F = floats[iFloat].F
|
||||
curSample.H = nil
|
||||
iFloat++
|
||||
case iFloat >= len(floats) || iHistogram < len(histograms) && floats[iFloat].T > histograms[iHistogram].T:
|
||||
{
|
||||
curSample.H = histograms[iHistogram].H
|
||||
iHistogram++
|
||||
}
|
||||
curSample.H = histograms[iHistogram].H
|
||||
iHistogram++
|
||||
}
|
||||
// Skip the comparison for the first sample, just initialize prevSample.
|
||||
if iFloat+iHistogram == 1 {
|
||||
|
@ -1459,20 +1469,14 @@ func funcChanges(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelp
|
|||
}
|
||||
switch {
|
||||
case prevSample.H == nil && curSample.H == nil:
|
||||
{
|
||||
if curSample.F != prevSample.F && !(math.IsNaN(curSample.F) && math.IsNaN(prevSample.F)) {
|
||||
changes++
|
||||
}
|
||||
}
|
||||
case prevSample.H != nil && curSample.H == nil, prevSample.H == nil && curSample.H != nil:
|
||||
{
|
||||
if curSample.F != prevSample.F && !(math.IsNaN(curSample.F) && math.IsNaN(prevSample.F)) {
|
||||
changes++
|
||||
}
|
||||
case prevSample.H != nil && curSample.H == nil, prevSample.H == nil && curSample.H != nil:
|
||||
changes++
|
||||
case prevSample.H != nil && curSample.H != nil:
|
||||
{
|
||||
if !curSample.H.Equals(prevSample.H) {
|
||||
changes++
|
||||
}
|
||||
if !curSample.H.Equals(prevSample.H) {
|
||||
changes++
|
||||
}
|
||||
}
|
||||
prevSample = curSample
|
||||
|
|
14
promql/promqltest/testdata/functions.test
vendored
14
promql/promqltest/testdata/functions.test
vendored
|
@ -5,7 +5,7 @@ load 5m
|
|||
http_requests{path="/biz"} 0 0 0 0 0 1 1 1 1 1
|
||||
http_requests_histogram{path="/foo"} {{schema:0 sum:1 count:1}}x9
|
||||
http_requests_histogram{path="/bar"} 0 0 0 0 0 0 0 0 {{schema:0 sum:1 count:1}} {{schema:0 sum:1 count:1}}
|
||||
http_requests_histogram{path="/biz"} 0 1 0 2 0 3 0 {{schema:0 sum:1 count:1}} {{schema:0 sum:2 count:2}} {{schema:0 sum:1 count:1}}
|
||||
http_requests_histogram{path="/biz"} 0 1 0 2 0 3 0 {{schema:0 sum:1 count:1 z_bucket_w:0.001 z_bucket:2}} {{schema:0 sum:2 count:2 z_bucket_w:0.001 z_bucket:1}} {{schema:0 sum:1 count:1 z_bucket_w:0.001 z_bucket:2}}
|
||||
|
||||
# Tests for resets().
|
||||
eval instant at 50m resets(http_requests[5m])
|
||||
|
@ -42,6 +42,18 @@ eval instant at 50m resets(http_requests[50m])
|
|||
|
||||
eval instant at 50m resets(nonexistent_metric[50m])
|
||||
|
||||
# Test for mix of floats and histograms.
|
||||
|
||||
eval instant at 50m resets(http_requests_histogram[6m])
|
||||
{path="/foo"} 0
|
||||
{path="/bar"} 0
|
||||
{path="/biz"} 0
|
||||
|
||||
eval instant at 50m resets(http_requests_histogram[60m])
|
||||
{path="/foo"} 0
|
||||
{path="/bar"} 1
|
||||
{path="/biz"} 6
|
||||
|
||||
# Tests for changes().
|
||||
eval instant at 50m changes(http_requests[5m])
|
||||
|
||||
|
|
Loading…
Reference in a new issue