statsd-grapher
Version:
A statsd backend that serves an http page with the graphical data
278 lines (193 loc) • 11.1 kB
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 …</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">¶</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">¶</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">¶</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">¶</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">¶</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">¶</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">¶</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">¶</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 && config.tokens && !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">¶</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">¶</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">¶</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>