commit 5efcde518796e319231fd68c816e1ab74dd66129
Author: Philipp Winter <[email protected]>
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")
+               })
        })
 }

_______________________________________________
tor-commits mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits

Reply via email to