Skip to content

Commit

Permalink
Merge pull request #1 from roylines/express-support
Browse files Browse the repository at this point in the history
Express support
  • Loading branch information
roylines committed Apr 27, 2016
2 parents c0368c3 + 57ead03 commit 7694906
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 7 deletions.
8 changes: 8 additions & 0 deletions examples/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: '2'
services:
prometheus:
image: prom/prometheus
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
17 changes: 17 additions & 0 deletions examples/express/express.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const express = require('express');
const epithemeus = require('../../index.js');

const app = express();
epithemeus.instrument(app);

app.get('/', function (req, res) {
var high = 500, low = 150;

setTimeout(() => {
res.send();
}, Math.floor(Math.random() * (high - low) + low));
});

app.listen(8000, () => {
console.log('express listening on 8000');
});
8 changes: 8 additions & 0 deletions examples/prometheus/prometheus.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
global:
scrape_interval: 5s
evaluation_interval: 5s

scrape_configs:
- job_name: 'express'
target_groups:
- targets: ['192.168.1.3:8000']
47 changes: 46 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
@@ -1 +1,46 @@
module.exports = {}
const client = require('prom-client');
const metric = {
http: {
requests: {
total: new client.Counter('http_requests_total', 'total number of http requests', ['method', 'path', 'status']),
duration: new client.Summary('http_requests_duration', 'request duration', ['method', 'path', 'status'])
}
}
}

function ignore(request) {
return request.path === '/metrics' || request.path === '/metrics/';
}

function ms(start) {
var diff = process.hrtime(start);
return Math.round((diff[0] * 1e9 + diff[1]) / 1000000);
}

function middleware(request, response, done) {
if(ignore(request)) {
return done();
}

var start = process.hrtime();

response.on('finish', function() {
metric.http.requests.total.labels(request.method, request.path, response.statusCode).inc();
metric.http.requests.duration.labels(request.method, request.path, response.statusCode).observe(ms(start));
});

return done();
};

function metrics(req, res) {
return res.send(client.register.metrics());
}

function instrument(app) {
app.use(middleware);
app.get('/metrics', metrics);
}

module.exports = {
instrument: instrument
}
8 changes: 7 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,13 @@
"node": ">=4.0.0"
},
"devDependencies": {
"chai": "^3.5.0",
"express": "^4.13.4",
"mocha": "*",
"mocha-circleci-reporter": "0.0.1"
"mocha-circleci-reporter": "0.0.1",
"request": "^2.72.0"
},
"dependencies": {
"prom-client": "^3.4.1"
}
}
34 changes: 34 additions & 0 deletions test/express.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
const express = require('express');
const epithemeus = require('../index');
const request = require('request');
const should = require('chai').should();

describe('express', () => {
before((done) => {
const app = express();
epithemeus.instrument(app);
app.get('/', (req, res) => {
res.send();
});
this.server = app.listen(3000, done);
});

after((done) => {
return this.server.close(done)
});

it('should return 200 for /', (done) => {
request('http://localhost:3000/', (e, r, b) => {
r.statusCode.should.equal(200);
return done(e);
});
});

it('should return 200 for /metrics', (done) => {
request('http://localhost:3000/metrics', (e, r, b) => {
console.log('BODY', b);
r.statusCode.should.equal(200);
return done(e);
});
});
});
5 changes: 0 additions & 5 deletions test/index.js

This file was deleted.

0 comments on commit 7694906

Please sign in to comment.