[tor-commits] [metrics-web/master] Put metrics into categories.

karsten at torproject.org karsten at torproject.org
Mon Jan 9 17:03:42 UTC 2017


commit c7532f18d4f5ac93a7c21fbca3e0274a6c6ac505
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date:   Mon Dec 12 16:40:52 2016 +0100

    Put metrics into categories.
---
 website/build.xml                                  |  3 +
 website/etc/categories.json                        | 67 ++++++++++++++++++++++
 .../src/org/torproject/metrics/web/Category.java   | 34 +++++++++++
 .../torproject/metrics/web/ContentProvider.java    | 38 ++++++++++++
 .../org/torproject/metrics/web/GraphServlet.java   | 13 +++++
 .../org/torproject/metrics/web/MetricServlet.java  |  8 +++
 .../torproject/metrics/web/MetricsProvider.java    | 38 ------------
 .../org/torproject/metrics/web/TableServlet.java   | 12 ++++
 website/web/WEB-INF/graph.jsp                      | 28 ++++++++-
 website/web/WEB-INF/table.jsp                      | 28 ++++++++-
 10 files changed, 229 insertions(+), 40 deletions(-)

diff --git a/website/build.xml b/website/build.xml
index 9f37d13..6e156b4 100644
--- a/website/build.xml
+++ b/website/build.xml
@@ -51,6 +51,9 @@
       <zipfileset dir="etc"
                   prefix="WEB-INF/classes"
                   includes="metrics.json"/>
+      <zipfileset dir="etc"
+                  prefix="WEB-INF/classes"
+                  includes="categories.json"/>
       <metainf dir="etc"
                includes="context.xml"/>
     </war>
diff --git a/website/etc/categories.json b/website/etc/categories.json
new file mode 100644
index 0000000..563b662
--- /dev/null
+++ b/website/etc/categories.json
@@ -0,0 +1,67 @@
+[
+  {
+    "id": "clients",
+    "header": "Users",
+    "description": "<p>Where are Tor users from? How do they connect to Tor?</p>",
+    "metrics": [
+      "userstats-relay-country",
+      "userstats-bridge-country",
+      "userstats-bridge-transport",
+      "userstats-bridge-combined",
+      "userstats-bridge-version",
+      "userstats-relay-table",
+      "userstats-censorship-events",
+      "userstats-bridge-table"
+    ]
+  },
+  {
+    "id": "servers",
+    "header": "Relays and Bridges",
+    "description": "<p>How many relays and bridges are online? What do we know about them?</p>",
+    "metrics": [
+      "networksize",
+      "relayflags",
+      "versions",
+      "platforms"
+    ]
+  },
+  {
+    "id": "traffic",
+    "header": "Traffic",
+    "description": "<p>How much traffic can the Tor network handle? How much traffic is there?</p>",
+    "metrics": [
+      "bandwidth",
+      "bandwidth-flags",
+      "advbwdist-perc",
+      "advbwdist-relay",
+      "bwhist-flags",
+      "dirbytes"
+    ]
+  },
+  {
+    "id": "performance",
+    "header": "Performance",
+    "description": "<p>How fast and reliable is the Tor network?</p>",
+    "metrics": [
+      "torperf",
+      "torperf-failures",
+      "connbidirect"
+    ]
+  },
+  {
+    "id": "onion-services",
+    "header": "Onion Services",
+    "description": "<p>How many onion services are there? How much traffic do they pull?</p>",
+    "metrics": [
+      "hidserv-dir-onions-seen",
+      "hidserv-rend-relayed-cells",
+      "hidserv-frac-reporting"
+    ]
+  },
+  {
+    "id": "downloads",
+    "header": "Downloads (coming soon)",
+    "description": "<p>How many downloads of Tor applications are there? How many updates?</p>",
+    "metrics": []
+  }
+]
diff --git a/website/src/org/torproject/metrics/web/Category.java b/website/src/org/torproject/metrics/web/Category.java
new file mode 100644
index 0000000..7f71b22
--- /dev/null
+++ b/website/src/org/torproject/metrics/web/Category.java
@@ -0,0 +1,34 @@
+/* Copyright 2016 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.web;
+
+import java.util.List;
+
+public class Category {
+
+  private String id;
+
+  private String header;
+
+  private String description;
+
+  private List<String> metrics;
+
+  public String getId() {
+    return id;
+  }
+
+  public String getHeader() {
+    return header;
+  }
+
+  public String getDescription() {
+    return description;
+  }
+
+  public List<String> getMetrics() {
+    return metrics;
+  }
+}
+
diff --git a/website/src/org/torproject/metrics/web/ContentProvider.java b/website/src/org/torproject/metrics/web/ContentProvider.java
new file mode 100644
index 0000000..606e7db
--- /dev/null
+++ b/website/src/org/torproject/metrics/web/ContentProvider.java
@@ -0,0 +1,38 @@
+/* Copyright 2016 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.web;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class MetricsProvider {
+
+  private static MetricsProvider instance = new MetricsProvider();
+
+  public static MetricsProvider getInstance() {
+    return MetricsProvider.instance;
+  }
+
+  private List<Metric> metricsList;
+
+  private MetricsProvider() {
+    InputStream in = this.getClass().getClassLoader()
+        .getResourceAsStream("metrics.json");
+    Gson gson = new GsonBuilder().create();
+    Metric[] metricsArray = gson.fromJson(new InputStreamReader(in),
+        Metric[].class);
+    this.metricsList = Arrays.asList(metricsArray);
+  }
+
+  public List<Metric> getMetricsList() {
+    return new ArrayList<Metric>(this.metricsList);
+  }
+}
+
diff --git a/website/src/org/torproject/metrics/web/GraphServlet.java b/website/src/org/torproject/metrics/web/GraphServlet.java
index 189406c..3a73fa5 100644
--- a/website/src/org/torproject/metrics/web/GraphServlet.java
+++ b/website/src/org/torproject/metrics/web/GraphServlet.java
@@ -8,6 +8,7 @@ import org.torproject.metrics.web.graphs.GraphParameterChecker;
 
 import java.io.IOException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashMap;
@@ -135,6 +136,18 @@ public class GraphServlet extends MetricServlet {
     }
     request.setAttribute("id", requestedId);
     request.setAttribute("title", this.titles.get(requestedId));
+    if (this.categories.containsKey(requestedId)) {
+      Category category = this.categories.get(requestedId);
+      request.setAttribute("categoryHeader", category.getHeader());
+      request.setAttribute("categoryDescription", category.getDescription());
+      List<String[]> categoryTabs = new ArrayList<String[]>();
+      for (String metricId : category.getMetrics()) {
+        categoryTabs.add(new String[] {
+            this.titles.get(metricId),
+            requestedId.equals(metricId) ? null : metricId });
+      }
+      request.setAttribute("categoryTabs", categoryTabs);
+    }
     request.setAttribute("description",
         this.descriptions.get(requestedId));
     request.setAttribute("data", this.data.get(requestedId));
diff --git a/website/src/org/torproject/metrics/web/MetricServlet.java b/website/src/org/torproject/metrics/web/MetricServlet.java
index 086f9e7..8de6922 100644
--- a/website/src/org/torproject/metrics/web/MetricServlet.java
+++ b/website/src/org/torproject/metrics/web/MetricServlet.java
@@ -47,6 +47,8 @@ public abstract class MetricServlet extends HttpServlet {
   protected Map<String, List<String[]>> related =
       new HashMap<String, List<String[]>>();
 
+  protected Map<String, Category> categories = new HashMap<String, Category>();
+
   @Override
   public void init() throws ServletException {
     this.metrics = MetricsProvider.getInstance().getMetricsList();
@@ -113,6 +115,12 @@ public abstract class MetricServlet extends HttpServlet {
         }
       }
     }
+    for (Category category :
+        CategoriesProvider.getInstance().getCategoriesList()) {
+      for (String id : category.getMetrics()) {
+        categories.put(id, category);
+      }
+    }
   }
 }
 
diff --git a/website/src/org/torproject/metrics/web/MetricsProvider.java b/website/src/org/torproject/metrics/web/MetricsProvider.java
deleted file mode 100644
index 606e7db..0000000
--- a/website/src/org/torproject/metrics/web/MetricsProvider.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Copyright 2016 The Tor Project
- * See LICENSE for licensing information */
-
-package org.torproject.metrics.web;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-public class MetricsProvider {
-
-  private static MetricsProvider instance = new MetricsProvider();
-
-  public static MetricsProvider getInstance() {
-    return MetricsProvider.instance;
-  }
-
-  private List<Metric> metricsList;
-
-  private MetricsProvider() {
-    InputStream in = this.getClass().getClassLoader()
-        .getResourceAsStream("metrics.json");
-    Gson gson = new GsonBuilder().create();
-    Metric[] metricsArray = gson.fromJson(new InputStreamReader(in),
-        Metric[].class);
-    this.metricsList = Arrays.asList(metricsArray);
-  }
-
-  public List<Metric> getMetricsList() {
-    return new ArrayList<Metric>(this.metricsList);
-  }
-}
-
diff --git a/website/src/org/torproject/metrics/web/TableServlet.java b/website/src/org/torproject/metrics/web/TableServlet.java
index ad2b10a..035c0be 100644
--- a/website/src/org/torproject/metrics/web/TableServlet.java
+++ b/website/src/org/torproject/metrics/web/TableServlet.java
@@ -50,6 +50,18 @@ public class TableServlet extends MetricServlet {
     }
     request.setAttribute("id", requestedId);
     request.setAttribute("title", this.titles.get(requestedId));
+    if (this.categories.containsKey(requestedId)) {
+      Category category = this.categories.get(requestedId);
+      request.setAttribute("categoryHeader", category.getHeader());
+      request.setAttribute("categoryDescription", category.getDescription());
+      List<String[]> categoryTabs = new ArrayList<String[]>();
+      for (String metricId : category.getMetrics()) {
+        categoryTabs.add(new String[] {
+            this.titles.get(metricId),
+            requestedId.equals(metricId) ? null : metricId });
+      }
+      request.setAttribute("categoryTabs", categoryTabs);
+    }
     request.setAttribute("description",
         this.descriptions.get(requestedId));
     request.setAttribute("tableheader",
diff --git a/website/web/WEB-INF/graph.jsp b/website/web/WEB-INF/graph.jsp
index ad33e4d..2ce9583 100644
--- a/website/web/WEB-INF/graph.jsp
+++ b/website/web/WEB-INF/graph.jsp
@@ -11,8 +11,34 @@
 <body>
   <div class="center">
     <div class="main-column">
+        <h2><a href="/"><img src="images/metrics-logo.png" width="153" height="200" alt="Metrics logo"><img src="images/metrics-wordmark.png" width="384" height="50" alt="Metrics wordmark"></a></h2>
+        <br>
+
+<p>"Tor metrics are the ammunition that lets Tor and other security
+advocates argue for a more private and secure Internet from a position
+of data, rather than just dogma or perspective."
+<i>- Bruce Schneier (June 1, 2016)</i></p>
+
+        <!-- Navigation start -->
+        Metrics |
+        <a href="about.html">About</a> |
+        <a href="news.html">News</a> |
+        <a href="sources.html">Sources</a> |
+        <a href="tools.html">Tools</a> |
+        <a href="research.html">Research</a>
+        <br>
+        <br>
+        <!-- Navigation end -->
+
+<h2>${categoryHeader}</h2>
+
+${categoryDescription}
+
+<c:forEach var="tab" items="${categoryTabs}">
+<c:if test="${fn:length(tab[1]) > 0}"><a href="${tab[1]}.html"></c:if>${tab[0]}<c:if test="${fn:length(tab[1]) > 0}"></a></c:if> |
+</c:forEach>
+<br>
 
-<h2><a href="."><img src="images/metrics-wordmark-small.png" width="138" height="18" alt="Metrics wordmark"></a> — ${title}</h2>
 <br>
 ${description}
 <img src="${id}.png${parameters}"
diff --git a/website/web/WEB-INF/table.jsp b/website/web/WEB-INF/table.jsp
index 1eca70f..ffabd75 100644
--- a/website/web/WEB-INF/table.jsp
+++ b/website/web/WEB-INF/table.jsp
@@ -11,8 +11,34 @@
 <body>
   <div class="center">
     <div class="main-column">
+        <h2><a href="/"><img src="images/metrics-logo.png" width="153" height="200" alt="Metrics logo"><img src="images/metrics-wordmark.png" width="384" height="50" alt="Metrics wordmark"></a></h2>
+        <br>
+
+<p>"Tor metrics are the ammunition that lets Tor and other security
+advocates argue for a more private and secure Internet from a position
+of data, rather than just dogma or perspective."
+<i>- Bruce Schneier (June 1, 2016)</i></p>
+
+        <!-- Navigation start -->
+        Metrics |
+        <a href="about.html">About</a> |
+        <a href="news.html">News</a> |
+        <a href="sources.html">Sources</a> |
+        <a href="tools.html">Tools</a> |
+        <a href="research.html">Research</a>
+        <br>
+        <br>
+        <!-- Navigation end -->
+
+<h2>${categoryHeader}</h2>
+
+${categoryDescription}
+
+<c:forEach var="tab" items="${categoryTabs}">
+<c:if test="${fn:length(tab[1]) > 0}"><a href="${tab[1]}.html"></c:if>${tab[0]}<c:if test="${fn:length(tab[1]) > 0}"></a></c:if> |
+</c:forEach>
+<br>
 
-<h2><a href="."><img src="images/metrics-wordmark-small.png" width="138" height="18" alt="Metrics wordmark"></a> — ${title}</h2>
 <br>
 ${description}
 <form action="${id}.html">





More information about the tor-commits mailing list