@@ -2,6 +2,7 @@ package bloomgateway
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"math/rand"
6
7
"sort"
7
8
"testing"
@@ -10,6 +11,7 @@ import (
10
11
"github.com/go-kit/log"
11
12
"github.com/pkg/errors"
12
13
"github.com/prometheus/common/model"
14
+ "github.com/prometheus/prometheus/model/labels"
13
15
"github.com/stretchr/testify/require"
14
16
15
17
"github.com/grafana/loki/v3/pkg/logproto"
@@ -79,7 +81,7 @@ func TestBloomQuerier(t *testing.T) {
79
81
}
80
82
expr , err := syntax .ParseExpr (`{foo="bar"}` )
81
83
require .NoError (t , err )
82
- res , err := bq .FilterChunkRefs (ctx , tenant , from , through , chunkRefs , plan.QueryPlan {AST : expr })
84
+ res , err := bq .FilterChunkRefs (ctx , tenant , from , through , nil , chunkRefs , plan.QueryPlan {AST : expr })
83
85
require .NoError (t , err )
84
86
require .Equal (t , chunkRefs , res )
85
87
require .Equal (t , 0 , c .callCount )
@@ -95,7 +97,7 @@ func TestBloomQuerier(t *testing.T) {
95
97
chunkRefs := []* logproto.ChunkRef {}
96
98
expr , err := syntax .ParseExpr (`{foo="bar"} | trace_id="exists"` )
97
99
require .NoError (t , err )
98
- res , err := bq .FilterChunkRefs (ctx , tenant , from , through , chunkRefs , plan.QueryPlan {AST : expr })
100
+ res , err := bq .FilterChunkRefs (ctx , tenant , from , through , nil , chunkRefs , plan.QueryPlan {AST : expr })
99
101
require .NoError (t , err )
100
102
require .Equal (t , chunkRefs , res )
101
103
require .Equal (t , 0 , c .callCount )
@@ -115,7 +117,7 @@ func TestBloomQuerier(t *testing.T) {
115
117
}
116
118
expr , err := syntax .ParseExpr (`{foo="bar"} | trace_id="exists"` )
117
119
require .NoError (t , err )
118
- res , err := bq .FilterChunkRefs (ctx , tenant , from , through , chunkRefs , plan.QueryPlan {AST : expr })
120
+ res , err := bq .FilterChunkRefs (ctx , tenant , from , through , nil , chunkRefs , plan.QueryPlan {AST : expr })
119
121
require .Error (t , err )
120
122
require .Nil (t , res )
121
123
})
@@ -134,7 +136,7 @@ func TestBloomQuerier(t *testing.T) {
134
136
}
135
137
expr , err := syntax .ParseExpr (`{foo="bar"} | trace_id="exists"` )
136
138
require .NoError (t , err )
137
- res , err := bq .FilterChunkRefs (ctx , tenant , from , through , chunkRefs , plan.QueryPlan {AST : expr })
139
+ res , err := bq .FilterChunkRefs (ctx , tenant , from , through , nil , chunkRefs , plan.QueryPlan {AST : expr })
138
140
require .NoError (t , err )
139
141
require .Equal (t , chunkRefs , res )
140
142
require .Equal (t , 2 , c .callCount )
@@ -143,28 +145,44 @@ func TestBloomQuerier(t *testing.T) {
143
145
}
144
146
145
147
func TestGroupChunkRefs (t * testing.T ) {
148
+ series := []labels.Labels {
149
+ labels .FromStrings ("app" , "1" ),
150
+ labels .FromStrings ("app" , "2" ),
151
+ labels .FromStrings ("app" , "3" ),
152
+ }
153
+ seriesMap := make (map [uint64 ]labels.Labels )
154
+ for _ , s := range series {
155
+ seriesMap [s .Hash ()] = s
156
+ }
157
+
146
158
chunkRefs := []* logproto.ChunkRef {
147
- {Fingerprint : 0x00 , UserID : "tenant" , From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
148
- {Fingerprint : 0x00 , UserID : "tenant" , From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
149
- {Fingerprint : 0x01 , UserID : "tenant" , From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
150
- {Fingerprint : 0x01 , UserID : "tenant" , From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
151
- {Fingerprint : 0x02 , UserID : "tenant" , From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
152
- {Fingerprint : 0x02 , UserID : "tenant" , From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
159
+ {Fingerprint : series [ 0 ]. Hash () , UserID : "tenant" , From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
160
+ {Fingerprint : series [ 0 ]. Hash () , UserID : "tenant" , From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
161
+ {Fingerprint : series [ 1 ]. Hash () , UserID : "tenant" , From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
162
+ {Fingerprint : series [ 1 ]. Hash () , UserID : "tenant" , From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
163
+ {Fingerprint : series [ 2 ]. Hash () , UserID : "tenant" , From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
164
+ {Fingerprint : series [ 2 ]. Hash () , UserID : "tenant" , From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
153
165
}
154
166
155
- result := groupChunkRefs (chunkRefs , nil )
167
+ result := groupChunkRefs (seriesMap , chunkRefs , nil )
156
168
require .Equal (t , []* logproto.GroupedChunkRefs {
157
- {Fingerprint : 0x00 , Tenant : "tenant" , Refs : []* logproto.ShortRef {
169
+ {Fingerprint : series [ 0 ]. Hash () , Tenant : "tenant" , Refs : []* logproto.ShortRef {
158
170
{From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
159
171
{From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
172
+ }, Labels : & logproto.IndexSeries {
173
+ Labels : logproto .FromLabelsToLabelAdapters (series [0 ]),
160
174
}},
161
- {Fingerprint : 0x01 , Tenant : "tenant" , Refs : []* logproto.ShortRef {
175
+ {Fingerprint : series [ 1 ]. Hash () , Tenant : "tenant" , Refs : []* logproto.ShortRef {
162
176
{From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
163
177
{From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
178
+ }, Labels : & logproto.IndexSeries {
179
+ Labels : logproto .FromLabelsToLabelAdapters (series [1 ]),
164
180
}},
165
- {Fingerprint : 0x02 , Tenant : "tenant" , Refs : []* logproto.ShortRef {
181
+ {Fingerprint : series [ 2 ]. Hash () , Tenant : "tenant" , Refs : []* logproto.ShortRef {
166
182
{From : mktime ("2024-04-20 00:00" ), Through : mktime ("2024-04-20 00:59" )},
167
183
{From : mktime ("2024-04-20 01:00" ), Through : mktime ("2024-04-20 01:59" )},
184
+ }, Labels : & logproto.IndexSeries {
185
+ Labels : logproto .FromLabelsToLabelAdapters (series [2 ]),
168
186
}},
169
187
}, result )
170
188
}
@@ -175,11 +193,15 @@ func BenchmarkGroupChunkRefs(b *testing.B) {
175
193
n := 1000 // num series
176
194
m := 10000 // num chunks per series
177
195
chunkRefs := make ([]* logproto.ChunkRef , 0 , n * m )
196
+ series := make (map [uint64 ]labels.Labels , n )
178
197
179
198
for i := 0 ; i < n ; i ++ {
199
+ s := labels .FromStrings ("app" , fmt .Sprintf ("%d" , i ))
200
+ sFP := s .Hash ()
201
+ series [sFP ] = s
180
202
for j := 0 ; j < m ; j ++ {
181
203
chunkRefs = append (chunkRefs , & logproto.ChunkRef {
182
- Fingerprint : uint64 ( n ) ,
204
+ Fingerprint : sFP ,
183
205
UserID : "tenant" ,
184
206
From : mktime ("2024-04-20 00:00" ),
185
207
Through : mktime ("2024-04-20 00:59" ),
@@ -196,5 +218,5 @@ func BenchmarkGroupChunkRefs(b *testing.B) {
196
218
b .StartTimer ()
197
219
198
220
groups := make ([]* logproto.GroupedChunkRefs , 0 , n )
199
- groupChunkRefs (chunkRefs , groups )
221
+ groupChunkRefs (series , chunkRefs , groups )
200
222
}
0 commit comments