Skip to content

Commit 7592bbb

Browse files
authored
fix(v2): scheduler metrics collector panics (#3990)
* fix(v2): scheduler metrics collector panics * fix(v2): add scheduler metrics collector test
1 parent 7b3609f commit 7592bbb

File tree

4 files changed

+64
-1
lines changed

4 files changed

+64
-1
lines changed

pkg/experiment/metastore/compaction/scheduler/metrics.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ func (c *statsCollector) collectStats(fn func(level int, stats queueStats)) {
8181
defer c.s.mu.Unlock()
8282

8383
for i, q := range c.s.queue.levels {
84+
// Note that some levels may be empty.
85+
if q == nil || q.jobs == nil {
86+
continue
87+
}
8488
var stats queueStats
8589
for _, e := range *q.jobs {
8690
switch {

pkg/experiment/metastore/compaction/scheduler/metrics_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package scheduler
22

33
import (
4+
"bytes"
5+
"os"
46
"testing"
57
"time"
68

79
"github.com/prometheus/client_golang/prometheus"
10+
"github.com/prometheus/client_golang/prometheus/testutil"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
813

914
metastorev1 "github.com/grafana/pyroscope/api/gen/proto/go/metastore/v1"
1015
"github.com/grafana/pyroscope/api/gen/proto/go/metastore/v1/raft_log"
@@ -27,3 +32,26 @@ func TestCollectorRegistration(t *testing.T) {
2732
sc.queue.delete("a")
2833
}
2934
}
35+
36+
func TestCollectorCollect(t *testing.T) {
37+
reg := prometheus.NewRegistry()
38+
config := Config{
39+
MaxFailures: 5,
40+
LeaseDuration: 15 * time.Second,
41+
}
42+
43+
sc := NewScheduler(config, nil, reg)
44+
sc.queue.put(&raft_log.CompactionJobState{
45+
Name: "a", CompactionLevel: 0, Token: 1,
46+
Status: metastorev1.CompactionJobStatus_COMPACTION_STATUS_UNSPECIFIED,
47+
})
48+
sc.queue.put(&raft_log.CompactionJobState{
49+
Name: "b", CompactionLevel: 2, Token: 1,
50+
Status: metastorev1.CompactionJobStatus_COMPACTION_STATUS_UNSPECIFIED,
51+
})
52+
sc.queue.delete("a")
53+
54+
buf, err := os.ReadFile("testdata/metrics.txt")
55+
require.NoError(t, err)
56+
assert.NoError(t, testutil.GatherAndCompare(reg, bytes.NewReader(buf)))
57+
}

pkg/experiment/metastore/compaction/scheduler/scheduler_queue.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99
)
1010

1111
type schedulerQueue struct {
12-
jobs map[string]*jobEntry
12+
jobs map[string]*jobEntry
13+
// Sparse array of job queues, indexed by compaction level.
1314
levels []*jobQueue
1415
}
1516

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# HELP compaction_scheduler_queue_added_jobs_total The total number of jobs added to the queue.
2+
# TYPE compaction_scheduler_queue_added_jobs_total counter
3+
compaction_scheduler_queue_added_jobs_total{level="0"} 1
4+
compaction_scheduler_queue_added_jobs_total{level="2"} 1
5+
# HELP compaction_scheduler_queue_assigned_jobs_total The total number of jobs assigned.
6+
# TYPE compaction_scheduler_queue_assigned_jobs_total counter
7+
compaction_scheduler_queue_assigned_jobs_total{level="0"} 0
8+
compaction_scheduler_queue_assigned_jobs_total{level="2"} 0
9+
# HELP compaction_scheduler_queue_completed_jobs_total The total number of jobs completed.
10+
# TYPE compaction_scheduler_queue_completed_jobs_total counter
11+
compaction_scheduler_queue_completed_jobs_total{level="0"} 1
12+
compaction_scheduler_queue_completed_jobs_total{level="2"} 0
13+
# HELP compaction_scheduler_queue_evicted_jobs_total The total number of jobs evicted.
14+
# TYPE compaction_scheduler_queue_evicted_jobs_total counter
15+
compaction_scheduler_queue_evicted_jobs_total{level="0"} 0
16+
compaction_scheduler_queue_evicted_jobs_total{level="2"} 0
17+
# HELP compaction_scheduler_queue_jobs The total number of jobs in the queue.
18+
# TYPE compaction_scheduler_queue_jobs gauge
19+
compaction_scheduler_queue_jobs{level="0",status="assigned"} 0
20+
compaction_scheduler_queue_jobs{level="0",status="failed"} 0
21+
compaction_scheduler_queue_jobs{level="0",status="reassigned"} 0
22+
compaction_scheduler_queue_jobs{level="0",status="unassigned"} 0
23+
compaction_scheduler_queue_jobs{level="2",status="assigned"} 0
24+
compaction_scheduler_queue_jobs{level="2",status="failed"} 0
25+
compaction_scheduler_queue_jobs{level="2",status="reassigned"} 0
26+
compaction_scheduler_queue_jobs{level="2",status="unassigned"} 1
27+
# HELP compaction_scheduler_queue_reassigned_jobs_total The total number of jobs reassigned.
28+
# TYPE compaction_scheduler_queue_reassigned_jobs_total counter
29+
compaction_scheduler_queue_reassigned_jobs_total{level="0"} 0
30+
compaction_scheduler_queue_reassigned_jobs_total{level="2"} 0

0 commit comments

Comments
 (0)