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>

Reply via email to