@neo-one/monitor
Version:
NEO•ONE monitoring.
99 lines (97 loc) • 14.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
const CollectingMetricsFactory_1 = require("./CollectingMetricsFactory");
const NoOpMetricsFactory_1 = require("./NoOpMetricsFactory");
const MAX_BACKLOG = 1000;
const EMPTY_BACKREPORT = {
logs: [],
metrics: {
counters: {},
histograms: {},
},
};
class Reporter {
constructor({ logger, timer, endpoint, }) {
this.endpoint = endpoint;
this.requestsTotal = NoOpMetricsFactory_1.metrics.createCounter({
name: 'http_report_metrics_requests_total',
});
this.requestErrorsTotal = NoOpMetricsFactory_1.metrics.createCounter({
name: 'http_report_metrics_failures_total',
});
this.subscription = rxjs_1.interval(timer)
.pipe(operators_1.mergeScan(async (backReport) => this.collectReport({
backReport,
logger,
}), EMPTY_BACKREPORT, 1))
.subscribe();
}
close() {
this.subscription.unsubscribe();
}
async collectReport_forTest(options) {
return this.collectReport(options);
}
async report(report) {
return fetch(this.endpoint, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify(report),
});
}
async collectReport({ backReport, logger }) {
const logs = logger.collect();
const metrics = CollectingMetricsFactory_1.collectingMetrics.collect();
const report = this.addBackReport({ logs, metrics }, backReport);
let response;
try {
response = await this.report(report);
}
catch (_a) {
response = { ok: false };
}
this.requestsTotal.inc();
if (!response.ok) {
this.requestErrorsTotal.inc();
return this.constructBackReport(report);
}
return EMPTY_BACKREPORT;
}
addBackReport(report, backReport) {
if (backReport === undefined) {
return report;
}
return {
logs: backReport.logs.concat(report.logs),
metrics: {
counters: Object.entries(backReport.metrics.counters).reduce((accMetric, [name, metric]) => (Object.assign({}, accMetric, { [name]: {
metric: metric.metric,
values: accMetric[name] === undefined ? metric.values : metric.values.concat(accMetric[name].values),
} })), report.metrics.counters),
histograms: Object.entries(backReport.metrics.histograms).reduce((accMetric, [name, metric]) => (Object.assign({}, accMetric, { [name]: {
metric: metric.metric,
values: accMetric[name] === undefined ? metric.values : metric.values.concat(accMetric[name].values),
} })), report.metrics.histograms),
},
};
}
constructBackReport(report) {
return {
logs: report.logs.slice(-MAX_BACKLOG),
metrics: {
counters: Object.entries(report.metrics.counters).reduce((accMetric, [name, metric]) => (Object.assign({}, accMetric, { [name]: {
metric: metric.metric,
values: metric.values.slice(-MAX_BACKLOG),
} })), {}),
histograms: Object.entries(report.metrics.histograms).reduce((accMetric, [name, metric]) => (Object.assign({}, accMetric, { [name]: {
metric: metric.metric,
values: metric.values.slice(-MAX_BACKLOG),
} })), {}),
},
};
}
}
exports.Reporter = Reporter;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQixDQUFDLE1BQWM7UUFDeEMsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQztZQUNyQyxPQUFPLEVBQUU7Z0JBQ1AsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQ3RELENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFDMUIsU0FBUyxJQUNaLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ04sTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO3dCQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUM7cUJBQzFDLElBQ0QsRUFDRixFQUFFLENBQ0g7Z0JBQ0QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQzFELENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxtQkFDMUIsU0FBUyxJQUNaLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ04sTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO3dCQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUM7cUJBQzFDLElBQ0QsRUFDRixFQUFFLENBQ0g7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEzSUQsNEJBMklDIiwiZmlsZSI6Im5lby1vbmUtbW9uaXRvci9zcmMvUmVwb3J0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnRlcnZhbCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IG1lcmdlU2NhbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ29sbGVjdGluZ0xvZ2dlciB9IGZyb20gJy4vQ29sbGVjdGluZ0xvZ2dlcic7XG5pbXBvcnQgeyBCdWNrZXRlZE1ldHJpY09wdGlvbnMsIENvbGxlY3RlZE1ldHJpY3MsIENvdW50ZXIsIE1ldHJpY09wdGlvbnMsIFJlcG9ydCB9IGZyb20gJy4vdHlwZXMnO1xuXG5pbXBvcnQgeyBjb2xsZWN0aW5nTWV0cmljcyB9IGZyb20gJy4vQ29sbGVjdGluZ01ldHJpY3NGYWN0b3J5JztcbmltcG9ydCB7IG1ldHJpY3MgYXMgbWV0cmljc0ZhY3RvcnkgfSBmcm9tICcuL05vT3BNZXRyaWNzRmFjdG9yeSc7XG5cbmNvbnN0IE1BWF9CQUNLTE9HID0gMTAwMDtcblxuY29uc3QgRU1QVFlfQkFDS1JFUE9SVDogUmVwb3J0ID0ge1xuICBsb2dzOiBbXSxcbiAgbWV0cmljczoge1xuICAgIGNvdW50ZXJzOiB7fSxcbiAgICBoaXN0b2dyYW1zOiB7fSxcbiAgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdFJlcG9ydE9wdGlvbnMge1xuICByZWFkb25seSBiYWNrUmVwb3J0PzogUmVwb3J0O1xuICByZWFkb25seSBsb2dnZXI6IENvbGxlY3RpbmdMb2dnZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXBvcnRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0c1RvdGFsOiBDb3VudGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RFcnJvcnNUb3RhbDogQ291bnRlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Ioe1xuICAgIGxvZ2dlcixcbiAgICB0aW1lcixcbiAgICBlbmRwb2ludCxcbiAgfToge1xuICAgIHJlYWRvbmx5IGxvZ2dlcjogQ29sbGVjdGluZ0xvZ2dlcjtcbiAgICByZWFkb25seSB0aW1lcjogbnVtYmVyO1xuICAgIHJlYWRvbmx5IGVuZHBvaW50OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7XG4gICAgdGhpcy5yZXF1ZXN0c1RvdGFsID0gbWV0cmljc0ZhY3RvcnkuY3JlYXRlQ291bnRlcih7XG4gICAgICBuYW1lOiAnaHR0cF9yZXBvcnRfbWV0cmljc19yZXF1ZXN0c190b3RhbCcsXG4gICAgfSk7XG4gICAgdGhpcy5yZXF1ZXN0RXJyb3JzVG90YWwgPSBtZXRyaWNzRmFjdG9yeS5jcmVhdGVDb3VudGVyKHtcbiAgICAgIG5hbWU6ICdodHRwX3JlcG9ydF9tZXRyaWNzX2ZhaWx1cmVzX3RvdGFsJyxcbiAgICB9KTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gaW50ZXJ2YWwodGltZXIpXG4gICAgICAucGlwZShcbiAgICAgICAgbWVyZ2VTY2FuKFxuICAgICAgICAgIGFzeW5jIChiYWNrUmVwb3J0KSA9PlxuICAgICAgICAgICAgdGhpcy5jb2xsZWN0UmVwb3J0KHtcbiAgICAgICAgICAgICAgYmFja1JlcG9ydCxcbiAgICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgRU1QVFlfQkFDS1JFUE9SVCxcbiAgICAgICAgICAxLFxuICAgICAgICApLFxuICAgICAgKVxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHJ4anMtbm8taWdub3JlZC1zdWJzY3JpYmVcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNvbGxlY3RSZXBvcnRfZm9yVGVzdChvcHRpb25zOiBDb2xsZWN0UmVwb3J0T3B0aW9ucyk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgcmV0dXJuIHRoaXMuY29sbGVjdFJlcG9ydChvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVwb3J0KHJlcG9ydDogUmVwb3J0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBmZXRjaCh0aGlzLmVuZHBvaW50LCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVwb3J0KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29sbGVjdFJlcG9ydCh7IGJhY2tSZXBvcnQsIGxvZ2dlciB9OiBDb2xsZWN0UmVwb3J0T3B0aW9ucyk6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgY29uc3QgbG9ncyA9IGxvZ2dlci5jb2xsZWN0KCk7XG4gICAgY29uc3QgbWV0cmljcyA9IGNvbGxlY3RpbmdNZXRyaWNzLmNvbGxlY3QoKTtcblxuICAgIGNvbnN0IHJlcG9ydCA9IHRoaXMuYWRkQmFja1JlcG9ydCh7IGxvZ3MsIG1ldHJpY3MgfSwgYmFja1JlcG9ydCk7XG5cbiAgICBsZXQgcmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXBvcnQocmVwb3J0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlc3BvbnNlID0geyBvazogZmFsc2UgfTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcXVlc3RzVG90YWwuaW5jKCk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgdGhpcy5yZXF1ZXN0RXJyb3JzVG90YWwuaW5jKCk7XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdEJhY2tSZXBvcnQocmVwb3J0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gRU1QVFlfQkFDS1JFUE9SVDtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQmFja1JlcG9ydChyZXBvcnQ6IFJlcG9ydCwgYmFja1JlcG9ydD86IFJlcG9ydCk6IFJlcG9ydCB7XG4gICAgaWYgKGJhY2tSZXBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHJlcG9ydDtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9nczogYmFja1JlcG9ydC5sb2dzLmNvbmNhdChyZXBvcnQubG9ncyksXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIGNvdW50ZXJzOiBPYmplY3QuZW50cmllcyhiYWNrUmVwb3J0Lm1ldHJpY3MuY291bnRlcnMpLnJlZHVjZShcbiAgICAgICAgICAoYWNjTWV0cmljLCBbbmFtZSwgbWV0cmljXSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmFjY01ldHJpYyxcbiAgICAgICAgICAgIFtuYW1lXToge1xuICAgICAgICAgICAgICBtZXRyaWM6IG1ldHJpYy5tZXRyaWMsXG4gICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBzdHJpY3QtdHlwZS1wcmVkaWNhdGVzXG4gICAgICAgICAgICAgIHZhbHVlczogYWNjTWV0cmljW25hbWVdID09PSB1bmRlZmluZWQgPyBtZXRyaWMudmFsdWVzIDogbWV0cmljLnZhbHVlcy5jb25jYXQoYWNjTWV0cmljW25hbWVdLnZhbHVlcyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHJlcG9ydC5tZXRyaWNzLmNvdW50ZXJzLFxuICAgICAgICApLFxuICAgICAgICBoaXN0b2dyYW1zOiBPYmplY3QuZW50cmllcyhiYWNrUmVwb3J0Lm1ldHJpY3MuaGlzdG9ncmFtcykucmVkdWNlKFxuICAgICAgICAgIChhY2NNZXRyaWMsIFtuYW1lLCBtZXRyaWNdKSA9PiAoe1xuICAgICAgICAgICAgLi4uYWNjTWV0cmljLFxuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIG1ldHJpYzogbWV0cmljLm1ldHJpYyxcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIHN0cmljdC10eXBlLXByZWRpY2F0ZXNcbiAgICAgICAgICAgICAgdmFsdWVzOiBhY2NNZXRyaWNbbmFtZV0gPT09IHVuZGVmaW5lZCA/IG1ldHJpYy52YWx1ZXMgOiBtZXRyaWMudmFsdWVzLmNvbmNhdChhY2NNZXRyaWNbbmFtZV0udmFsdWVzKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgcmVwb3J0Lm1ldHJpY3MuaGlzdG9ncmFtcyxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0QmFja1JlcG9ydChyZXBvcnQ6IFJlcG9ydCk6IFJlcG9ydCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxvZ3M6IHJlcG9ydC5sb2dzLnNsaWNlKC1NQVhfQkFDS0xPRyksXG4gICAgICBtZXRyaWNzOiB7XG4gICAgICAgIGNvdW50ZXJzOiBPYmplY3QuZW50cmllcyhyZXBvcnQubWV0cmljcy5jb3VudGVycykucmVkdWNlPENvbGxlY3RlZE1ldHJpY3M8TWV0cmljT3B0aW9ucz4+KFxuICAgICAgICAgIChhY2NNZXRyaWMsIFtuYW1lLCBtZXRyaWNdKSA9PiAoe1xuICAgICAgICAgICAgLi4uYWNjTWV0cmljLFxuICAgICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAgIG1ldHJpYzogbWV0cmljLm1ldHJpYyxcbiAgICAgICAgICAgICAgdmFsdWVzOiBtZXRyaWMudmFsdWVzLnNsaWNlKC1NQVhfQkFDS0xPRyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgICAgICBoaXN0b2dyYW1zOiBPYmplY3QuZW50cmllcyhyZXBvcnQubWV0cmljcy5oaXN0b2dyYW1zKS5yZWR1Y2U8Q29sbGVjdGVkTWV0cmljczxCdWNrZXRlZE1ldHJpY09wdGlvbnM+PihcbiAgICAgICAgICAoYWNjTWV0cmljLCBbbmFtZSwgbWV0cmljXSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmFjY01ldHJpYyxcbiAgICAgICAgICAgIFtuYW1lXToge1xuICAgICAgICAgICAgICBtZXRyaWM6IG1ldHJpYy5tZXRyaWMsXG4gICAgICAgICAgICAgIHZhbHVlczogbWV0cmljLnZhbHVlcy5zbGljZSgtTUFYX0JBQ0tMT0cpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7fSxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19