use bunyan as the logger, remove 'good'
This commit is contained in:
Родитель
5d2bd7da4a
Коммит
c7abb0c156
|
@ -4,3 +4,4 @@
|
|||
/config/public-key.json
|
||||
/config/secret-key.json
|
||||
*.swp
|
||||
server.log
|
||||
|
|
53
bin/idp.js
53
bin/idp.js
|
@ -4,9 +4,56 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
var server = require('../server.js');
|
||||
const bunyan = require('bunyan');
|
||||
|
||||
const config = require('../lib/config').root();
|
||||
const stats = require('../lib/stats');
|
||||
|
||||
const memoryMonitor = new (require('../lib/memory_monitor'))();
|
||||
memoryMonitor.on('mem', stats.mem);
|
||||
memoryMonitor.start();
|
||||
|
||||
const logStreams = [
|
||||
{
|
||||
type: 'rotating-file',
|
||||
level: config.log.level,
|
||||
path: config.log.path,
|
||||
period: config.log.period,
|
||||
count: config.log.count
|
||||
},
|
||||
{
|
||||
type: 'raw',
|
||||
level: 'trace',
|
||||
stream: new bunyan.RingBuffer({ limit: 100 })
|
||||
}
|
||||
];
|
||||
|
||||
if (config.env !== 'production') {
|
||||
logStreams.push({ stream: process.stderr, level: 'trace' });
|
||||
}
|
||||
|
||||
const log = bunyan.createLogger(
|
||||
{
|
||||
name: 'picl-idp',
|
||||
streams: logStreams
|
||||
}
|
||||
);
|
||||
|
||||
const routes = require('../routes');
|
||||
const server = require('../server.js')(config, routes, log);
|
||||
|
||||
// Start the server
|
||||
server.start(function() {
|
||||
console.log('running on ' + server.info.uri);
|
||||
log.info('running on ' + server.info.uri);
|
||||
});
|
||||
|
||||
process.on(
|
||||
'SIGINT',
|
||||
function () {
|
||||
log.info('shutting down');
|
||||
server.stop(
|
||||
function () {
|
||||
process.exit();
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
|
|
@ -8,6 +8,7 @@ const path = require('path');
|
|||
const convict = require('convict');
|
||||
|
||||
const AVAILABLE_BACKENDS = ["memory", "mysql", "memcached"];
|
||||
const STATS_BACKENDS = ['none', 'heka', 'statsd'];
|
||||
|
||||
|
||||
var conf = module.exports = convict({
|
||||
|
@ -17,6 +18,20 @@ var conf = module.exports = convict({
|
|||
format: [ "production", "local", "test" ],
|
||||
env: 'NODE_ENV'
|
||||
},
|
||||
log: {
|
||||
level: {
|
||||
default: 'info'
|
||||
},
|
||||
path: {
|
||||
default: path.join(__dirname, '../server.log')
|
||||
},
|
||||
period: {
|
||||
default: '1d'
|
||||
},
|
||||
count: {
|
||||
default: 7
|
||||
}
|
||||
},
|
||||
public_url: {
|
||||
format: "url",
|
||||
// the real url is set by awsbox
|
||||
|
@ -106,6 +121,29 @@ var conf = module.exports = convict({
|
|||
format: 'port',
|
||||
env: 'PORT'
|
||||
}
|
||||
},
|
||||
stats: {
|
||||
backend: {
|
||||
format: STATS_BACKENDS,
|
||||
default: 'none',
|
||||
env: 'STATS_BACKEND'
|
||||
}
|
||||
},
|
||||
heka: {
|
||||
host: {
|
||||
default: '127.0.0.1'
|
||||
},
|
||||
port: {
|
||||
default: 4880
|
||||
}
|
||||
},
|
||||
statsd: {
|
||||
host: {
|
||||
default: '127.0.0.1',
|
||||
},
|
||||
port: {
|
||||
default: 8125
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -128,5 +166,3 @@ if (!fs.existsSync(conf.get('publicKeyFile'))) {
|
|||
}
|
||||
|
||||
conf.validate();
|
||||
|
||||
console.log('configuration: ', conf.toString());
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
var inherits = require('util').inherits;
|
||||
var EventEmitter = require('events').EventEmitter;
|
||||
|
||||
function MemoryMonitor(interval) {
|
||||
EventEmitter.call(this);
|
||||
this.interval = interval || 15000;
|
||||
this.timer = null;
|
||||
}
|
||||
inherits(MemoryMonitor, EventEmitter);
|
||||
|
||||
MemoryMonitor.prototype.start = function () {
|
||||
this.stop();
|
||||
this.timer = setTimeout(loop.bind(this), this.interval);
|
||||
};
|
||||
|
||||
MemoryMonitor.prototype.stop = function () {
|
||||
clearTimeout(this.timer);
|
||||
};
|
||||
|
||||
function loop() {
|
||||
this.emit('mem', process.memoryUsage());
|
||||
this.start();
|
||||
}
|
||||
|
||||
module.exports = MemoryMonitor;
|
15
lib/stats.js
15
lib/stats.js
|
@ -29,22 +29,17 @@ var heka = Heka.clientFromJsonConfig(
|
|||
// );
|
||||
|
||||
module.exports = {
|
||||
ops: function (event) {
|
||||
|
||||
// statsd.gauge('rss', event.proc.mem.rss);
|
||||
// statsd.gauge('heapTotal', event.proc.mem.heapTotal);
|
||||
// statsd.gauge('heapUsed', event.proc.mem.heapUsed);
|
||||
|
||||
mem: function (usage) {
|
||||
heka.heka(
|
||||
'mem',
|
||||
{
|
||||
timestamp: new Date(event.timestamp),
|
||||
timestamp: new Date(),
|
||||
severity: 6,
|
||||
fields: {
|
||||
rss: event.proc.mem.rss,
|
||||
heapTotal: event.proc.mem.heapTotal,
|
||||
heapUsed: event.proc.mem.heapUsed,
|
||||
uptime: event.proc.uptime
|
||||
rss: usage.rss,
|
||||
heapTotal: usage.heapTotal,
|
||||
heapUsed: usage.heapUsed
|
||||
},
|
||||
pid: PID,
|
||||
hostname: HOSTNAME
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
"uuid": "1.4.1",
|
||||
"async": "0.2.8",
|
||||
"kvstore": "0.0.3",
|
||||
"good": "git://github.com/dannycoates/good.git#223e5d6db3",
|
||||
"bunyan": "0.21.3",
|
||||
"heka": "0.3.0",
|
||||
"node-statsd": "0.0.7",
|
||||
"toobusy": "0.2.3"
|
||||
|
|
|
@ -149,7 +149,7 @@ var routes = [
|
|||
|
||||
function wellKnown(request) {
|
||||
request.reply({
|
||||
'public-key': fs.readFileSync(config.get('publicKeyFile')),
|
||||
'public-key': fs.readFileSync(config.publicKeyFile),
|
||||
'authentication': '/sign_in.html',
|
||||
'provisioning': '/provision.html'
|
||||
});
|
||||
|
|
155
server.js
155
server.js
|
@ -5,98 +5,79 @@
|
|||
const Hapi = require('hapi');
|
||||
const toobusy = require('toobusy');
|
||||
|
||||
const config = require('./lib/config');
|
||||
const routes = require('./routes');
|
||||
const stats = require('./lib/stats');
|
||||
module.exports = function (config, routes, log) {
|
||||
|
||||
// server settings
|
||||
var settings = {
|
||||
files: {
|
||||
relativeTo: __dirname
|
||||
},
|
||||
views: {
|
||||
basePath: __dirname,
|
||||
path: 'templates',
|
||||
engines: {
|
||||
html: 'handlebars'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Create a server with a host and port
|
||||
var bind = config.get('bind_to');
|
||||
var server = Hapi.createServer(bind.host, bind.port, settings);
|
||||
server.addRoutes(routes);
|
||||
|
||||
server.ext(
|
||||
'onRequest',
|
||||
function (request, next) {
|
||||
var exit = false;
|
||||
if (toobusy()) {
|
||||
exit = Hapi.error.serverTimeout('Server too busy');
|
||||
}
|
||||
next(exit);
|
||||
}
|
||||
);
|
||||
|
||||
server.ext(
|
||||
'onPreResponse',
|
||||
function (request, next) {
|
||||
var res = request.response();
|
||||
// error responses don't have `header`
|
||||
if (res.header) {
|
||||
res.header('Strict-Transport-Security', 'max-age=10886400');
|
||||
}
|
||||
next();
|
||||
}
|
||||
);
|
||||
|
||||
server.ext('onPreResponse', function (request, next) {
|
||||
var response = request.response();
|
||||
if (response.isBoom) {
|
||||
server.log(['error'],
|
||||
response.response.code + ' ' +
|
||||
response.response.payload.error + ': ' +
|
||||
response.message);
|
||||
server.log(['info'], 'request payload: ' + JSON.stringify(request.payload));
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
server.pack.require('good', {
|
||||
subscribers: {
|
||||
console: ['request', 'log'],
|
||||
ops: {
|
||||
events: ['ops'],
|
||||
handler: stats.ops
|
||||
var server = Hapi.createServer(
|
||||
config.bind_to.host,
|
||||
config.bind_to.port,
|
||||
{
|
||||
files: {
|
||||
relativeTo: __dirname
|
||||
},
|
||||
request: {
|
||||
events: ['request'],
|
||||
handler: stats.request
|
||||
views: {
|
||||
basePath: __dirname,
|
||||
path: 'templates',
|
||||
engines: {
|
||||
html: 'handlebars'
|
||||
}
|
||||
}
|
||||
},
|
||||
extendedRequests: true,
|
||||
leakDetection: true
|
||||
},
|
||||
function(err) {
|
||||
if (err) server.log(['error'], err);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
process.on(
|
||||
'SIGINT',
|
||||
function () {
|
||||
console.log("shutting down");
|
||||
server.stop(
|
||||
function () {
|
||||
toobusy.shutdown();
|
||||
server.addRoutes(routes);
|
||||
|
||||
server.app.log = log;
|
||||
server.on(
|
||||
'log',
|
||||
function (event) {
|
||||
log.info({ hapiEvent: event });
|
||||
}
|
||||
);
|
||||
|
||||
server.on(
|
||||
'request',
|
||||
function (request, event) {
|
||||
log.info({ hapiEvent: event });
|
||||
}
|
||||
);
|
||||
|
||||
//TODO throttle extension
|
||||
|
||||
server.ext(
|
||||
'onRequest',
|
||||
function (request, next) {
|
||||
var exit = false;
|
||||
if (toobusy()) {
|
||||
exit = Hapi.error.serverTimeout('Server too busy');
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
next(exit);
|
||||
}
|
||||
);
|
||||
|
||||
//TODO throttle extension
|
||||
server.ext(
|
||||
'onPreResponse',
|
||||
function (request, next) {
|
||||
var res = request.response();
|
||||
// error responses don't have `header`
|
||||
if (res.header) {
|
||||
res.header('Strict-Transport-Security', 'max-age=10886400');
|
||||
}
|
||||
next();
|
||||
}
|
||||
);
|
||||
|
||||
module.exports = server;
|
||||
server.ext('onPreResponse', function (request, next) {
|
||||
var response = request.response();
|
||||
if (response.isBoom) {
|
||||
log.error({
|
||||
code: response.response.code,
|
||||
error: response.response.payload.error,
|
||||
msg: response.message,
|
||||
});
|
||||
}
|
||||
|
||||
next();
|
||||
});
|
||||
|
||||
return server;
|
||||
};
|
||||
|
|
|
@ -2,9 +2,21 @@ const request = require('request');
|
|||
const crypto = require('crypto');
|
||||
const Hapi = require('hapi');
|
||||
const hoek = require('hoek');
|
||||
const config = require('../lib/config');
|
||||
const config = require('../lib/config').root();
|
||||
const routes = require('../routes');
|
||||
|
||||
exports.server = require('../server');
|
||||
const noop = function () {};
|
||||
const nullLog = {
|
||||
trace: noop,
|
||||
debug: noop,
|
||||
info: noop,
|
||||
log: noop,
|
||||
warn: noop,
|
||||
error: noop,
|
||||
fatal: noop
|
||||
};
|
||||
|
||||
exports.server = require('../server')(config, routes, nullLog);
|
||||
|
||||
|
||||
// Generate a unique, randomly-generated ID.
|
||||
|
|
Загрузка…
Ссылка в новой задаче