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") + }) }) }