@@ -6,17 +6,19 @@ import (
6
6
"testing"
7
7
"time"
8
8
9
- "github.com/grafana/loki/v3/pkg/logproto "
10
-
9
+ "github.com/prometheus/client_golang/prometheus "
10
+ "github.com/prometheus/client_golang/prometheus/testutil"
11
11
"github.com/prometheus/prometheus/model/labels"
12
12
"github.com/stretchr/testify/require"
13
+
14
+ "github.com/grafana/loki/v3/pkg/logproto"
13
15
)
14
16
15
17
func TestManager_Append (t * testing.T ) {
16
18
m , err := NewManager (Config {
17
19
MaxSegments : 1 ,
18
20
MaxSegmentSize : 1024 , // 1KB
19
- })
21
+ }, NewMetrics ( nil ) )
20
22
require .NoError (t , err )
21
23
22
24
// Append some data.
@@ -96,7 +98,7 @@ func TestManager_Append_ErrFull(t *testing.T) {
96
98
m , err := NewManager (Config {
97
99
MaxSegments : 10 ,
98
100
MaxSegmentSize : 1024 , // 1KB
99
- })
101
+ }, NewMetrics ( nil ) )
100
102
require .NoError (t , err )
101
103
102
104
// Should be able to write to all 10 segments of 1KB each.
@@ -140,7 +142,7 @@ func TestManager_NextPending(t *testing.T) {
140
142
MaxAge : DefaultMaxAge ,
141
143
MaxSegments : 1 ,
142
144
MaxSegmentSize : 1024 , // 1KB
143
- })
145
+ }, NewMetrics ( nil ) )
144
146
require .NoError (t , err )
145
147
146
148
// There should be no items as no data has been written.
@@ -195,7 +197,7 @@ func TestManager_Put(t *testing.T) {
195
197
m , err := NewManager (Config {
196
198
MaxSegments : 10 ,
197
199
MaxSegmentSize : 1024 , // 1KB
198
- })
200
+ }, NewMetrics ( nil ) )
199
201
require .NoError (t , err )
200
202
201
203
// There should be 10 available segments, and 0 pending.
@@ -242,3 +244,88 @@ func TestManager_Put(t *testing.T) {
242
244
// The segment should be reset.
243
245
require .Equal (t , int64 (0 ), it .Writer .InputSize ())
244
246
}
247
+
248
+ func TestManager_Metrics (t * testing.T ) {
249
+ r := prometheus .NewRegistry ()
250
+ m , err := NewManager (Config {
251
+ MaxSegments : 1 ,
252
+ MaxSegmentSize : 1024 , // 1KB
253
+ }, NewMetrics (r ))
254
+ require .NoError (t , err )
255
+
256
+ metricNames := []string {
257
+ "wal_segments_available" ,
258
+ "wal_segments_flushing" ,
259
+ "wal_segments_pending" ,
260
+ }
261
+ expected := `
262
+ # HELP wal_segments_available The number of WAL segments accepting writes.
263
+ # TYPE wal_segments_available gauge
264
+ wal_segments_available 1
265
+ # HELP wal_segments_flushing The number of WAL segments being flushed.
266
+ # TYPE wal_segments_flushing gauge
267
+ wal_segments_flushing 0
268
+ # HELP wal_segments_pending The number of WAL segments waiting to be flushed.
269
+ # TYPE wal_segments_pending gauge
270
+ wal_segments_pending 0
271
+ `
272
+ require .NoError (t , testutil .CollectAndCompare (r , strings .NewReader (expected ), metricNames ... ))
273
+
274
+ // Appending 1KB of data.
275
+ lbs := labels.Labels {{Name : "foo" , Value : "bar" }}
276
+ entries := []* logproto.Entry {{Timestamp : time .Now (), Line : strings .Repeat ("b" , 1024 )}}
277
+ _ , err = m .Append (AppendRequest {
278
+ TenantID : "1" ,
279
+ Labels : lbs ,
280
+ LabelsStr : lbs .String (),
281
+ Entries : entries ,
282
+ })
283
+ require .NoError (t , err )
284
+
285
+ // This should move the segment from the available to the pending list.
286
+ expected = `
287
+ # HELP wal_segments_available The number of WAL segments accepting writes.
288
+ # TYPE wal_segments_available gauge
289
+ wal_segments_available 0
290
+ # HELP wal_segments_flushing The number of WAL segments being flushed.
291
+ # TYPE wal_segments_flushing gauge
292
+ wal_segments_flushing 0
293
+ # HELP wal_segments_pending The number of WAL segments waiting to be flushed.
294
+ # TYPE wal_segments_pending gauge
295
+ wal_segments_pending 1
296
+ `
297
+ require .NoError (t , testutil .CollectAndCompare (r , strings .NewReader (expected ), metricNames ... ))
298
+
299
+ // Get the segment from the pending list.
300
+ it , err := m .NextPending ()
301
+ require .NoError (t , err )
302
+ require .NotNil (t , it )
303
+ expected = `
304
+ # HELP wal_segments_available The number of WAL segments accepting writes.
305
+ # TYPE wal_segments_available gauge
306
+ wal_segments_available 0
307
+ # HELP wal_segments_flushing The number of WAL segments being flushed.
308
+ # TYPE wal_segments_flushing gauge
309
+ wal_segments_flushing 1
310
+ # HELP wal_segments_pending The number of WAL segments waiting to be flushed.
311
+ # TYPE wal_segments_pending gauge
312
+ wal_segments_pending 0
313
+ `
314
+ require .NoError (t , testutil .CollectAndCompare (r , strings .NewReader (expected ), metricNames ... ))
315
+
316
+ // Reset the segment and put it back in the available list.
317
+ require .NoError (t , m .Put (it ))
318
+ expected = `
319
+ # HELP wal_segments_available The number of WAL segments accepting writes.
320
+ # TYPE wal_segments_available gauge
321
+ wal_segments_available 1
322
+ # HELP wal_segments_flushing The number of WAL segments being flushed.
323
+ # TYPE wal_segments_flushing gauge
324
+ wal_segments_flushing 0
325
+ # HELP wal_segments_pending The number of WAL segments waiting to be flushed.
326
+ # TYPE wal_segments_pending gauge
327
+ wal_segments_pending 0
328
+ `
329
+ require .NoError (t , testutil .CollectAndCompare (r , strings .NewReader (expected ), metricNames ... ))
330
+
331
+ }
0 commit comments