commit bfced2c6ea12fdc10c1d5fed031edec87f56e97f Author: Karsten Loesing karsten.loesing@gmx.net Date: Thu Nov 20 11:44:58 2014 +0100
Move all graphs and tables to their own subpage. --- website/etc/web.xml | 38 ++- .../metrics/web/graphs/GraphsSubpagesServlet.java | 83 ++++-- .../web/graphs/LegacyGraphsSubpagesServlet.java | 54 ++++ website/web/WEB-INF/advbwdist-perc.jsp | 77 +++++ website/web/WEB-INF/advbwdist-relay.jsp | 69 +++++ website/web/WEB-INF/bandwidth-flags.jsp | 53 ++++ website/web/WEB-INF/bandwidth.jsp | 221 ++------------ website/web/WEB-INF/bubbles.jsp | 20 +- website/web/WEB-INF/bwhist-flags.jsp | 50 ++++ website/web/WEB-INF/cloudbridges.jsp | 52 ++++ website/web/WEB-INF/connbidirect.jsp | 58 ++++ website/web/WEB-INF/dirbytes.jsp | 53 ++++ website/web/WEB-INF/network.jsp | 165 +---------- website/web/WEB-INF/networksize.jsp | 50 ++++ website/web/WEB-INF/oxford-anonymous-internet.jsp | 38 +++ website/web/WEB-INF/performance.jsp | 135 +-------- website/web/WEB-INF/platforms.jsp | 51 ++++ website/web/WEB-INF/relayflags.jsp | 59 ++++ website/web/WEB-INF/torperf-failures.jsp | 63 ++++ website/web/WEB-INF/torperf.jsp | 64 ++++ website/web/WEB-INF/users.jsp | 311 +------------------- website/web/WEB-INF/userstats-bridge-country.jsp | 56 ++++ website/web/WEB-INF/userstats-bridge-table.jsp | 57 ++++ website/web/WEB-INF/userstats-bridge-transport.jsp | 60 ++++ website/web/WEB-INF/userstats-bridge-version.jsp | 54 ++++ .../web/WEB-INF/userstats-censorship-events.jsp | 60 ++++ website/web/WEB-INF/userstats-relay-country.jsp | 64 ++++ website/web/WEB-INF/userstats-relay-table.jsp | 57 ++++ website/web/WEB-INF/versions.jsp | 55 ++++ 29 files changed, 1417 insertions(+), 810 deletions(-)
diff --git a/website/etc/web.xml b/website/etc/web.xml index ee439f3..cc5d076 100644 --- a/website/etc/web.xml +++ b/website/etc/web.xml @@ -36,18 +36,40 @@ </servlet> <servlet-mapping> <servlet-name>GraphsSubpages</servlet-name> - <url-pattern>/network.html</url-pattern> - </servlet-mapping> - <servlet-mapping> - <servlet-name>GraphsSubpages</servlet-name> + <url-pattern>/networksize.html</url-pattern> + <url-pattern>/relayflags.html</url-pattern> + <url-pattern>/versions.html</url-pattern> + <url-pattern>/platforms.html</url-pattern> + <url-pattern>/cloudbridges.html</url-pattern> <url-pattern>/bandwidth.html</url-pattern> + <url-pattern>/bwhist-flags.html</url-pattern> + <url-pattern>/bandwidth-flags.html</url-pattern> + <url-pattern>/dirbytes.html</url-pattern> + <url-pattern>/advbwdist-perc.html</url-pattern> + <url-pattern>/advbwdist-relay.html</url-pattern> + <url-pattern>/userstats-relay-country.html</url-pattern> + <url-pattern>/userstats-relay-table.html</url-pattern> + <url-pattern>/userstats-censorship-events.html</url-pattern> + <url-pattern>/userstats-bridge-country.html</url-pattern> + <url-pattern>/userstats-bridge-table.html</url-pattern> + <url-pattern>/userstats-bridge-transport.html</url-pattern> + <url-pattern>/userstats-bridge-version.html</url-pattern> + <url-pattern>/oxford-anonymous-internet.html</url-pattern> + <url-pattern>/torperf.html</url-pattern> + <url-pattern>/torperf-failures.html</url-pattern> + <url-pattern>/connbidirect.html</url-pattern> </servlet-mapping> + + <servlet> + <servlet-name>LegacyGraphsSubpages</servlet-name> + <servlet-class> + org.torproject.metrics.web.graphs.LegacyGraphsSubpagesServlet + </servlet-class> + </servlet> <servlet-mapping> - <servlet-name>GraphsSubpages</servlet-name> + <servlet-name>LegacyGraphsSubpages</servlet-name> + <url-pattern>/network.html</url-pattern> <url-pattern>/users.html</url-pattern> - </servlet-mapping> - <servlet-mapping> - <servlet-name>GraphsSubpages</servlet-name> <url-pattern>/performance.html</url-pattern> </servlet-mapping>
diff --git a/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java b/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java index 6bbc5ca..1d8a1e5 100644 --- a/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java +++ b/website/src/org/torproject/metrics/web/graphs/GraphsSubpagesServlet.java @@ -4,13 +4,10 @@ package org.torproject.metrics.web.graphs;
import java.io.IOException; import java.text.SimpleDateFormat; -import java.util.Arrays; import java.util.Date; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.TimeZone;
import javax.servlet.ServletException; @@ -27,7 +24,7 @@ public class GraphsSubpagesServlet extends HttpServlet { private Map<String, String> availableGraphsSubpages;
/* Available tables on graphs subpages. */ - private Map<String, Set<String>> availableGraphsSubpageTables; + private Map<String, String> availableGraphsSubpageTables;
/* Country codes and names for per-country graphs. */ private List<String[]> knownCountries; @@ -37,20 +34,59 @@ public class GraphsSubpagesServlet extends HttpServlet {
public GraphsSubpagesServlet() { this.availableGraphsSubpages = new HashMap<String, String>(); - this.availableGraphsSubpages.put("network.html", - "WEB-INF/network.jsp"); + this.availableGraphsSubpages.put("networksize.html", + "WEB-INF/networksize.jsp"); + this.availableGraphsSubpages.put("relayflags.html", + "WEB-INF/relayflags.jsp"); + this.availableGraphsSubpages.put("versions.html", + "WEB-INF/versions.jsp"); + this.availableGraphsSubpages.put("platforms.html", + "WEB-INF/platforms.jsp"); + this.availableGraphsSubpages.put("cloudbridges.html", + "WEB-INF/cloudbridges.jsp"); this.availableGraphsSubpages.put("bandwidth.html", "WEB-INF/bandwidth.jsp"); - this.availableGraphsSubpages.put("users.html", "WEB-INF/users.jsp"); - this.availableGraphsSubpages.put("performance.html", - "WEB-INF/performance.jsp"); - - this.availableGraphsSubpageTables = - new HashMap<String, Set<String>>(); - this.availableGraphsSubpageTables.put("users.html", - new HashSet<String>(Arrays.asList(( - "direct-users,censorship-events,bridge-users,userstats-relay," - + "userstats-censorship-events,userstats-bridge").split(",")))); + this.availableGraphsSubpages.put("bwhist-flags.html", + "WEB-INF/bwhist-flags.jsp"); + this.availableGraphsSubpages.put("bandwidth-flags.html", + "WEB-INF/bandwidth-flags.jsp"); + this.availableGraphsSubpages.put("dirbytes.html", + "WEB-INF/dirbytes.jsp"); + this.availableGraphsSubpages.put("advbwdist-perc.html", + "WEB-INF/advbwdist-perc.jsp"); + this.availableGraphsSubpages.put("advbwdist-relay.html", + "WEB-INF/advbwdist-relay.jsp"); + this.availableGraphsSubpages.put("userstats-relay-country.html", + "WEB-INF/userstats-relay-country.jsp"); + this.availableGraphsSubpages.put("userstats-relay-table.html", + "WEB-INF/userstats-relay-table.jsp"); + this.availableGraphsSubpages.put("userstats-censorship-events.html", + "WEB-INF/userstats-censorship-events.jsp"); + this.availableGraphsSubpages.put("userstats-bridge-country.html", + "WEB-INF/userstats-bridge-country.jsp"); + this.availableGraphsSubpages.put("userstats-bridge-table.html", + "WEB-INF/userstats-bridge-table.jsp"); + this.availableGraphsSubpages.put("userstats-bridge-transport.html", + "WEB-INF/userstats-bridge-transport.jsp"); + this.availableGraphsSubpages.put("userstats-bridge-version.html", + "WEB-INF/userstats-bridge-version.jsp"); + this.availableGraphsSubpages.put("oxford-anonymous-internet.html", + "WEB-INF/oxford-anonymous-internet.jsp"); + this.availableGraphsSubpages.put("torperf.html", + "WEB-INF/torperf.jsp"); + this.availableGraphsSubpages.put("torperf-failures.html", + "WEB-INF/torperf-failures.jsp"); + this.availableGraphsSubpages.put("connbidirect.html", + "WEB-INF/connbidirect.jsp"); + + this.availableGraphsSubpageTables = new HashMap<String, String>(); + this.availableGraphsSubpageTables.put("userstats-relay-table.html", + "userstats-relay"); + this.availableGraphsSubpageTables.put( + "userstats-censorship-events.html", + "userstats-censorship-events"); + this.availableGraphsSubpageTables.put("userstats-bridge-table.html", + "userstats-bridge");
this.knownCountries = Countries.getInstance().getCountryList(); } @@ -131,14 +167,13 @@ public class GraphsSubpagesServlet extends HttpServlet { * regardless of whether a table update was requested, and add the * table data as request attribute. */ if (this.availableGraphsSubpageTables.containsKey(requestedPage)) { - for (String tableName : - this.availableGraphsSubpageTables.get(requestedPage)) { - List<Map<String, String>> tableData = rObjectGenerator. - generateTable(tableName, requestedTable, - request.getParameterMap(), true); - request.setAttribute(tableName.replaceAll("-", "_") - + "_tabledata", tableData); - } + String tableName = this.availableGraphsSubpageTables.get( + requestedPage); + List<Map<String, String>> tableData = rObjectGenerator. + generateTable(tableName, requestedTable, + request.getParameterMap(), true); + request.setAttribute(tableName.replaceAll("-", "_") + + "_tabledata", tableData); }
/* Pass list of known countries in case we want to display them. */ diff --git a/website/src/org/torproject/metrics/web/graphs/LegacyGraphsSubpagesServlet.java b/website/src/org/torproject/metrics/web/graphs/LegacyGraphsSubpagesServlet.java new file mode 100644 index 0000000..1fd1333 --- /dev/null +++ b/website/src/org/torproject/metrics/web/graphs/LegacyGraphsSubpagesServlet.java @@ -0,0 +1,54 @@ +/* Copyright 2014 The Tor Project + * See LICENSE for licensing information */ +package org.torproject.metrics.web.graphs; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@SuppressWarnings("serial") +public class LegacyGraphsSubpagesServlet extends HttpServlet { + + /* Available graphs subpages with corresponding JSP to which requests + * are forwarded. */ + private Map<String, String> availableGraphsSubpages; + + public LegacyGraphsSubpagesServlet() { + this.availableGraphsSubpages = new HashMap<String, String>(); + this.availableGraphsSubpages.put("network.html", + "WEB-INF/network.jsp"); + this.availableGraphsSubpages.put("users.html", "WEB-INF/users.jsp"); + this.availableGraphsSubpages.put("performance.html", + "WEB-INF/performance.jsp"); + } + + public void doGet(HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + + /* Find out which graph subpage was requested and look up which JSP + * handles this subpage. */ + String requestedPage = request.getRequestURI(); + if (requestedPage == null) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST); + return; + } + if (requestedPage.contains("/")) { + requestedPage = requestedPage.substring(requestedPage. + lastIndexOf("/") + 1); + } + if (!availableGraphsSubpages.containsKey(requestedPage)) { + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + return; + } + String jsp = availableGraphsSubpages.get(requestedPage); + + /* Forward the request to the JSP that does all the hard work. */ + request.getRequestDispatcher(jsp).forward(request, response); + } +} + diff --git a/website/web/WEB-INF/advbwdist-perc.jsp b/website/web/WEB-INF/advbwdist-perc.jsp new file mode 100644 index 0000000..aa015bd --- /dev/null +++ b/website/web/WEB-INF/advbwdist-perc.jsp @@ -0,0 +1,77 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Advertised bandwidth distribution</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Advertised bandwidth distribution</h3> +<br> +<p>The following graph shows the distribution of advertised bandwidth in +the network. In contrast to the graphs above, the following graph contains +no sums of advertised bandwidths, but bandwidths of single relays.</p> +<img src="advbwdist-perc.png${advbwdist_perc_url}" + width="576" height="360" + alt="Advertised bandwidth distribution graph"> +<form action="advbwdist-perc.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="advbwdist-perc"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(advbwdist_perc_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_perc_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(advbwdist_perc_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_perc_end[0]}</c:otherwise></c:choose>"> + </p><p> + <label>Percentiles: </label> + <input type="checkbox" name="p" value="100"<c:if test="${fn:length(advbwdist_perc_p) == 0 or fn:contains(fn:join(advbwdist_perc_p, ','), '100')}"> checked</c:if>> 100 (maximum) + <input type="checkbox" name="p" value="99"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '99')}"> checked</c:if>> 99 + <input type="checkbox" name="p" value="98"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '98')}"> checked</c:if>> 98 + <input type="checkbox" name="p" value="97"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '97')}"> checked</c:if>> 97 + <input type="checkbox" name="p" value="95"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '95')}"> checked</c:if>> 95 + <input type="checkbox" name="p" value="91"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '91')}"> checked</c:if>> 91 + <input type="checkbox" name="p" value="90"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '90')}"> checked</c:if>> 90 + <input type="checkbox" name="p" value="80"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '80')}"> checked</c:if>> 80 + <input type="checkbox" name="p" value="75"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '75')}"> checked</c:if>> 75 (3rd quartile) + <input type="checkbox" name="p" value="70"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '70')}"> checked</c:if>> 70 + <input type="checkbox" name="p" value="60"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '60')}"> checked</c:if>> 60 + <input type="checkbox" name="p" value="50"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '50')}"> checked</c:if>> 50 (median) + <input type="checkbox" name="p" value="40"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '40')}"> checked</c:if>> 40 + <input type="checkbox" name="p" value="30"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '30')}"> checked</c:if>> 30 + <input type="checkbox" name="p" value="25"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '25')}"> checked</c:if>> 25 (first quartile) + <input type="checkbox" name="p" value="20"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '20')}"> checked</c:if>> 20 + <input type="checkbox" name="p" value="10"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '10,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',10,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',10') or (advbwdist_perc_p[0] == '10' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 10 + <input type="checkbox" name="p" value="9"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '9,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',9,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',9') or (advbwdist_perc_p[0] == '9' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 9 + <input type="checkbox" name="p" value="5"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '5,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',5,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',5') or (advbwdist_perc_p[0] == '5' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 5 + <input type="checkbox" name="p" value="3"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '3,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',3,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',3') or (advbwdist_perc_p[0] == '3' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 3 + <input type="checkbox" name="p" value="2"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '2,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',2,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',2') or (advbwdist_perc_p[0] == '2' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 2 + <input type="checkbox" name="p" value="1"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '1,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',1,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',1') or (advbwdist_perc_p[0] == '1' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 1 + <input type="checkbox" name="p" value="0"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '0,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',0,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',0') or (advbwdist_perc_p[0] == '0' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 0 (minimum) + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="advbwdist-perc.pdf${advbwdist_perc_url}">PDF</a> or +<a href="advbwdist-perc.svg${advbwdist_perc_url}">SVG</a>.</p> +<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/advbwdist-relay.jsp b/website/web/WEB-INF/advbwdist-relay.jsp new file mode 100644 index 0000000..afd45a5 --- /dev/null +++ b/website/web/WEB-INF/advbwdist-relay.jsp @@ -0,0 +1,69 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Advertised bandwidth of n-th fastest relays</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Advertised bandwidth of n-th fastest relays</h3> +<br> +<p>The following graph shows the advertised bandwidth of the n-th fastest +relays in the network.</p> +<img src="advbwdist-relay.png${advbwdist_relay_url}" + width="576" height="360" + alt="Advertised bandwidth of n-th fastest relays graph"> +<form action="advbwdist-relay.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="advbwdist-relay"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(advbwdist_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_relay_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(advbwdist_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_relay_end[0]}</c:otherwise></c:choose>"> + </p><p> + <label>n-th fastest relays: </label> + <input type="checkbox" name="n" value="1"<c:if test="${fn:length(advbwdist_relay_n) == 0 or fn:contains(fn:join(advbwdist_relay_n, ','), '1,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '1')}"> checked</c:if>> 1 + <input type="checkbox" name="n" value="2"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '2,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '2'))}"> checked</c:if>> 2 + <input type="checkbox" name="n" value="3"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '3,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '3'))}"> checked</c:if>> 3 + <input type="checkbox" name="n" value="5"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '5,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '5'))}"> checked</c:if>> 5 + <input type="checkbox" name="n" value="10"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '10,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '10'))}"> checked</c:if>> 10 + <input type="checkbox" name="n" value="20"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '20,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '20'))}"> checked</c:if>> 20 + <input type="checkbox" name="n" value="30"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '30,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '30'))}"> checked</c:if>> 30 + <input type="checkbox" name="n" value="50"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '50,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '50'))}"> checked</c:if>> 50 + <input type="checkbox" name="n" value="100"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '100,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '100'))}"> checked</c:if>> 100 + <input type="checkbox" name="n" value="200"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '200,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '200'))}"> checked</c:if>> 200 + <input type="checkbox" name="n" value="300"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '300,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '300'))}"> checked</c:if>> 300 + <input type="checkbox" name="n" value="500"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '500,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '500'))}"> checked</c:if>> 500 + <input type="checkbox" name="n" value="1000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '1000')}"> checked</c:if>> 1000 + <input type="checkbox" name="n" value="2000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '2000')}"> checked</c:if>> 2000 + <input type="checkbox" name="n" value="3000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '3000')}"> checked</c:if>> 3000 + <input type="checkbox" name="n" value="5000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '5000')}"> checked</c:if>> 5000 + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="advbwdist-relay.pdf${advbwdist_relay_url}">PDF</a> or +<a href="advbwdist-relay.svg${advbwdist_relay_url}">SVG</a>.</p> +<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/bandwidth-flags.jsp b/website/web/WEB-INF/bandwidth-flags.jsp new file mode 100644 index 0000000..a8de13e --- /dev/null +++ b/website/web/WEB-INF/bandwidth-flags.jsp @@ -0,0 +1,53 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Advertised bandwidth and bandwidth history by relay flags</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Advertised bandwidth and bandwidth history by relay flags</h3> +<br> +<p>The following graph shows the advertised bandwidth and bandwidth +history of all relays with the Exit and/or Guard flags assigned by the +directory authorities. +Note that these sets possibly overlap with relays having both Exit and +Guard flag.</p> +<img src="bandwidth-flags.png${bandwidth_flags_url}" + width="576" height="360" alt="Advertised bandwidth and bandwidth history by relay flags graph"> +<form action="bandwidth-flags.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="bandwidth-flags"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(bandwidth_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bandwidth_flags_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(bandwidth_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bandwidth_flags_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="bandwidth-flags.pdf${bandwidth_flags_url}">PDF</a> or +<a href="bandwidth-flags.svg${bandwidth_flags_url}">SVG</a>.</p> +<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/bandwidth.jsp b/website/web/WEB-INF/bandwidth.jsp index 2882236..cc3aa6b 100644 --- a/website/web/WEB-INF/bandwidth.jsp +++ b/website/web/WEB-INF/bandwidth.jsp @@ -4,7 +4,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> - <title>Tor Metrics: Bandwidth</title> + <title>Tor Metrics: Total relay bandwidth in the network</title> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> @@ -13,12 +13,27 @@ <div class="center"> <%@ include file="banner.jsp"%> <div class="main-column"> + <h2>Tor Metrics: Bandwidth</h2> <br> +<p>The graphs on this page (except one) have moved to their own subpages. +This is part of an effort to make navigation on this website more intuitive. +In the future, this notice will go away, and all graphs/tables can be searched more easily from the start page. +Sorry for any inconvenience caused by this.</p> + +<ul> +<li>Graph: Total relay bandwidth in the network (see below)</li> +<li><a href="bwhist-flags.html">Graph: Relay bandwidth by Exit and/or Guard flags</a></li> +<li><a href="bandwidth-flags.html">Graph: Advertised bandwidth and bandwidth history by relay flags</a></li> +<li><a href="dirbytes.html">Graph: Number of bytes spent on answering directory requests</a></li> +<li><a href="advbwdist-perc.html">Graph: Advertised bandwidth distribution</a></li> +<li><a href="advbwdist-relay.html">Graph: Advertised bandwidth of n-th fastest relays</a></li> +</ul> +<br> +<hr> +<br>
-<a name="bandwidth"></a> -<h3><a href="#bandwidth" class="anchor">Total relay bandwidth in the -network</a></h3> +<h3>Tor Metrics: Total relay bandwidth in the network</h3> <br> <p>Relays report how much bandwidth they are willing to contribute and how many bytes they have read and written in the past 24 hours. The following @@ -26,7 +41,7 @@ graph shows total advertised bandwidth and bandwidth history of all relays in the network.</p> <img src="bandwidth.png${bandwidth_url}" width="576" height="360" alt="Relay bandwidth graph"> -<form action="bandwidth.html#bandwidth"> +<form action="bandwidth.html"> <div class="formrow"> <input type="hidden" name="graph" value="bandwidth"> <p> @@ -47,202 +62,6 @@ in the network.</p> <p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p> <br>
-<a name="bwhist-flags"></a> -<h3><a href="#bwhist-flags" class="anchor">Relay bandwidth by Exit and/or -Guard flags</a></h3> -<br> -<p>The following graph shows the relay bandwidth of all relays with the -Exit and/or Guard flags assigned by the directory authorities.</p> -<img src="bwhist-flags.png${bwhist_flags_url}" - width="576" height="360" alt="Relay bandwidth by flags graph"> -<form action="bandwidth.html#bwhist-flags"> - <div class="formrow"> - <input type="hidden" name="graph" value="bwhist-flags"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(bwhist_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bwhist_flags_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(bwhist_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bwhist_flags_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="bwhist-flags.pdf${bwhist_flags_url}">PDF</a> or -<a href="bwhist-flags.svg${bwhist_flags_url}">SVG</a>.</p> -<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p> -<br> - -<a name="bandwidth-flags"></a> -<h3><a href="#bandwidth-flags" class="anchor">Advertised bandwidth and -bandwidth history by relay flags</a></h3> -<br> -<p>The following graph shows the advertised bandwidth and bandwidth -history of all relays with the Exit and/or Guard flags assigned by the -directory authorities. -Note that these sets possibly overlap with relays having both Exit and -Guard flag.</p> -<img src="bandwidth-flags.png${bandwidth_flags_url}" - width="576" height="360" alt="Advertised bandwidth and bandwidth history by relay flags graph"> -<form action="bandwidth.html#bandwidth-flags"> - <div class="formrow"> - <input type="hidden" name="graph" value="bandwidth-flags"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(bandwidth_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bandwidth_flags_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(bandwidth_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bandwidth_flags_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="bandwidth-flags.pdf${bandwidth_flags_url}">PDF</a> or -<a href="bandwidth-flags.svg${bandwidth_flags_url}">SVG</a>.</p> -<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p> -<br> - -<a name="dirbytes"></a> -<h3><a href="#dirbytes" class="anchor">Number of bytes spent on answering -directory requests</a></h3> -<br> -<p>Relays running on 0.2.2.15-alpha or higher report the number of bytes -they spend on answering directory requests. The following graph shows -total written and read bytes as well as written and read dir bytes. The -dir bytes are extrapolated from those relays who report them to reflect -the number of written and read dir bytes by all relays.</p> -<img src="dirbytes.png${dirbytes_url}" - width="576" height="360" alt="Dir bytes graph"> -<form action="bandwidth.html#dirbytes"> - <div class="formrow"> - <input type="hidden" name="graph" value="dirbytes"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(dirbytes_start) == 0}">${default_start_date}</c:when><c:otherwise>${dirbytes_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(dirbytes_end) == 0}">${default_end_date}</c:when><c:otherwise>${dirbytes_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="dirbytes.pdf${dirbytes_url}">PDF</a> or -<a href="dirbytes.svg${dirbytes_url}">SVG</a>.</p> -<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p> -<br> - -<a name="advbwdist-perc"></a> -<h3><a href="#advbwdist-perc" class="anchor">Advertised bandwidth -distribution</a></h3> -<br> -<p>The following graph shows the distribution of advertised bandwidth in -the network. In contrast to the graphs above, the following graph contains -no sums of advertised bandwidths, but bandwidths of single relays.</p> -<img src="advbwdist-perc.png${advbwdist_perc_url}" - width="576" height="360" - alt="Advertised bandwidth distribution graph"> -<form action="bandwidth.html#advbwdist-perc"> - <div class="formrow"> - <input type="hidden" name="graph" value="advbwdist-perc"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(advbwdist_perc_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_perc_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(advbwdist_perc_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_perc_end[0]}</c:otherwise></c:choose>"> - </p><p> - <label>Percentiles: </label> - <input type="checkbox" name="p" value="100"<c:if test="${fn:length(advbwdist_perc_p) == 0 or fn:contains(fn:join(advbwdist_perc_p, ','), '100')}"> checked</c:if>> 100 (maximum) - <input type="checkbox" name="p" value="99"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '99')}"> checked</c:if>> 99 - <input type="checkbox" name="p" value="98"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '98')}"> checked</c:if>> 98 - <input type="checkbox" name="p" value="97"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '97')}"> checked</c:if>> 97 - <input type="checkbox" name="p" value="95"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '95')}"> checked</c:if>> 95 - <input type="checkbox" name="p" value="91"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '91')}"> checked</c:if>> 91 - <input type="checkbox" name="p" value="90"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '90')}"> checked</c:if>> 90 - <input type="checkbox" name="p" value="80"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '80')}"> checked</c:if>> 80 - <input type="checkbox" name="p" value="75"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '75')}"> checked</c:if>> 75 (3rd quartile) - <input type="checkbox" name="p" value="70"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '70')}"> checked</c:if>> 70 - <input type="checkbox" name="p" value="60"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '60')}"> checked</c:if>> 60 - <input type="checkbox" name="p" value="50"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '50')}"> checked</c:if>> 50 (median) - <input type="checkbox" name="p" value="40"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '40')}"> checked</c:if>> 40 - <input type="checkbox" name="p" value="30"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '30')}"> checked</c:if>> 30 - <input type="checkbox" name="p" value="25"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '25')}"> checked</c:if>> 25 (first quartile) - <input type="checkbox" name="p" value="20"<c:if test="${fn:length(advbwdist_perc_p) > 0 and fn:contains(fn:join(advbwdist_perc_p, ','), '20')}"> checked</c:if>> 20 - <input type="checkbox" name="p" value="10"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '10,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',10,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',10') or (advbwdist_perc_p[0] == '10' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 10 - <input type="checkbox" name="p" value="9"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '9,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',9,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',9') or (advbwdist_perc_p[0] == '9' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 9 - <input type="checkbox" name="p" value="5"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '5,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',5,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',5') or (advbwdist_perc_p[0] == '5' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 5 - <input type="checkbox" name="p" value="3"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '3,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',3,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',3') or (advbwdist_perc_p[0] == '3' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 3 - <input type="checkbox" name="p" value="2"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '2,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',2,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',2') or (advbwdist_perc_p[0] == '2' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 2 - <input type="checkbox" name="p" value="1"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '1,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',1,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',1') or (advbwdist_perc_p[0] == '1' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 1 - <input type="checkbox" name="p" value="0"<c:if test="${fn:length(advbwdist_perc_p) > 0 and (fn:startsWith(fn:join(advbwdist_perc_p, ','), '0,') or fn:contains(fn:join(advbwdist_perc_p, ','), ',0,') or fn:endsWith(fn:join(advbwdist_perc_p, ','), ',0') or (advbwdist_perc_p[0] == '0' and fn:length(advbwdist_perc_p) == 1))}"> checked</c:if>> 0 (minimum) - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="advbwdist-perc.pdf${advbwdist_perc_url}">PDF</a> or -<a href="advbwdist-perc.svg${advbwdist_perc_url}">SVG</a>.</p> -<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p> -<br> - -<a name="advbwdist-relay"></a> -<h3><a href="#advbwdist-relay" class="anchor">Advertised bandwidth of -n-th fastest relays</a></h3> -<br> -<p>The following graph shows the advertised bandwidth of the n-th fastest -relays in the network.</p> -<img src="advbwdist-relay.png${advbwdist_relay_url}" - width="576" height="360" - alt="Advertised bandwidth of n-th fastest relays graph"> -<form action="bandwidth.html#advbwdist-relay"> - <div class="formrow"> - <input type="hidden" name="graph" value="advbwdist-relay"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(advbwdist_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${advbwdist_relay_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(advbwdist_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${advbwdist_relay_end[0]}</c:otherwise></c:choose>"> - </p><p> - <label>n-th fastest relays: </label> - <input type="checkbox" name="n" value="1"<c:if test="${fn:length(advbwdist_relay_n) == 0 or fn:contains(fn:join(advbwdist_relay_n, ','), '1,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '1')}"> checked</c:if>> 1 - <input type="checkbox" name="n" value="2"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '2,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '2'))}"> checked</c:if>> 2 - <input type="checkbox" name="n" value="3"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '3,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '3'))}"> checked</c:if>> 3 - <input type="checkbox" name="n" value="5"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '5,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '5'))}"> checked</c:if>> 5 - <input type="checkbox" name="n" value="10"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '10,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '10'))}"> checked</c:if>> 10 - <input type="checkbox" name="n" value="20"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '20,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '20'))}"> checked</c:if>> 20 - <input type="checkbox" name="n" value="30"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '30,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '30'))}"> checked</c:if>> 30 - <input type="checkbox" name="n" value="50"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '50,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '50'))}"> checked</c:if>> 50 - <input type="checkbox" name="n" value="100"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '100,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '100'))}"> checked</c:if>> 100 - <input type="checkbox" name="n" value="200"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '200,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '200'))}"> checked</c:if>> 200 - <input type="checkbox" name="n" value="300"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '300,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '300'))}"> checked</c:if>> 300 - <input type="checkbox" name="n" value="500"<c:if test="${fn:length(advbwdist_relay_n) > 0 and (fn:contains(fn:join(advbwdist_relay_n, ','), '500,') or fn:endsWith(fn:join(advbwdist_relay_n, ','), '500'))}"> checked</c:if>> 500 - <input type="checkbox" name="n" value="1000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '1000')}"> checked</c:if>> 1000 - <input type="checkbox" name="n" value="2000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '2000')}"> checked</c:if>> 2000 - <input type="checkbox" name="n" value="3000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '3000')}"> checked</c:if>> 3000 - <input type="checkbox" name="n" value="5000"<c:if test="${fn:length(advbwdist_relay_n) > 0 and fn:contains(fn:join(advbwdist_relay_n, ','), '5000')}"> checked</c:if>> 5000 - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="advbwdist-relay.pdf${advbwdist_relay_url}">PDF</a> or -<a href="advbwdist-relay.svg${advbwdist_relay_url}">SVG</a>.</p> -<p><a href="stats/advbwdist.csv">CSV</a> file containing all data.</p> -<br> </div> </div> <div class="bottom" id="bottom"> diff --git a/website/web/WEB-INF/bubbles.jsp b/website/web/WEB-INF/bubbles.jsp index 6afa1fe..5c011c1 100644 --- a/website/web/WEB-INF/bubbles.jsp +++ b/website/web/WEB-INF/bubbles.jsp @@ -2,7 +2,7 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> - <title>Tor Metrics: Diversity</title> + <title>Tor Metrics: Network bubble graphs</title> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> @@ -13,10 +13,22 @@ <div class="center"> <%@ include file="banner.jsp"%> <div class="main-column"> + <h2>Tor Metrics: Diversity</h2> <br> -<a name="bubbles"></a> -<h3><a href="#bubbles" class="anchor">Network bubble graphs</a></h3> +<p>The graph on this page will soon move to its own subpages. +This is part of an effort to make navigation on this website more intuitive. +In the future, this notice will go away, and all graphs/tables can be searched more easily from the start page. +Sorry for any inconvenience caused by this.</p> + +<ul> +<li>Graph: Network bubble graphs (see below)</li> +</ul> +<br> +<hr> +<br> + +<h3>Tor Metrics: Network bubble graphs</h3> <br> <p> All relays: @@ -36,6 +48,7 @@ </p> <script>make_bubble_graph();</script> <noscript>Sorry, you need to turn on JavaScript.</script> + </div> </div> <div class="bottom" id="bottom"> @@ -43,3 +56,4 @@ </div> </body> </html> + diff --git a/website/web/WEB-INF/bwhist-flags.jsp b/website/web/WEB-INF/bwhist-flags.jsp new file mode 100644 index 0000000..3e1396a --- /dev/null +++ b/website/web/WEB-INF/bwhist-flags.jsp @@ -0,0 +1,50 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Relay bandwidth by Exit and/or Guard flags</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Relay bandwidth by Exit and/or Guard flags</h3> +<br> +<p>The following graph shows the relay bandwidth of all relays with the +Exit and/or Guard flags assigned by the directory authorities.</p> +<img src="bwhist-flags.png${bwhist_flags_url}" + width="576" height="360" alt="Relay bandwidth by flags graph"> +<form action="bwhist-flags.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="bwhist-flags"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(bwhist_flags_start) == 0}">${default_start_date}</c:when><c:otherwise>${bwhist_flags_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(bwhist_flags_end) == 0}">${default_end_date}</c:when><c:otherwise>${bwhist_flags_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="bwhist-flags.pdf${bwhist_flags_url}">PDF</a> or +<a href="bwhist-flags.svg${bwhist_flags_url}">SVG</a>.</p> +<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/cloudbridges.jsp b/website/web/WEB-INF/cloudbridges.jsp new file mode 100644 index 0000000..2907bfe --- /dev/null +++ b/website/web/WEB-INF/cloudbridges.jsp @@ -0,0 +1,52 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Tor Cloud bridges</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<a name="cloudbridges"></a> +<h3>Tor Metrics: Tor Cloud bridges</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="cloudbridges.html"> + <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> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="cloudbridges.pdf${cloudbridges_url}">PDF</a> or +<a href="cloudbridges.svg${cloudbridges_url}">SVG</a>.</p> +<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/connbidirect.jsp b/website/web/WEB-INF/connbidirect.jsp new file mode 100644 index 0000000..46d91fd --- /dev/null +++ b/website/web/WEB-INF/connbidirect.jsp @@ -0,0 +1,58 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Fraction of connections used uni-/bidirectionally</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Fraction of connections used uni-/bidirectionally</h3> +<br> +<p>The following graph shows the fraction of connections that is used +uni- or bi-directionally. Every 10 seconds, relays determine for every +connection whether they read and wrote less than a threshold of 20 KiB. +Connections below this threshold are excluded from these statistics. For +the remaining connections, relays report whether they read/wrote at least +10 times as many bytes as they wrote/read. If so, they classify a +connection as "Mostly reading" or "Mostly writing," respectively. All +other connections are classified as "Both reading and writing." After +classifying connections, read and write counters are reset for the next +10-second interval. Statistics are aggregated over 24 hours.</p> +<img src="connbidirect.png${connbidirect_url}" + width="576" height="360" + alt="Fraction of direct connections used uni-/bidirectionally"> +<form action="connbidirect.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="connbidirect"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(connbidirect_start) == 0}">${default_start_date}</c:when><c:otherwise>${connbidirect_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(connbidirect_end) == 0}">${default_end_date}</c:when><c:otherwise>${connbidirect_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="connbidirect.pdf${connbidirect_url}">PDF</a> or +<a href="connbidirect.svg${connbidirect_url}">SVG</a>.</p> +<p><a href="stats/connbidirect.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/dirbytes.jsp b/website/web/WEB-INF/dirbytes.jsp new file mode 100644 index 0000000..10ea40e --- /dev/null +++ b/website/web/WEB-INF/dirbytes.jsp @@ -0,0 +1,53 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Number of bytes spent on answering directory requests</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Number of bytes spent on answering directory requests</h3> +<br> +<p>Relays running on 0.2.2.15-alpha or higher report the number of bytes +they spend on answering directory requests. The following graph shows +total written and read bytes as well as written and read dir bytes. The +dir bytes are extrapolated from those relays who report them to reflect +the number of written and read dir bytes by all relays.</p> +<img src="dirbytes.png${dirbytes_url}" + width="576" height="360" alt="Dir bytes graph"> +<form action="dirbytes.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="dirbytes"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(dirbytes_start) == 0}">${default_start_date}</c:when><c:otherwise>${dirbytes_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(dirbytes_end) == 0}">${default_end_date}</c:when><c:otherwise>${dirbytes_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="dirbytes.pdf${dirbytes_url}">PDF</a> or +<a href="dirbytes.svg${dirbytes_url}">SVG</a>.</p> +<p><a href="stats/bandwidth.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/network.jsp b/website/web/WEB-INF/network.jsp index 830f3cc..ec18beb 100644 --- a/website/web/WEB-INF/network.jsp +++ b/website/web/WEB-INF/network.jsp @@ -15,163 +15,20 @@ <div class="main-column"> <h2>Tor Metrics: Servers</h2> <br> -<a name="networksize"></a> -<h3><a href="#networksize" class="anchor">Relays and bridges in the -network</a></h3> -<br> -<p>The following graph shows the average daily number of relays and -bridges in the network.</p> -<img src="networksize.png${networksize_url}" - width="576" height="360" alt="Network size graph"> -<form action="network.html#networksize"> - <div class="formrow"> - <input type="hidden" name="graph" value="networksize"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(networksize_start) == 0}">${default_start_date}</c:when><c:otherwise>${networksize_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(networksize_end) == 0}">${default_end_date}</c:when><c:otherwise>${networksize_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="networksize.pdf${networksize_url}">PDF</a> or -<a href="networksize.svg${networksize_url}">SVG</a>.</p> -<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> -<br> - -<a name="relayflags"></a> -<h3><a href="#relayflags" class="anchor">Relays with Exit, Fast, Guard, -Stable, and HSDir flags</a></h3> -<br> -<p>The directory authorities assign certain flags to relays that clients -use for their path selection decisions. The following graph shows the -average number of relays with these flags assigned.</p> -<img src="relayflags.png${relayflags_url}" - width="576" height="360" alt="Relay flags graph"> -<form action="network.html#relayflags"> - <div class="formrow"> - <input type="hidden" name="graph" value="relayflags"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(relayflags_start) == 0}">${default_start_date}</c:when><c:otherwise>${relayflags_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(relayflags_end) == 0}">${default_end_date}</c:when><c:otherwise>${relayflags_end[0]}</c:otherwise></c:choose>"> - </p><p> - <label>Relay flags: </label> - <input type="checkbox" name="flag" value="Running"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Running')}"> checked</c:if>> Running - <input type="checkbox" name="flag" value="Exit"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Exit')}"> checked</c:if>> Exit - <input type="checkbox" name="flag" value="Fast"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Fast')}"> checked</c:if>> Fast - <input type="checkbox" name="flag" value="Guard"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Guard')}"> checked</c:if>> Guard - <input type="checkbox" name="flag" value="Stable"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Stable')}"> checked</c:if>> Stable - <input type="checkbox" name="flag" value="HSDir"<c:if test="${fn:length(relayflags_flag) > 0 and fn:contains(fn:join(relayflags_flag, ','), 'HSDir')}"> checked</c:if>> HSDir - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="relayflags.pdf${relayflags_url}">PDF</a> or -<a href="relayflags.svg${relayflags_url}">SVG</a>.</p> -<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> -<br>
-<a name="versions"></a> -<h3><a href="#versions" class="anchor">Relays by version</a></h3> -<br> -<p>Relays report the Tor version that they are running to the directory -authorities. See the -<a href="https://www.torproject.org/download/download.html.en">download -page</a> and -<a href="https://gitweb.torproject.org/tor.git/blob/HEAD:/ChangeLog">ChangeLog file</a> -to find out which Tor versions are stable and unstable. -The following graph shows the number of relays by version.</p> -<img src="versions.png${versions_url}" - width="576" height="360" alt="Relay versions graph"> -<form action="network.html#versions"> - <div class="formrow"> - <input type="hidden" name="graph" value="versions"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(versions_start) == 0}">${default_start_date}</c:when><c:otherwise>${versions_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(versions_end) == 0}">${default_end_date}</c:when><c:otherwise>${versions_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="versions.pdf${versions_url}">PDF</a> or -<a href="versions.svg${versions_url}">SVG</a>.</p> -<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> -<br> +<p>The graphs on this page have moved to their own subpages. +This is part of an effort to make navigation on this website more intuitive. +In the future, this page will go away, and all graphs/tables can be searched more easily from the start page. +Sorry for any inconvenience caused by this.</p>
-<a name="platforms"></a> -<h3><a href="#platforms" class="anchor">Relays by platform</a></h3> -<br> -<p>Relays report the operating system they are running to the directory -authorities. The following graph shows the number of relays by -platform.</p> -<img src="platforms.png${platforms_url}" - width="576" height="360" alt="Relay platforms graph"> -<form action="network.html#platforms"> - <div class="formrow"> - <input type="hidden" name="graph" value="platforms"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(platforms_start) == 0}">${default_start_date}</c:when><c:otherwise>${platforms_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(platforms_end) == 0}">${default_end_date}</c:when><c:otherwise>${platforms_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="platforms.pdf${platforms_url}">PDF</a> or -<a href="platforms.svg${platforms_url}">SVG</a>.</p> -<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> -<br> +<ul> +<li><a href="networksize.html">Graph: Relays and bridges in the network</a></li> +<li><a href="relayflags.html">Graph: Relays with Exit, Fast, Guard, Stable, and HSDir flags</a></li> +<li><a href="versions.html">Graph: Relays by version</a></li> +<li><a href="platforms.html">Graph: Relays by platform</a></li> +<li><a href="cloudbridges.html">Graph: Tor Cloud bridges</a></li> +</ul>
-<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> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="cloudbridges.pdf${cloudbridges_url}">PDF</a> or -<a href="cloudbridges.svg${cloudbridges_url}">SVG</a>.</p> -<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> -<br> </div> </div> <div class="bottom" id="bottom"> diff --git a/website/web/WEB-INF/networksize.jsp b/website/web/WEB-INF/networksize.jsp new file mode 100644 index 0000000..fbdcc3a --- /dev/null +++ b/website/web/WEB-INF/networksize.jsp @@ -0,0 +1,50 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Relays and bridges in the network</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Relays and bridges in the network</h3> +<br> +<p>The following graph shows the average daily number of relays and +bridges in the network.</p> +<img src="networksize.png${networksize_url}" + width="576" height="360" alt="Network size graph"> +<form action="networksize.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="networksize"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(networksize_start) == 0}">${default_start_date}</c:when><c:otherwise>${networksize_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(networksize_end) == 0}">${default_end_date}</c:when><c:otherwise>${networksize_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="networksize.pdf${networksize_url}">PDF</a> or +<a href="networksize.svg${networksize_url}">SVG</a>.</p> +<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/oxford-anonymous-internet.jsp b/website/web/WEB-INF/oxford-anonymous-internet.jsp new file mode 100644 index 0000000..4eb361c --- /dev/null +++ b/website/web/WEB-INF/oxford-anonymous-internet.jsp @@ -0,0 +1,38 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Tor users as percentage of larger Internet population</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Tor users as percentage of larger Internet population</h3> +<br> +<p>The Oxford Internet Institute made a cartogram visualization of Tor +users as compared to the overall Internet population per country. +They used the average number of Tor users from August 2012 to August 2013 +and put it in relation to total Internet users per country. +Be sure to read up the +<a href="http://geography.oii.ox.ac.uk/?page=tor">details and their +conclusions</a>.</p> + +<a href="http://geography.oii.ox.ac.uk/?page=tor"> +<img src="images/oxford-anonymous-internet.png" + alt="The anonymous Internet"> +</a> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/performance.jsp b/website/web/WEB-INF/performance.jsp index 4a87a55..cc958b9 100644 --- a/website/web/WEB-INF/performance.jsp +++ b/website/web/WEB-INF/performance.jsp @@ -12,134 +12,19 @@ <div class="center"> <%@ include file="banner.jsp"%> <div class="main-column"> + <h2>Tor Metrics: Performance</h2> <br> -<a name="torperf"></a> -<h3><a href="#torperf" class="anchor">Time to download files over -Tor</a></h3> -<br> -<p>The following graphs show the performance of the Tor network as -experienced by its users. The graphs contain the average (median) time to -request files of three different sizes over Tor as well as first and third -quartile of request times. Medians and quartiles are calculated multiple -times per day for completed days only, resulting in a delay of 1 to 1.5 -days before changes to network performance become visible in the -graph.</p> -<img src="torperf.png${torperf_url}" - width="576" height="360" alt="Torperf graph"> -<form action="performance.html#torperf"> - <div class="formrow"> - <input type="hidden" name="graph" value="torperf"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(torperf_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_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(torperf_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_end[0]}</c:otherwise></c:choose>"> - </p><p> - Source: - <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_source) == 0 or torperf_source[0] eq 'all'}"> checked</c:if>> all - <input type="radio" name="source" value="torperf"<c:if test="${torperf_source[0] eq 'torperf'}"> checked</c:if>> torperf - <input type="radio" name="source" value="moria"<c:if test="${torperf_source[0] eq 'moria'}"> checked</c:if>> moria - <input type="radio" name="source" value="siv"<c:if test="${torperf_source[0] eq 'siv'}"> checked</c:if>> siv - </p><p> - <label>File size: </label> - <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_filesize) == 0 or torperf_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB - <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB - <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="torperf.pdf${torperf_url}">PDF</a> or -<a href="torperf.svg${torperf_url}">SVG</a>.</p> -<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p> +<p>The graphs on this page have moved to their own subpages. +This is part of an effort to make navigation on this website more intuitive. +In the future, this page will go away, and all graphs/tables can be searched more easily from the start page. +Sorry for any inconvenience caused by this.</p>
-<br> -<a name="torperf-failures"></a> -<h3><a href="#torperf-failures" class="anchor">Timeouts and failures of -downloading files over Tor</a></h3> -<br> -<p>The following graphs show the fraction of timeouts and failures of -downloading files over Tor as experienced by users. -A timeout occurs when a 50 KiB (1 MiB, 5 MiB) download does not complete -within 4:55 minutes (29:55 minutes, 59:55 minutes). -A failure occurs when the download completes, but the response is smaller -than 50 KiB (1 MiB, 5 MiB).</p> -<img src="torperf-failures.png${torperf_failures_url}" - width="576" height="360" alt="Torperf failures graph"> -<form action="performance.html#torperf-failures"> - <div class="formrow"> - <input type="hidden" name="graph" value="torperf-failures"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(torperf_failures_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_failures_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(torperf_failures_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_failures_end[0]}</c:otherwise></c:choose>"> - </p><p> - Source: - <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_failures_source) == 0 or torperf_failures_source[0] eq 'all'}"> checked</c:if>> all - <input type="radio" name="source" value="torperf"<c:if test="${torperf_failures_source[0] eq 'torperf'}"> checked</c:if>> torperf - <input type="radio" name="source" value="moria"<c:if test="${torperf_failures_source[0] eq 'moria'}"> checked</c:if>> moria - <input type="radio" name="source" value="siv"<c:if test="${torperf_failures_source[0] eq 'siv'}"> checked</c:if>> siv - </p><p> - <label>File size: </label> - <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_failures_filesize) == 0 or torperf_failures_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB - <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_failures_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB - <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_failures_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="torperf-failures.pdf${torperf_failures_url}">PDF</a> or -<a href="torperf-failures.svg${torperf_failures_url}">SVG</a>.</p> -<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p> - -<br> -<a name="connbidirect"></a> -<h3><a href="#connbidirect" class="anchor">Fraction of connections used -uni-/bidirectionally</a></h3> -<br> -<p>The following graph shows the fraction of connections that is used -uni- or bi-directionally. Every 10 seconds, relays determine for every -connection whether they read and wrote less than a threshold of 20 KiB. -Connections below this threshold are excluded from these statistics. For -the remaining connections, relays report whether they read/wrote at least -10 times as many bytes as they wrote/read. If so, they classify a -connection as "Mostly reading" or "Mostly writing," respectively. All -other connections are classified as "Both reading and writing." After -classifying connections, read and write counters are reset for the next -10-second interval. Statistics are aggregated over 24 hours.</p> -<img src="connbidirect.png${connbidirect_url}" - width="576" height="360" - alt="Fraction of direct connections used uni-/bidirectionally"> -<form action="performance.html#connbidirect"> - <div class="formrow"> - <input type="hidden" name="graph" value="connbidirect"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(connbidirect_start) == 0}">${default_start_date}</c:when><c:otherwise>${connbidirect_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(connbidirect_end) == 0}">${default_end_date}</c:when><c:otherwise>${connbidirect_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="connbidirect.pdf${connbidirect_url}">PDF</a> or -<a href="connbidirect.svg${connbidirect_url}">SVG</a>.</p> -<p><a href="stats/connbidirect.csv">CSV</a> file containing all data.</p> -<br> +<ul> +<li><a href="torperf.html">Graph: Time to download files over Tor</a></li> +<li><a href="torperf-failures.html">Graph: Timeouts and failures of downloading files over Tor</a></li> +<li><a href="connbidirect.html">Graph: Fraction of connections used uni-/bidirectionally</a></li> +</ul>
</div> </div> diff --git a/website/web/WEB-INF/platforms.jsp b/website/web/WEB-INF/platforms.jsp new file mode 100644 index 0000000..bac911f --- /dev/null +++ b/website/web/WEB-INF/platforms.jsp @@ -0,0 +1,51 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Relays by platform</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Relays by platform</a></h3> +<br> +<p>Relays report the operating system they are running to the directory +authorities. The following graph shows the number of relays by +platform.</p> +<img src="platforms.png${platforms_url}" + width="576" height="360" alt="Relay platforms graph"> +<form action="platforms.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="platforms"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(platforms_start) == 0}">${default_start_date}</c:when><c:otherwise>${platforms_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(platforms_end) == 0}">${default_end_date}</c:when><c:otherwise>${platforms_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="platforms.pdf${platforms_url}">PDF</a> or +<a href="platforms.svg${platforms_url}">SVG</a>.</p> +<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/relayflags.jsp b/website/web/WEB-INF/relayflags.jsp new file mode 100644 index 0000000..2149b7c --- /dev/null +++ b/website/web/WEB-INF/relayflags.jsp @@ -0,0 +1,59 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Relays with Exit, Fast, Guard, Stable, and HSDir flags</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Relays with Exit, Fast, Guard, Stable, and HSDir flags</h3> +<br> +<p>The directory authorities assign certain flags to relays that clients +use for their path selection decisions. The following graph shows the +average number of relays with these flags assigned.</p> +<img src="relayflags.png${relayflags_url}" + width="576" height="360" alt="Relay flags graph"> +<form action="relayflags.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="relayflags"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(relayflags_start) == 0}">${default_start_date}</c:when><c:otherwise>${relayflags_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(relayflags_end) == 0}">${default_end_date}</c:when><c:otherwise>${relayflags_end[0]}</c:otherwise></c:choose>"> + </p><p> + <label>Relay flags: </label> + <input type="checkbox" name="flag" value="Running"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Running')}"> checked</c:if>> Running + <input type="checkbox" name="flag" value="Exit"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Exit')}"> checked</c:if>> Exit + <input type="checkbox" name="flag" value="Fast"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Fast')}"> checked</c:if>> Fast + <input type="checkbox" name="flag" value="Guard"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Guard')}"> checked</c:if>> Guard + <input type="checkbox" name="flag" value="Stable"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Stable')}"> checked</c:if>> Stable + <input type="checkbox" name="flag" value="HSDir"<c:if test="${fn:length(relayflags_flag) > 0 and fn:contains(fn:join(relayflags_flag, ','), 'HSDir')}"> checked</c:if>> HSDir + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="relayflags.pdf${relayflags_url}">PDF</a> or +<a href="relayflags.svg${relayflags_url}">SVG</a>.</p> +<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/torperf-failures.jsp b/website/web/WEB-INF/torperf-failures.jsp new file mode 100644 index 0000000..7c90f17 --- /dev/null +++ b/website/web/WEB-INF/torperf-failures.jsp @@ -0,0 +1,63 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Timeouts and failures of downloading files over Tor</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Timeouts and failures of downloading files over Tor</h3> +<br> +<p>The following graphs show the fraction of timeouts and failures of +downloading files over Tor as experienced by users. +A timeout occurs when a 50 KiB (1 MiB, 5 MiB) download does not complete +within 4:55 minutes (29:55 minutes, 59:55 minutes). +A failure occurs when the download completes, but the response is smaller +than 50 KiB (1 MiB, 5 MiB).</p> +<img src="torperf-failures.png${torperf_failures_url}" + width="576" height="360" alt="Torperf failures graph"> +<form action="torperf-failures.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="torperf-failures"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(torperf_failures_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_failures_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(torperf_failures_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_failures_end[0]}</c:otherwise></c:choose>"> + </p><p> + Source: + <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_failures_source) == 0 or torperf_failures_source[0] eq 'all'}"> checked</c:if>> all + <input type="radio" name="source" value="torperf"<c:if test="${torperf_failures_source[0] eq 'torperf'}"> checked</c:if>> torperf + <input type="radio" name="source" value="moria"<c:if test="${torperf_failures_source[0] eq 'moria'}"> checked</c:if>> moria + <input type="radio" name="source" value="siv"<c:if test="${torperf_failures_source[0] eq 'siv'}"> checked</c:if>> siv + </p><p> + <label>File size: </label> + <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_failures_filesize) == 0 or torperf_failures_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB + <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_failures_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB + <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_failures_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="torperf-failures.pdf${torperf_failures_url}">PDF</a> or +<a href="torperf-failures.svg${torperf_failures_url}">SVG</a>.</p> +<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/torperf.jsp b/website/web/WEB-INF/torperf.jsp new file mode 100644 index 0000000..f9c717b --- /dev/null +++ b/website/web/WEB-INF/torperf.jsp @@ -0,0 +1,64 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Time to download files over Tor</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Time to download files over Tor</h3> +<br> +<p>The following graphs show the performance of the Tor network as +experienced by its users. The graphs contain the average (median) time to +request files of three different sizes over Tor as well as first and third +quartile of request times. Medians and quartiles are calculated multiple +times per day for completed days only, resulting in a delay of 1 to 1.5 +days before changes to network performance become visible in the +graph.</p> +<img src="torperf.png${torperf_url}" + width="576" height="360" alt="Torperf graph"> +<form action="torperf.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="torperf"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(torperf_start) == 0}">${default_start_date}</c:when><c:otherwise>${torperf_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(torperf_end) == 0}">${default_end_date}</c:when><c:otherwise>${torperf_end[0]}</c:otherwise></c:choose>"> + </p><p> + Source: + <input type="radio" name="source" value="all"<c:if test="${fn:length(torperf_source) == 0 or torperf_source[0] eq 'all'}"> checked</c:if>> all + <input type="radio" name="source" value="torperf"<c:if test="${torperf_source[0] eq 'torperf'}"> checked</c:if>> torperf + <input type="radio" name="source" value="moria"<c:if test="${torperf_source[0] eq 'moria'}"> checked</c:if>> moria + <input type="radio" name="source" value="siv"<c:if test="${torperf_source[0] eq 'siv'}"> checked</c:if>> siv + </p><p> + <label>File size: </label> + <input type="radio" name="filesize" value="50kb"<c:if test="${fn:length(torperf_filesize) == 0 or torperf_filesize[0] eq '50kb'}"> checked</c:if>> 50 KiB + <input type="radio" name="filesize" value="1mb"<c:if test="${torperf_filesize[0] eq '1mb'}"> checked</c:if>> 1 MiB + <input type="radio" name="filesize" value="5mb"<c:if test="${torperf_filesize[0] eq '5mb'}"> checked</c:if>> 5 MiB + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="torperf.pdf${torperf_url}">PDF</a> or +<a href="torperf.svg${torperf_url}">SVG</a>.</p> +<p><a href="stats/torperf.csv">CSV</a> file containing all data.</p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/users.jsp b/website/web/WEB-INF/users.jsp index b722564..79ffd9d 100644 --- a/website/web/WEB-INF/users.jsp +++ b/website/web/WEB-INF/users.jsp @@ -13,304 +13,25 @@ <div class="center"> <%@ include file="banner.jsp"%> <div class="main-column"> -<h2>Tor Metrics: Users</h2> -<br> - -<a name="userstats-relay-country"></a> -<h3><a href="#userstats-relay-country" class="anchor"> -Direct users by country: -</a></h3> - -<img src="userstats-relay-country.png${userstats_relay_country_url}" - width="576" height="360" alt="Direct users by country graph"> -<form action="users.html#userstats-relay-country"> - <div class="formrow"> - <input type="hidden" name="graph" value="userstats-relay-country"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(userstats_relay_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_country_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(userstats_relay_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_country_end[0]}</c:otherwise></c:choose>"> - </p><p> - Source: <select name="country"> - <option value="all"<c:if test="${userstats_relay_country_country[0] eq 'all'}"> selected</c:if>>All users</option> - <c:forEach var="country" items="${countries}" > - <option value="${country[0]}"<c:if test="${userstats_relay_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option> - </c:forEach> - </select> - </p><p> - Show possible censorship events if available (<a - href="http://research.torproject.org/techreports/detector-2011-09-09.pdf%22%3EBETA</a>) - <select name="events"> - <option value="off">Off</option> - <option value="on"<c:if test="${userstats_relay_country_events[0] eq 'on'}"> selected</c:if>>On: both points and expected range</option> - <option value="points"<c:if test="${userstats_relay_country_events[0] eq 'points'}"> selected</c:if>>On: points only, no expected range</option> - </select> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="userstats-relay-country.pdf${userstats_relay_country_url}">PDF</a> or -<a href="userstats-relay-country.svg${userstats_relay_country_url}">SVG</a>. -<a href="stats/clients.csv">CSV</a> file containing user estimates. -<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions -and answers about users statistics</a></p> - -<hr> -<a name="userstats-relay-table"></a> -<h3><a href="#userstats-relay-table" class="anchor"> -Top-10 countries by directly connecting users: -</a></h3> -<form action="users.html#userstats-relay-table"> - <div class="formrow"> - <input type="hidden" name="table" value="userstats-relay"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(userstats_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_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(userstats_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update table"> - </p> - </div> -</form> -<br> -<table> - <tr> - <th>Country</th> - <th>Mean daily users</th> - </tr> - <c:forEach var="row" items="${userstats_relay_tabledata}"> - <tr> - <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}#userstats-relay-country">${row['country']}</a> </td> - <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td> - </tr> - </c:forEach> -</table> -<p><a href="stats/clients.csv">CSV</a> file containing user estimates. -<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions -and answers about users statistics</a></p> - -<hr> -<a name="userstats-censorship-events"></a> -<h3><a href="#userstats-censorship-events" class="anchor"> -Top-10 countries by possible censorship events (<a -href="http://research.torproject.org/techreports/detector-2011-09-09.pdf">BETA</a>): -</a></h3> -<form action="users.html#userstats-censorship-events"> - <div class="formrow"> - <input type="hidden" name="table" value="userstats-censorship-events"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(userstats_censorship_events_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_censorship_events_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(userstats_censorship_events_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_censorship_events_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update table"> - </p> - </div> -</form> -<br> -<table> - <tr> - <th>Country</th> - <th>Downturns</th> - <th>Upturns</th> - </tr> - <c:forEach var="row" items="${userstats_censorship_events_tabledata}"> - <tr> - <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}&events=on#userstats-relay-country">${row['country']}</a> </td> - <td>${row['downturns']}</td> - <td>${row['upturns']}</td> - </tr> - </c:forEach> -</table> -<p><a href="stats/clients.csv">CSV</a> file containing user estimates. -<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions -and answers about users statistics</a></p> - -<hr> - -<a name="userstats-bridge-country"></a> -<h3><a href="#userstats-bridge-country" class="anchor"> -Bridge users by country: -</a></h3> - -<img src="userstats-bridge-country.png${userstats_bridge_country_url}" - width="576" height="360" alt="Bridge users by country graph"> -<form action="users.html#userstats-bridge-country"> - <div class="formrow"> - <input type="hidden" name="graph" value="userstats-bridge-country"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(userstats_bridge_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_country_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(userstats_bridge_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_country_end[0]}</c:otherwise></c:choose>"> - </p><p> - Source: <select name="country"> - <option value="all"<c:if test="${userstats_bridge_country_country[0] eq 'all'}"> selected</c:if>>All users</option> - <c:forEach var="country" items="${countries}" > - <option value="${country[0]}"<c:if test="${userstats_bridge_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option> - </c:forEach> - </select> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="userstats-bridge-country.pdf${userstats_bridge_country_url}">PDF</a> or -<a href="userstats-bridge-country.svg${userstats_bridge_country_url}">SVG</a>. -<a href="stats/clients.csv">CSV</a> file containing user estimates. -<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions -and answers about users statistics</a></p>
-<hr> -<a name="userstats-bridge-table"></a> -<h3><a href="#userstats-bridge-table" class="anchor"> -Top-10 countries by bridge users: -</a></h3> -<form action="users.html#userstats-bridge-table"> - <div class="formrow"> - <input type="hidden" name="table" value="userstats-bridge"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(userstats_bridge_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_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(userstats_bridge_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_end[0]}</c:otherwise></c:choose>"> - </p><p> - <input class="submit" type="submit" value="Update table"> - </p> - </div> -</form> +<h2>Tor Metrics: Users</h2> <br> -<table> - <tr> - <th>Country</th> - <th>Mean daily users</th> - </tr> - <c:forEach var="row" items="${userstats_bridge_tabledata}"> - <tr> - <td><a href="users.html?graph=userstats-bridge-country&country=${row['cc']}#userstats-bridge-country">${row['country']}</a> </td> - <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td> - </tr> - </c:forEach> -</table> -<p><a href="stats/clients.csv">CSV</a> file containing user estimates. -<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions -and answers about users statistics</a></p> - -<hr> - -<a name="userstats-bridge-transport"></a> -<h3><a href="#userstats-bridge-transport" class="anchor"> -Bridge users by transport: -</a></h3> - -<img src="userstats-bridge-transport.png${userstats_bridge_transport_url}" - width="576" height="360" alt="Bridge users by transport graph"> -<form action="users.html#userstats-bridge-transport"> - <div class="formrow"> - <input type="hidden" name="graph" value="userstats-bridge-transport"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(userstats_bridge_transport_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_transport_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(userstats_bridge_transport_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_transport_end[0]}</c:otherwise></c:choose>"> - </p><p> - <label>Source: </label> - <input type="checkbox" name="transport" value="<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) == 0 or fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<OR>')}"> checked</c:if>> Default OR protocol - <input type="checkbox" name="transport" value="obfs2"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs2')}"> checked</c:if>> obfs2 - <input type="checkbox" name="transport" value="obfs3"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs3')}"> checked</c:if>> obfs3 - <input type="checkbox" name="transport" value="websocket"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'websocket')}"> checked</c:if>> Flash proxy/websocket - <input type="checkbox" name="transport" value="fte"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'fte')}"> checked</c:if>> FTE - <input type="checkbox" name="transport" value="meek"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'meek')}"> checked</c:if>> meek - <input type="checkbox" name="transport" value="scramblesuit"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'scramblesuit')}"> checked</c:if>> scramblesuit - <input type="checkbox" name="transport" value="<??>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<??>')}"> checked</c:if>> Unknown pluggable transport(s) - <input type="checkbox" name="transport" value="!<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '!<OR>')}"> checked</c:if>> Any pluggable transport - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="userstats-bridge-transport.pdf${userstats_bridge_transport_url}">PDF</a> or -<a href="userstats-bridge-transport.svg${userstats_bridge_transport_url}">SVG</a>. -<a href="stats/clients.csv">CSV</a> file containing user estimates. -<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions -and answers about users statistics</a></p> - -<hr> - -<a name="userstats-bridge-version"></a> -<h3><a href="#userstats-bridge-version" class="anchor"> -Bridge users by IP version: -</a></h3> - -<img src="userstats-bridge-version.png${userstats_bridge_version_url}" - width="576" height="360" alt="Bridge users by IP version graph"> -<form action="users.html#userstats-bridge-version"> - <div class="formrow"> - <input type="hidden" name="graph" value="userstats-bridge-version"> - <p> - <label>Start date (yyyy-mm-dd):</label> - <input type="text" name="start" size="10" - value="<c:choose><c:when test="${fn:length(userstats_bridge_version_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_version_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(userstats_bridge_version_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_version_end[0]}</c:otherwise></c:choose>"> - </p><p> - Source: <select name="version"> - <option value="v4"<c:if test="${userstats_bridge_version_version[0] eq 'v4'}"> selected</c:if>>IPv4</option> - <option value="v6"<c:if test="${userstats_bridge_version_version[0] eq 'v6'}"> selected</c:if>>IPv6</option> - </select> - </p><p> - <input class="submit" type="submit" value="Update graph"> - </p> - </div> -</form> -<p>Download graph as -<a href="userstats-bridge-version.pdf${userstats_bridge_version_url}">PDF</a> or -<a href="userstats-bridge-version.svg${userstats_bridge_version_url}">SVG</a>. -<a href="stats/clients.csv">CSV</a> file containing user estimates. -<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions -and answers about users statistics</a></p> - -<hr> - -<a name="oxford-anonymous-internet"></a> -<h3><a href="#oxford-anonymous-internet" class="anchor"> -Tor users as percentage of larger Internet population -</a></h3> - -<p>The Oxford Internet Institute made a cartogram visualization of Tor -users as compared to the overall Internet population per country. -They used the average number of Tor users from August 2012 to August 2013 -and put it in relation to total Internet users per country. -Be sure to read up the -<a href="http://geography.oii.ox.ac.uk/?page=tor">details and their -conclusions</a>.</p> - -<a href="http://geography.oii.ox.ac.uk/?page=tor"> -<img src="images/oxford-anonymous-internet.png" - alt="The anonymous Internet"> -</a>
-<hr> +<p>The graphs and tables on this page have moved to their own subpages. +This is part of an effort to make navigation on this website more intuitive. +In the future, this page will go away, and all graphs/tables can be searched more easily from the start page. +Sorry for any inconvenience caused by this.</p> + +<ul> +<li><a href="userstats-relay-country.html">Graph: Direct users by country</a></li> +<li><a href="userstats-relay-table.html">Table: Top-10 countries by directly connecting users</a></li> +<li><a href="userstats-censorship-events.html">Table: Top-10 countries by possible censorship events</a></li> +<li><a href="userstats-bridge-country.html">Graph: Bridge users by country</a></li> +<li><a href="userstats-bridge-table.html">Table: Top-10 countries by bridge users</a></li> +<li><a href="userstats-bridge-transport.html">Graph: Bridge users by transport</a></li> +<li><a href="userstats-bridge-version.html">Graph: Bridge users by IP version</a></li> +<li><a href="oxford-anonymous-internet.html">Link: Tor users as percentage of larger Internet population</a></li> +</ul>
</div> </div> diff --git a/website/web/WEB-INF/userstats-bridge-country.jsp b/website/web/WEB-INF/userstats-bridge-country.jsp new file mode 100644 index 0000000..ae64c3a --- /dev/null +++ b/website/web/WEB-INF/userstats-bridge-country.jsp @@ -0,0 +1,56 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Bridge users by country</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Bridge users by country</h3> +<br> +<img src="userstats-bridge-country.png${userstats_bridge_country_url}" + width="576" height="360" alt="Bridge users by country graph"> +<form action="userstats-bridge-country.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="userstats-bridge-country"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(userstats_bridge_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_country_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(userstats_bridge_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_country_end[0]}</c:otherwise></c:choose>"> + </p><p> + Source: <select name="country"> + <option value="all"<c:if test="${userstats_bridge_country_country[0] eq 'all'}"> selected</c:if>>All users</option> + <c:forEach var="country" items="${countries}" > + <option value="${country[0]}"<c:if test="${userstats_bridge_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option> + </c:forEach> + </select> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="userstats-bridge-country.pdf${userstats_bridge_country_url}">PDF</a> or +<a href="userstats-bridge-country.svg${userstats_bridge_country_url}">SVG</a>. +<a href="stats/clients.csv">CSV</a> file containing user estimates. +<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions +and answers about users statistics</a></p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/userstats-bridge-table.jsp b/website/web/WEB-INF/userstats-bridge-table.jsp new file mode 100644 index 0000000..4e61728 --- /dev/null +++ b/website/web/WEB-INF/userstats-bridge-table.jsp @@ -0,0 +1,57 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Top-10 countries by bridge users</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Top-10 countries by bridge users</h3> +<br> +<form action="userstats-bridge-table.html"> + <div class="formrow"> + <input type="hidden" name="table" value="userstats-bridge"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(userstats_bridge_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_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(userstats_bridge_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update table"> + </p> + </div> +</form> +<br> +<table> + <tr> + <th>Country</th> + <th>Mean daily users</th> + </tr> + <c:forEach var="row" items="${userstats_bridge_tabledata}"> + <tr> + <td><a href="users.html?graph=userstats-bridge-country&country=${row['cc']}#userstats-bridge-country">${row['country']}</a> </td> + <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td> + </tr> + </c:forEach> +</table> +<p><a href="stats/clients.csv">CSV</a> file containing user estimates. +<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions +and answers about users statistics</a></p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/userstats-bridge-transport.jsp b/website/web/WEB-INF/userstats-bridge-transport.jsp new file mode 100644 index 0000000..6cf1f6e --- /dev/null +++ b/website/web/WEB-INF/userstats-bridge-transport.jsp @@ -0,0 +1,60 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Bridge users by transport</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Bridge users by transport</h3> +<br> +<img src="userstats-bridge-transport.png${userstats_bridge_transport_url}" + width="576" height="360" alt="Bridge users by transport graph"> +<form action="userstats-bridge-transport.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="userstats-bridge-transport"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(userstats_bridge_transport_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_transport_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(userstats_bridge_transport_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_transport_end[0]}</c:otherwise></c:choose>"> + </p><p> + <label>Source: </label> + <input type="checkbox" name="transport" value="<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) == 0 or fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<OR>')}"> checked</c:if>> Default OR protocol + <input type="checkbox" name="transport" value="obfs2"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs2')}"> checked</c:if>> obfs2 + <input type="checkbox" name="transport" value="obfs3"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'obfs3')}"> checked</c:if>> obfs3 + <input type="checkbox" name="transport" value="websocket"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'websocket')}"> checked</c:if>> Flash proxy/websocket + <input type="checkbox" name="transport" value="fte"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'fte')}"> checked</c:if>> FTE + <input type="checkbox" name="transport" value="meek"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'meek')}"> checked</c:if>> meek + <input type="checkbox" name="transport" value="scramblesuit"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), 'scramblesuit')}"> checked</c:if>> scramblesuit + <input type="checkbox" name="transport" value="<??>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '<??>')}"> checked</c:if>> Unknown pluggable transport(s) + <input type="checkbox" name="transport" value="!<OR>"<c:if test="${fn:length(userstats_bridge_transport_transport) > 0 and fn:contains(fn:join(userstats_bridge_transport_transport, ','), '!<OR>')}"> checked</c:if>> Any pluggable transport + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="userstats-bridge-transport.pdf${userstats_bridge_transport_url}">PDF</a> or +<a href="userstats-bridge-transport.svg${userstats_bridge_transport_url}">SVG</a>. +<a href="stats/clients.csv">CSV</a> file containing user estimates. +<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions +and answers about users statistics</a></p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/userstats-bridge-version.jsp b/website/web/WEB-INF/userstats-bridge-version.jsp new file mode 100644 index 0000000..b69454d --- /dev/null +++ b/website/web/WEB-INF/userstats-bridge-version.jsp @@ -0,0 +1,54 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Bridge users by IP version</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Bridge users by IP version</h3> +<br> +<img src="userstats-bridge-version.png${userstats_bridge_version_url}" + width="576" height="360" alt="Bridge users by IP version graph"> +<form action="userstats-bridge-version.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="userstats-bridge-version"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(userstats_bridge_version_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_bridge_version_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(userstats_bridge_version_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_bridge_version_end[0]}</c:otherwise></c:choose>"> + </p><p> + Source: <select name="version"> + <option value="v4"<c:if test="${userstats_bridge_version_version[0] eq 'v4'}"> selected</c:if>>IPv4</option> + <option value="v6"<c:if test="${userstats_bridge_version_version[0] eq 'v6'}"> selected</c:if>>IPv6</option> + </select> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="userstats-bridge-version.pdf${userstats_bridge_version_url}">PDF</a> or +<a href="userstats-bridge-version.svg${userstats_bridge_version_url}">SVG</a>. +<a href="stats/clients.csv">CSV</a> file containing user estimates. +<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions +and answers about users statistics</a></p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/userstats-censorship-events.jsp b/website/web/WEB-INF/userstats-censorship-events.jsp new file mode 100644 index 0000000..3c90214 --- /dev/null +++ b/website/web/WEB-INF/userstats-censorship-events.jsp @@ -0,0 +1,60 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Top-10 countries by possible censorship events</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Top-10 countries by possible censorship events (<a +href="http://research.torproject.org/techreports/detector-2011-09-09.pdf%22%3EBETA</a>)</h3> +<br> +<form action="userstats-censorship-events.html"> + <div class="formrow"> + <input type="hidden" name="table" value="userstats-censorship-events"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(userstats_censorship_events_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_censorship_events_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(userstats_censorship_events_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_censorship_events_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update table"> + </p> + </div> +</form> +<br> +<table> + <tr> + <th>Country</th> + <th>Downturns</th> + <th>Upturns</th> + </tr> + <c:forEach var="row" items="${userstats_censorship_events_tabledata}"> + <tr> + <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}&events=on#userstats-relay-country">${row['country']}</a> </td> + <td>${row['downturns']}</td> + <td>${row['upturns']}</td> + </tr> + </c:forEach> +</table> +<p><a href="stats/clients.csv">CSV</a> file containing user estimates. +<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions +and answers about users statistics</a></p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/userstats-relay-country.jsp b/website/web/WEB-INF/userstats-relay-country.jsp new file mode 100644 index 0000000..e010ea0 --- /dev/null +++ b/website/web/WEB-INF/userstats-relay-country.jsp @@ -0,0 +1,64 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Direct users by country</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Direct users by country</h3> +<br> +<img src="userstats-relay-country.png${userstats_relay_country_url}" + width="576" height="360" alt="Direct users by country graph"> +<form action="userstats-relay-country.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="userstats-relay-country"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(userstats_relay_country_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_country_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(userstats_relay_country_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_country_end[0]}</c:otherwise></c:choose>"> + </p><p> + Source: <select name="country"> + <option value="all"<c:if test="${userstats_relay_country_country[0] eq 'all'}"> selected</c:if>>All users</option> + <c:forEach var="country" items="${countries}" > + <option value="${country[0]}"<c:if test="${userstats_relay_country_country[0] eq country[0]}"> selected</c:if>>${country[1]}</option> + </c:forEach> + </select> + </p><p> + Show possible censorship events if available (<a + href="http://research.torproject.org/techreports/detector-2011-09-09.pdf%22%3EBETA</a>) + <select name="events"> + <option value="off">Off</option> + <option value="on"<c:if test="${userstats_relay_country_events[0] eq 'on'}"> selected</c:if>>On: both points and expected range</option> + <option value="points"<c:if test="${userstats_relay_country_events[0] eq 'points'}"> selected</c:if>>On: points only, no expected range</option> + </select> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="userstats-relay-country.pdf${userstats_relay_country_url}">PDF</a> or +<a href="userstats-relay-country.svg${userstats_relay_country_url}">SVG</a>. +<a href="stats/clients.csv">CSV</a> file containing user estimates. +<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions +and answers about users statistics</a></p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/userstats-relay-table.jsp b/website/web/WEB-INF/userstats-relay-table.jsp new file mode 100644 index 0000000..6e59cae --- /dev/null +++ b/website/web/WEB-INF/userstats-relay-table.jsp @@ -0,0 +1,57 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Top-10 countries by directly connecting users</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Top-10 countries by directly connecting users</h3> +<br> +<form action="userstats-relay-table.html"> + <div class="formrow"> + <input type="hidden" name="table" value="userstats-relay"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(userstats_relay_start) == 0}">${default_start_date}</c:when><c:otherwise>${userstats_relay_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(userstats_relay_end) == 0}">${default_end_date}</c:when><c:otherwise>${userstats_relay_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update table"> + </p> + </div> +</form> +<br> +<table> + <tr> + <th>Country</th> + <th>Mean daily users</th> + </tr> + <c:forEach var="row" items="${userstats_relay_tabledata}"> + <tr> + <td><a href="users.html?graph=userstats-relay-country&country=${row['cc']}#userstats-relay-country">${row['country']}</a> </td> + <td>${row['abs']} <c:if test="${row['rel'] != 'NA'}"> (<fmt:formatNumber type="number" minFractionDigits="2" value="${row['rel']}" /> %)</c:if></td> + </tr> + </c:forEach> +</table> +<p><a href="stats/clients.csv">CSV</a> file containing user estimates. +<a href="https://gitweb.torproject.org/metrics-web.git/blob/HEAD:/doc/users-q-and-a.txt">Questions +and answers about users statistics</a></p> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html> diff --git a/website/web/WEB-INF/versions.jsp b/website/web/WEB-INF/versions.jsp new file mode 100644 index 0000000..5e5490e --- /dev/null +++ b/website/web/WEB-INF/versions.jsp @@ -0,0 +1,55 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> +<html> +<head> + <title>Tor Metrics: Relays by version</title> + <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> + <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet"> + <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon"> +</head> +<body> + <div class="center"> + <%@ include file="banner.jsp"%> + <div class="main-column"> + +<h3>Tor Metrics: Relays by version</h3> +<br> +<p>Relays report the Tor version that they are running to the directory +authorities. See the +<a href="https://www.torproject.org/download/download.html.en">download +page</a> and +<a href="https://gitweb.torproject.org/tor.git/blob/HEAD:/ChangeLog">ChangeLog file</a> +to find out which Tor versions are stable and unstable. +The following graph shows the number of relays by version.</p> +<img src="versions.png${versions_url}" + width="576" height="360" alt="Relay versions graph"> +<form action="versions.html"> + <div class="formrow"> + <input type="hidden" name="graph" value="versions"> + <p> + <label>Start date (yyyy-mm-dd):</label> + <input type="text" name="start" size="10" + value="<c:choose><c:when test="${fn:length(versions_start) == 0}">${default_start_date}</c:when><c:otherwise>${versions_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(versions_end) == 0}">${default_end_date}</c:when><c:otherwise>${versions_end[0]}</c:otherwise></c:choose>"> + </p><p> + <input class="submit" type="submit" value="Update graph"> + </p> + </div> +</form> +<p>Download graph as +<a href="versions.pdf${versions_url}">PDF</a> or +<a href="versions.svg${versions_url}">SVG</a>.</p> +<p><a href="stats/servers.csv">CSV</a> file containing all data.</p> +<br> + + </div> + </div> + <div class="bottom" id="bottom"> + <%@ include file="footer.jsp"%> + </div> +</body> +</html>