use bunyan as the logger, remove 'good'

This commit is contained in:
Danny Coates 2013-06-17 16:36:52 -07:00
Родитель 5d2bd7da4a
Коммит c7abb0c156
9 изменённых файлов: 203 добавлений и 106 удалений

1
.gitignore поставляемый
Просмотреть файл

@ -4,3 +4,4 @@
/config/public-key.json
/config/secret-key.json
*.swp
server.log

Просмотреть файл

@ -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());

25
lib/memory_monitor.js Normal file
Просмотреть файл

@ -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;

Просмотреть файл

@ -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
Просмотреть файл

@ -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.