1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.default = void 0;
|
7 |
|
8 | var _events = _interopRequireDefault(require("events"));
|
9 |
|
10 | var _uninstrumentedHttpUtils = require("./uninstrumentedHttpUtils");
|
11 |
|
12 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13 |
|
14 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; }
|
15 |
|
16 | function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
17 |
|
18 | class InfluxDBClient extends _events.default {
|
19 | constructor(influxDBHost, influxDBDBName, statNameMode, flushIntervalMS, baseDims) {
|
20 | super();
|
21 |
|
22 | _defineProperty(this, "_influxDBHost", void 0);
|
23 |
|
24 | _defineProperty(this, "_influxDBDBName", void 0);
|
25 |
|
26 | _defineProperty(this, "_statNameMode", void 0);
|
27 |
|
28 | _defineProperty(this, "_flushIntervalMS", void 0);
|
29 |
|
30 | _defineProperty(this, "_counterPoints", void 0);
|
31 |
|
32 | _defineProperty(this, "_gaugePoints", void 0);
|
33 |
|
34 | _defineProperty(this, "_timerPoints", void 0);
|
35 |
|
36 | _defineProperty(this, "_baseDims", void 0);
|
37 |
|
38 | _defineProperty(this, "trackMetrics", async metrics => {
|
39 | metrics.forEach(({
|
40 | statName,
|
41 | value,
|
42 | dims
|
43 | }) => {
|
44 | const filledDims = this._fillDims(dims);
|
45 |
|
46 | const metricKey = this._statNameMode === 'fields' ? `stat${`${Object.keys(filledDims).map(k => `,${k}=${filledDims[k]}`).join('')}`} ${statName}` : `${statName}${`${Object.keys(filledDims).map(k => `,${k}=${filledDims[k]}`).join('')}`} value`;
|
47 |
|
48 | switch (filledDims.metricType) {
|
49 | case 'counters':
|
50 | this._counterPoints.set(metricKey, Number(this._counterPoints.get(metricKey) || 0) + Number(value));
|
51 |
|
52 | break;
|
53 |
|
54 | case 'gauges':
|
55 | this._gaugePoints.set(metricKey, Number(value));
|
56 |
|
57 | break;
|
58 |
|
59 | case 'timers':
|
60 | this._timerPoints.set(metricKey, [...(this._timerPoints.get(metricKey) || []), Number(value)]);
|
61 |
|
62 | break;
|
63 |
|
64 | default:
|
65 | throw new Error(`Illegal metricType: '${filledDims.metricType}'`);
|
66 | }
|
67 | }); //const body = `${statName}${ dims ? `${Object.keys(dims).map(k => `,${k}=${dims[k]}`).join('')}` : '' } value=${value}${ timestampMs ? ` ${timestampMs}000000` : '' }`
|
68 | // $FlowIgnore
|
69 | //const newMetricStrs = metrics.map(({ statName, value, dims, timestampMs }) => `stat${ dims ? `${Object.keys(dims).map(k => `,${k}=${dims[k]}`).join('')}` : '' } ${statName}=${value}${ timestampMs ? ` ${timestampMs}000000` : '' }`)
|
70 |
|
71 | if (!this._flushIntervalMS) {
|
72 | await this.flushMetrics();
|
73 | }
|
74 | });
|
75 |
|
76 | _defineProperty(this, "flushMetrics", async () => {
|
77 | try {
|
78 | if (this._counterPoints.size + this._gaugePoints.size + this._timerPoints.size === 0) return;
|
79 | const pointsStr = [Array.from(this._counterPoints.keys()).map(key => `${key}=${this._counterPoints.get(key) || 0}`).join('\n'), Array.from(this._gaugePoints.keys()).map(key => `${key}=${this._gaugePoints.get(key) || 0}`).join('\n'), Array.from(this._timerPoints.keys()).map(key => `${key}=${(this._timerPoints.get(key) || []).reduce((a, b) => a + b, 0) / (this._timerPoints.get(key) || []).length}`).join('\n')].join('\n');
|
80 | this._counterPoints = new Map();
|
81 | this._gaugePoints = new Map();
|
82 | this._timerPoints = new Map(); // console.log('Tracking:\n' + pointsStr) // eslint-disable-line no-console
|
83 |
|
84 | await (0, _uninstrumentedHttpUtils.httpReq)(`http://${this._influxDBHost}/write?db=${this._influxDBDBName}`, {
|
85 | method: 'POST',
|
86 | body: pointsStr,
|
87 | maxRetries: 1,
|
88 | timeout: 10000
|
89 | });
|
90 | } catch (err) {
|
91 | console.error('InfluxDB error', new Date().toUTCString(), err.toString()); // eslint-disable-line no-console
|
92 | // TODO: make sure these errors are logged
|
93 | //this.emit('error', { err: err })
|
94 | }
|
95 | });
|
96 |
|
97 | _defineProperty(this, "_fillDims", dims => {
|
98 | return _objectSpread({}, this._baseDims, {
|
99 | metricType: 'counters'
|
100 | }, dims);
|
101 | });
|
102 |
|
103 | this._influxDBHost = influxDBHost;
|
104 | this._influxDBDBName = influxDBDBName;
|
105 | this._statNameMode = statNameMode;
|
106 | this._flushIntervalMS = flushIntervalMS || 0;
|
107 | this._baseDims = baseDims || {};
|
108 | this._counterPoints = new Map();
|
109 | this._gaugePoints = new Map();
|
110 | this._timerPoints = new Map();
|
111 |
|
112 | if (this._flushIntervalMS) {
|
113 | setInterval(this.flushMetrics, this._flushIntervalMS);
|
114 | }
|
115 | }
|
116 |
|
117 | }
|
118 |
|
119 | exports.default = InfluxDBClient;
|
120 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9JbmZsdXhEQkNsaWVudC5qcyJdLCJuYW1lcyI6WyJJbmZsdXhEQkNsaWVudCIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwiaW5mbHV4REJIb3N0IiwiaW5mbHV4REJEQk5hbWUiLCJzdGF0TmFtZU1vZGUiLCJmbHVzaEludGVydmFsTVMiLCJiYXNlRGltcyIsIm1ldHJpY3MiLCJmb3JFYWNoIiwic3RhdE5hbWUiLCJ2YWx1ZSIsImRpbXMiLCJmaWxsZWREaW1zIiwiX2ZpbGxEaW1zIiwibWV0cmljS2V5IiwiX3N0YXROYW1lTW9kZSIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJrIiwiam9pbiIsIm1ldHJpY1R5cGUiLCJfY291bnRlclBvaW50cyIsInNldCIsIk51bWJlciIsImdldCIsIl9nYXVnZVBvaW50cyIsIl90aW1lclBvaW50cyIsIkVycm9yIiwiX2ZsdXNoSW50ZXJ2YWxNUyIsImZsdXNoTWV0cmljcyIsInNpemUiLCJwb2ludHNTdHIiLCJBcnJheSIsImZyb20iLCJrZXkiLCJyZWR1Y2UiLCJhIiwiYiIsImxlbmd0aCIsIk1hcCIsIl9pbmZsdXhEQkhvc3QiLCJfaW5mbHV4REJEQk5hbWUiLCJtZXRob2QiLCJib2R5IiwibWF4UmV0cmllcyIsInRpbWVvdXQiLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJEYXRlIiwidG9VVENTdHJpbmciLCJ0b1N0cmluZyIsIl9iYXNlRGltcyIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBSUE7O0FBRUE7Ozs7Ozs7O0FBY2UsTUFBTUEsY0FBTixTQUE2QkMsZUFBN0IsQ0FBMEM7QUFZdkRDLEVBQUFBLFdBQVcsQ0FBQ0MsWUFBRCxFQUF1QkMsY0FBdkIsRUFBK0NDLFlBQS9DLEVBQTJFQyxlQUEzRSxFQUFxR0MsUUFBckcsRUFBeUg7QUFDbEk7O0FBRGtJOztBQUFBOztBQUFBOztBQUFBOztBQUFBOztBQUFBOztBQUFBOztBQUFBOztBQUFBLDBDQWtCckgsTUFBT0Ms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RCxLQXJGbUk7O0FBR2xJLFNBQUs4QixhQUFMLEdBQXFCdkMsWUFBckI7QUFDQSxTQUFLd0MsZUFBTCxHQUF1QnZDLGNBQXZCO0FBQ0EsU0FBS1ksYUFBTCxHQUFxQlgsWUFBckI7QUFDQSxTQUFLeUIsZ0JBQUwsR0FBd0J4QixlQUFlLElBQUksQ0FBM0M7QUFDQSxTQUFLZ0QsU0FBTCxHQUFpQi9DLFFBQVEsSUFBSSxFQUE3QjtBQUNBLFNBQUtnQixjQUFMLEdBQXNCLElBQUlrQixHQUFKLEVBQXRCO0FBQ0EsU0FBS2QsWUFBTCxHQUFvQixJQUFJYyxHQUFKLEVBQXBCO0FBQ0EsU0FBS2IsWUFBTCxHQUFvQixJQUFJYSxHQUFKLEVBQXBCOztBQUVBLFFBQUksS0FBS1gsZ0JBQVQsRUFBMkI7QUFDekJ5QixNQUFBQSxXQUFXLENBQUMsS0FBS3hCLFlBQU4sRUFBb0IsS0FBS0QsZ0JBQXpCLENBQVg7QUFDRDtBQUNGOztBQTNCc0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuXG4vLyBOT1RFOiBkb24ndCB1c2UgTW9kdWxlIGhlcmUsIHNpbmNlIE1vZHVsZSB1c2VzIHRoaXMgY2xhc3NcblxuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnXG5cbmltcG9ydCB7IGh0dHBSZXEgfSBmcm9tICcuL3VuaW5zdHJ1bWVudGVkSHR0cFV0aWxzJ1xuXG5pbXBvcnQgdHlwZSB7IE1pbmltYWxNZXRyaWNEaW1lbnNpb25zIH0gZnJvbSAnLi90eXBlcydcblxuXG5leHBvcnQgdHlwZSBNZXRyaWMgPSB7XG4gIHN0YXROYW1lOiBzdHJpbmcsIFxuICB2YWx1ZTogbnVtYmVyLCBcbiAgZGltcz86ID97fSwgXG4gIHRpbWVzdGFtcE1zPzogP251bWJlcixcbn1cblxuZXhwb3J0IHR5cGUgU3RhdE5hbWVNb2RlID0gJ21lYXN1cmVtZW50cycgfCAnZmllbGRzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmZsdXhEQkNsaWVudCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cbiAgX2luZmx1eERCSG9zdDogc3RyaW5nXG4gIF9pbmZsdXhEQkRCTmFtZTogc3RyaW5nXG4gIF9zdGF0TmFtZU1vZGU6IFN0YXROYW1lTW9kZVxuICBfZmx1c2hJbnRlcnZhbE1TOiBudW1iZXJcbiAgX2NvdW50ZXJQb2ludHM6IE1hcDxzdHJpbmcsIG51bWJlcj5cbiAgX2dhdWdlUG9pbnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+XG4gIF90aW1lclBvaW50czogTWFwPHN0cmluZywgQXJyYXk8bnVtYmVyPj5cbiAgX2Jhc2VEaW1zOiBPYmplY3RcblxuXG4gIGNvbnN0cnVjdG9yKGluZmx1eERCSG9zdDogc3RyaW5nLCBpbmZsdXhEQkRCTmFtZTogc3RyaW5nLCBzdGF0TmFtZU1vZGU6IFN0YXROYW1lTW9kZSwgZmx1c2hJbnRlcnZhbE1TOiA/bnVtYmVyLCBiYXNlRGltcz86ID9PYmplY3QpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLl9pbmZsdXhEQkhvc3QgPSBpbmZsdXhEQkhvc3RcbiAgICB0aGlzLl9pbmZsdXhEQkRCTmFtZSA9IGluZmx1eERCREJOYW1lXG4gICAgdGhpcy5fc3RhdE5hbWVNb2RlID0gc3RhdE5hbWVNb2RlXG4gICAgdGhpcy5fZmx1c2hJbnRlcnZhbE1TID0gZmx1c2hJbnRlcnZhbE1TIHx8IDBcbiAgICB0aGlzLl9iYXNlRGltcyA9IGJhc2VEaW1zIHx8IHt9XG4gICAgdGhpcy5fY291bnRlclBvaW50cyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX2dhdWdlUG9pbnRzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fdGltZXJQb2ludHMgPSBuZXcgTWFwKClcblxuICAgIGlmICh0aGlzLl9mbHVzaEludGVydmFsTVMpIHtcbiAgICAgIHNldEludGVydmFsKHRoaXMuZmx1c2hNZXRyaWNzLCB0aGlzLl9mbHVzaEludGVydmFsTVMpXG4gICAgfVxuICB9XG5cblxuICB0cmFja01ldHJpY3MgPSBhc3luYyAobWV0cmljczogQXJyYXk8TWV0cmljPikgPT4ge1xuICAgIG1ldHJpY3MuZm9yRWFjaCgoeyBzdGF0TmFtZSwgdmFsdWUsIGRpbXMgfSkgPT4ge1xuICAgICAgY29uc3QgZmlsbGVkRGltcyA9IHRoaXMuX2ZpbGxEaW1zKGRpbXMpXG4gICAgICBjb25zdCBtZXRyaWNLZXkgPSB0aGlzLl9zdGF0TmFtZU1vZGUgPT09ICdmaWVsZHMnID9cbiAgICAgICAgYHN0YXQke2Ake09iamVjdC5rZXlzKGZpbGxlZERpbXMpLm1hcChrID0+IGAsJHtrfT0ke2ZpbGxlZERpbXNba119YCkuam9pbignJyl9YH0gJHtzdGF0TmFtZX1gIDpcbiAgICAgICAgYCR7c3RhdE5hbWV9JHtgJHtPYmplY3Qua2V5cyhmaWxsZWREaW1zKS5tYXAoayA9PiBgLCR7a309JHtmaWxsZWREaW1zW2tdfWApLmpvaW4oJycpfWB9IHZhbHVlYFxuICAgICAgc3dpdGNoIChmaWxsZWREaW1zLm1ldHJpY1R5cGUpIHtcbiAgICAgIGNhc2UgJ2NvdW50ZXJzJzpcbiAgICAgICAgdGhpcy5fY291bnRlclBvaW50cy5zZXQobWV0cmljS2V5LCBOdW1iZXIodGhpcy5fY291bnRlclBvaW50cy5nZXQobWV0cmljS2V5KSB8fCAwKSArIE51bWJlcih2YWx1ZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdnYXVnZXMnOlxuICAgICAgICB0aGlzLl9nYXVnZVBvaW50cy5zZXQobWV0cmljS2V5LCBOdW1iZXIodmFsdWUpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAndGltZXJzJzpcbiAgICAgICAgdGhpcy5fdGltZXJQb2ludHMuc2V0KG1ldHJpY0tleSwgWyAuLi4odGhpcy5fdGltZXJQb2ludHMuZ2V0KG1ldHJpY0tleSkgfHwgW10pLCBOdW1iZXIodmFsdWUpIF0pXG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElsbGVnYWwgbWV0cmljVHlwZTogJyR7ZmlsbGVkRGltcy5tZXRyaWNUeXBlfSdgKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvL2NvbnN0IGJvZHkgPSBgJHtzdGF0TmFtZX0keyBkaW1zID8gYCR7T2JqZWN0LmtleXMoZGltcykubWFwKGsgPT4gYCwke2t9PSR7ZGltc1trXX1gKS5qb2luKCcnKX1gIDogJycgfSB2YWx1ZT0ke3ZhbHVlfSR7IHRpbWVzdGFtcE1zID8gYCAke3RpbWVzdGFtcE1zfTAwMDAwMGAgOiAnJyB9YFxuXG4gICAgLy8gJEZsb3dJZ25vcmVcbiAgICAvL2NvbnN0IG5ld01ldHJpY1N0cnMgPSBtZXRyaWNzLm1hcCgoeyBzdGF0TmFtZSwgdmFsdWUsIGRpbXMsIHRpbWVzdGFtcE1zIH0pID0+IGBzdGF0JHsgZGltcyA/IGAke09iamVjdC5rZXlzKGRpbXMpLm1hcChrID0+IGAsJHtrfT0ke2RpbXNba119YCkuam9pbignJyl9YCA6ICcnIH0gJHtzdGF0TmFtZX09JHt2YWx1ZX0keyB0aW1lc3RhbXBNcyA/IGAgJHt0aW1lc3RhbXBNc30wMDAwMDBgIDogJycgfWApXG4gICAgXG4gICAgaWYgKCF0aGlzLl9mbHVzaEludGVydmFsTVMpIHtcbiAgICAgIGF3YWl0IHRoaXMuZmx1c2hNZXRyaWNzKClcbiAgICB9XG4gIH1cblxuICBmbHVzaE1ldHJpY3MgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLl9jb3VudGVyUG9pbnRzLnNpemUgKyB0aGlzLl9nYXVnZVBvaW50cy5zaXplICsgdGhpcy5fdGltZXJQb2ludHMuc2l6ZSA9PT0gMClcbiAgICAgICAgcmV0dXJuXG5cbiAgICAgIGNvbnN0IHBvaW50c1N0ciA9IFtcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9jb3VudGVyUG9pbnRzLmtleXMoKSkubWFwKGtleSA9PiBgJHtrZXl9PSR7IHRoaXMuX2NvdW50ZXJQb2ludHMuZ2V0KGtleSkgfHwgMCB9YCkuam9pbignXFxuJyksXG4gICAgICAgIEFycmF5LmZyb20odGhpcy5fZ2F1Z2VQb2ludHMua2V5cygpKS5tYXAoa2V5ID0+IGAke2tleX09JHsgdGhpcy5fZ2F1Z2VQb2ludHMuZ2V0KGtleSkgfHwgMCB9YCkuam9pbignXFxuJyksXG4gICAgICAgIEFycmF5LmZyb20odGhpcy5fdGltZXJQb2ludHMua2V5cygpKS5tYXAoa2V5ID0+IGAke2tleX09JHsgKHRoaXMuX3RpbWVyUG9pbnRzLmdldChrZXkpIHx8IFtdKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvICh0aGlzLl90aW1lclBvaW50cy5nZXQoa2V5KSB8fCBbXSkubGVuZ3RoIH1gKS5qb2luKCdcXG4nKSxcbiAgICAgIF0uam9pbignXFxuJylcblxuICAgICAgdGhpcy5fY291bnRlclBvaW50cyA9IG5ldyBNYXAoKVxuICAgICAgdGhpcy5fZ2F1Z2VQb2ludHMgPSBuZXcgTWFwKClcbiAgICAgIHRoaXMuX3RpbWVyUG9pbnRzID0gbmV3IE1hcCgpXG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdUcmFja2luZzpcXG4nICsgcG9pbnRzU3RyKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcblxuICAgICAgYXdhaXQgaHR0cFJlcShgaHR0cDovLyR7dGhpcy5faW5mbHV4REJIb3N0fS93cml0ZT9kYj0ke3RoaXMuX2luZmx1eERCREJOYW1lfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGJvZHk6IHBvaW50c1N0cixcbiAgICAgICAgbWF4UmV0cmllczogMSxcbiAgICAgICAgdGltZW91dDogMTAwMDAsXG4gICAgICB9KVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignSW5mbHV4REIgZXJyb3InLCAobmV3IERhdGUoKSkudG9VVENTdHJpbmcoKSwgZXJyLnRvU3RyaW5nKCkpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgLy8gVE9ETzogbWFrZSBzdXJlIHRoZXNlIGVycm9ycyBhcmUgbG9nZ2VkXG4gICAgICAvL3RoaXMuZW1pdCgnZXJyb3InLCB7IGVycjogZXJyIH0pXG4gICAgfVxuICB9XG5cbiAgX2ZpbGxEaW1zID0gKGRpbXM6ID97fSk6IE1pbmltYWxNZXRyaWNEaW1lbnNpb25zID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5fYmFzZURpbXMsXG4gICAgICBtZXRyaWNUeXBlOiAnY291bnRlcnMnLCAvLyBhIG1ldHJpYyBpcyBhIGNvdW50ZXIgYnkgZGVmYXVsdFxuICAgICAgLi4uZGltcyxcbiAgICB9XG4gIH0gXG5cbn1cbiJdfQ== |
\ | No newline at end of file |