.. 
.. Copyright 2015 Comcast Cable Communications Management, LLC
.. 
.. Licensed under the Apache License, Version 2.0 (the "License");
.. you may not use this file except in compliance with the License.
.. You may obtain a copy of the License at
.. 
..     http://www.apache.org/licenses/LICENSE-2.0
.. 
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS,
.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
.. See the License for the specific language governing permissions and
.. limitations under the License.
.. 

Traffic Stats
*************

Introduction
============
Traffic Stats is a utility written in `Go <http.golang.org>`_ that is used to acquire and store statistics about CDNs controlled by Traffic Control.  Traffic Stats mines metrics from Traffic Monitor's JSON APIs and stores the data in `InfluxDb <http://influxdb.com>`_.  Data is typically stored in InfluxDb on a short-term basis (30 days or less) and is used to drive graphs created by `Grafana <http://grafana.org>`_ which are linked from Traffic Ops.  Traffic Stats also calculates daily statistics from InfluxDb and stores them in the Traffic Ops database.

Software Requirements
=====================
To work on Traffic Stats you need a \*nix (MacOS and Linux are most commonly used) environment that has the following installed:

	* `Go 1.5.x or above <https://golang.org/doc/install>`_
	* Access to a working instance of Traffic Ops
	* Access to a working instance of Traffic Monitor
	* `InfluxDb version 0.10.0 or greater <https://influxdb.com/download/index.html>`_

Traffic Stats Project Tree Overview
=====================================
	* **traffic_control/traffic_stats** - contains Go source files and Files used to create the Traffic Stats rpm.
	* **traffic_control/traffic_stats/grafana/** - contains a javascript file which is installed on the grafana server.  This allows Traffic Ops to create custom dashboards for Delivery Services, Caches, etc.


Go Formatting Conventions 
============================
In general `Go fmt <https://golang.org/cmd/gofmt/>`_ is the standard for formatting go code.

Installing The Developer Environment
====================================
To install the Traffic Ops Developer environment:

	- Clone the traffic_control repository using Git into a location accessible by your $GOPATH
	- Navigate to the traffic_ops/client directory of your cloned repository. (This is the directory containing Traffic Ops client code used by Traffic Stats)
	- From the traffic_ops/client directory run ``go test`` to test the client code.  This will run all unit tests for the client and return the results.  If there are missing dependencies you will need to run ``go get <dependency name>`` to get the dependency
	- Once the tests pass, run ``go install`` to build and install the Traffic Ops client package.  This makes it accessible to Traffic Stats.
	- Navigate to your cloned repo under Traffic Stats
	- Run ``go build traffic_stats.go`` to build traffic_stats.  You will need to run ``go get`` for any missing dependencies.


Test Cases
==========
	Currently there are not automated tests for Traffic Stats :(.  
	We hope to remedy this problem very soon! 

