Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Ruler][DNS] Don't propagate no such host error if using default resolver #3257

Merged
merged 11 commits into from
Oct 15, 2020
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ We use *breaking :warning:* to mark changes that are not backward compatible (re

## Unreleased

### Fixed

## [#3257](https://github.com/thanos-io/thanos/pull/3257) Ruler: Prevent Ruler from crashing when using default DNS to lookup hosts that results in "No such hosts" errors.

## [v0.16.0](https://github.com/thanos-io/thanos/releases) - Release in progress

### Fixed
Expand Down
3 changes: 2 additions & 1 deletion pkg/discovery/dns/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ type ResolverType string
const (
GolangResolverType ResolverType = "golang"
MiekgdnsResolverType ResolverType = "miekgdns"
MockdnsResolverType ResolverType = "mockdns"
)

func (t ResolverType) ToResolver(logger log.Logger) ipLookupResolver {
Expand All @@ -57,7 +58,7 @@ func (t ResolverType) ToResolver(logger log.Logger) ipLookupResolver {
// If empty resolver type is net.DefaultResolver.
func NewProvider(logger log.Logger, reg prometheus.Registerer, resolverType ResolverType) *Provider {
p := &Provider{
resolver: NewResolver(resolverType.ToResolver(logger)),
resolver: NewResolver(resolverType.ToResolver(logger), resolverType),
resolved: make(map[string][]string),
logger: logger,
resolverAddrs: extprom.NewTxGaugeVec(reg, prometheus.GaugeOpts{
Expand Down
12 changes: 8 additions & 4 deletions pkg/discovery/dns/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,13 @@ type ipLookupResolver interface {
}

type dnsSD struct {
resolver ipLookupResolver
resolver ipLookupResolver
resolverType ResolverType
}

// NewResolver creates a resolver with given underlying resolver.
func NewResolver(resolver ipLookupResolver) Resolver {
return &dnsSD{resolver: resolver}
func NewResolver(resolver ipLookupResolver, resolverType ResolverType) Resolver {
return &dnsSD{resolver: resolver, resolverType: resolverType}
}

func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string, error) {
Expand Down Expand Up @@ -71,7 +72,10 @@ func (s *dnsSD) Resolve(ctx context.Context, name string, qtype QType) ([]string
}
ips, err := s.resolver.LookupIPAddr(ctx, host)
if err != nil {
return nil, errors.Wrapf(err, "lookup IP addresses %q", host)
dnsErr, ok := err.(*net.DNSError)
if !(s.resolverType == GolangResolverType && ok && dnsErr.IsNotFound) {
OGKevin marked this conversation as resolved.
Show resolved Hide resolved
return nil, errors.Wrapf(err, "lookup IP addresses %q", host)
}
}
for _, ip := range ips {
res = append(res, appendScheme(scheme, net.JoinHostPort(ip.String(), port)))
Expand Down
2 changes: 1 addition & 1 deletion pkg/discovery/dns/resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ func TestDnsSD_Resolve(t *testing.T) {

func testDnsSd(t *testing.T, tt DNSSDTest) {
ctx := context.TODO()
dnsSD := dnsSD{tt.resolver}
dnsSD := dnsSD{tt.resolver, MockdnsResolverType}

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