commit 25f059f4c4adf98a6ae9bdeae731e3f8ff3d609e Author: Cecylia Bocovich cohosh@torproject.org Date: Tue Jun 11 15:43:59 2019 -0400
Log geoip stats of proxies by unique IP
Change it so that we log the geoip country code of proxies if they poll within the current metrics epoch. We make sure we log by unique IP address --- broker/broker.go | 18 +++++++++--------- broker/metrics.go | 10 ++++++++-- 2 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/broker/broker.go b/broker/broker.go index 3795f2b..26fc450 100644 --- a/broker/broker.go +++ b/broker/broker.go @@ -149,6 +149,15 @@ func proxyPolls(ctx *BrokerContext, w http.ResponseWriter, r *http.Request) { return } log.Println("Received snowflake: ", id) + + // Log geoip stats + remoteIP, _, err := net.SplitHostPort(r.RemoteAddr) + if err != nil { + log.Println("Error processing proxy IP: ", err.Error()) + } else { + ctx.metrics.UpdateCountryStats(remoteIP) + } + // Wait for a client to avail an offer to the snowflake, or timeout if nil. offer := ctx.RequestOffer(id) if nil == offer { @@ -224,15 +233,6 @@ func proxyAnswers(ctx *BrokerContext, w http.ResponseWriter, r *http.Request) { return }
- // Get proxy country stats - remoteIP, _, err := net.SplitHostPort(r.RemoteAddr) - if err != nil { - log.Println("Error processing proxy IP: ", err.Error()) - } else { - - ctx.metrics.UpdateCountryStats(remoteIP) - } - log.Println("Received answer.") snowflake.answerChannel <- body } diff --git a/broker/metrics.go b/broker/metrics.go index a7f077a..b03c6db 100644 --- a/broker/metrics.go +++ b/broker/metrics.go @@ -17,6 +17,7 @@ var ( const metricsResolution = 86400 * time.Second
type CountryStats struct { + ips map[string]bool counts map[string]int }
@@ -65,8 +66,11 @@ func (m *Metrics) UpdateCountryStats(addr string) { log.Println("Unknown geoip") }
- //update map of countries and counts - m.countryStats.counts[country]++ + //update map of unique ips and counts + if !m.countryStats.ips[addr] { + m.countryStats.counts[country]++ + m.countryStats.ips[addr] = true + }
return } @@ -101,6 +105,7 @@ func NewMetrics(metricsLogger *log.Logger) (*Metrics, error) {
m.countryStats = CountryStats{ counts: make(map[string]int), + ips: make(map[string]bool), }
m.logger = metricsLogger @@ -126,6 +131,7 @@ func (m *Metrics) logMetrics() { m.clientDeniedCount = 0 m.clientProxyMatchCount = 0 m.countryStats.counts = make(map[string]int) + m.countryStats.ips = make(map[string]bool) } }