Add support for v8-profiler (optional dep)
This commit is contained in:
parent
4db78deda3
commit
9a1d50dcd3
|
@ -85,5 +85,8 @@
|
||||||
"transform-flow-strip-types",
|
"transform-flow-strip-types",
|
||||||
"transform-decorators-legacy"
|
"transform-decorators-legacy"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"v8-profiler": "^5.7.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,7 @@ const SOCKETFILE = Config.get("service-socket.socket");
|
||||||
// Wipe the TTY
|
// Wipe the TTY
|
||||||
process.stdout.write('\x1Bc');
|
process.stdout.write('\x1Bc');
|
||||||
|
|
||||||
var commandline, eventlog, syslog;
|
var commandline, eventlog, syslog, errorlog;
|
||||||
var client = net.createConnection(SOCKETFILE).on('connect', () => {
|
var client = net.createConnection(SOCKETFILE).on('connect', () => {
|
||||||
commandline = readline.createInterface({
|
commandline = readline.createInterface({
|
||||||
input: process.stdin,
|
input: process.stdin,
|
||||||
|
@ -79,6 +79,11 @@ var client = net.createConnection(SOCKETFILE).on('connect', () => {
|
||||||
console.log(data.toString().replace(/^(.+)$/mg, 'sys: $1'));
|
console.log(data.toString().replace(/^(.+)$/mg, 'sys: $1'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
errorlog = spawn('tail', ['-f', 'error.log']);
|
||||||
|
errorlog.stdout.on('data', function (data) {
|
||||||
|
console.log(data.toString().replace(/^(.+)$/mg, 'error: $1'));
|
||||||
|
});
|
||||||
|
|
||||||
}).on('data', (msg) => {
|
}).on('data', (msg) => {
|
||||||
msg = msg.toString();
|
msg = msg.toString();
|
||||||
|
|
||||||
|
|
36
src/main.js
36
src/main.js
|
@ -21,6 +21,8 @@ if (!Config.get('debug')) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let profileName = null;
|
||||||
|
|
||||||
// TODO: this can probably just be part of servsock.js
|
// TODO: this can probably just be part of servsock.js
|
||||||
// servsock should also be refactored to send replies instead of
|
// servsock should also be refactored to send replies instead of
|
||||||
// relying solely on tailing logs
|
// relying solely on tailing logs
|
||||||
|
@ -78,6 +80,40 @@ function handleLine(line) {
|
||||||
}
|
}
|
||||||
} else if (line.indexOf('/reloadcert') === 0) {
|
} else if (line.indexOf('/reloadcert') === 0) {
|
||||||
sv.reloadCertificateData();
|
sv.reloadCertificateData();
|
||||||
|
} else if (line.indexOf('/profile') === 0) {
|
||||||
|
try {
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const profiler = require('v8-profiler');
|
||||||
|
|
||||||
|
if (profileName !== null) {
|
||||||
|
const filename = path.resolve(
|
||||||
|
__dirname,
|
||||||
|
'..',
|
||||||
|
`${profileName}.cpuprofile`
|
||||||
|
);
|
||||||
|
const profile = profiler.stopProfiling(profileName);
|
||||||
|
profileName = null;
|
||||||
|
|
||||||
|
const stream = profile.export();
|
||||||
|
stream.on('error', error => {
|
||||||
|
LOGGER.error('Error exporting profile: %s', error);
|
||||||
|
profile.delete();
|
||||||
|
});
|
||||||
|
stream.on('finish', () => {
|
||||||
|
LOGGER.info('Exported profile to %s', filename);
|
||||||
|
profile.delete();
|
||||||
|
});
|
||||||
|
|
||||||
|
stream.pipe(fs.createWriteStream(filename));
|
||||||
|
} else {
|
||||||
|
profileName = `prof_${Date.now()}`;
|
||||||
|
profiler.startProfiling(profileName, true);
|
||||||
|
LOGGER.info('Started CPU profile');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
LOGGER.error('Unable to record CPU profile: %s', error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue