|
9 | 9 | "strconv" |
10 | 10 | "strings" |
11 | 11 |
|
| 12 | + "github.com/go-kit/kit/log" |
| 13 | + "github.com/go-kit/kit/log/level" |
| 14 | + |
12 | 15 | "github.com/pkg/errors" |
13 | 16 | ) |
14 | 17 |
|
@@ -37,13 +40,16 @@ type ipLookupResolver interface { |
37 | 40 | } |
38 | 41 |
|
39 | 42 | 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 |
42 | 48 | } |
43 | 49 |
|
44 | 50 | // 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} |
47 | 53 | } |
48 | 54 |
|
49 | 55 | 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 |
73 | 79 | ips, err := s.resolver.LookupIPAddr(ctx, host) |
74 | 80 | if err != nil { |
75 | 81 | 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) { |
77 | 86 | return nil, errors.Wrapf(err, "lookup IP addresses %q", host) |
78 | 87 | } |
| 88 | + level.Error(s.logger).Log("msg", "failed to lookup IP addresses", "host", host, "err", err) |
79 | 89 | } |
80 | 90 | for _, ip := range ips { |
81 | 91 | 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 |
110 | 120 | return nil, errors.Errorf("invalid lookup scheme %q", qtype) |
111 | 121 | } |
112 | 122 |
|
| 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 | + |
113 | 129 | return res, nil |
114 | 130 | } |
115 | 131 |
|
|
0 commit comments