fix(promql): histogram_count inconsistent
CI / Go tests (push) Waiting to run
Details
CI / More Go tests (push) Waiting to run
Details
CI / Go tests with previous Go version (push) Waiting to run
Details
CI / UI tests (push) Waiting to run
Details
CI / Go tests on Windows (push) Waiting to run
Details
CI / Mixins tests (push) Waiting to run
Details
CI / Build Prometheus for common architectures (0) (push) Waiting to run
Details
CI / Build Prometheus for common architectures (1) (push) Waiting to run
Details
CI / Build Prometheus for common architectures (2) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (0) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (1) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (10) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (11) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (2) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (3) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (4) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (5) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (6) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (7) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (8) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (9) (push) Waiting to run
Details
CI / Report status of build Prometheus for all architectures (push) Blocked by required conditions
Details
CI / Check generated parser (push) Waiting to run
Details
CI / golangci-lint (push) Waiting to run
Details
CI / fuzzing (push) Waiting to run
Details
CI / codeql (push) Waiting to run
Details
CI / Publish main branch artifacts (push) Blocked by required conditions
Details
CI / Publish release artefacts (push) Blocked by required conditions
Details
CI / Publish UI on npm Registry (push) Blocked by required conditions
Details
CI / Go tests (push) Waiting to run
Details
CI / More Go tests (push) Waiting to run
Details
CI / Go tests with previous Go version (push) Waiting to run
Details
CI / UI tests (push) Waiting to run
Details
CI / Go tests on Windows (push) Waiting to run
Details
CI / Mixins tests (push) Waiting to run
Details
CI / Build Prometheus for common architectures (0) (push) Waiting to run
Details
CI / Build Prometheus for common architectures (1) (push) Waiting to run
Details
CI / Build Prometheus for common architectures (2) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (0) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (1) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (10) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (11) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (2) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (3) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (4) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (5) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (6) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (7) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (8) (push) Waiting to run
Details
CI / Build Prometheus for all architectures (9) (push) Waiting to run
Details
CI / Report status of build Prometheus for all architectures (push) Blocked by required conditions
Details
CI / Check generated parser (push) Waiting to run
Details
CI / golangci-lint (push) Waiting to run
Details
CI / fuzzing (push) Waiting to run
Details
CI / codeql (push) Waiting to run
Details
CI / Publish main branch artifacts (push) Blocked by required conditions
Details
CI / Publish release artefacts (push) Blocked by required conditions
Details
CI / Publish UI on npm Registry (push) Blocked by required conditions
Details
The problem is in the counter reset detection. The code that loads the samples is matrixIterSlice which uses the typed Buffer iterator, which will preload the integer histogram samples, however the last sample is always(!) loaded as a float histogram sample in matrixIterSlice and the optimized iterator fails to detect counter resets in that case. Also the iterator does not reset lastH, lastFH properly. Ref: https://github.com/prometheus/prometheus/issues/16681 Signed-off-by: György Krajcsovits <gyorgy.krajcsovits@grafana.com>
This commit is contained in:
parent
e6b838391a
commit
df94ecebab
|
@ -105,6 +105,7 @@ func (f *histogramStatsIterator) AtFloatHistogram(fh *histogram.FloatHistogram)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *histogramStatsIterator) setLastH(h *histogram.Histogram) {
|
func (f *histogramStatsIterator) setLastH(h *histogram.Histogram) {
|
||||||
|
f.lastFH = nil
|
||||||
if f.lastH == nil {
|
if f.lastH == nil {
|
||||||
f.lastH = h.Copy()
|
f.lastH = h.Copy()
|
||||||
} else {
|
} else {
|
||||||
|
@ -113,6 +114,7 @@ func (f *histogramStatsIterator) setLastH(h *histogram.Histogram) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *histogramStatsIterator) setLastFH(fh *histogram.FloatHistogram) {
|
func (f *histogramStatsIterator) setLastFH(fh *histogram.FloatHistogram) {
|
||||||
|
f.lastH = nil
|
||||||
if f.lastFH == nil {
|
if f.lastFH == nil {
|
||||||
f.lastFH = fh.Copy()
|
f.lastFH = fh.Copy()
|
||||||
} else {
|
} else {
|
||||||
|
@ -125,7 +127,13 @@ func (f *histogramStatsIterator) getFloatResetHint(hint histogram.CounterResetHi
|
||||||
return hint
|
return hint
|
||||||
}
|
}
|
||||||
if f.lastFH == nil {
|
if f.lastFH == nil {
|
||||||
return histogram.NotCounterReset
|
// If there was no previous histogram, this will not be used,
|
||||||
|
// and if there was a previous integer histogram, this will
|
||||||
|
// force a reset detection. The later can happen if we used the
|
||||||
|
// iterator to read integer histograms before, but switched to
|
||||||
|
// float histograms for whatever reason.
|
||||||
|
// https://github.com/prometheus/prometheus/issues/16681
|
||||||
|
return histogram.UnknownCounterReset
|
||||||
}
|
}
|
||||||
|
|
||||||
if f.currentFH.DetectReset(f.lastFH) {
|
if f.currentFH.DetectReset(f.lastFH) {
|
||||||
|
@ -139,7 +147,10 @@ func (f *histogramStatsIterator) getResetHint(h *histogram.Histogram) histogram.
|
||||||
return h.CounterResetHint
|
return h.CounterResetHint
|
||||||
}
|
}
|
||||||
if f.lastH == nil {
|
if f.lastH == nil {
|
||||||
return histogram.NotCounterReset
|
// If there was no previous histogram, this will not be used,
|
||||||
|
// and if there was a previous float histogram, this will
|
||||||
|
// force a reset detection.
|
||||||
|
return histogram.UnknownCounterReset
|
||||||
}
|
}
|
||||||
|
|
||||||
fh, prevFH := h.ToFloat(nil), f.lastH.ToFloat(nil)
|
fh, prevFH := h.ToFloat(nil), f.lastH.ToFloat(nil)
|
||||||
|
|
|
@ -68,7 +68,7 @@ func TestHistogramStatsDecoding(t *testing.T) {
|
||||||
tsdbutil.GenerateTestHistogramWithHint(1, histogram.UnknownCounterReset),
|
tsdbutil.GenerateTestHistogramWithHint(1, histogram.UnknownCounterReset),
|
||||||
},
|
},
|
||||||
expectedHints: []histogram.CounterResetHint{
|
expectedHints: []histogram.CounterResetHint{
|
||||||
histogram.NotCounterReset,
|
histogram.UnknownCounterReset,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -78,7 +78,7 @@ func TestHistogramStatsDecoding(t *testing.T) {
|
||||||
tsdbutil.GenerateTestHistogramWithHint(1, histogram.UnknownCounterReset),
|
tsdbutil.GenerateTestHistogramWithHint(1, histogram.UnknownCounterReset),
|
||||||
},
|
},
|
||||||
expectedHints: []histogram.CounterResetHint{
|
expectedHints: []histogram.CounterResetHint{
|
||||||
histogram.NotCounterReset,
|
histogram.UnknownCounterReset,
|
||||||
histogram.CounterReset,
|
histogram.CounterReset,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -90,7 +90,7 @@ func TestHistogramStatsDecoding(t *testing.T) {
|
||||||
tsdbutil.GenerateTestHistogramWithHint(1, histogram.UnknownCounterReset),
|
tsdbutil.GenerateTestHistogramWithHint(1, histogram.UnknownCounterReset),
|
||||||
},
|
},
|
||||||
expectedHints: []histogram.CounterResetHint{
|
expectedHints: []histogram.CounterResetHint{
|
||||||
histogram.NotCounterReset,
|
histogram.UnknownCounterReset,
|
||||||
histogram.UnknownCounterReset,
|
histogram.UnknownCounterReset,
|
||||||
histogram.CounterReset,
|
histogram.CounterReset,
|
||||||
},
|
},
|
||||||
|
@ -141,6 +141,41 @@ func TestHistogramStatsDecoding(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHistogramStatsMixedUse(t *testing.T) {
|
||||||
|
histograms := []*histogram.Histogram{
|
||||||
|
tsdbutil.GenerateTestHistogramWithHint(2, histogram.UnknownCounterReset),
|
||||||
|
tsdbutil.GenerateTestHistogramWithHint(4, histogram.UnknownCounterReset),
|
||||||
|
tsdbutil.GenerateTestHistogramWithHint(0, histogram.UnknownCounterReset),
|
||||||
|
}
|
||||||
|
|
||||||
|
series := newHistogramSeries(histograms)
|
||||||
|
it := series.Iterator(nil)
|
||||||
|
|
||||||
|
statsIterator := NewHistogramStatsIterator(it)
|
||||||
|
|
||||||
|
expectedHints := []histogram.CounterResetHint{
|
||||||
|
histogram.UnknownCounterReset,
|
||||||
|
histogram.NotCounterReset,
|
||||||
|
histogram.UnknownCounterReset,
|
||||||
|
}
|
||||||
|
actualHints := make([]histogram.CounterResetHint, 3)
|
||||||
|
typ := statsIterator.Next()
|
||||||
|
require.Equal(t, chunkenc.ValHistogram, typ)
|
||||||
|
_, h := statsIterator.AtHistogram(nil)
|
||||||
|
actualHints[0] = h.CounterResetHint
|
||||||
|
typ = statsIterator.Next()
|
||||||
|
require.Equal(t, chunkenc.ValHistogram, typ)
|
||||||
|
_, h = statsIterator.AtHistogram(nil)
|
||||||
|
actualHints[1] = h.CounterResetHint
|
||||||
|
typ = statsIterator.Next()
|
||||||
|
require.Equal(t, chunkenc.ValHistogram, typ)
|
||||||
|
_, fh := statsIterator.AtFloatHistogram(nil)
|
||||||
|
actualHints[2] = fh.CounterResetHint
|
||||||
|
|
||||||
|
require.Equal(t, chunkenc.ValNone, statsIterator.Next())
|
||||||
|
require.Equal(t, expectedHints, actualHints)
|
||||||
|
}
|
||||||
|
|
||||||
type histogramSeries struct {
|
type histogramSeries struct {
|
||||||
histograms []*histogram.Histogram
|
histograms []*histogram.Histogram
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue