Skip to content

Commit 09fc10a

Browse files
committed
Add custom dns support.
Signed-off-by: halohsu <[email protected]>
1 parent 2156dcc commit 09fc10a

File tree

7 files changed

+29
-6
lines changed

7 files changed

+29
-6
lines changed

config/config.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@ type HTTPProbe struct {
297297
Compression string `yaml:"compression,omitempty"`
298298
BodySizeLimit units.Base2Bytes `yaml:"body_size_limit,omitempty"`
299299
UseHTTP3 bool `yaml:"enable_http3,omitempty"`
300+
DNSServer string `yaml:"dns_server,omitempty"`
301+
DNSTimeout time.Duration `yaml:"dns_timeout,omitempty"`
300302
}
301303

302304
type GRPCProbe struct {
@@ -305,6 +307,8 @@ type GRPCProbe struct {
305307
TLSConfig config.TLSConfig `yaml:"tls_config,omitempty"`
306308
IPProtocolFallback bool `yaml:"ip_protocol_fallback,omitempty"`
307309
PreferredIPProtocol string `yaml:"preferred_ip_protocol,omitempty"`
310+
DNSServer string `yaml:"dns_server,omitempty"`
311+
DNSTimeout time.Duration `yaml:"dns_timeout,omitempty"`
308312
}
309313

310314
type HeaderMatch struct {
@@ -332,6 +336,8 @@ type TCPProbe struct {
332336
QueryResponse []QueryResponse `yaml:"query_response,omitempty"`
333337
TLS bool `yaml:"tls,omitempty"`
334338
TLSConfig config.TLSConfig `yaml:"tls_config,omitempty"`
339+
DNSServer string `yaml:"dns_server,omitempty"`
340+
DNSTimeout time.Duration `yaml:"dns_timeout,omitempty"`
335341
}
336342

337343
type ICMPProbe struct {
@@ -341,6 +347,8 @@ type ICMPProbe struct {
341347
PayloadSize int `yaml:"payload_size,omitempty"`
342348
DontFragment bool `yaml:"dont_fragment,omitempty"`
343349
TTL int `yaml:"ttl,omitempty"`
350+
DNSServer string `yaml:"dns_server,omitempty"`
351+
DNSTimeout time.Duration `yaml:"dns_timeout,omitempty"`
344352
}
345353

346354
type DNSProbe struct {
@@ -358,6 +366,8 @@ type DNSProbe struct {
358366
ValidateAnswer DNSRRValidator `yaml:"validate_answer_rrs,omitempty"`
359367
ValidateAuthority DNSRRValidator `yaml:"validate_authority_rrs,omitempty"`
360368
ValidateAdditional DNSRRValidator `yaml:"validate_additional_rrs,omitempty"`
369+
DNSServer string `yaml:"dns_server,omitempty"`
370+
DNSTimeout time.Duration `yaml:"dns_timeout,omitempty"`
361371
}
362372

363373
type DNSRRValidator struct {

prober/dns.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ func ProbeDNS(ctx context.Context, target string, module config.Module, registry
196196
}
197197
targetAddr = target
198198
}
199-
ip, lookupTime, err := chooseProtocol(ctx, module.DNS.IPProtocol, module.DNS.IPProtocolFallback, targetAddr, registry, logger)
199+
ip, lookupTime, err := chooseProtocol(ctx, module.DNS.IPProtocol, module.DNS.IPProtocolFallback, targetAddr, registry, logger, module.DNS.DNSServer, module.DNS.DNSTimeout)
200200
if err != nil {
201201
logger.Error("Error resolving address", "err", err)
202202
return false

prober/grpc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func ProbeGRPC(ctx context.Context, target string, module config.Module, registr
144144
return false
145145
}
146146

147-
ip, lookupTime, err := chooseProtocol(ctx, module.GRPC.PreferredIPProtocol, module.GRPC.IPProtocolFallback, targetHost, registry, logger)
147+
ip, lookupTime, err := chooseProtocol(ctx, module.GRPC.PreferredIPProtocol, module.GRPC.IPProtocolFallback, targetHost, registry, logger, module.GRPC.DNSServer, module.GRPC.DNSTimeout)
148148
if err != nil {
149149
logger.Error("Error resolving address", "err", err)
150150
return false

prober/http.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ func ProbeHTTP(ctx context.Context, target string, module config.Module, registr
404404
var ip *net.IPAddr
405405
if shouldResolveDNSWithProxy(module.HTTP) {
406406
var lookupTime float64
407-
ip, lookupTime, err = chooseProtocol(ctx, module.HTTP.IPProtocol, module.HTTP.IPProtocolFallback, targetHost, registry, logger)
407+
ip, lookupTime, err = chooseProtocol(ctx, module.HTTP.IPProtocol, module.HTTP.IPProtocolFallback, targetHost, registry, logger, module.HTTP.DNSServer, module.HTTP.DNSTimeout)
408408
durationGaugeVec.WithLabelValues("resolve").Add(lookupTime)
409409
if err != nil {
410410
logger.Error("Error resolving address", "err", err)

prober/icmp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func ProbeICMP(ctx context.Context, target string, module config.Module, registr
8787

8888
registry.MustRegister(durationGaugeVec)
8989

90-
dstIPAddr, lookupTime, err := chooseProtocol(ctx, module.ICMP.IPProtocol, module.ICMP.IPProtocolFallback, target, registry, logger)
90+
dstIPAddr, lookupTime, err := chooseProtocol(ctx, module.ICMP.IPProtocol, module.ICMP.IPProtocolFallback, target, registry, logger, module.ICMP.DNSServer, module.ICMP.DNSTimeout)
9191

9292
if err != nil {
9393
logger.Error("Error resolving address", "err", err)

prober/tcp.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func dialTCP(ctx context.Context, target string, module config.Module, registry
3636
return nil, err
3737
}
3838

39-
ip, _, err := chooseProtocol(ctx, module.TCP.IPProtocol, module.TCP.IPProtocolFallback, targetAddress, registry, logger)
39+
ip, _, err := chooseProtocol(ctx, module.TCP.IPProtocol, module.TCP.IPProtocolFallback, targetAddress, registry, logger, module.TCP.DNSServer, module.TCP.DNSTimeout)
4040
if err != nil {
4141
logger.Error("Error resolving address", "err", err)
4242
return nil, err

prober/utils.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ var protocolToGauge = map[string]float64{
3030
}
3131

3232
// Returns the IP for the IPProtocol and lookup time.
33-
func chooseProtocol(ctx context.Context, IPProtocol string, fallbackIPProtocol bool, target string, registry *prometheus.Registry, logger *slog.Logger) (ip *net.IPAddr, lookupTime float64, err error) {
33+
func chooseProtocol(ctx context.Context, IPProtocol string, fallbackIPProtocol bool, target string, registry *prometheus.Registry, logger *slog.Logger, dnsServer string, dnsTimeout time.Duration) (ip *net.IPAddr, lookupTime float64, err error) {
3434
var fallbackProtocol string
3535
probeDNSLookupTimeSeconds := prometheus.NewGauge(prometheus.GaugeOpts{
3636
Name: "probe_dns_lookup_time_seconds",
@@ -67,6 +67,19 @@ func chooseProtocol(ctx context.Context, IPProtocol string, fallbackIPProtocol b
6767
}()
6868

6969
resolver := &net.Resolver{}
70+
71+
if dnsServer != "" {
72+
resolver = &net.Resolver{
73+
PreferGo: true,
74+
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
75+
d := net.Dialer{
76+
Timeout: dnsTimeout,
77+
}
78+
return d.DialContext(ctx, "udp", dnsServer)
79+
},
80+
}
81+
}
82+
7083
if !fallbackIPProtocol {
7184
ips, err := resolver.LookupIP(ctx, IPProtocol, target)
7285
if err == nil {

0 commit comments

Comments
 (0)