Skip to content

Commit e30a981

Browse files
committed
Add flag to ensure new behaviour only impacts ruler AM resolution.
Signed-off-by: Kevin Hellemun <17928966+OGKevin@users.noreply.github.com>
1 parent 84824e6 commit e30a981

File tree

7 files changed

+32
-10
lines changed

7 files changed

+32
-10
lines changed

cmd/thanos/query.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ func runQuery(
265265
logger,
266266
extprom.WrapRegistererWithPrefix("thanos_querier_store_apis_", reg),
267267
dns.ResolverType(dnsSDResolver),
268+
true,
268269
)
269270

270271
for _, store := range strictStores {
@@ -277,6 +278,7 @@ func runQuery(
277278
logger,
278279
extprom.WrapRegistererWithPrefix("thanos_querier_rule_apis_", reg),
279280
dns.ResolverType(dnsSDResolver),
281+
true,
280282
)
281283

282284
var (

cmd/thanos/rule.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ func runRule(
338338
logger,
339339
extprom.WrapRegistererWithPrefix("thanos_ruler_query_apis_", reg),
340340
dns.ResolverType(dnsSDResolver),
341+
true,
341342
)
342343
var queryClients []*http_util.Client
343344
for _, cfg := range queryCfg {
@@ -401,6 +402,7 @@ func runRule(
401402
logger,
402403
extprom.WrapRegistererWithPrefix("thanos_ruler_alertmanagers_", reg),
403404
dns.ResolverType(dnsSDResolver),
405+
false,
404406
)
405407
var alertmgrs []*alert.Alertmanager
406408
for _, cfg := range alertingCfg.Alertmanagers {

pkg/cacheutil/memcached_client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ func newMemcachedClient(
219219
logger,
220220
extprom.WrapRegistererWithPrefix("thanos_memcached_", reg),
221221
dns.GolangResolverType,
222+
true,
222223
)
223224

224225
c := &memcachedClient{

pkg/discovery/dns/provider.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ type ResolverType string
3737
const (
3838
GolangResolverType ResolverType = "golang"
3939
MiekgdnsResolverType ResolverType = "miekgdns"
40-
MockdnsResolverType ResolverType = "mockdns"
4140
)
4241

4342
func (t ResolverType) ToResolver(logger log.Logger) ipLookupResolver {
@@ -56,9 +55,9 @@ func (t ResolverType) ToResolver(logger log.Logger) ipLookupResolver {
5655

5756
// NewProvider returns a new empty provider with a given resolver type.
5857
// If empty resolver type is net.DefaultResolver.
59-
func NewProvider(logger log.Logger, reg prometheus.Registerer, resolverType ResolverType) *Provider {
58+
func NewProvider(logger log.Logger, reg prometheus.Registerer, resolverType ResolverType, returnErrOnNotFound bool) *Provider {
6059
p := &Provider{
61-
resolver: NewResolver(resolverType.ToResolver(logger), resolverType),
60+
resolver: NewResolver(resolverType.ToResolver(logger), logger, returnErrOnNotFound),
6261
resolved: make(map[string][]string),
6362
logger: logger,
6463
resolverAddrs: extprom.NewTxGaugeVec(reg, prometheus.GaugeOpts{

pkg/discovery/dns/provider_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func TestProvider(t *testing.T) {
2222
"127.0.0.5:19095",
2323
}
2424

25-
prv := NewProvider(log.NewNopLogger(), nil, "")
25+
prv := NewProvider(log.NewNopLogger(), nil, "", true)
2626
prv.resolver = &mockResolver{
2727
res: map[string][]string{
2828
"a": ips[:2],

pkg/discovery/dns/resolver.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import (
99
"strconv"
1010
"strings"
1111

12+
"github.com/go-kit/kit/log"
13+
"github.com/go-kit/kit/log/level"
14+
1215
"github.com/pkg/errors"
1316
)
1417

@@ -37,13 +40,16 @@ type ipLookupResolver interface {
3740
}
3841

3942
type dnsSD struct {
40-
resolver ipLookupResolver
41-
resolverType ResolverType
43+
resolver ipLookupResolver
44+
logger log.Logger
45+
// https://github.com/thanos-io/thanos/issues/3186
46+
// This flag is used to prevent components from crashing if hosts are not found.
47+
returnErrOnNotFound bool
4248
}
4349

4450
// NewResolver creates a resolver with given underlying resolver.
45-
func NewResolver(resolver ipLookupResolver, resolverType ResolverType) Resolver {
46-
return &dnsSD{resolver: resolver, resolverType: resolverType}
51+
func NewResolver(resolver ipLookupResolver, logger log.Logger, returnErrOnNotFound bool) Resolver {
52+
return &dnsSD{resolver: resolver, logger: logger, returnErrOnNotFound: returnErrOnNotFound}
4753
}
4854

4955
func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string, error) {
@@ -73,9 +79,13 @@ func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string
7379
ips, err := s.resolver.LookupIPAddr(ctx, host)
7480
if err != nil {
7581
dnsErr, ok := err.(*net.DNSError)
76-
if !(s.resolverType == GolangResolverType && ok && dnsErr.IsNotFound) {
82+
// https://github.com/thanos-io/thanos/issues/3186
83+
// Default DNS resolver can make thanos components crash if DSN resolutions results in EAI_NONAME.
84+
// the flag returnErrOnNotFound can be used to prevent such crash.
85+
if !(!s.returnErrOnNotFound && ok && dnsErr.IsNotFound) {
7786
return nil, errors.Wrapf(err, "lookup IP addresses %q", host)
7887
}
88+
level.Error(s.logger).Log("msg", "failed to lookup IP addresses", "host", host, "err", err)
7989
}
8090
for _, ip := range ips {
8191
res = append(res, appendScheme(scheme, net.JoinHostPort(ip.String(), port)))
@@ -110,6 +120,12 @@ func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string
110120
return nil, errors.Errorf("invalid lookup scheme %q", qtype)
111121
}
112122

123+
// https://github.com/thanos-io/thanos/issues/3186
124+
// This happens when miekg is used as resolver. When the host cannot be found, nothing is returned.
125+
if res == nil && err == nil {
126+
level.Warn(s.logger).Log("msg", "IP address lookup yielded no results nor errors", "host", host)
127+
}
128+
113129
return res, nil
114130
}
115131

pkg/discovery/dns/resolver_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"sort"
1010
"testing"
1111

12+
"github.com/go-kit/kit/log"
13+
1214
"github.com/pkg/errors"
1315
"github.com/thanos-io/thanos/pkg/testutil"
1416
)
@@ -184,7 +186,7 @@ func TestDnsSD_Resolve(t *testing.T) {
184186

185187
func testDnsSd(t *testing.T, tt DNSSDTest) {
186188
ctx := context.TODO()
187-
dnsSD := dnsSD{tt.resolver, MockdnsResolverType}
189+
dnsSD := dnsSD{tt.resolver, log.NewNopLogger(), false}
188190

189191
result, err := dnsSD.Resolve(ctx, tt.addr, tt.qtype)
190192
if tt.expectedErr != nil {

0 commit comments

Comments
 (0)