@jambonz/time-series 0.1.1 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +68 -18
- package/package.json +1 -1
- package/test/unit-tests.js +1 -1
package/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
const debug = require('debug')('jambonz:time-series');
|
|
2
1
|
const assert = require('assert');
|
|
3
2
|
const Influx = require('influx');
|
|
4
3
|
const AlertType = {
|
|
5
4
|
WEBHOOK_STATUS_FAILURE: 'webhook-failure',
|
|
6
5
|
WEBHOOK_CONNECTION_FAILURE: 'webhook-connection-failure',
|
|
6
|
+
WEBHOOK_URL_NOTFOUND: 'webhook-url-notfound',
|
|
7
7
|
WEBHOOK_AUTH_FAILURE: 'webhook-auth-failure',
|
|
8
8
|
TTS_NOT_PROVISIONED: 'no-tts',
|
|
9
9
|
STT_NOT_PROVISIONED: 'no-stt',
|
|
@@ -12,7 +12,8 @@ const AlertType = {
|
|
|
12
12
|
CARRIER_NOT_PROVISIONED: 'no-carrier',
|
|
13
13
|
CALL_LIMIT: 'call-limit',
|
|
14
14
|
DEVICE_LIMIT: 'device-limit',
|
|
15
|
-
API_LIMIT: 'api-limit'
|
|
15
|
+
API_LIMIT: 'api-limit',
|
|
16
|
+
ACCOUNT_INACTIVE: 'account is inactive or suspended'
|
|
16
17
|
};
|
|
17
18
|
|
|
18
19
|
const schemas = {
|
|
@@ -50,6 +51,25 @@ const schemas = {
|
|
|
50
51
|
}
|
|
51
52
|
};
|
|
52
53
|
|
|
54
|
+
const writeData = async(client) => {
|
|
55
|
+
const {data, initialized} = client.locals;
|
|
56
|
+
if (0 === data.length || client.locals.writing) return;
|
|
57
|
+
if (!initialized) await initDatabase(client, client.locals.db);
|
|
58
|
+
try {
|
|
59
|
+
//console.log(`writing data ${JSON.stringify(data)}`);
|
|
60
|
+
client.locals.writing = true;
|
|
61
|
+
await client.writePoints(data);
|
|
62
|
+
client.locals.writing = false;
|
|
63
|
+
client.locals.data = [];
|
|
64
|
+
} catch (err) {
|
|
65
|
+
console.log(err);
|
|
66
|
+
client.locals.writing = false;
|
|
67
|
+
client.locals.data = [];
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
|
|
53
73
|
const createCdrQuery = ({account_sid, page, page_size, trunk, direction, answered, days, start, end}) => {
|
|
54
74
|
let sql = `SELECT * from cdrs WHERE account_sid = '${account_sid}' `;
|
|
55
75
|
if (trunk) sql += `AND trunk = '${trunk}' `;
|
|
@@ -67,7 +87,7 @@ const createCdrQuery = ({account_sid, page, page_size, trunk, direction, answere
|
|
|
67
87
|
return sql;
|
|
68
88
|
};
|
|
69
89
|
const createCdrCountQuery = ({account_sid, trunk, direction, answered, days, start, end}) => {
|
|
70
|
-
let sql = `SELECT COUNT(
|
|
90
|
+
let sql = `SELECT COUNT(sip_callid) from cdrs WHERE account_sid = '${account_sid}' `;
|
|
71
91
|
if (trunk) sql += `AND trunk = '${trunk}' `;
|
|
72
92
|
if (direction) sql += `AND direction = '${direction}' `;
|
|
73
93
|
if (['true', 'false'].includes(answered)) sql += `AND answered = '${answered}' `;
|
|
@@ -96,7 +116,7 @@ const createAlertsQuery = ({account_sid, alert_type, page, page_size, days, star
|
|
|
96
116
|
};
|
|
97
117
|
|
|
98
118
|
const createAlertsCountQuery = ({account_sid, alert_type, days, start, end}) => {
|
|
99
|
-
let sql = `SELECT COUNT(
|
|
119
|
+
let sql = `SELECT COUNT(message) FROM alerts WHERE account_sid = '${account_sid}' `;
|
|
100
120
|
if (alert_type) sql += `AND alert_type = '${alert_type}' `;
|
|
101
121
|
if (days) sql += `AND time > now() - ${days}d `;
|
|
102
122
|
else {
|
|
@@ -112,11 +132,11 @@ const initDatabase = async(client, dbName) => {
|
|
|
112
132
|
if (!names.includes(dbName)) {
|
|
113
133
|
await client.createDatabase(dbName);
|
|
114
134
|
}
|
|
115
|
-
client.
|
|
135
|
+
client.locals.initialized = true;
|
|
116
136
|
};
|
|
117
137
|
|
|
118
138
|
const writeCdrs = async(client, cdrs) => {
|
|
119
|
-
if (!client.
|
|
139
|
+
if (!client.locals.initialized) await initDatabase(client, 'cdrs');
|
|
120
140
|
cdrs = (Array.isArray(cdrs) ? cdrs : [cdrs])
|
|
121
141
|
.map((cdr) => {
|
|
122
142
|
const {direction, host, trunk, account_sid, answered, attempted_at, ...fields} = cdr;
|
|
@@ -133,13 +153,16 @@ const writeCdrs = async(client, cdrs) => {
|
|
|
133
153
|
}
|
|
134
154
|
};
|
|
135
155
|
});
|
|
136
|
-
|
|
137
|
-
|
|
156
|
+
//console.log(`writing cdrs: ${JSON.stringify(cdrs)}`);
|
|
157
|
+
client.locals.data = [...client.locals.data, ...cdrs];
|
|
158
|
+
if (client.locals.data.length >= client.locals.commitSize) {
|
|
159
|
+
await writeData(client);
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
138
162
|
};
|
|
139
163
|
|
|
140
164
|
const queryCdrs = async(client, opts) => {
|
|
141
|
-
if (!client.
|
|
142
|
-
//console.log(JSON.stringify(opts));
|
|
165
|
+
if (!client.locals.initialized) await initDatabase(client, 'cdrs');
|
|
143
166
|
const response = {
|
|
144
167
|
total: 0,
|
|
145
168
|
page_size: opts.page_size,
|
|
@@ -148,7 +171,7 @@ const queryCdrs = async(client, opts) => {
|
|
|
148
171
|
};
|
|
149
172
|
const sqlTotal = createCdrCountQuery(opts);
|
|
150
173
|
const obj = await client.queryRaw(sqlTotal);
|
|
151
|
-
//console.log(JSON.stringify(obj));
|
|
174
|
+
//console.log(`sql: ${sqlTotal}, results: ${JSON.stringify(obj)}`);
|
|
152
175
|
if (!obj.results || !obj.results[0].series) return response;
|
|
153
176
|
response.total = obj.results[0].series[0].values[0][1];
|
|
154
177
|
|
|
@@ -173,7 +196,7 @@ const queryCdrs = async(client, opts) => {
|
|
|
173
196
|
};
|
|
174
197
|
|
|
175
198
|
const writeAlerts = async(client, alerts) => {
|
|
176
|
-
if (!client.
|
|
199
|
+
if (!client.locals.initialized) await initDatabase(client, 'alerts');
|
|
177
200
|
alerts = (Array.isArray(alerts) ? alerts : [alerts])
|
|
178
201
|
.map((alert) => {
|
|
179
202
|
const {alert_type, account_sid, url, status, vendor, count, detail, timestamp} = alert;
|
|
@@ -189,6 +212,9 @@ const writeAlerts = async(client, alerts) => {
|
|
|
189
212
|
case AlertType.WEBHOOK_AUTH_FAILURE:
|
|
190
213
|
message = `authentication failure: ${url}`;
|
|
191
214
|
break;
|
|
215
|
+
case AlertType.WEBHOOK_URL_NOTFOUND:
|
|
216
|
+
message = `webhook url not found: ${url}`;
|
|
217
|
+
break;
|
|
192
218
|
case AlertType.TTS_NOT_PROVISIONED:
|
|
193
219
|
message = `text to speech credentials for ${vendor} have not been provisioned`;
|
|
194
220
|
break;
|
|
@@ -219,16 +245,20 @@ const writeAlerts = async(client, alerts) => {
|
|
|
219
245
|
}
|
|
220
246
|
}
|
|
221
247
|
const obj = {measurement: 'alerts', fields: { message }, tags: { alert_type, account_sid }};
|
|
222
|
-
if (timestamp) obj.
|
|
248
|
+
if (timestamp) obj.timestamp = timestamp;
|
|
223
249
|
if (detail) obj.fields.detail = detail;
|
|
224
250
|
return obj;
|
|
225
251
|
});
|
|
226
252
|
//console.log(`writing alerts: ${JSON.stringify(alerts)}`);
|
|
227
|
-
|
|
253
|
+
client.locals.data = [...client.locals.data, ...alerts];
|
|
254
|
+
if (client.locals.data.length >= client.locals.commitSize) {
|
|
255
|
+
await writeData(client);
|
|
256
|
+
}
|
|
257
|
+
return;
|
|
228
258
|
};
|
|
229
259
|
|
|
230
260
|
const queryAlerts = async(client, opts) => {
|
|
231
|
-
if (!client.
|
|
261
|
+
if (!client.locals.initialized) await initDatabase(client, 'alerts');
|
|
232
262
|
const response = {
|
|
233
263
|
total: 0,
|
|
234
264
|
page_size: opts.page_size,
|
|
@@ -237,7 +267,7 @@ const queryAlerts = async(client, opts) => {
|
|
|
237
267
|
};
|
|
238
268
|
const sqlTotal = createAlertsCountQuery(opts);
|
|
239
269
|
const obj = await client.queryRaw(sqlTotal);
|
|
240
|
-
//console.log(JSON.stringify(obj));
|
|
270
|
+
//console.log(`query total alerts: ${sqlTotal}: ${JSON.stringify(obj)}`);
|
|
241
271
|
if (!obj.results || !obj.results[0].series) return response;
|
|
242
272
|
response.total = obj.results[0].series[0].values[0][1];
|
|
243
273
|
|
|
@@ -264,8 +294,28 @@ module.exports = (logger, opts) => {
|
|
|
264
294
|
|
|
265
295
|
const cdrClient = new Influx.InfluxDB({database: 'cdrs', schemas: schemas.cdr, ...opts});
|
|
266
296
|
const alertClient = new Influx.InfluxDB({database: 'alerts', schemas: schemas.alerts, ...opts});
|
|
267
|
-
|
|
268
|
-
|
|
297
|
+
|
|
298
|
+
cdrClient.locals = {
|
|
299
|
+
db: 'cdrs',
|
|
300
|
+
initialized: false,
|
|
301
|
+
writing: false,
|
|
302
|
+
commitSize: opts.commitSize || 1,
|
|
303
|
+
commitInterval: opts.commitInterval || 10,
|
|
304
|
+
data: []
|
|
305
|
+
};
|
|
306
|
+
alertClient.locals = {
|
|
307
|
+
db: 'alerts',
|
|
308
|
+
initialized: false,
|
|
309
|
+
writing: false,
|
|
310
|
+
commitSize: opts.commitSize || 1,
|
|
311
|
+
commitInterval: opts.commitInterval || 10,
|
|
312
|
+
data: []
|
|
313
|
+
};
|
|
314
|
+
|
|
315
|
+
if (opts.commitSize > 1 && opts.commitInterval && opts.commitInterval > 2) {
|
|
316
|
+
setInterval(writeData.bind(null, cdrClient), opts.commitInterval * 1000);
|
|
317
|
+
setInterval(writeData.bind(null, alertClient), opts.commitInterval * 1000);
|
|
318
|
+
}
|
|
269
319
|
|
|
270
320
|
return {
|
|
271
321
|
writeCdrs: writeCdrs.bind(null, cdrClient),
|
package/package.json
CHANGED
package/test/unit-tests.js
CHANGED