UNPKG

16.1 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = void 0;
7
8var _events = _interopRequireDefault(require("events"));
9
10var _uninstrumentedHttpUtils = require("./uninstrumentedHttpUtils");
11
12function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
14function _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
16function _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
18class 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
119exports.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