From e74d37d30faac42ee2baa0ebf67ecc0ed762485f Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 19 Jul 2021 22:24:43 -0700 Subject: [PATCH] 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) --- net/dns/config.go | 17 ++++++++++ net/dns/manager.go | 9 +++-- net/dns/resolver/tsdns.go | 70 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 2 deletions(-) diff --git a/net/dns/config.go b/net/dns/config.go index dc0b73440..f30e13293 100644 --- a/net/dns/config.go +++ b/net/dns/config.go @@ -5,9 +5,12 @@ package dns import ( + "bufio" + "fmt" "sort" "inet.af/netaddr" + "tailscale.com/net/dns/resolver" "tailscale.com/util/dnsname" ) @@ -38,6 +41,20 @@ type Config struct { 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 // at the OS level. func (c Config) needsOSResolver() bool { diff --git a/net/dns/manager.go b/net/dns/manager.go index 398db6837..121ee1732 100644 --- a/net/dns/manager.go +++ b/net/dns/manager.go @@ -5,6 +5,7 @@ package dns import ( + "bufio" "runtime" "time" @@ -50,14 +51,18 @@ func NewManager(logf logger.Logf, oscfg OSConfigurator, linkMon *monitor.Mon, li } 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) if err != nil { 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) if err := m.resolver.SetConfig(rcfg); err != nil { diff --git a/net/dns/resolver/tsdns.go b/net/dns/resolver/tsdns.go index 96738779f..fbd8abda0 100644 --- a/net/dns/resolver/tsdns.go +++ b/net/dns/resolver/tsdns.go @@ -7,8 +7,10 @@ package resolver import ( + "bufio" "encoding/hex" "errors" + "fmt" "runtime" "sort" "strings" @@ -79,6 +81,74 @@ type Config struct { 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, // associating them with domain names of the form ... // If it is asked to resolve a domain that is not of that form,