Skip to content

Commit

Permalink
Offset the initial counter value by 1 second
Browse files Browse the repository at this point in the history
Signed-off-by: Zach Leslie <[email protected]>
  • Loading branch information
zalegrala committed Feb 6, 2023
1 parent 1da7a64 commit 272f86a
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 11 deletions.
7 changes: 6 additions & 1 deletion modules/generator/registry/counter.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ type counterSeries struct {
var _ Counter = (*counter)(nil)
var _ metric = (*counter)(nil)

const insertOffsetDuration = 1 * time.Second

func (co *counterSeries) isNew() bool {
return co.firstSeries.Load()
}
Expand Down Expand Up @@ -135,6 +137,7 @@ func (c *counter) collectMetrics(appender storage.Appender, timeMs int64, extern
}

for _, s := range c.series {
t := time.UnixMilli(timeMs)
// set series-specific labels
for i, name := range c.labels {
lb.Set(name, s.labelValues[i])
Expand All @@ -148,10 +151,12 @@ func (c *counter) collectMetrics(appender storage.Appender, timeMs int64, extern
if err != nil {
return
}
// Increment timeMs to ensure that the next value is not at the same time.
t = t.Add(insertOffsetDuration)
}

s.registerSeenSeries()
_, err = appender.Append(0, lb.Labels(nil), timeMs, s.value.Load())
_, err = appender.Append(0, lb.Labels(nil), t.UnixMilli(), s.value.Load())
if err != nil {
return
}
Expand Down
25 changes: 15 additions & 10 deletions modules/generator/registry/counter_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,12 @@ func Test_counter(t *testing.T) {
assert.Equal(t, 2, seriesAdded)

collectionTimeMs := time.Now().UnixMilli()
offsetCollectionTimeMs := time.UnixMilli(collectionTimeMs).Add(insertOffsetDuration).UnixMilli()
expectedSamples := []sample{
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, offsetCollectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, collectionTimeMs, 2),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, offsetCollectionTimeMs, 2),
}
collectMetricAndAssert(t, c, collectionTimeMs, nil, 2, expectedSamples, nil)

Expand All @@ -43,7 +44,7 @@ func Test_counter(t *testing.T) {
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, collectionTimeMs, 4),
newSample(map[string]string{"__name__": "my_counter", "label": "value-3"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-3"}, collectionTimeMs, 3),
newSample(map[string]string{"__name__": "my_counter", "label": "value-3"}, offsetCollectionTimeMs, 3),
}
collectMetricAndAssert(t, c, collectionTimeMs, nil, 3, expectedSamples, nil)
}
Expand Down Expand Up @@ -75,11 +76,12 @@ func Test_counter_cantAdd(t *testing.T) {
c.Inc(newLabelValues([]string{"value-2"}), 2.0)

collectionTimeMs := time.Now().UnixMilli()
offsetCollectionTimeMs := time.UnixMilli(collectionTimeMs).Add(insertOffsetDuration).UnixMilli()
expectedSamples := []sample{
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, offsetCollectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, collectionTimeMs, 2),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, offsetCollectionTimeMs, 2),
}
collectMetricAndAssert(t, c, collectionTimeMs, nil, 2, expectedSamples, nil)

Expand Down Expand Up @@ -115,11 +117,12 @@ func Test_counter_removeStaleSeries(t *testing.T) {
assert.Equal(t, 0, removedSeries)

collectionTimeMs := time.Now().UnixMilli()
offsetCollectionTimeMs := time.UnixMilli(collectionTimeMs).Add(insertOffsetDuration).UnixMilli()
expectedSamples := []sample{
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, offsetCollectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, collectionTimeMs, 2),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2"}, offsetCollectionTimeMs, 2),
}
collectMetricAndAssert(t, c, collectionTimeMs, nil, 2, expectedSamples, nil)

Expand Down Expand Up @@ -147,11 +150,12 @@ func Test_counter_externalLabels(t *testing.T) {
c.Inc(newLabelValues([]string{"value-2"}), 2.0)

collectionTimeMs := time.Now().UnixMilli()
offsetCollectionTimeMs := time.UnixMilli(collectionTimeMs).Add(insertOffsetDuration).UnixMilli()
expectedSamples := []sample{
newSample(map[string]string{"__name__": "my_counter", "label": "value-1", "external_label": "external_value"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1", "external_label": "external_value"}, collectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1", "external_label": "external_value"}, offsetCollectionTimeMs, 1),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2", "external_label": "external_value"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2", "external_label": "external_value"}, collectionTimeMs, 2),
newSample(map[string]string{"__name__": "my_counter", "label": "value-2", "external_label": "external_value"}, offsetCollectionTimeMs, 2),
}
collectMetricAndAssert(t, c, collectionTimeMs, map[string]string{"external_label": "external_value"}, 2, expectedSamples, nil)
}
Expand Down Expand Up @@ -232,9 +236,10 @@ func Test_counter_concurrencyCorrectness(t *testing.T) {
wg.Wait()

collectionTimeMs := time.Now().UnixMilli()
offsetCollectionTimeMs := time.UnixMilli(collectionTimeMs).Add(insertOffsetDuration).UnixMilli()
expectedSamples := []sample{
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, 0),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, collectionTimeMs, float64(totalCount.Load())),
newSample(map[string]string{"__name__": "my_counter", "label": "value-1"}, offsetCollectionTimeMs, float64(totalCount.Load())),
}
collectMetricAndAssert(t, c, collectionTimeMs, nil, 1, expectedSamples, nil)
}
Expand Down
4 changes: 4 additions & 0 deletions modules/generator/registry/registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,10 @@ func collectRegistryMetricsAndAssert(t *testing.T, r *ManagedRegistry, appender
expectedSamples[i].t = collectionTimeMs
}

for i := range appender.samples {
appender.samples[i].t = collectionTimeMs
}

assert.Equal(t, true, appender.isCommitted)
assert.Equal(t, false, appender.isRolledback)
assert.ElementsMatch(t, expectedSamples, appender.samples)
Expand Down

0 comments on commit 272f86a

Please sign in to comment.