[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [snowflake/master] Add proxy type to stats exported by broker
commit 981abffbd93673c483a0d41631e472303b3fd0aa
Author: Cecylia Bocovich <cohosh@xxxxxxxxxxxxxx>
Date: Wed Nov 20 13:27:04 2019 -0500
Add proxy type to stats exported by broker
---
broker/broker.go | 2 +-
broker/metrics.go | 73 +++++++++++++++++++++++++++++++++++------
broker/snowflake-broker_test.go | 58 +++++++++++++++++++++++++-------
3 files changed, 111 insertions(+), 22 deletions(-)
diff --git a/broker/broker.go b/broker/broker.go
index 3edfe84..e897ffd 100644
--- a/broker/broker.go
+++ b/broker/broker.go
@@ -173,7 +173,7 @@ func proxyPolls(ctx *BrokerContext, w http.ResponseWriter, r *http.Request) {
if err != nil {
log.Println("Error processing proxy IP: ", err.Error())
} else {
- ctx.metrics.UpdateCountryStats(remoteIP)
+ ctx.metrics.UpdateCountryStats(remoteIP, ptype)
}
// Wait for a client to avail an offer to the snowflake, or timeout if nil.
diff --git a/broker/metrics.go b/broker/metrics.go
index 15a4a88..b5c423c 100644
--- a/broker/metrics.go
+++ b/broker/metrics.go
@@ -19,6 +19,24 @@ We export metrics in the following format:
A count of the total number of unique IP addresses of snowflake
proxies that have polled.
+ "snowflake-ips-standalone" NUM NL
+ [At most once.]
+
+ A count of the total number of unique IP addresses of snowflake
+ proxies of type "standalone" that have polled.
+
+ "snowflake-ips-badge" NUM NL
+ [At most once.]
+
+ A count of the total number of unique IP addresses of snowflake
+ proxies of type "badge" that have polled.
+
+ "snowflake-ips-webext" NUM NL
+ [At most once.]
+
+ A count of the total number of unique IP addresses of snowflake
+ proxies of type "webext" that have polled.
+
"snowflake-idle-count" NUM NL
[At most once.]
@@ -58,8 +76,11 @@ var (
const metricsResolution = 60 * 60 * 24 * time.Second //86400 seconds
type CountryStats struct {
- addrs map[string]bool
- counts map[string]int
+ standalone map[string]bool
+ badge map[string]bool
+ webext map[string]bool
+ unknown map[string]bool
+ counts map[string]int
}
// Implements Observable
@@ -89,13 +110,27 @@ func (s CountryStats) Display() string {
return output
}
-func (m *Metrics) UpdateCountryStats(addr string) {
+func (m *Metrics) UpdateCountryStats(addr string, ptype string) {
var country string
var ok bool
- if m.countryStats.addrs[addr] {
- return
+ if ptype == "standalone" {
+ if m.countryStats.standalone[addr] {
+ return
+ }
+ } else if ptype == "badge" {
+ if m.countryStats.badge[addr] {
+ return
+ }
+ } else if ptype == "webext" {
+ if m.countryStats.webext[addr] {
+ return
+ }
+ } else {
+ if m.countryStats.unknown[addr] {
+ return
+ }
}
ip := net.ParseIP(addr)
@@ -118,7 +153,15 @@ func (m *Metrics) UpdateCountryStats(addr string) {
//update map of unique ips and counts
m.countryStats.counts[country]++
- m.countryStats.addrs[addr] = true
+ if ptype == "standalone" {
+ m.countryStats.standalone[addr] = true
+ } else if ptype == "badge" {
+ m.countryStats.badge[addr] = true
+ } else if ptype == "webext" {
+ m.countryStats.webext[addr] = true
+ } else {
+ m.countryStats.unknown[addr] = true
+ }
}
@@ -148,8 +191,11 @@ func NewMetrics(metricsLogger *log.Logger) (*Metrics, error) {
m := new(Metrics)
m.countryStats = CountryStats{
- counts: make(map[string]int),
- addrs: make(map[string]bool),
+ counts: make(map[string]int),
+ standalone: make(map[string]bool),
+ badge: make(map[string]bool),
+ webext: make(map[string]bool),
+ unknown: make(map[string]bool),
}
m.logger = metricsLogger
@@ -172,7 +218,11 @@ func (m *Metrics) logMetrics() {
func (m *Metrics) printMetrics() {
m.logger.Println("snowflake-stats-end", time.Now().UTC().Format("2006-01-02 15:04:05"), fmt.Sprintf("(%d s)", int(metricsResolution.Seconds())))
m.logger.Println("snowflake-ips", m.countryStats.Display())
- m.logger.Println("snowflake-ips-total", len(m.countryStats.addrs))
+ m.logger.Println("snowflake-ips-total", len(m.countryStats.standalone)+
+ len(m.countryStats.badge)+len(m.countryStats.webext)+len(m.countryStats.unknown))
+ m.logger.Println("snowflake-ips-standalone", len(m.countryStats.standalone))
+ m.logger.Println("snowflake-ips-badge", len(m.countryStats.badge))
+ m.logger.Println("snowflake-ips-webext", len(m.countryStats.webext))
m.logger.Println("snowflake-idle-count", binCount(m.proxyIdleCount))
m.logger.Println("client-denied-count", binCount(m.clientDeniedCount))
m.logger.Println("client-snowflake-match-count", binCount(m.clientProxyMatchCount))
@@ -184,7 +234,10 @@ func (m *Metrics) zeroMetrics() {
m.clientDeniedCount = 0
m.clientProxyMatchCount = 0
m.countryStats.counts = make(map[string]int)
- m.countryStats.addrs = make(map[string]bool)
+ m.countryStats.standalone = make(map[string]bool)
+ m.countryStats.badge = make(map[string]bool)
+ m.countryStats.webext = make(map[string]bool)
+ m.countryStats.unknown = make(map[string]bool)
}
// Rounds up a count to the nearest multiple of 8.
diff --git a/broker/snowflake-broker_test.go b/broker/snowflake-broker_test.go
index cb5f34f..b23e688 100644
--- a/broker/snowflake-broker_test.go
+++ b/broker/snowflake-broker_test.go
@@ -387,7 +387,7 @@ func TestGeoip(t *testing.T) {
if err := ctx.metrics.LoadGeoipDatabases("invalid_filename", "invalid_filename6"); err != nil {
log.Printf("loading geo ip databases returned error: %v", err)
}
- ctx.metrics.UpdateCountryStats("127.0.0.1")
+ ctx.metrics.UpdateCountryStats("127.0.0.1", "")
So(ctx.metrics.tablev4, ShouldEqual, nil)
})
@@ -408,7 +408,6 @@ func TestMetrics(t *testing.T) {
w := httptest.NewRecorder()
data := bytes.NewReader([]byte("{\"Sid\":\"ymbcCMto7KHNGYlp\",\"Version\":\"1.0\"}"))
r, err := http.NewRequest("POST", "snowflake.broker/proxy", data)
- r.Header.Set("X-Session-ID", "test")
r.RemoteAddr = "129.97.208.23:8888" //CA geoip
So(err, ShouldBeNil)
go func(ctx *BrokerContext) {
@@ -419,8 +418,47 @@ func TestMetrics(t *testing.T) {
p.offerChannel <- nil
<-done
+ w = httptest.NewRecorder()
+ data = bytes.NewReader([]byte(`{"Sid":"ymbcCMto7KHNGYlp","Version":"1.0","Type":"standalone"}`))
+ r, err = http.NewRequest("POST", "snowflake.broker/proxy", data)
+ r.RemoteAddr = "129.97.208.23:8888" //CA geoip
+ So(err, ShouldBeNil)
+ go func(ctx *BrokerContext) {
+ proxyPolls(ctx, w, r)
+ done <- true
+ }(ctx)
+ p = <-ctx.proxyPolls //manually unblock poll
+ p.offerChannel <- nil
+ <-done
+
+ w = httptest.NewRecorder()
+ data = bytes.NewReader([]byte(`{"Sid":"ymbcCMto7KHNGYlp","Version":"1.0","Type":"badge"}`))
+ r, err = http.NewRequest("POST", "snowflake.broker/proxy", data)
+ r.RemoteAddr = "129.97.208.23:8888" //CA geoip
+ So(err, ShouldBeNil)
+ go func(ctx *BrokerContext) {
+ proxyPolls(ctx, w, r)
+ done <- true
+ }(ctx)
+ p = <-ctx.proxyPolls //manually unblock poll
+ p.offerChannel <- nil
+ <-done
+
+ w = httptest.NewRecorder()
+ data = bytes.NewReader([]byte(`{"Sid":"ymbcCMto7KHNGYlp","Version":"1.0","Type":"webext"}`))
+ r, err = http.NewRequest("POST", "snowflake.broker/proxy", data)
+ r.RemoteAddr = "129.97.208.23:8888" //CA geoip
+ So(err, ShouldBeNil)
+ go func(ctx *BrokerContext) {
+ proxyPolls(ctx, w, r)
+ done <- true
+ }(ctx)
+ p = <-ctx.proxyPolls //manually unblock poll
+ p.offerChannel <- nil
+ <-done
ctx.metrics.printMetrics()
- So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips CA=1\nsnowflake-ips-total 1\nsnowflake-idle-count 8\nclient-denied-count 0\nclient-snowflake-match-count 0\n")
+ So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips CA=4\nsnowflake-ips-total 4\nsnowflake-ips-standalone 1\nsnowflake-ips-badge 1\nsnowflake-ips-webext 1\nsnowflake-idle-count 8\nclient-denied-count 0\nclient-snowflake-match-count 0\n")
+
})
//Test addition of client failures
@@ -433,13 +471,13 @@ func TestMetrics(t *testing.T) {
clientOffers(ctx, w, r)
ctx.metrics.printMetrics()
- So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-idle-count 0\nclient-denied-count 8\nclient-snowflake-match-count 0\n")
+ So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-ips-standalone 0\nsnowflake-ips-badge 0\nsnowflake-ips-webext 0\nsnowflake-idle-count 0\nclient-denied-count 8\nclient-snowflake-match-count 0\n")
// Test reset
buf.Reset()
ctx.metrics.zeroMetrics()
ctx.metrics.printMetrics()
- So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-idle-count 0\nclient-denied-count 0\nclient-snowflake-match-count 0\n")
+ So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-ips-standalone 0\nsnowflake-ips-badge 0\nsnowflake-ips-webext 0\nsnowflake-idle-count 0\nclient-denied-count 0\nclient-snowflake-match-count 0\n")
})
//Test addition of client matches
Convey("for client-proxy match", func() {
@@ -460,7 +498,7 @@ func TestMetrics(t *testing.T) {
<-done
ctx.metrics.printMetrics()
- So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-idle-count 0\nclient-denied-count 0\nclient-snowflake-match-count 8\n")
+ So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-ips-standalone 0\nsnowflake-ips-badge 0\nsnowflake-ips-webext 0\nsnowflake-idle-count 0\nclient-denied-count 0\nclient-snowflake-match-count 8\n")
})
//Test rounding boundary
Convey("binning boundary", func() {
@@ -479,12 +517,12 @@ func TestMetrics(t *testing.T) {
clientOffers(ctx, w, r)
ctx.metrics.printMetrics()
- So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-idle-count 0\nclient-denied-count 8\nclient-snowflake-match-count 0\n")
+ So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-ips-standalone 0\nsnowflake-ips-badge 0\nsnowflake-ips-webext 0\nsnowflake-idle-count 0\nclient-denied-count 8\nclient-snowflake-match-count 0\n")
clientOffers(ctx, w, r)
buf.Reset()
ctx.metrics.printMetrics()
- So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-idle-count 0\nclient-denied-count 16\nclient-snowflake-match-count 0\n")
+ So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips \nsnowflake-ips-total 0\nsnowflake-ips-standalone 0\nsnowflake-ips-badge 0\nsnowflake-ips-webext 0\nsnowflake-idle-count 0\nclient-denied-count 16\nclient-snowflake-match-count 0\n")
})
//Test unique ip
@@ -492,7 +530,6 @@ func TestMetrics(t *testing.T) {
w := httptest.NewRecorder()
data := bytes.NewReader([]byte(`{"Sid":"ymbcCMto7KHNGYlp","Version":"1.0"}`))
r, err := http.NewRequest("POST", "snowflake.broker/proxy", data)
- r.Header.Set("X-Session-ID", "test")
r.RemoteAddr = "129.97.208.23:8888" //CA geoip
So(err, ShouldBeNil)
go func(ctx *BrokerContext) {
@@ -508,7 +545,6 @@ func TestMetrics(t *testing.T) {
if err != nil {
log.Printf("unable to get NewRequest with error: %v", err)
}
- r.Header.Set("X-Session-ID", "test")
r.RemoteAddr = "129.97.208.23:8888" //CA geoip
go func(ctx *BrokerContext) {
proxyPolls(ctx, w, r)
@@ -519,7 +555,7 @@ func TestMetrics(t *testing.T) {
<-done
ctx.metrics.printMetrics()
- So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips CA=1\nsnowflake-ips-total 1\nsnowflake-idle-count 8\nclient-denied-count 0\nclient-snowflake-match-count 0\n")
+ So(buf.String(), ShouldResemble, "snowflake-stats-end "+time.Now().UTC().Format("2006-01-02 15:04:05")+" (86400 s)\nsnowflake-ips CA=1\nsnowflake-ips-total 1\nsnowflake-ips-standalone 0\nsnowflake-ips-badge 0\nsnowflake-ips-webext 0\nsnowflake-idle-count 8\nclient-denied-count 0\nclient-snowflake-match-count 0\n")
})
})
}
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits