[tor-commits] [metrics-web/master] Add Tor Cloud bridges graph and .csv export.

karsten at torproject.org karsten at torproject.org
Thu Jun 14 07:01:17 UTC 2012


commit 3c63bb7dd8d75e7fa9a8805980117936bf93583f
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Thu Jun 14 09:00:47 2012 +0200

    Add Tor Cloud bridges graph and .csv export.
---
 etc/web.xml                                        |    4 ++
 rserve/csv.R                                       |   12 +++++++
 rserve/graphs.R                                    |   33 ++++++++++++++++++++
 src/org/torproject/ernie/web/GraphDataServlet.java |    1 +
 src/org/torproject/ernie/web/RObjectGenerator.java |    2 +
 web/WEB-INF/network.jsp                            |   32 +++++++++++++++++++
 6 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/etc/web.xml b/etc/web.xml
index a5bd7be..24f3ba2 100644
--- a/etc/web.xml
+++ b/etc/web.xml
@@ -163,6 +163,10 @@
   </servlet-mapping>
   <servlet-mapping>
     <servlet-name>GraphImage</servlet-name>
+    <url-pattern>/cloudbridges.png</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>GraphImage</servlet-name>
     <url-pattern>/relaycountries.png</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
diff --git a/rserve/csv.R b/rserve/csv.R
index 596d305..6d76bf7 100644
--- a/rserve/csv.R
+++ b/rserve/csv.R
@@ -15,6 +15,18 @@ export_networksize <- function(path) {
   write.csv(networksize, path, quote = FALSE, row.names = FALSE)
 }
 
+export_cloudbridges <- function(path) {
+  drv <- dbDriver("PostgreSQL")
+  con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
+  q <- paste("SELECT date, avg_running_ec2 AS cloudbridges",
+      "FROM bridge_network_size ORDER BY date")
+  rs <- dbSendQuery(con, q)
+  cloudbridges <- fetch(rs, n = -1)
+  dbDisconnect(con)
+  dbUnloadDriver(drv)
+  write.csv(cloudbridges, path, quote = FALSE, row.names = FALSE)
+}
+
 export_relaycountries <- function(path) {
   drv <- dbDriver("PostgreSQL")
   con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
diff --git a/rserve/graphs.R b/rserve/graphs.R
index 61c12f7..f5575c3 100644
--- a/rserve/graphs.R
+++ b/rserve/graphs.R
@@ -324,6 +324,39 @@ plot_networksize <- function(start, end, path, dpi) {
   ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
 }
 
+plot_cloudbridges <- function(start, end, path, dpi) {
+  drv <- dbDriver("PostgreSQL")
+  con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
+  q <- paste("SELECT date, avg_running_ec2 ",
+      "FROM bridge_network_size WHERE date >= '", start,
+      "' AND date <= '", end, "'", sep = "")
+  rs <- dbSendQuery(con, q)
+  bridges <- fetch(rs, n = -1)
+  dbDisconnect(con)
+  dbUnloadDriver(drv)
+  dates <- seq(from = as.Date(start, "%Y-%m-%d"),
+      to = as.Date(end, "%Y-%m-%d"), by="1 day")
+  missing <- setdiff(dates, bridges$date)
+  if (length(missing) > 0)
+    bridges <- rbind(bridges,
+        data.frame(date = as.Date(missing, origin = "1970-01-01"),
+        avg_running_ec2 = NA))
+  date_breaks <- date_breaks(
+    as.numeric(max(as.Date(bridges$date, "%Y-%m-%d")) -
+    min(as.Date(bridges$date, "%Y-%m-%d"))))
+  ggplot(bridges, aes(x = as.Date(date, "%Y-%m-%d"),
+      y = avg_running_ec2)) +
+    geom_line(size = 1, colour = "green3") +
+    scale_x_date(name = paste("\nThe Tor Project - ",
+        "https://metrics.torproject.org/", sep = ""),
+        format = date_breaks$format, major = date_breaks$major,
+        minor = date_breaks$minor) +
+    scale_y_continuous(name = "", limits = c(0,
+        max(bridges$avg_running_ec2, na.rm = TRUE))) +
+    opts(title = "Number of Tor Cloud bridges\n")
+  ggsave(filename = path, width = 8, height = 5, dpi = as.numeric(dpi))
+}
+
 plot_relaycountries <- function(start, end, country, path, dpi) {
   drv <- dbDriver("PostgreSQL")
   con <- dbConnect(drv, user = dbuser, password = dbpassword, dbname = db)
diff --git a/src/org/torproject/ernie/web/GraphDataServlet.java b/src/org/torproject/ernie/web/GraphDataServlet.java
index b335994..209aefe 100644
--- a/src/org/torproject/ernie/web/GraphDataServlet.java
+++ b/src/org/torproject/ernie/web/GraphDataServlet.java
@@ -53,6 +53,7 @@ public class GraphDataServlet extends HttpServlet {
     this.availableGraphDataFiles = new TreeMap<String, String>();
     this.availableGraphDataFiles.put("relays", "networksize");
     this.availableGraphDataFiles.put("bridges", "networksize");
+    this.availableGraphDataFiles.put("cloudbridges", "cloudbridges");
     this.availableGraphDataFiles.put("relays-by-country",
         "relaycountries");
     this.availableGraphDataFiles.put("relays-by-flags", "relayflags");
diff --git a/src/org/torproject/ernie/web/RObjectGenerator.java b/src/org/torproject/ernie/web/RObjectGenerator.java
index 8350de9..993bc59 100644
--- a/src/org/torproject/ernie/web/RObjectGenerator.java
+++ b/src/org/torproject/ernie/web/RObjectGenerator.java
@@ -57,6 +57,7 @@ public class RObjectGenerator implements ServletContextListener {
     this.availableCsvFiles.add("bridge-users");
     this.availableCsvFiles.add("bwhist-flags");
     this.availableCsvFiles.add("connbidirect");
+    this.availableCsvFiles.add("cloudbridges");
     this.availableCsvFiles.add("direct-users");
     this.availableCsvFiles.add("dirreq-stats");
     this.availableCsvFiles.add("dirbytes");
@@ -80,6 +81,7 @@ public class RObjectGenerator implements ServletContextListener {
 
     this.availableGraphs = new HashMap<String, String>();
     this.availableGraphs.put("networksize", "start,end,filename,dpi");
+    this.availableGraphs.put("cloudbridges", "start,end,filename,dpi");
     this.availableGraphs.put("relaycountries",
         "start,end,country,filename,dpi");
     this.availableGraphs.put("relayflags", "start,end,flag,granularity,"
diff --git a/web/WEB-INF/network.jsp b/web/WEB-INF/network.jsp
index 73205e0..fa7732f 100644
--- a/web/WEB-INF/network.jsp
+++ b/web/WEB-INF/network.jsp
@@ -197,6 +197,38 @@ platform.</p>
 <p><a href="csv/platforms.csv">CSV</a> file containing all data.</p>
 <br>
 
+<a name="cloudbridges"></a>
+<h3><a href="#cloudbridges" class="anchor">Tor Cloud bridges</a></h3>
+<br>
+<p>The following graph shows the average daily number of
+<a href="http://cloud.torproject.org/">Tor Cloud</a> bridges in the
+network.</p>
+<img src="cloudbridges.png${cloudbridges_url}"
+     width="576" height="360" alt="Tor Cloud bridges graph">
+<form action="network.html#cloudbridges">
+  <div class="formrow">
+    <input type="hidden" name="graph" value="cloudbridges">
+    <p>
+    <label>Start date (yyyy-mm-dd):</label>
+      <input type="text" name="start" size="10"
+             value="<c:choose><c:when test="${fn:length(cloudbridges_start) == 0}">${default_start_date}</c:when><c:otherwise>${cloudbridges_start[0]}</c:otherwise></c:choose>">
+    <label>End date (yyyy-mm-dd):</label>
+      <input type="text" name="end" size="10"
+             value="<c:choose><c:when test="${fn:length(cloudbridges_end) == 0}">${default_end_date}</c:when><c:otherwise>${cloudbridges_end[0]}</c:otherwise></c:choose>">
+    </p><p>
+      Resolution: <select name="dpi">
+        <option value="72"<c:if test="${cloudbridges_dpi[0] eq '72'}"> selected</c:if>>Screen - 576x360</option>
+        <option value="150"<c:if test="${cloudbridges_dpi[0] eq '150'}"> selected</c:if>>Print low - 1200x750</option>
+        <option value="300"<c:if test="${cloudbridges_dpi[0] eq '300'}"> selected</c:if>>Print high - 2400x1500</option>
+      </select>
+    </p><p>
+    <input class="submit" type="submit" value="Update graph">
+    </p>
+  </div>
+</form>
+<p><a href="csv/cloudbridges.csv">CSV</a> file containing all data.</p>
+<br>
+
 <a name="bandwidth"></a>
 <h3><a href="#bandwidth" class="anchor">Total relay bandwidth in the
 network</a></h3>



More information about the tor-commits mailing list