@@ -5,6 +5,8 @@ package dns
55
66import (
77 "context"
8+ "github.com/go-kit/kit/log"
9+ "github.com/go-kit/kit/log/level"
810 "net"
911 "strconv"
1012 "strings"
@@ -38,12 +40,15 @@ type ipLookupResolver interface {
3840
3941type dnsSD struct {
4042 resolver ipLookupResolver
41- resolverType ResolverType
43+ logger log.Logger
44+ // https://github.com/thanos-io/thanos/issues/3186
45+ // This flag is used to prevent components from crashing if hosts are not found.
46+ returnErrOnNotFound bool
4247}
4348
4449// NewResolver creates a resolver with given underlying resolver.
45- func NewResolver (resolver ipLookupResolver , resolverType ResolverType ) Resolver {
46- return & dnsSD {resolver : resolver , resolverType : resolverType }
50+ func NewResolver (resolver ipLookupResolver , logger log. Logger , returnErrOnNotFound bool ) Resolver {
51+ return & dnsSD {resolver : resolver , logger : logger , returnErrOnNotFound : returnErrOnNotFound }
4752}
4853
4954func (s * dnsSD ) Resolve (ctx context.Context , name string , qtype QType ) ([]string , error ) {
@@ -73,9 +78,13 @@ func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string
7378 ips , err := s .resolver .LookupIPAddr (ctx , host )
7479 if err != nil {
7580 dnsErr , ok := err .(* net.DNSError )
76- if ! (s .resolverType == GolangResolverType && ok && dnsErr .IsNotFound ) {
81+ // https://github.com/thanos-io/thanos/issues/3186
82+ // Default DNS resolver can make thanos components crash if DSN resolutions results in EAI_NONAME.
83+ // the flag returnErrOnNotFound can be used to prevent such crash.
84+ if ! (! s .returnErrOnNotFound && ok && dnsErr .IsNotFound ) {
7785 return nil , errors .Wrapf (err , "lookup IP addresses %q" , host )
7886 }
87+ level .Error (s .logger ).Log ("msg" , "failed to lookup IP addresses" , "host" , host , "err" , err )
7988 }
8089 for _ , ip := range ips {
8190 res = append (res , appendScheme (scheme , net .JoinHostPort (ip .String (), port )))
@@ -110,6 +119,12 @@ func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string
110119 return nil , errors .Errorf ("invalid lookup scheme %q" , qtype )
111120 }
112121
122+ // https://github.com/thanos-io/thanos/issues/3186
123+ // This happens when miekg is used as resolver. When the host cannot be found, nothing is returned.
124+ if res == nil && err == nil {
125+ level .Warn (s .logger ).Log ("msg" , "IP address lookup yielded no results nor errors" , "host" , host )
126+ }
127+
113128 return res , nil
114129}
115130
0 commit comments