Metrics: track the use of TCP vs. UDP

Why implement a feature w/out measuring how much it gets used?

I want to know who, if anyone, is using TCP queries.

TODO: update the documentation.
This commit is contained in:
Brian Cunnie
2023-10-01 18:35:49 -07:00
parent 358d85bb04
commit ce94dfc20b
3 changed files with 38 additions and 1 deletions

View File

@@ -20,22 +20,35 @@ var _ = Describe("IntegrationMetrics", func() {
var actualMetrics xip.Metrics
expectedMetrics := getMetrics(port)
// A updates .Queries, .AnsweredQueries, .AnsweredAQueries
// A updates .Queries, UDPQueries .AnsweredQueries, .AnsweredAQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredAQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost 127.0.0.1.sslip.io +short -p "+strconv.Itoa(port), port)
Expect(expectedMetrics.MostlyEquals(actualMetrics)).To(BeTrue())
// A updates .Queries, TCPQueries .AnsweredQueries, .AnsweredAQueries
expectedMetrics.Queries++
expectedMetrics.TCPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredAQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
// "+vc" runs the lookup over TCP, not UDP
actualMetrics = digAndGetMetrics("@localhost 127.0.0.1.sslip.io +short +vc -p "+strconv.Itoa(port), port)
Expect(expectedMetrics.MostlyEquals(actualMetrics)).To(BeTrue())
// A (non-existent) record updates .Queries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost non-existent.sslip.io +short -p "+strconv.Itoa(port), port)
Expect(expectedMetrics.MostlyEquals(actualMetrics)).To(BeTrue())
// A blocked updates .Queries, .AnsweredQueries, .AnsweredBlockedQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredBlockedQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
@@ -45,6 +58,7 @@ var _ = Describe("IntegrationMetrics", func() {
// AAAA updates .Queries, .AnsweredQueries, .AnsweredAAAAQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredAAAAQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
@@ -53,12 +67,14 @@ var _ = Describe("IntegrationMetrics", func() {
// AAAA (non-existent) updates .Queries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost non-existent.sslip.io aaaa +short -p "+strconv.Itoa(port), port)
Expect(expectedMetrics.MostlyEquals(actualMetrics)).To(BeTrue())
// MX (customized) updates .Queries, .AnsweredQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost sslip.io mx +short -p "+strconv.Itoa(port), port)
@@ -66,6 +82,7 @@ var _ = Describe("IntegrationMetrics", func() {
// MX updates .Queries, AnsweredQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost non-existent.sslip.io mx +short -p "+strconv.Itoa(port), port)
@@ -73,6 +90,7 @@ var _ = Describe("IntegrationMetrics", func() {
// NS updates .Queries, AnsweredQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost non-existent.sslip.io ns +short -p "+strconv.Itoa(port), port)
@@ -80,6 +98,7 @@ var _ = Describe("IntegrationMetrics", func() {
// NS DNS-01 challenge record updates .Queries, .AnsweredNSDNS01ChallengeQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
// DNS-01 challenges don't count as successful because we're not authoritative; we're delegating
expectedMetrics.AnsweredNSDNS01ChallengeQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
@@ -88,6 +107,7 @@ var _ = Describe("IntegrationMetrics", func() {
// Always successful: SOA
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
dig("@localhost non-existent.sslip.io soa +short -p " + strconv.Itoa(port))
@@ -96,6 +116,7 @@ var _ = Describe("IntegrationMetrics", func() {
// TXT sslip.io (customized) updates .Queries, .AnsweredQueries,
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost sslip.io txt +short -p "+strconv.Itoa(port), port)
@@ -103,12 +124,14 @@ var _ = Describe("IntegrationMetrics", func() {
// TXT sslip.io (non-existent) updates .Queries, .AnsweredQueries,
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost non-existent.sslip.io txt +short -p "+strconv.Itoa(port), port)
Expect(expectedMetrics.MostlyEquals(actualMetrics)).To(BeTrue())
// TXT ip.sslip.io updates .Queries, .AnsweredQueries, .AnsweredTXTSrcIPQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredTXTSrcIPQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
@@ -117,6 +140,7 @@ var _ = Describe("IntegrationMetrics", func() {
// TXT version.sslip.io updates .Queries, .AnsweredQueries, .AnsweredTXTVersionQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredTXTVersionQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
@@ -125,6 +149,7 @@ var _ = Describe("IntegrationMetrics", func() {
// PTR version.sslip.io updates .Queries, .AnsweredQueries, .AnsweredPTRQueriesIPv4
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredPTRQueriesIPv4++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
@@ -133,6 +158,7 @@ var _ = Describe("IntegrationMetrics", func() {
// PTR version.sslip.io updates .Queries, .AnsweredQueries, .AnsweredPTRQueriesIPv6
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredQueries++
expectedMetrics.AnsweredPTRQueriesIPv6++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
@@ -141,6 +167,7 @@ var _ = Describe("IntegrationMetrics", func() {
// TXT DNS-01 challenge record updates .Queries, .AnsweredNSDNS01ChallengeQueries
expectedMetrics.Queries++
expectedMetrics.UDPQueries++
expectedMetrics.AnsweredNSDNS01ChallengeQueries++
expectedMetrics = bumpExpectedToAccountForMetricsQuery(expectedMetrics)
actualMetrics = digAndGetMetrics("@localhost _acme-challenge.fe80--.sslip.io txt +short -p "+strconv.Itoa(port), port)
@@ -154,6 +181,7 @@ var _ = Describe("IntegrationMetrics", func() {
// the Heisenberg uncertainty principle (observing changes the values)
func bumpExpectedToAccountForMetricsQuery(metrics xip.Metrics) xip.Metrics {
metrics.Queries++
metrics.UDPQueries++
metrics.AnsweredQueries++
return metrics
}
@@ -181,6 +209,7 @@ func getMetrics(port int) (m xip.Metrics) {
"\"Uptime: %d\"\n"+
"\"Blocklist: %s %s %s\n"+
"\"Queries: %d (%s\n"+ // %s "swallows" the `/s"` at the end
"\"TCP/UDP: %d/%d\"\n"+
"\"Answered Queries: %d (%s\n"+ // %s "swallows" the `/s"` at the end
"\"A: %d\"\n"+
"\"AAAA: %d\"\n"+
@@ -192,6 +221,7 @@ func getMetrics(port int) (m xip.Metrics) {
&uptime,
&junk, &junk, &junk,
&m.Queries, &junk,
&m.TCPQueries, &m.UDPQueries,
&m.AnsweredQueries, &junk,
&m.AnsweredAQueries,
&m.AnsweredAAAAQueries,

View File

@@ -130,6 +130,7 @@ func readFromUDP(conn *net.UDPConn, x *xip.Xip, quiet bool) {
if !quiet {
log.Printf("%v.%d %s", addr.IP, addr.Port, logMessage)
}
x.Metrics.UDPQueries += 1
}()
}
}
@@ -167,6 +168,7 @@ func readFromTCP(tcpListener *net.TCPListener, x *xip.Xip, quiet bool) {
if !quiet {
log.Printf("%s.%s %s", addr, port, logMessage)
}
x.Metrics.TCPQueries += 1
}()
}
}

View File

@@ -37,6 +37,8 @@ type Xip struct {
type Metrics struct {
Start time.Time
Queries int
TCPQueries int
UDPQueries int
AnsweredQueries int
AnsweredAQueries int
AnsweredAAAAQueries int
@@ -892,6 +894,7 @@ func TXTMetrics(x *Xip, _ net.IP) (txtResources []dnsmessage.TXTResource, err er
len(x.BlocklistStrings),
len(x.BlocklistCDIRs)))
metrics = append(metrics, fmt.Sprintf("Queries: %d (%.1f/s)", x.Metrics.Queries, float64(x.Metrics.Queries)/uptime.Seconds()))
metrics = append(metrics, fmt.Sprintf("TCP/UDP: %d/%d", x.Metrics.TCPQueries, x.Metrics.UDPQueries))
metrics = append(metrics, fmt.Sprintf("Answered Queries: %d (%.1f/s)", x.Metrics.AnsweredQueries, float64(x.Metrics.AnsweredQueries)/uptime.Seconds()))
metrics = append(metrics, fmt.Sprintf("A: %d", x.Metrics.AnsweredAQueries))
metrics = append(metrics, fmt.Sprintf("AAAA: %d", x.Metrics.AnsweredAAAAQueries))
@@ -920,6 +923,8 @@ func soaLogMessage(soaResource dnsmessage.SOAResource) string {
// MostlyEquals compares all fields except `Start` (timestamp)
func (a Metrics) MostlyEquals(b Metrics) bool {
if a.Queries == b.Queries &&
a.TCPQueries == b.TCPQueries &&
a.UDPQueries == b.UDPQueries &&
a.AnsweredQueries == b.AnsweredQueries &&
a.AnsweredAQueries == b.AnsweredAQueries &&
a.AnsweredAAAAQueries == b.AnsweredAAAAQueries &&