mirror of
https://github.com/lukaszraczylo/filepuff-mcp.git
synced 2026-10-18 05:48:00 +00:00
fix(metrics): ignore negative Counter.Add to keep counters monotonic
Counter.Add applied any delta, so a negative value would decrement a counter that must be monotonic, corrupting rate()-style downstream math. Ignore delta<0. Adds TestCounterRejectsNegativeAdd.
This commit is contained in:
@@ -33,8 +33,13 @@ func (c *Counter) Inc() {
|
|||||||
c.value.Add(1)
|
c.value.Add(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add adds the given value to the counter.
|
// Add adds the given value to the counter. Counters are monotonic, so a
|
||||||
|
// negative delta (which would corrupt rate()-style calculations downstream) is
|
||||||
|
// ignored rather than applied.
|
||||||
func (c *Counter) Add(delta int64) {
|
func (c *Counter) Add(delta int64) {
|
||||||
|
if delta < 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
c.value.Add(delta)
|
c.value.Add(delta)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,16 @@ func TestCounter(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Counters are monotonic: a negative Add must be ignored, not applied.
|
||||||
|
func TestCounterRejectsNegativeAdd(t *testing.T) {
|
||||||
|
c := NewCounter("mono_counter", "test", nil)
|
||||||
|
c.Add(5)
|
||||||
|
c.Add(-3)
|
||||||
|
if got := c.Value(); got != 5 {
|
||||||
|
t.Errorf("negative Add should be ignored: Value() = %d, want 5", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestCounterConcurrency(t *testing.T) {
|
func TestCounterConcurrency(t *testing.T) {
|
||||||
c := NewCounter("concurrent_counter", "test", nil)
|
c := NewCounter("concurrent_counter", "test", nil)
|
||||||
var wg sync.WaitGroup
|
var wg sync.WaitGroup
|
||||||
|
|||||||
Reference in New Issue
Block a user