net/dns{,/resolver}: quiet DNS output logging

It was a huge chunk of the overall log output and made debugging
difficult. Omit and summarize the spammy *.arpa parts instead.

Fixes tailscale/corp#2066 (to which nobody had opinions, so)
This commit is contained in:
Brad Fitzpatrick 2021-07-19 22:24:43 -07:00
parent b6d70203d3
commit e74d37d30f
3 changed files with 94 additions and 2 deletions

View File

@ -5,9 +5,12 @@
package dns package dns
import ( import (
"bufio"
"fmt"
"sort" "sort"
"inet.af/netaddr" "inet.af/netaddr"
"tailscale.com/net/dns/resolver"
"tailscale.com/util/dnsname" "tailscale.com/util/dnsname"
) )
@ -38,6 +41,20 @@ type Config struct {
Hosts map[dnsname.FQDN][]netaddr.IP Hosts map[dnsname.FQDN][]netaddr.IP
} }
// WriteToBufioWriter write a debug version of c for logs to w, omitting
// spammy stuff like *.arpa entries and replacing it with a total count.
func (c *Config) WriteToBufioWriter(w *bufio.Writer) {
w.WriteString("{DefaultResolvers:")
resolver.WriteIPPorts(w, c.DefaultResolvers)
w.WriteString(" Routes:")
resolver.WriteRoutes(w, c.Routes)
fmt.Fprintf(w, " SearchDomains:%v", c.SearchDomains)
fmt.Fprintf(w, " Hosts:%v", len(c.Hosts))
w.WriteString("}")
}
// needsAnyResolvers reports whether c requires a resolver to be set // needsAnyResolvers reports whether c requires a resolver to be set
// at the OS level. // at the OS level.
func (c Config) needsOSResolver() bool { func (c Config) needsOSResolver() bool {

View File

@ -5,6 +5,7 @@
package dns package dns
import ( import (
"bufio"
"runtime" "runtime"
"time" "time"
@ -50,14 +51,18 @@ func NewManager(logf logger.Logf, oscfg OSConfigurator, linkMon *monitor.Mon, li
} }
func (m *Manager) Set(cfg Config) error { func (m *Manager) Set(cfg Config) error {
m.logf("Set: %+v", cfg) m.logf("Set: %v", logger.ArgWriter(func(w *bufio.Writer) {
cfg.WriteToBufioWriter(w)
}))
rcfg, ocfg, err := m.compileConfig(cfg) rcfg, ocfg, err := m.compileConfig(cfg)
if err != nil { if err != nil {
return err return err
} }
m.logf("Resolvercfg: %+v", rcfg) m.logf("Resolvercfg: %v", logger.ArgWriter(func(w *bufio.Writer) {
rcfg.WriteToBufioWriter(w)
}))
m.logf("OScfg: %+v", ocfg) m.logf("OScfg: %+v", ocfg)
if err := m.resolver.SetConfig(rcfg); err != nil { if err := m.resolver.SetConfig(rcfg); err != nil {

View File

@ -7,8 +7,10 @@
package resolver package resolver
import ( import (
"bufio"
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt"
"runtime" "runtime"
"sort" "sort"
"strings" "strings"
@ -79,6 +81,74 @@ type Config struct {
LocalDomains []dnsname.FQDN LocalDomains []dnsname.FQDN
} }
// WriteToBufioWriter write a debug version of c for logs to w, omitting
// spammy stuff like *.arpa entries and replacing it with a total count.
func (c *Config) WriteToBufioWriter(w *bufio.Writer) {
w.WriteString("{Routes:")
WriteRoutes(w, c.Routes)
fmt.Fprintf(w, " Hosts:%v LocalDomains:[", len(c.Hosts))
space := false
arpa := 0
for _, d := range c.LocalDomains {
if strings.HasSuffix(string(d), ".arpa.") {
arpa++
continue
}
if space {
w.WriteByte(' ')
}
w.WriteString(string(d))
space = true
}
w.WriteString("]")
if arpa > 0 {
fmt.Fprintf(w, "+%darpa", arpa)
}
w.WriteString("}")
}
// WriteIPPorts writes vv to w.
func WriteIPPorts(w *bufio.Writer, vv []netaddr.IPPort) {
w.WriteByte('[')
var b []byte
for i, v := range vv {
if i > 0 {
w.WriteByte(' ')
}
b = v.AppendTo(b[:0])
w.Write(b)
}
w.WriteByte(']')
}
// WriteRoutes writes routes to w, omitting *.arpa routes and instead
// summarizing how many of them there were.
func WriteRoutes(w *bufio.Writer, routes map[dnsname.FQDN][]netaddr.IPPort) {
var kk []dnsname.FQDN
arpa := 0
for k := range routes {
if strings.HasSuffix(string(k), ".arpa.") {
arpa++
continue
}
kk = append(kk, k)
}
sort.Slice(kk, func(i, j int) bool { return kk[i] < kk[j] })
w.WriteByte('{')
for i, k := range kk {
if i > 0 {
w.WriteByte(' ')
}
w.WriteString(string(k))
w.WriteByte(':')
WriteIPPorts(w, routes[k])
}
w.WriteByte('}')
if arpa > 0 {
fmt.Fprintf(w, "+%darpa", arpa)
}
}
// Resolver is a DNS resolver for nodes on the Tailscale network, // Resolver is a DNS resolver for nodes on the Tailscale network,
// associating them with domain names of the form <mynode>.<mydomain>.<root>. // associating them with domain names of the form <mynode>.<mydomain>.<root>.
// If it is asked to resolve a domain that is not of that form, // If it is asked to resolve a domain that is not of that form,