Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ continue your journey:
1. See the [exposition library](prometheus/README.md) if you want to
export metrics to a Prometheus server or pushgateway

2. See the [consumption library](extraction/README.md) if you want to
2. See the [consumption library](https://godoc.org/github.com/prometheus/client_golang/extraction) if you want to
process metrics exported by a Prometheus client. (The Prometheus server
is using that library.)

Expand Down
15 changes: 10 additions & 5 deletions prometheus/summary.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package prometheus
import (
"fmt"
"hash/fnv"
"math"
"sort"
"sync"
"time"
Expand Down Expand Up @@ -277,20 +278,24 @@ func (s *summary) Write(out *dto.Metric) error {

s.bufMtx.Lock()
s.mtx.Lock()

if len(s.hotBuf) != 0 {
s.swapBufs(time.Now())
}
// Swap bufs even if hotBuf is empty to set new hotBufExpTime.
s.swapBufs(time.Now())
s.bufMtx.Unlock()

s.flushColdBuf()
sum.SampleCount = proto.Uint64(s.cnt)
sum.SampleSum = proto.Float64(s.sum)

for _, rank := range s.sortedObjectives {
var q float64
if s.headStream.Count() == 0 {
q = math.NaN()
} else {
q = s.headStream.Query(rank)
}
qs = append(qs, &dto.Quantile{
Quantile: proto.Float64(rank),
Value: proto.Float64(s.headStream.Query(rank)),
Value: proto.Float64(q),
})
}

Expand Down
11 changes: 11 additions & 0 deletions prometheus/summary_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,11 @@ func TestSummaryVecConcurrency(t *testing.T) {
}

func TestSummaryDecay(t *testing.T) {
if testing.Short() {
t.Skip("Skipping test in short mode.")
// More because it depends on timing than because it is particularly long...
}

sum := NewSummary(SummaryOpts{
Name: "test_summary",
Help: "helpless",
Expand All @@ -315,6 +320,12 @@ func TestSummaryDecay(t *testing.T) {
}
}
tick.Stop()
// Wait for MaxAge without observations and make sure quantiles are NaN.
time.Sleep(100 * time.Millisecond)
sum.Write(m)
if got := *m.Summary.Quantile[0].Value; !math.IsNaN(got) {
t.Errorf("got %f, want NaN after expiration", got)
}
}

func getBounds(vars []float64, q, ε float64) (min, max float64) {
Expand Down