Skip to content

Commit

Permalink
Use timeout for chooseProtocol (#458)
Browse files Browse the repository at this point in the history
* travisci skip ipv6 dns tests

Signed-off-by: Thor <[email protected]>
  • Loading branch information
thorfour authored and brian-brazil committed Apr 24, 2019
1 parent 4f023ef commit f763e92
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 29 deletions.
2 changes: 1 addition & 1 deletion prober/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ func ProbeDNS(ctx context.Context, target string, module config.Module, registry
port = "53"
targetAddr = target
}
ip, _, err = chooseProtocol(module.DNS.IPProtocol, module.DNS.IPProtocolFallback, targetAddr, registry, logger)
ip, _, err = chooseProtocol(ctx, module.DNS.IPProtocol, module.DNS.IPProtocolFallback, targetAddr, registry, logger)
if err != nil {
level.Error(logger).Log("msg", "Error resolving address", "err", err)
return false
Expand Down
13 changes: 13 additions & 0 deletions prober/dns_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package prober
import (
"context"
"net"
"os"
"runtime"
"testing"
"time"
Expand Down Expand Up @@ -85,6 +86,10 @@ func recursiveDNSHandler(w dns.ResponseWriter, r *dns.Msg) {
}

func TestRecursiveDNSResponse(t *testing.T) {
if os.Getenv("TRAVIS") == "true" {
t.Skip("skipping; travisci is failing on ipv6 dns requests")
}

tests := []struct {
Probe config.DNSProbe
ShouldSucceed bool
Expand Down Expand Up @@ -211,6 +216,10 @@ func authoritativeDNSHandler(w dns.ResponseWriter, r *dns.Msg) {
}

func TestAuthoritativeDNSResponse(t *testing.T) {
if os.Getenv("TRAVIS") == "true" {
t.Skip("skipping; travisci is failing on ipv6 dns requests")
}

tests := []struct {
Probe config.DNSProbe
ShouldSucceed bool
Expand Down Expand Up @@ -315,6 +324,10 @@ func TestAuthoritativeDNSResponse(t *testing.T) {
}

func TestServfailDNSResponse(t *testing.T) {
if os.Getenv("TRAVIS") == "true" {
t.Skip("skipping; travisci is failing on ipv6 dns requests")
}

tests := []struct {
Probe config.DNSProbe
ShouldSucceed bool
Expand Down
2 changes: 1 addition & 1 deletion prober/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ func ProbeHTTP(ctx context.Context, target string, module config.Module, registr
targetHost = targetURL.Host
}

ip, lookupTime, err := chooseProtocol(module.HTTP.IPProtocol, module.HTTP.IPProtocolFallback, targetHost, registry, logger)
ip, lookupTime, err := chooseProtocol(ctx, module.HTTP.IPProtocol, module.HTTP.IPProtocolFallback, targetHost, registry, logger)
if err != nil {
level.Error(logger).Log("msg", "Error resolving address", "err", err)
return false
Expand Down
2 changes: 1 addition & 1 deletion prober/icmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ func ProbeICMP(ctx context.Context, target string, module config.Module, registr

registry.MustRegister(durationGaugeVec)

ip, lookupTime, err := chooseProtocol(module.ICMP.IPProtocol, module.ICMP.IPProtocolFallback, target, registry, logger)
ip, lookupTime, err := chooseProtocol(ctx, module.ICMP.IPProtocol, module.ICMP.IPProtocolFallback, target, registry, logger)
if err != nil {
level.Warn(logger).Log("msg", "Error resolving address", "err", err)
return false
Expand Down
2 changes: 1 addition & 1 deletion prober/tcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func dialTCP(ctx context.Context, target string, module config.Module, registry
return nil, err
}

ip, _, err := chooseProtocol(module.TCP.IPProtocol, module.TCP.IPProtocolFallback, targetAddress, registry, logger)
ip, _, err := chooseProtocol(ctx, module.TCP.IPProtocol, module.TCP.IPProtocolFallback, targetAddress, registry, logger)
if err != nil {
level.Error(logger).Log("msg", "Error resolving address", "err", err)
return nil, err
Expand Down
4 changes: 4 additions & 0 deletions prober/tcp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,10 @@ func TestTCPConnectionFails(t *testing.T) {
}

func TestTCPConnectionWithTLS(t *testing.T) {
if os.Getenv("TRAVIS") == "true" {
t.Skip("skipping; travisci is failing on ipv6 dns requests")
}

ln, err := net.Listen("tcp", ":0")
if err != nil {
t.Fatalf("Error listening on socket: %s", err)
Expand Down
65 changes: 40 additions & 25 deletions prober/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
package prober

import (
"context"
"fmt"
"net"
"time"

Expand All @@ -24,7 +26,7 @@ import (
)

// Returns the IP for the IPProtocol and lookup time.
func chooseProtocol(IPProtocol string, fallbackIPProtocol bool, target string, registry *prometheus.Registry, logger log.Logger) (ip *net.IPAddr, lookupTime float64, err error) {
func chooseProtocol(ctx context.Context, IPProtocol string, fallbackIPProtocol bool, target string, registry *prometheus.Registry, logger log.Logger) (ip *net.IPAddr, lookupTime float64, err error) {
var fallbackProtocol string
probeDNSLookupTimeSeconds := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "probe_dns_lookup_time_seconds",
Expand All @@ -46,12 +48,6 @@ func chooseProtocol(IPProtocol string, fallbackIPProtocol bool, target string, r
fallbackProtocol = "ip6"
}

if IPProtocol == "ip6" {
fallbackProtocol = "ip4"
} else {
fallbackProtocol = "ip6"
}

level.Info(logger).Log("msg", "Resolving target address", "ip_protocol", IPProtocol)
resolveStart := time.Now()

Expand All @@ -60,31 +56,50 @@ func chooseProtocol(IPProtocol string, fallbackIPProtocol bool, target string, r
probeDNSLookupTimeSeconds.Add(lookupTime)
}()

ip, err = net.ResolveIPAddr(IPProtocol, target)
resolver := &net.Resolver{}
ips, err := resolver.LookupIPAddr(ctx, target)
if err != nil {
if !fallbackIPProtocol {

This comment has been minimized.

Copy link
@genofire

genofire Oct 23, 2019

Contributor

you remove the fallbackIPProtocol everywhere .... it is not possible to disable fallback anymore ....
hope i fix it with #540

level.Error(logger).Log("msg", "Resolution with IP protocol failed (fallback_ip_protocol is false):", "err", err)
} else {
level.Warn(logger).Log("msg", "Resolution with IP protocol failed, attempting fallback protocol", "fallback_protocol", fallbackProtocol, "err", err)
ip, err = net.ResolveIPAddr(fallbackProtocol, target)
}
level.Error(logger).Log("msg", "Resolution with IP protocol failed", "err", err)
return nil, 0.0, err
}

if err != nil {
if IPProtocol == "ip6" {
probeIPProtocolGauge.Set(6)
} else {
// Return the IP in the requested protocol.
var fallback *net.IPAddr
for _, ip := range ips {
switch IPProtocol {
case "ip4":
if ip.IP.To4() != nil {
level.Info(logger).Log("msg", "Resolved target address", "ip", ip)
probeIPProtocolGauge.Set(4)
return &ip, lookupTime, nil
}
return ip, 0.0, err

// ip4 as fallback
fallback = &ip

case "ip6":

if ip.IP.To4() == nil {
level.Info(logger).Log("msg", "Resolved target address", "ip", ip)
probeIPProtocolGauge.Set(6)
return &ip, lookupTime, nil
}

// ip6 as fallback
fallback = &ip
}
}

if ip.IP.To4() == nil {
probeIPProtocolGauge.Set(6)
} else {
probeIPProtocolGauge.Set(4)
// Unable to find ip and no fallback set.
if fallback == nil {
return nil, 0.0, fmt.Errorf("unable to find ip; no fallback")
}

level.Info(logger).Log("msg", "Resolved target address", "ip", ip)
return ip, lookupTime, nil
// Use fallback ip protocol.
if fallbackProtocol == "ip4" {
probeIPProtocolGauge.Set(4)
} else {
probeIPProtocolGauge.Set(6)
}
return fallback, lookupTime, nil
}

0 comments on commit f763e92

Please sign in to comment.