master
go 167 lines 4.77 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package metrix
4
5 import (
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 "github.com/stretchr/testify/require"
10 )
11
12 func TestMetricMetaScenarios(t *testing.T) {
13 tests := map[string]struct {
14 run func(t *testing.T)
15 }{
16 "reader returns declared metric metadata": {
17 run: func(t *testing.T) {
18 s := NewCollectorStore()
19 cc := cycleController(t, s)
20 g := s.Write().SnapshotMeter("apache").Gauge(
21 "workers_busy",
22 WithDescription("Busy workers"),
23 WithChartFamily("Workers"),
24 WithChartPriority(70000),
25 WithUnit("workers"),
26 WithFloat(true),
27 )
28
29 cc.BeginCycle()
30 g.Observe(5)
31 cc.CommitCycleSuccess()
32
33 meta, ok := s.Read().MetricMeta("apache.workers_busy")
34 require.True(t, ok)
35 assert.Equal(t, "Busy workers", meta.Description)
36 assert.Equal(t, "Workers", meta.ChartFamily)
37 assert.Equal(t, 70000, meta.ChartPriority)
38 assert.Equal(t, "workers", meta.Unit)
39 assert.True(t, meta.Float)
40 },
41 },
42 "unknown metric metadata is unavailable": {
43 run: func(t *testing.T) {
44 s := NewCollectorStore()
45 meta, ok := s.Read().MetricMeta("missing.metric")
46 assert.False(t, ok)
47 assert.Equal(t, MetricMeta{}, meta)
48 },
49 },
50 "flattened reader resolves histogram metadata by flattened names": {
51 run: func(t *testing.T) {
52 s := NewCollectorStore()
53 cc := cycleController(t, s)
54 h := s.Write().SnapshotMeter("svc").Histogram(
55 "latency",
56 WithHistogramBounds(1, 2),
57 WithDescription("Latency"),
58 WithChartFamily("Service"),
59 WithUnit("ms"),
60 WithFloat(true),
61 )
62
63 cc.BeginCycle()
64 h.ObservePoint(HistogramPoint{
65 Count: 2,
66 Sum: 3,
67 Buckets: []BucketPoint{
68 {UpperBound: 1, CumulativeCount: 1},
69 {UpperBound: 2, CumulativeCount: 2},
70 },
71 })
72 cc.CommitCycleSuccess()
73
74 flat := s.Read(ReadFlatten())
75
76 _, ok := flat.MetricMeta("svc.latency")
77 require.False(t, ok, "expected canonical histogram family name to be absent in flattened view")
78
79 meta, ok := flat.MetricMeta("svc.latency_bucket")
80 require.True(t, ok, "expected flattened histogram bucket metric metadata")
81 assert.Equal(t, "Latency", meta.Description)
82 assert.Equal(t, "Service", meta.ChartFamily)
83 assert.Zero(t, meta.ChartPriority)
84 assert.Equal(t, "ms", meta.Unit)
85 assert.True(t, meta.Float)
86
87 meta, ok = flat.MetricMeta("svc.latency_count")
88 require.True(t, ok, "expected flattened histogram count metric metadata")
89 assert.Equal(t, "Latency", meta.Description)
90 assert.Equal(t, "Service", meta.ChartFamily)
91 assert.Zero(t, meta.ChartPriority)
92 assert.Equal(t, "ms", meta.Unit)
93 assert.True(t, meta.Float)
94
95 meta, ok = flat.MetricMeta("svc.latency_sum")
96 require.True(t, ok, "expected flattened histogram sum metric metadata")
97 assert.Equal(t, "Latency", meta.Description)
98 assert.Equal(t, "Service", meta.ChartFamily)
99 assert.Zero(t, meta.ChartPriority)
100 assert.Equal(t, "ms", meta.Unit)
101 assert.True(t, meta.Float)
102 },
103 },
104 "metadata redeclaration conflict panics": {
105 run: func(t *testing.T) {
106 s := NewCollectorStore()
107 w := s.Write().SnapshotMeter("apache")
108 _ = w.Gauge("workers_busy", WithDescription("Busy workers"))
109 expectPanic(t, func() {
110 _ = w.Gauge("workers_busy", WithDescription("Workers currently busy"))
111 })
112 },
113 },
114 "chart priority redeclaration conflict panics": {
115 run: func(t *testing.T) {
116 s := NewCollectorStore()
117 w := s.Write().SnapshotMeter("apache")
118 _ = w.Gauge("workers_busy", WithChartPriority(70000))
119 expectPanic(t, func() {
120 _ = w.Gauge("workers_busy", WithChartPriority(70001))
121 })
122 },
123 },
124 "float metadata redeclaration conflict panics": {
125 run: func(t *testing.T) {
126 s := NewCollectorStore()
127 w := s.Write().SnapshotMeter("apache")
128 _ = w.Gauge("workers_busy", WithFloat(true))
129 expectPanic(t, func() {
130 _ = w.Gauge("workers_busy", WithFloat(false))
131 })
132 },
133 },
134 "redeclare without metadata options keeps first metadata": {
135 run: func(t *testing.T) {
136 s := NewCollectorStore()
137 w := s.Write().SnapshotMeter("apache")
138 g := w.Gauge(
139 "workers_busy",
140 WithDescription("Busy workers"),
141 WithChartFamily("Workers"),
142 WithChartPriority(70000),
143 WithUnit("workers"),
144 WithFloat(true),
145 )
146 _ = w.Gauge("workers_busy")
147
148 cc := cycleController(t, s)
149 cc.BeginCycle()
150 g.Observe(1)
151 cc.CommitCycleSuccess()
152
153 meta, ok := s.Read().MetricMeta("apache.workers_busy")
154 require.True(t, ok)
155 assert.Equal(t, "Busy workers", meta.Description)
156 assert.Equal(t, "Workers", meta.ChartFamily)
157 assert.Equal(t, 70000, meta.ChartPriority)
158 assert.Equal(t, "workers", meta.Unit)
159 assert.True(t, meta.Float)
160 },
161 },
162 }
163
164 for name, tc := range tests {
165 t.Run(name, tc.run)
166 }
167 }