Skip to content

Commit

Permalink
add possibility to record histogram with weight (#252)
Browse files Browse the repository at this point in the history
* add possibility to record histogram with weight

* add the same for recording duration
  • Loading branch information
MGaulia authored Mar 21, 2024
1 parent 0fbf11b commit e2a71ea
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 7 deletions.
24 changes: 20 additions & 4 deletions stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ func (h *histogram) cachedReport() {
}
}

func (h *histogram) RecordValue(value float64) {
func (h *histogram) recordValueWithWeight(value float64, weight int64) {
if h.htype != valueHistogramType {
return
}
Expand All @@ -376,10 +376,18 @@ func (h *histogram) RecordValue(value float64) {
idx := sort.Search(len(h.buckets), func(i int) bool {
return h.buckets[i].valueUpperBound >= value
})
h.samples[idx].counter.Inc(1)
h.samples[idx].counter.Inc(weight)
}

func (h *histogram) RecordDuration(value time.Duration) {
func (h *histogram) RecordValue(value float64) {
h.recordValueWithWeight(value, 1)
}

func (h *histogram) RecordValueWithWeight(value float64, weight int64) {
h.recordValueWithWeight(value, weight)
}

func (h *histogram) recordDurationWithWeight(value time.Duration, weight int64) {
if h.htype != durationHistogramType {
return
}
Expand All @@ -391,7 +399,15 @@ func (h *histogram) RecordDuration(value time.Duration) {
idx := sort.Search(len(h.buckets), func(i int) bool {
return h.buckets[i].durationUpperBound >= value
})
h.samples[idx].counter.Inc(1)
h.samples[idx].counter.Inc(weight)
}

func (h *histogram) RecordDuration(value time.Duration) {
h.recordDurationWithWeight(value, 1)
}

func (h *histogram) RecordDurationWithWeight(value time.Duration, weight int64) {
h.recordDurationWithWeight(value, weight)
}

func (h *histogram) Start() Stopwatch {
Expand Down
7 changes: 7 additions & 0 deletions stats_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,14 @@ func TestHistogramValueSamples(t *testing.T) {
for i := 0; i < 5; i++ {
h.RecordValue(offset + rand.Float64()*10)
}
offset = 60
h.RecordValueWithWeight(offset+rand.Float64()*10, 2)

h.report(h.name, h.tags, r)

assert.Equal(t, 3, r.valueSamples[10.0])
assert.Equal(t, 5, r.valueSamples[60.0])
assert.Equal(t, 2, r.valueSamples[70.0])
assert.Equal(t, buckets, r.buckets)
}

Expand All @@ -163,10 +166,14 @@ func TestHistogramDurationSamples(t *testing.T) {
h.RecordDuration(offset +
time.Duration(rand.Float64()*float64(10*time.Millisecond)))
}
offset = 60 * time.Millisecond
h.RecordDurationWithWeight(offset+
time.Duration(rand.Float64()*float64(10*time.Millisecond)), 2)

h.report(h.name, h.tags, r)

assert.Equal(t, 3, r.durationSamples[10*time.Millisecond])
assert.Equal(t, 5, r.durationSamples[60*time.Millisecond])
assert.Equal(t, 2, r.durationSamples[70*time.Millisecond])
assert.Equal(t, buckets, r.buckets)
}
15 changes: 12 additions & 3 deletions types.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ import (
// all emitted values have a given prefix or set of tags.
//
// IMPORTANT: When using Prometheus reporters, users must take care to
// not create metrics from both parent scopes and subscopes
// that have the same metric name but different tag keys,
// as metric allocation will panic.
//
// not create metrics from both parent scopes and subscopes
// that have the same metric name but different tag keys,
// as metric allocation will panic.
type Scope interface {
// Counter returns the Counter object corresponding to the name.
Counter(name string) Counter
Expand Down Expand Up @@ -91,10 +92,18 @@ type Histogram interface {
// Will use the configured value buckets for the histogram.
RecordValue(value float64)

// RecordValueWithWeight records a specific value directly with a weight.
// Will use the configured value buckets for the histogram.
RecordValueWithWeight(value float64, weight int64)

// RecordDuration records a specific duration directly.
// Will use the configured duration buckets for the histogram.
RecordDuration(value time.Duration)

// RecordDurationWithWeight records a specific duration directly with a weight.
// Will use the configured duration buckets for the histogram.
RecordDurationWithWeight(value time.Duration, weight int64)

// Start gives you a specific point in time to then record a duration.
// Will use the configured duration buckets for the histogram.
Start() Stopwatch
Expand Down

0 comments on commit e2a71ea

Please sign in to comment.