@@ -15,13 +15,15 @@ import (
1515 "github.com/pkg/errors"
1616 "github.com/prometheus/prometheus/model/labels"
1717 "google.golang.org/grpc"
18+ "google.golang.org/grpc/metadata"
1819
1920 "github.com/thanos-io/promql-engine/logicalplan"
2021 "github.com/thanos-io/promql-engine/query"
2122 "github.com/thanos-io/thanos/pkg/api/query/querypb"
2223 "github.com/thanos-io/thanos/pkg/extpromql"
2324 "github.com/thanos-io/thanos/pkg/info/infopb"
2425 "github.com/thanos-io/thanos/pkg/store/labelpb"
26+ "github.com/thanos-io/thanos/pkg/tenancy"
2527)
2628
2729func TestRemoteEngine_Warnings (t * testing.T ) {
@@ -269,6 +271,49 @@ func TestRemoteEngine_MinT(t *testing.T) {
269271 }
270272}
271273
274+ func TestRemoteEngine_Tenancy (t * testing.T ) {
275+ t .Parallel ()
276+
277+ mock := & tenantCheckClient {}
278+ engine := NewRemoteEngine (
279+ log .NewNopLogger (),
280+ NewClient (mock , "testclient" , nil ),
281+ Opts {
282+ Timeout : time .Second ,
283+ },
284+ )
285+
286+ expr , err := extpromql .ParseExpr ("up" )
287+ testutil .Ok (t , err )
288+ plan , err := logicalplan .NewFromAST (expr , & query.Options {
289+ Start : time .Now (),
290+ End : time .Now (),
291+ }, logicalplan.PlanOptions {})
292+ testutil .Ok (t , err )
293+
294+ ctx := context .WithValue (context .Background (), tenancy .TenantKey , "my-tenant" )
295+
296+ t .Run ("instant_query" , func (t * testing.T ) {
297+ mock .tenant = ""
298+ qry , err := engine .NewInstantQuery (ctx , nil , plan .Root (), time .Unix (0 , 0 ))
299+ testutil .Ok (t , err )
300+
301+ res := qry .Exec (ctx )
302+ testutil .Ok (t , res .Err )
303+ testutil .Equals (t , "my-tenant" , mock .tenant )
304+ })
305+
306+ t .Run ("range_query" , func (t * testing.T ) {
307+ mock .tenant = ""
308+ qry , err := engine .NewRangeQuery (ctx , nil , plan .Root (), time .Unix (0 , 0 ), time .Unix (10 , 0 ), time .Second )
309+ testutil .Ok (t , err )
310+
311+ res := qry .Exec (ctx )
312+ testutil .Ok (t , res .Err )
313+ testutil .Equals (t , "my-tenant" , mock .tenant )
314+ })
315+ }
316+
272317func zLabelSetFromStrings (ss ... string ) labelpb.ZLabelSet {
273318 return labelpb.ZLabelSet {
274319 Labels : labelpb .ZLabelsFromPromLabels (labels .FromStrings (ss ... )),
@@ -350,3 +395,28 @@ func (m *queryErrClient) Recv() (*querypb.QueryResponse, error) {
350395 m .errSent = true
351396 return nil , errors .New ("error" )
352397}
398+
399+ type tenantCheckClient struct {
400+ warnClient
401+ tenant string
402+ }
403+
404+ func (m * tenantCheckClient ) Query (ctx context.Context , req * querypb.QueryRequest , opts ... grpc.CallOption ) (querypb.Query_QueryClient , error ) {
405+ if md , ok := metadata .FromOutgoingContext (ctx ); ok {
406+ vals := md .Get (tenancy .DefaultTenantHeader )
407+ if len (vals ) > 0 {
408+ m .tenant = vals [0 ]
409+ }
410+ }
411+ return m .warnClient .Query (ctx , req , opts ... )
412+ }
413+
414+ func (m * tenantCheckClient ) QueryRange (ctx context.Context , req * querypb.QueryRangeRequest , opts ... grpc.CallOption ) (querypb.Query_QueryRangeClient , error ) {
415+ if md , ok := metadata .FromOutgoingContext (ctx ); ok {
416+ vals := md .Get (tenancy .DefaultTenantHeader )
417+ if len (vals ) > 0 {
418+ m .tenant = vals [0 ]
419+ }
420+ }
421+ return m .warnClient .QueryRange (ctx , req , opts ... )
422+ }
0 commit comments