@@ -42,6 +42,7 @@ import (
4242 grpcserver "github.com/thanos-io/thanos/pkg/server/grpc"
4343 httpserver "github.com/thanos-io/thanos/pkg/server/http"
4444 "github.com/thanos-io/thanos/pkg/store"
45+ "github.com/thanos-io/thanos/pkg/targets"
4546 "github.com/thanos-io/thanos/pkg/tls"
4647 "github.com/thanos-io/thanos/pkg/ui"
4748)
@@ -94,6 +95,10 @@ func registerQuery(app *extkingpin.App) {
9495 ruleEndpoints := cmd .Flag ("rule" , "Experimental: Addresses of statically configured rules API servers (repeatable). The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect rule API servers through respective DNS lookups." ).
9596 Hidden ().PlaceHolder ("<rule>" ).Strings ()
9697
98+ // TODO(atunik): Hidden because we plan to extract discovery to separate API: https://github.com/thanos-io/thanos/issues/2600.
99+ targetEndpoints := cmd .Flag ("target" , "Experimental: Addresses of statically configured targets API servers (repeatable). The scheme may be prefixed with 'dns+' or 'dnssrv+' to detect rule API servers through respective DNS lookups." ).
100+ Hidden ().PlaceHolder ("<target>" ).Strings ()
101+
97102 strictStores := cmd .Flag ("store-strict" , "Addresses of only statically configured store API servers that are always used, even if the health check fails. Useful if you have a caching layer on top." ).
98103 PlaceHolder ("<staticstore>" ).Strings ()
99104
@@ -139,6 +144,10 @@ func registerQuery(app *extkingpin.App) {
139144 return errors .Errorf ("Address %s is duplicated for --rule flag." , dup )
140145 }
141146
147+ if dup := firstDuplicate (* targetEndpoints ); dup != "" {
148+ return errors .Errorf ("Address %s is duplicated for --target flag." , dup )
149+ }
150+
142151 var fileSD * file.Discovery
143152 if len (* fileSDFiles ) > 0 {
144153 conf := & file.SDConfig {
@@ -188,6 +197,7 @@ func registerQuery(app *extkingpin.App) {
188197 getFlagsMap (cmd .Flags ()),
189198 * stores ,
190199 * ruleEndpoints ,
200+ * targetEndpoints ,
191201 * enableAutodownsampling ,
192202 * enableQueryPartialResponse ,
193203 * enableRulePartialResponse ,
@@ -237,6 +247,7 @@ func runQuery(
237247 flagsMap map [string ]string ,
238248 storeAddrs []string ,
239249 ruleAddrs []string ,
250+ targetAddrs []string ,
240251 enableAutodownsampling bool ,
241252 enableQueryPartialResponse bool ,
242253 enableRulePartialResponse bool ,
@@ -279,6 +290,12 @@ func runQuery(
279290 dns .ResolverType (dnsSDResolver ),
280291 )
281292
293+ dnsTargetProvider := dns .NewProvider (
294+ logger ,
295+ extprom .WrapRegistererWithPrefix ("thanos_querier_target_apis_" , reg ),
296+ dns .ResolverType (dnsSDResolver ),
297+ )
298+
282299 var (
283300 stores = query .NewStoreSet (
284301 logger ,
@@ -305,11 +322,22 @@ func runQuery(
305322
306323 return specs
307324 },
325+ func () (specs []query.TargetSpec ) {
326+ for _ , addr := range dnsTargetProvider .Addresses () {
327+ specs = append (specs , query .NewGRPCStoreSpec (addr , false ))
328+ }
329+
330+ // NOTE(s-urbaniak): No need to remove duplicates, as target apis are a subset of store apis.
331+ // hence, any duplicates will be tracked in the store api set.
332+
333+ return specs
334+ },
308335 dialOpts ,
309336 unhealthyStoreTimeout ,
310337 )
311338 proxy = store .NewProxyStore (logger , reg , stores .Get , component .Query , selectorLset , storeResponseTimeout )
312339 rulesProxy = rules .NewProxy (logger , stores .GetRulesClients )
340+ targetsProxy = targets .NewProxy (logger , stores .GetTargetsClients )
313341 queryableCreator = query .NewQueryableCreator (
314342 logger ,
315343 extprom .WrapRegistererWithPrefix ("thanos_query_" , reg ),
@@ -394,6 +422,9 @@ func runQuery(
394422 if err := dnsRuleProvider .Resolve (ctx , ruleAddrs ); err != nil {
395423 level .Error (logger ).Log ("msg" , "failed to resolve addresses for rulesAPIs" , "err" , err )
396424 }
425+ if err := dnsTargetProvider .Resolve (ctx , targetAddrs ); err != nil {
426+ level .Error (logger ).Log ("msg" , "failed to resolve addresses for targetsAPIs" , "err" , err )
427+ }
397428 return nil
398429 })
399430 }, func (error ) {
@@ -444,6 +475,7 @@ func runQuery(
444475 queryableCreator ,
445476 // NOTE: Will share the same replica label as the query for now.
446477 rules .NewGRPCClientWithDedup (rulesProxy , queryReplicaLabels ),
478+ targets .NewGRPCClientWithDedup (targetsProxy , queryReplicaLabels ),
447479 enableAutodownsampling ,
448480 enableQueryPartialResponse ,
449481 enableRulePartialResponse ,
@@ -486,6 +518,7 @@ func runQuery(
486518 s := grpcserver .New (logger , reg , tracer , comp , grpcProbe ,
487519 grpcserver .WithServer (store .RegisterStoreServer (proxy )),
488520 grpcserver .WithServer (rules .RegisterRulesServer (rulesProxy )),
521+ grpcserver .WithServer (targets .RegisterTargetsServer (targetsProxy )),
489522 grpcserver .WithListen (grpcBindAddr ),
490523 grpcserver .WithGracePeriod (grpcGracePeriod ),
491524 grpcserver .WithTLSConfig (tlsCfg ),
0 commit comments