UNPKG

@neo-one/monitor

Version:

NEO•ONE monitoring.

82 lines (80 loc) 10.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const koa_1 = tslib_1.__importDefault(require("koa")); const koa_mount_1 = tslib_1.__importDefault(require("koa-mount")); const prom = tslib_1.__importStar(require("prom-client")); const MonitorBase_1 = require("./MonitorBase"); const DEFAULT_LOGGER = { log: () => { }, close: (callback) => { callback(); }, }; class NodeMonitor extends MonitorBase_1.MonitorBase { static create({ service, logger = DEFAULT_LOGGER, tracer, spanLogLevel }) { prom.collectDefaultMetrics({ timeout: 4000 }); return new NodeMonitor({ service, component: service, logger, tracer, now: () => Date.now(), spanLogLevel, }); } forContext(ctx) { return this.withLabels({ [this.labels.HTTP_METHOD]: ctx.request.method, [this.labels.SPAN_KIND]: 'server', [this.labels.HTTP_REQUEST_PROTOCOL]: ctx.request.protocol, }).withData({ [this.labels.HTTP_HEADERS]: JSON.stringify(ctx.request.headers), [this.labels.HTTP_URL]: ctx.request.originalUrl, [this.labels.HTTP_FULLPATH]: ctx.request.path, [this.labels.HTTP_REQUEST_QUERY]: ctx.request.querystring, [this.labels.PEER_ADDRESS]: ctx.request.ip, [this.labels.PEER_PORT]: ctx.request.socket.remotePort, [this.labels.HTTP_REQUEST_SIZE]: ctx.request.length, }); } forMessage(message) { const app = new koa_1.default(); app.proxy = true; app.silent = true; const ctx = app.createContext(message, undefined); return this.forContext(ctx); } serveMetrics(port) { const app = new koa_1.default(); app.proxy = true; app.silent = true; const monitor = this.at('telemetry'); app.on('error', (error) => { monitor.logError({ name: 'http_server_request_uncaught_error', message: 'Unexpected uncaught request error.', error, }); }); app.use(koa_mount_1.default('/metrics', (ctx) => { ctx.body = prom.register.metrics(); })); this.mutableServer = app.listen(port); } async closeInternal() { clearInterval(prom.collectDefaultMetrics()); await Promise.all([ super.closeInternal(), new Promise((resolve, reject) => { if (this.mutableServer !== undefined) { this.mutableServer.close(reject); } resolve(); }), ]); } } exports.NodeMonitor = NodeMonitor; //# sourceMappingURL=data:application/json;charset=utf8;base64,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RyxJQUFJLENBQUM7UUFFbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNyQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFO1lBQy9CLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ2YsSUFBSSxFQUFFLG9DQUFvQztnQkFDMUMsT0FBTyxFQUFFLG9DQUFvQztnQkFDN0MsS0FBSzthQUNOLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsR0FBRyxDQUFDLEdBQUcsQ0FDTCxtQkFBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQXdCLEVBQUUsRUFBRTtZQUM3QyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUVGLElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVMsS0FBSyxDQUFDLGFBQWE7UUFDM0IsYUFBYSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3BDLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUU7b0JBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNsQztnQkFDRCxPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQztTQUNILENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWpGRCxrQ0FpRkMiLCJmaWxlIjoibmVvLW9uZS1tb25pdG9yL3NyYy9Ob2RlTW9uaXRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluY29taW5nTWVzc2FnZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IEFwcGxpY2F0aW9uIGZyb20gJ2tvYSc7XG5pbXBvcnQgeyBTZXJ2ZXIgfSBmcm9tICduZXQnO1xuXG5pbXBvcnQgbW91bnQgZnJvbSAna29hLW1vdW50JztcbmltcG9ydCAqIGFzIHByb20gZnJvbSAncHJvbS1jbGllbnQnO1xuXG5pbXBvcnQgeyBNb25pdG9yQmFzZSwgVHJhY2VyIH0gZnJvbSAnLi9Nb25pdG9yQmFzZSc7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ0xldmVsLCBNb25pdG9yIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTm9kZU1vbml0b3JDcmVhdGUge1xuICByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvZ2dlcj86IExvZ2dlcjtcbiAgcmVhZG9ubHkgdHJhY2VyPzogVHJhY2VyO1xuICByZWFkb25seSBzcGFuTG9nTGV2ZWw/OiBMb2dMZXZlbDtcbn1cblxuY29uc3QgREVGQVVMVF9MT0dHRVI6IExvZ2dlciA9IHtcbiAgbG9nOiAoKSA9PiB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9LFxuICBjbG9zZTogKGNhbGxiYWNrKSA9PiB7XG4gICAgY2FsbGJhY2soKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBOb2RlTW9uaXRvciBleHRlbmRzIE1vbml0b3JCYXNlIHtcbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoeyBzZXJ2aWNlLCBsb2dnZXIgPSBERUZBVUxUX0xPR0dFUiwgdHJhY2VyLCBzcGFuTG9nTGV2ZWwgfTogTm9kZU1vbml0b3JDcmVhdGUpOiBOb2RlTW9uaXRvciB7XG4gICAgcHJvbS5jb2xsZWN0RGVmYXVsdE1ldHJpY3MoeyB0aW1lb3V0OiA0MDAwIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBOb2RlTW9uaXRvcih7XG4gICAgICBzZXJ2aWNlLFxuICAgICAgY29tcG9uZW50OiBzZXJ2aWNlLFxuICAgICAgbG9nZ2VyLFxuICAgICAgdHJhY2VyLFxuICAgICAgLy8gUGVyZmhvb2tzIGlzIGJyb2tlbiBpbiA4LjkgLSB0aGVyZSdzIG5vIHdheSB0byBnZXQgdGhlIGN1cnJlbnRcbiAgICAgIC8vIGhpZ2ggcmVzb2x1dGlvbiB0aW1lc3RhbXAuIEZpeCBpcyBpbiA5LjguMC5cbiAgICAgIG5vdzogKCkgPT4gRGF0ZS5ub3coKSxcbiAgICAgIHNwYW5Mb2dMZXZlbCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbXV0YWJsZVNlcnZlcjogU2VydmVyIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBmb3JDb250ZXh0KGN0eDogQXBwbGljYXRpb24uQ29udGV4dCk6IE1vbml0b3Ige1xuICAgIHJldHVybiB0aGlzLndpdGhMYWJlbHMoe1xuICAgICAgW3RoaXMubGFiZWxzLkhUVFBfTUVUSE9EXTogY3R4LnJlcXVlc3QubWV0aG9kLFxuICAgICAgW3RoaXMubGFiZWxzLlNQQU5fS0lORF06ICdzZXJ2ZXInLFxuICAgICAgW3RoaXMubGFiZWxzLkhUVFBfUkVRVUVTVF9QUk9UT0NPTF06IGN0eC5yZXF1ZXN0LnByb3RvY29sLFxuICAgIH0pLndpdGhEYXRhKHtcbiAgICAgIFt0aGlzLmxhYmVscy5IVFRQX0hFQURFUlNdOiBKU09OLnN0cmluZ2lmeShjdHgucmVxdWVzdC5oZWFkZXJzKSxcbiAgICAgIFt0aGlzLmxhYmVscy5IVFRQX1VSTF06IGN0eC5yZXF1ZXN0Lm9yaWdpbmFsVXJsLFxuICAgICAgW3RoaXMubGFiZWxzLkhUVFBfRlVMTFBBVEhdOiBjdHgucmVxdWVzdC5wYXRoLFxuICAgICAgW3RoaXMubGFiZWxzLkhUVFBfUkVRVUVTVF9RVUVSWV06IGN0eC5yZXF1ZXN0LnF1ZXJ5c3RyaW5nLFxuICAgICAgW3RoaXMubGFiZWxzLlBFRVJfQUREUkVTU106IGN0eC5yZXF1ZXN0LmlwLFxuICAgICAgW3RoaXMubGFiZWxzLlBFRVJfUE9SVF06IGN0eC5yZXF1ZXN0LnNvY2tldC5yZW1vdGVQb3J0LFxuICAgICAgW3RoaXMubGFiZWxzLkhUVFBfUkVRVUVTVF9TSVpFXTogY3R4LnJlcXVlc3QubGVuZ3RoLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZvck1lc3NhZ2UobWVzc2FnZTogSW5jb21pbmdNZXNzYWdlKTogTW9uaXRvciB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGNvbnN0IGFwcCA9IG5ldyBBcHBsaWNhdGlvbjxhbnksIHt9PigpO1xuICAgIGFwcC5wcm94eSA9IHRydWU7XG4gICAgYXBwLnNpbGVudCA9IHRydWU7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIGNvbnN0IGN0eCA9IGFwcC5jcmVhdGVDb250ZXh0KG1lc3NhZ2UsIHVuZGVmaW5lZCBhcyBhbnkpO1xuXG4gICAgcmV0dXJuIHRoaXMuZm9yQ29udGV4dChjdHgpO1xuICB9XG5cbiAgcHVibGljIHNlcnZlTWV0cmljcyhwb3J0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgY29uc3QgYXBwID0gbmV3IEFwcGxpY2F0aW9uPGFueSwge30+KCk7XG4gICAgYXBwLnByb3h5ID0gdHJ1ZTtcbiAgICBhcHAuc2lsZW50ID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1vbml0b3IgPSB0aGlzLmF0KCd0ZWxlbWV0cnknKTtcbiAgICBhcHAub24oJ2Vycm9yJywgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgbW9uaXRvci5sb2dFcnJvcih7XG4gICAgICAgIG5hbWU6ICdodHRwX3NlcnZlcl9yZXF1ZXN0X3VuY2F1Z2h0X2Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogJ1VuZXhwZWN0ZWQgdW5jYXVnaHQgcmVxdWVzdCBlcnJvci4nLFxuICAgICAgICBlcnJvcixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgYXBwLnVzZShcbiAgICAgIG1vdW50KCcvbWV0cmljcycsIChjdHg6IEFwcGxpY2F0aW9uLkNvbnRleHQpID0+IHtcbiAgICAgICAgY3R4LmJvZHkgPSBwcm9tLnJlZ2lzdGVyLm1ldHJpY3MoKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICB0aGlzLm11dGFibGVTZXJ2ZXIgPSBhcHAubGlzdGVuKHBvcnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNsb3NlSW50ZXJuYWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY2xlYXJJbnRlcnZhbChwcm9tLmNvbGxlY3REZWZhdWx0TWV0cmljcygpKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICBzdXBlci5jbG9zZUludGVybmFsKCksXG4gICAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm11dGFibGVTZXJ2ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMubXV0YWJsZVNlcnZlci5jbG9zZShyZWplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pLFxuICAgIF0pO1xuICB9XG59XG4iXX0=