[tor-commits] [snowflake/master] Sort snowflake-ips stats by country count.

cohosh at torproject.org cohosh at torproject.org
Thu Dec 3 20:13:49 UTC 2020


commit 5efcde518796e319231fd68c816e1ab74dd66129
Author: Philipp Winter <phw at nymity.ch>
Date:   Fri Nov 27 11:04:00 2020 -0800

    Sort snowflake-ips stats by country count.
    
    We currently don't sort the snowflake-ips metrics:
    
        snowflake-ips CA=1,DE=1,AR=1,NL=1,FR=1,GB=2,US=4,CH=1
    
    To facilitate eyeballing our metrics, this patch sorts snowflake-ips by
    value.  If the value is identical, we sort by string, i.e.:
    
        snowflake-ips US=4,GB=2,AR=1,CA=1,CH=1,DE=1,FR=1,NL=1
    
    This patch fixes tpo/anti-censorship/pluggable-transports/snowflake#40011
---
 broker/metrics.go               | 25 ++++++++++++++++++++++++-
 broker/snowflake-broker_test.go | 15 +++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/broker/metrics.go b/broker/metrics.go
index d1beae2..c3ffa92 100644
--- a/broker/metrics.go
+++ b/broker/metrics.go
@@ -10,6 +10,7 @@ import (
 	"log"
 	"math"
 	"net"
+	"sort"
 	"sync"
 	"time"
 )
@@ -51,10 +52,32 @@ type Metrics struct {
 	lock sync.Mutex
 }
 
+type record struct {
+	cc    string
+	count int
+}
+type records []record
+
+func (r records) Len() int      { return len(r) }
+func (r records) Swap(i, j int) { r[i], r[j] = r[j], r[i] }
+func (r records) Less(i, j int) bool {
+	if r[i].count == r[j].count {
+		return r[i].cc > r[j].cc
+	}
+	return r[i].count < r[j].count
+}
+
 func (s CountryStats) Display() string {
 	output := ""
+
+	// Use the records struct to sort our counts map by value.
+	rs := records{}
 	for cc, count := range s.counts {
-		output += fmt.Sprintf("%s=%d,", cc, count)
+		rs = append(rs, record{cc: cc, count: count})
+	}
+	sort.Sort(sort.Reverse(rs))
+	for _, r := range rs {
+		output += fmt.Sprintf("%s=%d,", r.cc, r.count)
 	}
 
 	// cut off trailing ","
diff --git a/broker/snowflake-broker_test.go b/broker/snowflake-broker_test.go
index 4e8e5f0..7b87313 100644
--- a/broker/snowflake-broker_test.go
+++ b/broker/snowflake-broker_test.go
@@ -679,5 +679,20 @@ func TestMetrics(t *testing.T) {
 			ctx.metrics.printMetrics()
 			So(buf.String(), ShouldContainSubstring, "client-denied-count 8\nclient-restricted-denied-count 8\nclient-unrestricted-denied-count 0\nclient-snowflake-match-count 0")
 		})
+		Convey("for country stats order", func() {
+
+			stats := map[string]int{
+				"IT": 50,
+				"FR": 200,
+				"TZ": 100,
+				"CN": 250,
+				"RU": 150,
+				"CA": 1,
+				"BE": 1,
+				"PH": 1,
+			}
+			ctx.metrics.countryStats.counts = stats
+			So(ctx.metrics.countryStats.Display(), ShouldEqual, "CN=250,FR=200,RU=150,TZ=100,IT=50,BE=1,CA=1,PH=1")
+		})
 	})
 }



More information about the tor-commits mailing list