You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by gi...@apache.org on 2018/04/25 18:11:01 UTC

[2/3] incubator-trafficcontrol-website git commit: Update docs from commit 9c7e17bb5fd1625cc26872365047e16cd454ae62

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol-website/blob/feda6059/docs/master/development/traffic_monitor.html
----------------------------------------------------------------------
diff --git a/docs/master/development/traffic_monitor.html b/docs/master/development/traffic_monitor.html
index 6f8bc00..e57fd21 100644
--- a/docs/master/development/traffic_monitor.html
+++ b/docs/master/development/traffic_monitor.html
@@ -9,7 +9,7 @@
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
-  <title>Traffic Monitor &mdash; Traffic Control 2.2-dev documentation </title>
+  <title>Traffic Monitor Golang &mdash; Traffic Control 2.2-dev documentation </title>
   
 
   
@@ -132,8 +132,7 @@
 <li class="toctree-l2"><a class="reference internal" href="traffic_ops.html">Traffic Ops</a></li>
 <li class="toctree-l2"><a class="reference internal" href="traffic_portal.html">Traffic Portal</a></li>
 <li class="toctree-l2"><a class="reference internal" href="traffic_router.html">Traffic Router</a></li>
-<li class="toctree-l2 current"><a class="current reference internal" href="#">Traffic Monitor</a></li>
-<li class="toctree-l2"><a class="reference internal" href="traffic_monitor_golang.html">Traffic Monitor Golang</a></li>
+<li class="toctree-l2 current"><a class="current reference internal" href="#">Traffic Monitor Golang</a></li>
 <li class="toctree-l2"><a class="reference internal" href="traffic_stats.html">Traffic Stats</a></li>
 <li class="toctree-l2"><a class="reference internal" href="traffic_server.html">Traffic Server</a></li>
 </ul>
@@ -175,7 +174,7 @@
       
           <li><a href="index.html">Developer’s Guide</a> &raquo;</li>
       
-    <li>Traffic Monitor</li>
+    <li>Traffic Monitor Golang</li>
       <li class="wy-breadcrumbs-aside">
         
           <a href="../_sources/development/traffic_monitor.rst.txt" rel="nofollow"> View page source</a>
@@ -196,140 +195,269 @@
   		  
           <div role="main" class="document">
             
-  <div class="section" id="traffic-monitor">
-<h1>Traffic Monitor<a class="headerlink" href="#traffic-monitor" title="Permalink to this headline">¶</a></h1>
+  <div class="section" id="traffic-monitor-golang">
+<h1>Traffic Monitor Golang<a class="headerlink" href="#traffic-monitor-golang" title="Permalink to this headline">¶</a></h1>
 <div class="section" id="introduction">
 <h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
-<p>Traffic Monitor is a Java Tomcat application that monitors caches, provides health state information to Traffic Router, and collects statistics for use in tools such as Traffic Ops and Traffic Stats.  The health state provided by Traffic Monitor is used by Traffic Router to control which caches are available on the CDN.</p>
+<p>Traffic Monitor is an HTTP service application that monitors caches, provides health state information to Traffic Router, and collects statistics for use in tools such as Traffic Ops and Traffic Stats. The health state provided by Traffic Monitor is used by Traffic Router to control which caches are available on the CDN.</p>
 </div>
 <div class="section" id="software-requirements">
 <h2>Software Requirements<a class="headerlink" href="#software-requirements" title="Permalink to this headline">¶</a></h2>
 <p>To work on Traffic Monitor you need a *nix (MacOS and Linux are most commonly used) environment that has the following installed:</p>
 <ul class="simple">
-<li>Eclipse &gt;= Kepler SR2 (or another Java IDE)</li>
-<li>Maven &gt;= 3.3.1</li>
-<li>JDK &gt;= 6.0</li>
+<li>Golang</li>
 </ul>
 </div>
-<div class="section" id="traffic-monitor-project-tree-overview">
-<h2>Traffic Monitor Project Tree Overview<a class="headerlink" href="#traffic-monitor-project-tree-overview" title="Permalink to this headline">¶</a></h2>
+<div class="section" id="project-tree-overview">
+<h2>Project Tree Overview<a class="headerlink" href="#project-tree-overview" title="Permalink to this headline">¶</a></h2>
 <ul>
-<li><p class="first"><code class="docutils literal notranslate"><span class="pre">traffic_control/traffic_monitor/</span></code> - base directory for Traffic Monitor</p>
-<blockquote>
-<div><ul>
-<li><p class="first"><code class="docutils literal notranslate"><span class="pre">etc/</span></code> - Miscellaneous simulator utilities</p>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">traffic_control/traffic_monitor/</span></code> - base directory for Traffic Monitor.</p>
 </li>
-<li><p class="first"><code class="docutils literal notranslate"><span class="pre">src/main</span></code> - Main source directory for the Traffic Monitor</p>
-<blockquote>
-<div><ul class="simple">
-<li><code class="docutils literal notranslate"><span class="pre">bin/</span></code> - Configuration tools</li>
-<li><code class="docutils literal notranslate"><span class="pre">conf/</span></code> - Configuration files</li>
-<li><code class="docutils literal notranslate"><span class="pre">java/</span></code> - Java source code for Traffic Monitor</li>
-<li><code class="docutils literal notranslate"><span class="pre">opt/tomcat/conf</span></code> - Contains Tomcat configuration file(s) pulled in during an RPM build</li>
-<li><code class="docutils literal notranslate"><span class="pre">resources/</span></code> - Resources pulled in during an RPM build</li>
-<li><code class="docutils literal notranslate"><span class="pre">scripts/</span></code> - Scripts used by the RPM build process</li>
-<li><code class="docutils literal notranslate"><span class="pre">webapp/</span></code> - Java webapp resources</li>
-</ul>
-</div></blockquote>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">cache/</span></code> - Handler for processing cache results.</p>
 </li>
-<li><p class="first"><code class="docutils literal notranslate"><span class="pre">src/test</span></code> - Test source directory for Traffic Monitor</p>
-<blockquote>
-<div><ul class="simple">
-<li><code class="docutils literal notranslate"><span class="pre">java/</span></code> - JUnit based unit tests for Traffic Monitor</li>
-<li><code class="docutils literal notranslate"><span class="pre">resources/conf</span></code> - Configuration files used by unit tests</li>
-<li><code class="docutils literal notranslate"><span class="pre">resources/db</span></code> - Files downloaded by unit tests</li>
-<li><code class="docutils literal notranslate"><span class="pre">resources/var</span></code> - Files generated by unit tests</li>
-</ul>
-</div></blockquote>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">config/</span></code> - Application configuration; in-memory objects from <code class="docutils literal notranslate"><span class="pre">traffic_monitor.cfg</span></code>.</p>
 </li>
-</ul>
-</div></blockquote>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">crconfig/</span></code> - struct for deserlializing the CRConfig from JSON.</p>
+</li>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">deliveryservice/</span></code> - aggregates delivery service data from cache results.</p>
 </li>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">deliveryservicedata/</span></code> - deliveryservice structs. This exists separate from <code class="docutils literal notranslate"><span class="pre">deliveryservice</span></code> to avoid circular dependencies.</p>
+</li>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">enum/</span></code> - enumerations and name alias types.</p>
+</li>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">health/</span></code> - functions for calculating cache health, and creating health event objects.</p>
+</li>
+<li><dl class="first docutils">
+<dt><code class="docutils literal notranslate"><span class="pre">manager/</span></code> - manager goroutines (microthreads).</dt>
+<dd><ul class="first last simple">
+<li><code class="docutils literal notranslate"><span class="pre">health.go</span></code> - Health request manager. Processes health results, from the health poller -&gt; fetcher -&gt; manager. The health poll is the “heartbeat” containing a small amount of stats, primarily to determine whether a cache is reachable as quickly as possible. Data is aggregated and inserted into shared threadsafe objects.</li>
+<li><code class="docutils literal notranslate"><span class="pre">manager.go</span></code> - Contains <code class="docutils literal notranslate"><span class="pre">Start</span></code> function to start all pollers, handlers, and managers.</li>
+<li><code class="docutils literal notranslate"><span class="pre">monitorconfig.go</span></code> - Monitor config manager. Gets data from the monitor config poller, which polls Traffic Ops for changes to which caches are monitored and how.</li>
+<li><code class="docutils literal notranslate"><span class="pre">opsconfig.go</span></code> - Ops config manager. Gets data from the ops config poller, which polls Traffic Ops for changes to monitoring settings.</li>
+<li><code class="docutils literal notranslate"><span class="pre">peer.go</span></code> - Peer manager. Gets data from the peer poller -&gt; fetcher -&gt; handler and aggregates it into the shared threadsafe objects.</li>
+<li><code class="docutils literal notranslate"><span class="pre">stat.go</span></code> - Stat request manager. Processes stat results, from the stat poller -&gt; fetcher -&gt; manager. The stat poll is the large statistics poll, containing all stats (such as HTTP codes, transactions, delivery service statistics, and more). Data is aggregated and inserted into shared threadsafe objects.</li>
+<li><code class="docutils literal notranslate"><span class="pre">statecombiner.go</span></code> - Manager for combining local and peer states, into a single combined states threadsafe object, for serving the CrStates endpoint.</li>
 </ul>
-</div>
-<div class="section" id="java-formatting-conventions">
-<h2>Java Formatting Conventions<a class="headerlink" href="#java-formatting-conventions" title="Permalink to this headline">¶</a></h2>
-<p>None at this time.  The codebase will eventually be formatted per Java standards.</p>
-</div>
-<div class="section" id="installing-the-developer-environment">
-<h2>Installing The Developer Environment<a class="headerlink" href="#installing-the-developer-environment" title="Permalink to this headline">¶</a></h2>
-<p>To install the Traffic Monitor Developer environment:</p>
-<ol class="arabic simple">
-<li>Clone the traffic_control repository using Git.</li>
-<li>Change directories into <code class="docutils literal notranslate"><span class="pre">traffic_control/traffic_monitor</span></code>.</li>
-<li>Edit the following parameters in src/test/resources/conf/traffic_monitor_config.js:</li>
-</ol>
-<blockquote>
-<div><table border="1" class="docutils">
-<colgroup>
-<col width="22%" />
-<col width="78%" />
-</colgroup>
-<thead valign="bottom">
-<tr class="row-odd"><th class="head">Parameter</th>
-<th class="head">Value</th>
-</tr>
-</thead>
-<tbody valign="top">
-<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">tm.hostname</span></code></td>
-<td>FQDN of the Traffic Ops instance (do not include <a class="reference external" href="http://">http://</a>).</td>
-</tr>
-<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">tm.username</span></code></td>
-<td>Admin username for Traffic Ops</td>
-</tr>
-<tr class="row-even"><td><code class="docutils literal notranslate"><span class="pre">tm.password</span></code></td>
-<td>Password for admin user</td>
-</tr>
-<tr class="row-odd"><td><code class="docutils literal notranslate"><span class="pre">cdnName</span></code></td>
-<td>Name of the CDN this Traffic Monitor will monitor</td>
-</tr>
-</tbody>
-</table>
-<p>Note: any change done later in the configuration file requires a mvn build in order to be applied.</p>
-</div></blockquote>
-<ol class="arabic" start="4">
-<li><p class="first">Import the existing git repo into Eclipse:</p>
-<blockquote>
-<div><ol class="loweralpha simple">
-<li>File -&gt; Import -&gt; Git -&gt; Projects from Git; Next</li>
-<li>Existing local repository; Next</li>
-<li>Add -&gt; browse to find <code class="docutils literal notranslate"><span class="pre">traffic_control</span></code>; Add</li>
-<li>Select <code class="docutils literal notranslate"><span class="pre">traffic_control</span></code>; Next</li>
-<li>Ensure “Import existing projects” is selected, expand <code class="docutils literal notranslate"><span class="pre">traffic_control</span></code>, select <code class="docutils literal notranslate"><span class="pre">traffic_monitor</span></code>; Next</li>
-<li>Ensure <code class="docutils literal notranslate"><span class="pre">traffic_monitor</span></code> is checked; Finish</li>
-<li>Ensure <code class="docutils literal notranslate"><span class="pre">traffic_monitor</span></code> has been opened by Eclipse after importing</li>
-</ol>
-</div></blockquote>
+</dd>
+</dl>
 </li>
-<li><p class="first">Run <code class="docutils literal notranslate"><span class="pre">mvn</span> <span class="pre">clean</span> <span class="pre">verify</span></code> from the <code class="docutils literal notranslate"><span class="pre">traffic_monitor</span></code> directory</p>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">datareq/</span></code> - HTTP routing, which has threadsafe health and stat objects populated by stat and health managers.</p>
 </li>
-<li><p class="first">Start the embedded Jetty instance from within Eclipse</p>
-<blockquote>
-<div><ol class="loweralpha">
-<li><p class="first">In the package explorer, expand <code class="docutils literal notranslate"><span class="pre">traffic_monitor</span></code></p>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">peer/</span></code> - Manager for getting and populating peer data from other Traffic Monitors</p>
 </li>
-<li><p class="first">Expand <code class="docutils literal notranslate"><span class="pre">src/test/java</span></code></p>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">srvhttp/</span></code> - HTTP service. Given a map of endpoint functions, which are lambda closures containing aggregated data objects.</p>
 </li>
-<li><p class="first">Expand the package <code class="docutils literal notranslate"><span class="pre">com.comcast.cdn.traffic_control.traffic_monitor</span></code></p>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">static/</span></code> - Web GUI HTML and javascript files</p>
 </li>
-<li><p class="first">Open and run <code class="docutils literal notranslate"><span class="pre">Start.java</span></code></p>
-<blockquote>
-<div><div class="admonition note">
-<p class="first admonition-title">Note</p>
-<p class="last">If an error is displayed in the Console, run <code class="docutils literal notranslate"><span class="pre">mvn</span> <span class="pre">clean</span> <span class="pre">verify</span></code> from the <code class="docutils literal notranslate"><span class="pre">traffic_monitor</span></code> directory</p>
-</div>
-</div></blockquote>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">threadsafe/</span></code> - Threadsafe objects for storing aggregated data needed by multiple goroutines (typically the aggregator and HTTP server)</p>
 </li>
-<li><p class="first">With a web browser, navigate to <a class="reference external" href="http://localhost:8080">http://localhost:8080</a></p>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">trafficopsdata/</span></code> - Struct for fetching and storing Traffic Ops data needed from the CRConfig. This is primarily mappings, such as delivery service servers, and server types.</p>
 </li>
-</ol>
-</div></blockquote>
+<li><p class="first"><code class="docutils literal notranslate"><span class="pre">trafficopswrapper/</span></code> - Threadsafe wrapper around the Traffic Ops client. The client used to not be threadsafe, however, it mostly (possibly entirely) is now. But, the wrapper also serves to overwrite the Traffic Ops <code class="docutils literal notranslate"><span class="pre">monitoring.json</span></code> values, which are live, with snapshotted CRConfig values.</p>
 </li>
+</ul>
+</div>
+<div class="section" id="architecture">
+<h2>Architecture<a class="headerlink" href="#architecture" title="Permalink to this headline">¶</a></h2>
+<p>At the highest level, Traffic Monitor polls caches, aggregates their data and availability, and serves it at HTTP JSON endpoints.</p>
+<p>In the code, the data flows thru microthread (goroutine) pipelines. All stages of the pipeline are independent running microthreads <a class="footnote-reference" href="#f1" id="id1">[1]</a> . The pipelines are:</p>
+<ul class="simple">
+<li><strong>stat poll</strong> - polls caches for all statistics data. This should be a slower poll, which gets a lot of data.</li>
+<li><strong>health poll</strong> - polls caches for a tiny amount of data, typically system information. This poll is designed to be a heartbeat, determining quickly whether the cache is reachable. Since it’s a small amount of data, it should poll more frequently.</li>
+<li><strong>peer poll</strong> - polls Traffic Monitor peers for their availability data, and aggregates it with its own availability results and that of all other peers.</li>
+<li><strong>monitor config</strong> - polls Traffic Ops for the list of Traffic Monitors and their info.</li>
+<li><strong>ops config</strong> - polls for changes to the ops config file <code class="docutils literal notranslate"><span class="pre">traffic_ops.cfg</span></code>, and sends updates to other pollers when the config file has changed.<ul>
+<li>The ops config manager also updates the shared Traffic Ops client, since it’s the actor which becomes notified of config changes requiring a new client.</li>
+<li>The ops config manager also manages, creates, and recreates the HTTP server, since ops config changes necessitate restarting the HTTP server.</li>
+</ul>
+</li>
+</ul>
+<p>All microthreads in the pipeline are started by <code class="docutils literal notranslate"><span class="pre">manager/manager.go:Start()</span></code>.</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span class="o">--------------------</span>     <span class="o">--------------------</span>     <span class="o">--------------------</span>
+<span class="o">|</span> <span class="n">ops</span> <span class="n">config</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">ops</span> <span class="n">config</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">ops</span> <span class="n">config</span> <span class="n">manager</span> <span class="o">|--&gt;-</span><span class="n">restart</span> <span class="n">HTTP</span> <span class="n">server</span><span class="o">-------------------------</span>
+ <span class="o">-------------------</span>     <span class="o">--------------------</span>     <span class="o">--------------------</span> <span class="o">|</span>                                              <span class="o">|</span>
+                                                                       <span class="o">--&gt;-</span><span class="n">ops</span> <span class="n">config</span> <span class="n">change</span> <span class="n">subscriber</span><span class="o">-------------</span>  <span class="o">|</span>
+                                                                       <span class="o">|</span>                                           <span class="o">|</span>  <span class="o">|</span>
+                                                                       <span class="o">--&gt;-</span><span class="n">Traffic</span> <span class="n">Ops</span> <span class="n">client</span> <span class="n">change</span> <span class="n">subscriber</span><span class="o">--</span>  <span class="o">|</span>  <span class="o">|</span>
+                                                                                                                <span class="o">|</span>  <span class="o">|</span>  <span class="o">|</span>
+    <span class="o">-------------------------------------------------------------------------------------------------------------</span>  <span class="o">|</span>  <span class="o">|</span>
+    <span class="o">|</span>                                                                                                              <span class="o">|</span>  <span class="o">|</span>
+    <span class="o">|</span>   <span class="o">------------------------------------------------------------------------------------------------------------</span>  <span class="o">|</span>
+    <span class="o">|</span>   <span class="o">|</span>                                                                                                             <span class="o">|</span>
+    \<span class="o">/</span>  \<span class="o">/</span>                                                                                                            <span class="o">|</span>
+   <span class="o">-----------------------</span>     <span class="o">------------------------</span>                                                               <span class="o">|</span>
+  <span class="o">|</span> <span class="n">monitor</span> <span class="n">config</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">monitor</span> <span class="n">config</span> <span class="n">manager</span> <span class="o">|--&gt;-</span><span class="n">stat</span> <span class="n">subscriber</span><span class="o">--------</span>             <span class="o">-----------------------</span>
+   <span class="o">-----------------------</span>     <span class="o">------------------------</span> <span class="o">|</span>                         <span class="o">|</span>             <span class="o">|</span>
+                                                        <span class="o">|-&gt;-</span><span class="n">health</span> <span class="n">subscriber</span><span class="o">---</span>  <span class="o">|</span>             \<span class="o">/</span>                           <span class="n">_</span>
+                                                        <span class="o">|</span>                      <span class="o">|</span>  <span class="o">|</span>       <span class="o">-------------</span>                    <span class="n">_</span><span class="p">(</span> <span class="p">)</span><span class="o">.</span><span class="n">_</span>
+                                                        <span class="o">--&gt;-</span><span class="n">peer</span> <span class="n">subscriber</span><span class="o">--</span>  <span class="o">|</span>  <span class="o">|</span>      <span class="o">|</span> <span class="n">HTTP</span> <span class="n">server</span> <span class="o">|-&gt;-</span><span class="n">HTTP</span> <span class="n">request</span><span class="o">-&gt;</span> <span class="p">(</span><span class="n">____</span><span class="p">)</span><span class="n">_</span><span class="p">)</span>
+                                                                            <span class="o">|</span>  <span class="o">|</span>  <span class="o">|</span>       <span class="o">-------------</span>
+<span class="o">-----------------------------------------------------------------------------</span>  <span class="o">|</span>  <span class="o">|</span>              <span class="o">^</span>
+<span class="o">|</span>                                                                              <span class="o">|</span>  <span class="o">|</span>              <span class="o">|</span>
+<span class="o">|</span>  <span class="o">-----------------------------------------------------------------------------</span>  <span class="o">|</span>              <span class="o">------------------------</span>
+<span class="o">|</span>  <span class="o">|</span>                                                                              <span class="o">|</span>                                     <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>  <span class="o">-----------------------------------------------------------------------------</span>                                     <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>  <span class="o">|</span>                                                                                                                 <span class="o">^</span>
+<span class="o">|</span>  <span class="o">|</span>  <span class="o">|</span>   <span class="o">-------------</span>     <span class="o">--------------</span>     <span class="o">--------------</span>     <span class="o">--------------</span>                            <span class="o">-----------------------</span>
+<span class="o">|</span>  <span class="o">|</span>  <span class="o">--&gt;|</span> <span class="n">stat</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">stat</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">stat</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">stat</span> <span class="n">manager</span> <span class="o">|-&gt;--------</span><span class="nb">set</span> <span class="n">shared</span> <span class="n">data</span><span class="o">-&gt;|</span> <span class="n">shared</span> <span class="n">data</span>         <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>      <span class="o">-------------</span> <span class="o">|</span>   <span class="o">--------------</span>     <span class="o">--------------</span>  <span class="o">|</span>  <span class="o">--------------</span>                            <span class="o">-----------------------</span>
+<span class="o">|</span>  <span class="o">|</span>                    <span class="o">|</span>   <span class="o">--------------</span>     <span class="o">--------------</span>  <span class="o">|</span>                                            <span class="o">|</span> <span class="n">events</span>              <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>                    <span class="o">|-&gt;|</span> <span class="n">stat</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">stat</span> <span class="n">handler</span> <span class="o">|-|</span>                                            <span class="o">|</span> <span class="n">toData</span>              <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>                    <span class="o">|</span>   <span class="o">--------------</span>     <span class="o">--------------</span>  <span class="o">|</span>                                            <span class="o">|</span> <span class="n">errorCount</span>          <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>                    <span class="o">...</span>                                    <span class="o">...</span>                                          <span class="o">|</span> <span class="n">healthIteration</span>     <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>                                                                                                        <span class="o">|</span> <span class="n">fetchCount</span>          <span class="o">|</span>
+<span class="o">|</span>  <span class="o">|</span>     <span class="o">---------------</span>     <span class="o">----------------</span>     <span class="o">----------------</span>     <span class="o">----------------</span>                     <span class="o">|</span> <span class="n">localStates</span>         <span class="o">|</span>
+<span class="o">|</span>  <span class="o">----&gt;|</span> <span class="n">health</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">health</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">health</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">health</span> <span class="n">manager</span> <span class="o">|-&gt;-</span><span class="nb">set</span> <span class="n">shared</span> <span class="n">data</span><span class="o">-&gt;|</span> <span class="n">toSession</span>           <span class="o">|</span>
+<span class="o">|</span>        <span class="o">---------------</span> <span class="o">|</span>   <span class="o">----------------</span>     <span class="o">----------------</span>  <span class="o">|</span>  <span class="o">----------------</span>                     <span class="o">|</span> <span class="n">peerStates</span>          <span class="o">|</span>
+<span class="o">|</span>                        <span class="o">|</span>   <span class="o">----------------</span>     <span class="o">----------------</span>  <span class="o">|</span>                                       <span class="o">|</span> <span class="n">monitorConfig</span>       <span class="o">|</span>
+<span class="o">|</span>                        <span class="o">|-&gt;|</span> <span class="n">health</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">health</span> <span class="n">handler</span> <span class="o">|-|</span>                                       <span class="o">|</span> <span class="n">combinedStates</span>      <span class="o">|</span>
+<span class="o">|</span>                        <span class="o">|</span>   <span class="o">----------------</span>     <span class="o">----------------</span>  <span class="o">|</span>                                       <span class="o">|</span> <span class="n">statInfoHistory</span>     <span class="o">|</span>
+<span class="o">|</span>                        <span class="o">...</span>                                        <span class="o">...</span>                                     <span class="o">|</span> <span class="n">statResultHistory</span>   <span class="o">|</span>
+<span class="o">|</span>                                                                                                           <span class="o">|</span> <span class="n">statMaxKbpses</span>       <span class="o">|</span>
+<span class="o">|</span>       <span class="o">-------------</span>     <span class="o">--------------</span>     <span class="o">--------------</span>     <span class="o">--------------</span>                              <span class="o">|</span> <span class="n">lastKbpsStats</span>       <span class="o">|</span>
+<span class="o">------&gt;|</span> <span class="n">peer</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">peer</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">peer</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">peer</span> <span class="n">manager</span> <span class="o">|-&gt;----------</span><span class="nb">set</span> <span class="n">shared</span> <span class="n">data</span><span class="o">-&gt;|</span> <span class="n">dsStats</span>             <span class="o">|</span>
+        <span class="o">-------------</span> <span class="o">|</span>   <span class="o">--------------</span>     <span class="o">--------------</span>  <span class="o">|</span>  <span class="o">--------------</span>                              <span class="o">|</span> <span class="n">localCacheStatus</span>    <span class="o">|</span>
+                      <span class="o">|</span>   <span class="o">--------------</span>     <span class="o">--------------</span>  <span class="o">|</span>                                              <span class="o">|</span> <span class="n">lastHealthDurations</span> <span class="o">|</span>
+                      <span class="o">|-&gt;|</span> <span class="n">peer</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">peer</span> <span class="n">handler</span> <span class="o">|-|</span>                                              <span class="o">|</span> <span class="n">healthHistory</span>       <span class="o">|</span>
+                      <span class="o">|</span>   <span class="o">--------------</span>     <span class="o">--------------</span>  <span class="o">|</span>                                              <span class="o">-----------------------</span>
+                      <span class="o">...</span>                                    <span class="o">...</span>
+</pre></div>
+</div>
+<table class="docutils footnote" frame="void" id="f1" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>Technically, some stages which are one-to-one simply call the next stage as a function. For example, the Fetcher calls the Handler as a function in the same microthread. But this isn’t architecturally significant.</td></tr>
+</tbody>
+</table>
+<div class="section" id="stat-pipeline">
+<h3>Stat Pipeline<a class="headerlink" href="#stat-pipeline" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span class="o">---------</span>     <span class="o">---------</span>     <span class="o">---------</span>     <span class="o">---------</span>
+<span class="o">|</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">manager</span> <span class="o">|</span>
+ <span class="o">--------</span> <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>  <span class="o">---------</span>
+          <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>
+          <span class="o">|-&gt;|</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">handler</span> <span class="o">|-|</span>
+          <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>
+          <span class="o">...</span>                          <span class="o">...</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><strong>poller</strong> - <code class="docutils literal notranslate"><span class="pre">common/poller/poller.go:HttpPoller.Poll()</span></code>. Listens for config changes (from the ops config manager), and starts its own internal microthreads, one for each cache to poll. These internal microthreads call the Fetcher at each cache’s poll interval.</li>
+<li><strong>fetcher</strong> - <code class="docutils literal notranslate"><span class="pre">common/fetcher/fetcher.go:HttpFetcher.Fetch()</span></code>. Fetches the given URL, and passes the returned data to the Handler, along with any errors.</li>
+<li><strong>handler</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/cache/cache.go:Handler.Handle()</span></code>. Takes the given result and does all data computation possible with the single result. Currently, this computation primarily involves processing the denormalized ATS data into Go structs, and processing System data into OutBytes, Kbps, etc. Precomputed data is then passed to its result channel, which is picked up by the Manager.</li>
+<li><strong>manager</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/manager/stat.go:StartStatHistoryManager()</span></code>. Takes preprocessed results, and aggregates them. Aggregated results are then placed in shared data structures. The major data aggregated are delivery service statistics, and cache availability data. See <a class="reference internal" href="#agg-stat-data"><span class="std std-ref">Aggregated Stat Data</span></a> and <a class="reference internal" href="#agg-avail-data"><span class="std std-ref">Aggregated Availability Data</span></a>.</li>
+</ul>
+</div>
+<div class="section" id="health-pipeline">
+<h3>Health Pipeline<a class="headerlink" href="#health-pipeline" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span class="o">---------</span>     <span class="o">---------</span>     <span class="o">---------</span>     <span class="o">---------</span>
+<span class="o">|</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">manager</span> <span class="o">|</span>
+ <span class="o">--------</span> <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>  <span class="o">---------</span>
+          <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>
+          <span class="o">|-&gt;|</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">handler</span> <span class="o">|-|</span>
+          <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>
+          <span class="o">...</span>                          <span class="o">...</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><strong>poller</strong> - <code class="docutils literal notranslate"><span class="pre">common/poller/poller.go:HttpPoller.Poll()</span></code>. Same poller type as the Stat Poller pipeline, with a different handler object.</li>
+<li><strong>fetcher</strong> - <code class="docutils literal notranslate"><span class="pre">common/fetcher/fetcher.go:HttpFetcher.Fetch()</span></code>. Same fetcher type as the Stat Poller pipeline, with a different handler object.</li>
+<li><strong>handler</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/cache/cache.go:Handler.Handle()</span></code>. Same handler type as the Stat Poller pipeline, but constructed with a flag to not precompute. The health endpoint is of the same form as the stat endpoint, but doesn’t return all stat data. So, it doesn’t precompute like the Stat Handler, but only processes the system data, and passes the processed result to its result channel, which is picked up by the Manager.</li>
+<li><strong>manager</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/manager/health.go:StartHealthResultManager()</span></code>. Takes preprocessed results, and aggregates them. For the Health pipeline, only health availability data is aggregated. Aggregated results are then placed in shared data structures (lastHealthDurationsThreadsafe, lastHealthEndTimes, etc). See <a class="reference internal" href="#agg-avail-data"><span class="std std-ref">Aggregated Availability Data</span></a>.</li>
+</ul>
+</div>
+<div class="section" id="peer-pipeline">
+<h3>Peer Pipeline<a class="headerlink" href="#peer-pipeline" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span class="o">---------</span>     <span class="o">---------</span>     <span class="o">---------</span>     <span class="o">---------</span>
+<span class="o">|</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">manager</span> <span class="o">|</span>
+ <span class="o">--------</span> <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>  <span class="o">---------</span>
+          <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>
+          <span class="o">|-&gt;|</span> <span class="n">fetcher</span> <span class="o">|--&gt;|</span> <span class="n">handler</span> <span class="o">|-|</span>
+          <span class="o">|</span>   <span class="o">---------</span>     <span class="o">---------</span>  <span class="o">|</span>
+          <span class="o">...</span>                          <span class="o">...</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><strong>poller</strong> - <code class="docutils literal notranslate"><span class="pre">common/poller/poller.go:HttpPoller.Poll()</span></code>. Same poller type as the Stat and Health Poller pipelines, with a different handler object. Its config changes come from the Monitor Config Manager, and it starts an internal microthread for each peer to poll.</li>
+<li><strong>fetcher</strong> - <code class="docutils literal notranslate"><span class="pre">common/fetcher/fetcher.go:HttpFetcher.Fetch()</span></code>. Same fetcher type as the Stat and Health Poller pipeline, with a different handler object.</li>
+<li><strong>handler</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/cache/peer.go:Handler.Handle()</span></code>. Decodes the JSON result into an object, and without further processing passes to its result channel, which is picked up by the Manager.</li>
+<li><strong>manager</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/manager/peer.go:StartPeerManager()</span></code>. Takes JSON peer Traffic Monitor results, and aggregates them. The availability of the Peer Traffic Monitor itself, as well as all cache availability from the given peer result, is stored in the shared <code class="docutils literal notranslate"><span class="pre">peerStates</span></code> object. Results are then aggregated via a call to the <code class="docutils literal notranslate"><span class="pre">combineState()</span></code> lambda, which signals the State Combiner microthread (which stores the combined availability in the shared object <code class="docutils literal notranslate"><span class="pre">combinedStates</span></code>; See <a class="reference internal" href="#state-combiner"><span class="std std-ref">State Combiner</span></a>).</li>
+</ul>
+</div>
+<div class="section" id="monitor-config-pipeline">
+<h3>Monitor Config Pipeline<a class="headerlink" href="#monitor-config-pipeline" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span class="o">---------</span>     <span class="o">---------</span>
+<span class="o">|</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">manager</span> <span class="o">|--&gt;</span> <span class="n">stat</span> <span class="n">subscriber</span> <span class="p">(</span><span class="n">Stat</span> <span class="n">pipeline</span> <span class="n">Poller</span><span class="p">)</span>
+ <span class="o">--------</span>     <span class="o">---------</span> <span class="o">|</span>
+                        <span class="o">|-&gt;</span> <span class="n">health</span> <span class="n">subscriber</span> <span class="p">(</span><span class="n">Health</span> <span class="n">pipeline</span> <span class="n">Poller</span><span class="p">)</span>
+                        <span class="o">|</span>
+                        <span class="o">--&gt;</span> <span class="n">peer</span> <span class="n">subscriber</span> <span class="p">(</span><span class="n">Peer</span> <span class="n">pipeline</span> <span class="n">Poller</span><span class="p">)</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><strong>poller</strong> - <code class="docutils literal notranslate"><span class="pre">common/poller/poller.go:MonitorConfigPoller.Poll()</span></code>. The Monitor Config poller, on its interval, polls Traffic Ops for the Monitor configuration, and writes the polled value to its result channel, which is read by the Manager.</li>
+<li><strong>manager</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/manager/monitorconfig.go:StartMonitorConfigManager()</span></code>. Listens for results from the poller, and processes them. Cache changes are written to channels read by the Health, Stat, and Peer pollers. In the Shared Data objects, this also sets the list of new delivery services and removes ones which no longer exist, and sets the list of peer Traffic Monitors.</li>
+</ul>
+</div>
+<div class="section" id="ops-config-pipeline">
+<h3>Ops Config Pipeline<a class="headerlink" href="#ops-config-pipeline" title="Permalink to this headline">¶</a></h3>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span class="o">---------</span>     <span class="o">---------</span>     <span class="o">---------</span>
+<span class="o">|</span> <span class="n">poller</span> <span class="o">|--&gt;|</span> <span class="n">handler</span> <span class="o">|--&gt;|</span> <span class="n">manager</span> <span class="o">|--&gt;</span> <span class="n">ops</span> <span class="n">config</span> <span class="n">change</span> <span class="n">subscriber</span> <span class="p">(</span><span class="n">Monitor</span> <span class="n">Config</span> <span class="n">Poller</span><span class="p">)</span>
+ <span class="o">--------</span>     <span class="o">---------</span>     <span class="o">---------</span> <span class="o">|</span>
+                                      <span class="o">--&gt;</span> <span class="n">Traffic</span> <span class="n">ops</span> <span class="n">client</span> <span class="n">change</span> <span class="n">subscriber</span> <span class="p">(</span><span class="n">Monitor</span> <span class="n">Config</span> <span class="n">Poller</span><span class="p">)</span>
+</pre></div>
+</div>
+<ul class="simple">
+<li><strong>poller</strong> - <code class="docutils literal notranslate"><span class="pre">common/poller/poller.go:FilePoller.Poll()</span></code>. Polls for changes to the Traffic Ops config file <code class="docutils literal notranslate"><span class="pre">traffic_ops.cfg</span></code>, and writes the changed config to its result channel, which is read by the Handler.</li>
+<li><strong>handler</strong> - <code class="docutils literal notranslate"><span class="pre">common/handler/handler.go:OpsConfigFileHandler.Listen()</span></code>. Takes the given raw config, unmarshalls the JSON into an object, and writes the object to its channel, which is read by the Manager, along with any error.</li>
+<li><strong>manager</strong> - <code class="docutils literal notranslate"><span class="pre">traffic_monitor/manager/monitorconfig.go:StartMonitorConfigManager()</span></code>. Listens for new configs, and processes them. When a new config is received, a new HTTP dispatch map is created via <code class="docutils literal notranslate"><span class="pre">traffic_monitor/datareq/datareq.go:MakeDispatchMap()</span></code>, and the HTTP server is restarted with the new dispatch map. The Traffic Ops client is also recreated, and stored in its shared data object. The Ops Config change subscribers and Traffic Ops Client change subscribers (the Monitor Config poller) are also passed the new ops config and new Traffic Ops client.</li>
+</ul>
+</div>
+<div class="section" id="events">
+<h3>Events<a class="headerlink" href="#events" title="Permalink to this headline">¶</a></h3>
+<p>The <code class="docutils literal notranslate"><span class="pre">events</span></code> shared data object is passed to each pipeline microthread which needs to signal events. Most of them do. Events are then logged, and visible in the UI as well as an HTTP JSON endpoint. Most events are caches becoming available or unavailable, but include other things such as peer availability changes.</p>
+</div>
+<div class="section" id="state-combiner">
+<span id="id2"></span><h3>State Combiner<a class="headerlink" href="#state-combiner" title="Permalink to this headline">¶</a></h3>
+<p>The State Combiner is a microthread started in <code class="docutils literal notranslate"><span class="pre">traffic_monitor/manager/manager.go:Start()</span></code> via <code class="docutils literal notranslate"><span class="pre">traffic_monitor/manager/statecombiner.go:StartStateCombiner()</span></code>, which listens for signals to combine states. It should be signaled by any pipeline which updates the local or peer availability shared data objects, <code class="docutils literal notranslate"><span class="pre">localStates</span></code> and <code class="docutils literal notranslate"><span class="pre">peerStates</span></code>. It holds the threadsafe shared data objects for local states and peer states, so no data is passed or returned, only a signal.</p>
+<p>When a signal is received, it combines the local and peer states optimistically. That is, if a cache is marked available locally or by any peer, that cache is marked available in the combined states. There exists a variable to combine pessimistically, which may be set at compile time (it’s unusual for a CDN to operate well with pessimistic cache availability). Combined data is stored in the threadsafe shared data object <code class="docutils literal notranslate"><span class="pre">combinedStates</span></code>.</p>
+</div>
+<div class="section" id="aggregated-stat-data">
+<span id="agg-stat-data"></span><h3>Aggregated Stat Data<a class="headerlink" href="#aggregated-stat-data" title="Permalink to this headline">¶</a></h3>
+<p>The Stat pipeline Manager is responsible for aggregating stats from all caches, into delivery services statistics. This is done via a call to <code class="docutils literal notranslate"><span class="pre">traffic_monitor/deliveryservice/stat.go:CreateStats()</span></code>.</p>
+</div>
+<div class="section" id="aggregated-availability-data">
+<span id="agg-avail-data"></span><h3>Aggregated Availability Data<a class="headerlink" href="#aggregated-availability-data" title="Permalink to this headline">¶</a></h3>
+<p>Both the Stat and Health pipelines aggregate availability data received from caches. This is done via a call to <code class="docutils literal notranslate"><span class="pre">traffic_monitor/deliveryservice/health.go:CalcAvailability()</span></code> followed by a call to <code class="docutils literal notranslate"><span class="pre">combineState()</span></code>. The <code class="docutils literal notranslate"><span class="pre">CalcAvailability</span></code> function calculates the availability of each cache from the result of polling it, that is, local availability. The <code class="docutils literal notranslate"><span class="pre">combineState()</span></code> function is a lambda passed to the Manager, which signals the State Combiner microthread, which will combine the local and peer Traffic Monitor availability data, and insert it into the shared data <code class="docutils literal notranslate"><span class="pre">combinedStates</span></code> object.</p>
+</div>
+<div class="section" id="http-data-requests">
+<h3>HTTP Data Requests<a class="headerlink" href="#http-data-requests" title="Permalink to this headline">¶</a></h3>
+<p>Data is provided to HTTP requests via the threadsafe shared data objects (see <a class="reference internal" href="#shared-data"><span class="std std-ref">Shared Data</span></a>). These objects are closed in lambdas created via <code class="docutils literal notranslate"><span class="pre">traffic_monitor/datareq/datareq.go:MakeDispatchMap()</span></code>. This is called by the Ops Config Manager when it recreates the HTTP server.</p>
+<p>Each HTTP endpoint is mapped to a function which closes around the shared data objects it needs, and takes the request data it needs (such as query parameters). Each endpoint function resides in its own file in <code class="docutils literal notranslate"><span class="pre">traffic_monitor/datareq/</span></code>. Because each Go HTTP routing function must be a <code class="docutils literal notranslate"><span class="pre">http.HandlerFunc</span></code>, wrapper functions take the endpoint functions and return <code class="docutils literal notranslate"><span class="pre">http.HandlerFunc</span></code> functions which call them, and which are stored in the dispatch map, to be registered with the HTTP server.</p>
+</div>
+<div class="section" id="shared-data">
+<span id="id3"></span><h3>Shared Data<a class="headerlink" href="#shared-data" title="Permalink to this headline">¶</a></h3>
+<p>Processed and aggregated data must be shared between the end of the stat and health processing pipelines, and HTTP requests. The CSP paradigm of idiomatic Go does not work efficiently with storing and sharing state. While not idiomatic Go, shared mutexed data structures are faster and simpler than CSP manager microthreads for each data object.</p>
+<p>Traffic Monitor has many threadsafe shared data types and objects. All shared data objects can be seen in <code class="docutils literal notranslate"><span class="pre">manager/manager.go:Start()</span></code>, where they are created and passed to the various pipeline stage microthreads that need them. Their respective types all include the word <code class="docutils literal notranslate"><span class="pre">Threadsafe</span></code>, and can be found in <code class="docutils literal notranslate"><span class="pre">traffic_monitor/threadsafe/</span></code> as well as, for dependency reasons, various appropriate directories.</p>
+<p>Currently, all Threadsafe shared data types use mutexes. In the future, these could be changed to lock-free or wait-free structures, if the performance needs outweighed the readability and correctness costs. They could also easily be changed to internally be manager microthreads and channels, if being idiomatic were deemed more important than readability or performance.</p>
+</div>
+</div>
+<div class="section" id="formatting-conventions">
+<h2>Formatting Conventions<a class="headerlink" href="#formatting-conventions" title="Permalink to this headline">¶</a></h2>
+<p>Go code should be formatted with <code class="docutils literal notranslate"><span class="pre">gofmt</span></code>. See also <code class="docutils literal notranslate"><span class="pre">CONTRIBUTING.md</span></code>.</p>
+</div>
+<div class="section" id="installing-the-developer-environment">
+<h2>Installing The Developer Environment<a class="headerlink" href="#installing-the-developer-environment" title="Permalink to this headline">¶</a></h2>
+<p>To install the Traffic Monitor Developer environment:</p>
+<ol class="arabic simple">
+<li>Install <cite>go</cite> version 1.7 or greater, from <a class="reference external" href="https://golang.org/doc/install">https://golang.org/doc/install</a> and <a class="reference external" href="https://golang.org/doc/code.html">https://golang.org/doc/code.html</a></li>
+<li>Clone the traffic_control repository using Git, into <code class="docutils literal notranslate"><span class="pre">$GOPATH/src/github.com/apache/incubator-trafficcontrol</span></code></li>
+<li>Change directories into <code class="docutils literal notranslate"><span class="pre">$GOPATH/src/github.com/apache/incubator-trafficcontrol/traffic_monitor_golang/traffic_monitor</span></code></li>
+<li>Run <code class="docutils literal notranslate"><span class="pre">./build.sh</span></code></li>
 </ol>
 </div>
 <div class="section" id="test-cases">
 <h2>Test Cases<a class="headerlink" href="#test-cases" title="Permalink to this headline">¶</a></h2>
-<p>Unit tests can be executed using Maven by running <code class="docutils literal notranslate"><span class="pre">mvn</span> <span class="pre">test</span></code> at the root of the <code class="docutils literal notranslate"><span class="pre">traffic_monitor</span></code> project.</p>
+<p>Tests can be executed by running <code class="docutils literal notranslate"><span class="pre">go</span> <span class="pre">test</span> <span class="pre">./...</span></code> at the root of the <code class="docutils literal notranslate"><span class="pre">traffic_monitor_golang</span></code> project.</p>
 </div>
 <div class="section" id="api">
 <h2>API<a class="headerlink" href="#api" title="Permalink to this headline">¶</a></h2>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol-website/blob/feda6059/docs/master/genindex.html
----------------------------------------------------------------------
diff --git a/docs/master/genindex.html b/docs/master/genindex.html
index 694cd31..2c53984 100644
--- a/docs/master/genindex.html
+++ b/docs/master/genindex.html
@@ -130,8 +130,7 @@
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_ops.html">Traffic Ops</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_portal.html">Traffic Portal</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_router.html">Traffic Router</a></li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor</a></li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor_golang.html">Traffic Monitor Golang</a></li>
+<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor Golang</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_stats.html">Traffic Stats</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_server.html">Traffic Server</a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol-website/blob/feda6059/docs/master/index.html
----------------------------------------------------------------------
diff --git a/docs/master/index.html b/docs/master/index.html
index 35d9db3..597f182 100644
--- a/docs/master/index.html
+++ b/docs/master/index.html
@@ -130,8 +130,7 @@
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_ops.html">Traffic Ops</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_portal.html">Traffic Portal</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_router.html">Traffic Router</a></li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor</a></li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor_golang.html">Traffic Monitor Golang</a></li>
+<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor Golang</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_stats.html">Traffic Stats</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_server.html">Traffic Server</a></li>
 </ul>
@@ -403,27 +402,17 @@
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_router.html#api">API</a></li>
 </ul>
 </li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor Golang</a><ul>
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#introduction">Introduction</a></li>
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#software-requirements">Software Requirements</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#traffic-monitor-project-tree-overview">Traffic Monitor Project Tree Overview</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#java-formatting-conventions">Java Formatting Conventions</a></li>
+<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#project-tree-overview">Project Tree Overview</a></li>
+<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#architecture">Architecture</a></li>
+<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#formatting-conventions">Formatting Conventions</a></li>
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#installing-the-developer-environment">Installing The Developer Environment</a></li>
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#test-cases">Test Cases</a></li>
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor.html#api">API</a></li>
 </ul>
 </li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor_golang.html">Traffic Monitor Golang</a><ul>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#introduction">Introduction</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#software-requirements">Software Requirements</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#project-tree-overview">Project Tree Overview</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#architecture">Architecture</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#formatting-conventions">Formatting Conventions</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#installing-the-developer-environment">Installing The Developer Environment</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#test-cases">Test Cases</a></li>
-<li class="toctree-l3"><a class="reference internal" href="development/traffic_monitor_golang.html#api">API</a></li>
-</ul>
-</li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_stats.html">Traffic Stats</a><ul>
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_stats.html#introduction">Introduction</a></li>
 <li class="toctree-l3"><a class="reference internal" href="development/traffic_stats.html#software-requirements">Software Requirements</a></li>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol-website/blob/feda6059/docs/master/objects.inv
----------------------------------------------------------------------
diff --git a/docs/master/objects.inv b/docs/master/objects.inv
index 985b301..450f23a 100644
Binary files a/docs/master/objects.inv and b/docs/master/objects.inv differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol-website/blob/feda6059/docs/master/overview/index.html
----------------------------------------------------------------------
diff --git a/docs/master/overview/index.html b/docs/master/overview/index.html
index 469ab45..7bb1a37 100644
--- a/docs/master/overview/index.html
+++ b/docs/master/overview/index.html
@@ -131,8 +131,7 @@
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_ops.html">Traffic Ops</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_portal.html">Traffic Portal</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_router.html">Traffic Router</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../development/traffic_monitor.html">Traffic Monitor</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../development/traffic_monitor_golang.html">Traffic Monitor Golang</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../development/traffic_monitor.html">Traffic Monitor Golang</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_stats.html">Traffic Stats</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_server.html">Traffic Server</a></li>
 </ul>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol-website/blob/feda6059/docs/master/overview/traffic_server.html
----------------------------------------------------------------------
diff --git a/docs/master/overview/traffic_server.html b/docs/master/overview/traffic_server.html
index bbbe960..e14aca1 100644
--- a/docs/master/overview/traffic_server.html
+++ b/docs/master/overview/traffic_server.html
@@ -132,8 +132,7 @@
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_ops.html">Traffic Ops</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_portal.html">Traffic Portal</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_router.html">Traffic Router</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../development/traffic_monitor.html">Traffic Monitor</a></li>
-<li class="toctree-l2"><a class="reference internal" href="../development/traffic_monitor_golang.html">Traffic Monitor Golang</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../development/traffic_monitor.html">Traffic Monitor Golang</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_stats.html">Traffic Stats</a></li>
 <li class="toctree-l2"><a class="reference internal" href="../development/traffic_server.html">Traffic Server</a></li>
 </ul>
@@ -198,7 +197,7 @@
             
   <div class="section" id="traffic-server">
 <h1>Traffic Server<a class="headerlink" href="#traffic-server" title="Permalink to this headline">¶</a></h1>
-<p>The caches in a Traffic Control CDN are servers running the Apache Traffic Server software. See <a class="reference external" href="http://trafficserver.readthedocs.org/en/latest/">ATS documentation</a> for more information. Caches in a Traffic Control CDN are deployed in cache groups.</p>
+<p>The caches in a Traffic Control CDN are servers running the Apache Traffic Server software. See <a class="reference external" href="https://docs.trafficserver.apache.org/en/latest/index.html">ATS documentation</a> for more information. Caches in a Traffic Control CDN are deployed in cache groups.</p>
 <div class="section" id="arrow-cache-group">
 <span id="rl-cachegroup"></span><h2><img alt="arrow" src="../_images/fwda1.png" /> Cache Group<a class="headerlink" href="#arrow-cache-group" title="Permalink to this headline">¶</a></h2>
 <blockquote>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol-website/blob/feda6059/docs/master/search.html
----------------------------------------------------------------------
diff --git a/docs/master/search.html b/docs/master/search.html
index 76d6c8e..3acda9b 100644
--- a/docs/master/search.html
+++ b/docs/master/search.html
@@ -129,8 +129,7 @@
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_ops.html">Traffic Ops</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_portal.html">Traffic Portal</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_router.html">Traffic Router</a></li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor</a></li>
-<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor_golang.html">Traffic Monitor Golang</a></li>
+<li class="toctree-l2"><a class="reference internal" href="development/traffic_monitor.html">Traffic Monitor Golang</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_stats.html">Traffic Stats</a></li>
 <li class="toctree-l2"><a class="reference internal" href="development/traffic_server.html">Traffic Server</a></li>
 </ul>