UNPKG

statsd-grapher

Version:

A statsd backend that serves an http page with the graphical data

278 lines (193 loc) 11.1 kB
<!DOCTYPE html> <html> <head> <title>server.js</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <ul id="jump_to"> <li> <a class="large" href="javascript:void(0);">Jump To &hellip;</a> <a class="small" href="javascript:void(0);">+</a> <div id="jump_wrapper"> <div id="jump_page_wrapper"> <div id="jump_page"> <a class="source" href="server.html"> server.js </a> <a class="source" href="utils.html"> utils.js </a> </div> </div> </li> </ul> <ul class="sections"> <li id="title"> <div class="annotation"> <h1>server.js</h1> </div> </li> <li id="section-1"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-1">&#182;</a> </div> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">const</span> express = <span class="hljs-built_in">require</span>(<span class="hljs-string">'express'</span>) , session = <span class="hljs-built_in">require</span>(<span class="hljs-string">'express-session'</span>) , uuid = <span class="hljs-built_in">require</span>(<span class="hljs-string">'node-uuid'</span>) <span class="hljs-keyword">const</span> R = <span class="hljs-built_in">require</span>(<span class="hljs-string">'ramda'</span>) , U = <span class="hljs-built_in">require</span>(<span class="hljs-string">'./src/utils'</span>) <span class="hljs-keyword">const</span> statusCodes = { unauthorized: <span class="hljs-number">401</span>, notFound: <span class="hljs-number">404</span> }</pre></div></div> </li> <li id="section-2"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-2">&#182;</a> </div> <p>Set up express basics</p> </div> <div class="content"><div class='highlight'><pre><span class="hljs-keyword">const</span> app = express() app.use(express.static(<span class="hljs-string">`<span class="hljs-subst">${__dirname}</span>/public`</span>)) app.set(<span class="hljs-string">'views'</span>, <span class="hljs-string">`<span class="hljs-subst">${__dirname}</span>/views`</span>) app.set(<span class="hljs-string">'view engine'</span>, <span class="hljs-string">'jade'</span>)</pre></div></div> </li> <li id="section-3"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-3">&#182;</a> </div> <p>Exports <code>init</code> to implement the statsd backend</p> </div> <div class="content"><div class='highlight'><pre>exports.init = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">startupTime, config, events</span>) </span>{</pre></div></div> </li> <li id="section-4"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-4">&#182;</a> </div> <p>Calculates the number of flushes per hour and week for reseting stats</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">const</span> per = { hour: <span class="hljs-number">60</span> * <span class="hljs-number">60</span> * <span class="hljs-number">24</span>, week: <span class="hljs-number">60</span> * <span class="hljs-number">60</span> * <span class="hljs-number">24</span> * <span class="hljs-number">7</span> } per.hour /= (config.flushInterval || <span class="hljs-number">10000</span>) / <span class="hljs-number">1000</span> per.week /= (config.flushInterval || <span class="hljs-number">10000</span>) / <span class="hljs-number">1000</span></pre></div></div> </li> <li id="section-5"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-5">&#182;</a> </div> <p>Keeps track of the flush count for reseting stats</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> flushCount = <span class="hljs-number">0</span></pre></div></div> </li> <li id="section-6"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-6">&#182;</a> </div> <p>The accumulated and formatted stats metrics</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> stats = {} , statsKeys = {}</pre></div></div> </li> <li id="section-7"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-7">&#182;</a> </div> <p>Session middleware</p> </div> <div class="content"><div class='highlight'><pre> app.use(session({ secret: config.sessionSecret || uuid.v4(), store: config.sessionStore, resave: <span class="hljs-literal">false</span>, saveUninitialized: <span class="hljs-literal">false</span>, cookie: { expires: config.sessionExpires || <span class="hljs-number">1000</span> * <span class="hljs-number">60</span> * <span class="hljs-number">60</span> } <span class="hljs-comment">// default: 1 hour</span> }))</pre></div></div> </li> <li id="section-8"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-8">&#182;</a> </div> <p>Authentication middleware using <code>tokens</code></p> </div> <div class="content"><div class='highlight'><pre> app.use(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">req, res, next</span>) </span>{ <span class="hljs-keyword">if</span> (!req.session.authenticated &amp;&amp; config.tokens &amp;&amp; !R.contains(req.query.token, config.tokens)) res.status(statusCodes.unauthorized).send(<span class="hljs-string">'401: Unauthorized'</span>) <span class="hljs-keyword">else</span> { req.session.authenticated = <span class="hljs-literal">true</span> next() } })</pre></div></div> </li> <li id="section-9"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-9">&#182;</a> </div> <p>Updates the stats on flush intervals</p> </div> <div class="content"><div class='highlight'><pre> events.on(<span class="hljs-string">'flush'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">timestamp, metrics</span>) </span>{ timestamp *= <span class="hljs-number">1000</span> <span class="hljs-comment">// converts timestamp to unix time</span></pre></div></div> </li> <li id="section-10"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-10">&#182;</a> </div> <p>Reset the stats if a week has passed</p> </div> <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (flushCount === per.week) { stats = {} flushCount = <span class="hljs-number">0</span> } <span class="hljs-keyword">else</span> { flushCount++ } <span class="hljs-keyword">const</span> newStats = U.setStats(timestamp, metrics, stats) stats = newStats statsKeys = R.map(R.keys, stats) })</pre></div></div> </li> <li id="section-11"> <div class="annotation"> <div class="pilwrap "> <a class="pilcrow" href="#section-11">&#182;</a> </div> <p>Serve the routes</p> </div> <div class="content"><div class='highlight'><pre> app.get(<span class="hljs-string">'/stats'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">req, res</span>) </span>{ res.render(<span class="hljs-string">'stats'</span>, statsKeys) }) app.get(<span class="hljs-string">'/stats/:namespace/:metric'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">req, res</span>) </span>{ res.render(<span class="hljs-string">'stats'</span>, U.filterStats(req.params.namespace, req.params.metric, statsKeys)) }) app.get(<span class="hljs-string">'/metrics/:type/:name'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">req, res</span>) </span>{ <span class="hljs-keyword">const</span> metric = R.path([req.params.type, req.params.name], stats) <span class="hljs-keyword">if</span> (!metric) res.status(statusCodes.notFound).send({ message: <span class="hljs-string">'Not found'</span> }) <span class="hljs-keyword">else</span> res.send(metric) }) app.listen(config.expressPort || <span class="hljs-number">3000</span>, <span class="hljs-function"><span class="hljs-keyword">function</span> (<span class="hljs-params"></span>) </span>{ <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Express listening on port: <span class="hljs-subst">${config.expressPort || 3000}</span>`</span>) }) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span> }</pre></div></div> </li> </ul> </div> </body> </html>