code: func NewDNSClientImpl(
  	readTimeout time.Duration,
  	servers []string,
  	stats metrics.Scope,
  	clk clock.Clock,
  	maxTries int,
  ) *DNSClientImpl {
  	stats = stats.NewScope("DNS")
  	// TODO(jmhodges): make constructor use an Option func pattern
  	dnsClient := new(dns.Client)
  
  	// Set timeout for underlying net.Conn
  	dnsClient.ReadTimeout = readTimeout
  	dnsClient.Net = "udp"
  
  	queryTime := prometheus.NewHistogramVec(
  		prometheus.HistogramOpts{
  			Name:    "dns_query_time",
  			Help:    "Time taken to perform a DNS query",
  			Buckets: metrics.InternetFacingBuckets,
  		},
  		[]string{"qtype", "result", "authenticated_data", "resolver"},
  	)
  	totalLookupTime := prometheus.NewHistogramVec(
  		prometheus.HistogramOpts{
  			Name:    "dns_total_lookup_time",
  			Help:    "Time taken to perform a DNS lookup, including all retried queries",
  			Buckets: metrics.InternetFacingBuckets,
  		},
  		[]string{"qtype", "result", "authenticated_data", "retries", "resolver"},
  	)
  	timeoutCounter := prometheus.NewCounterVec(
  		prometheus.CounterOpts{
  			Name: "dns_timeout",
  			Help: "Counter of various types of DNS query timeouts",
  		},
  		[]string{"qtype", "type", "resolver"},
  	)
  	stats.MustRegister(queryTime, totalLookupTime, timeoutCounter)
  
  	return &DNSClientImpl{
  		dnsClient:                dnsClient,
  		servers:                  servers,
  		allowRestrictedAddresses: false,
  		maxTries:                 maxTries,
  		clk:                      clk,
  		queryTime:                queryTime,
  		totalLookupTime:          totalLookupTime,
  		timeoutCounter:           timeoutCounter,
  	}
  }
docs: // NewDNSClientImpl constructs a new DNS resolver object that utilizes the
  // provided list of DNS servers for resolution.