@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 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(call_sid) from cdrs WHERE account_sid = '${account_sid}' `;
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(*) FROM alerts WHERE account_sid = '${account_sid}' `;
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._initialized = true;
135
+ client.locals.initialized = true;
116
136
  };
117
137
 
118
138
  const writeCdrs = async(client, cdrs) => {
119
- if (!client._initialized) await initDatabase(client, 'cdrs');
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
- debug(`writing cdrs: ${JSON.stringify(cdrs)}`);
137
- return await client.writePoints(cdrs);
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._initialized) await initDatabase(client, 'alerts');
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._initialized) await initDatabase(client, 'alerts');
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.fields.timestamp = timestamp;
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
- return await client.writePoints(alerts);
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._initialized) await initDatabase(client, 'alerts');
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
- cdrClient._initialized = false;
268
- alertClient._initialized = false;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jambonz/time-series",
3
- "version": "0.1.1",
3
+ "version": "0.1.6",
4
4
  "description": "write and query data to time series daetabase",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -8,7 +8,7 @@ const {
8
8
  writeAlerts,
9
9
  queryAlerts,
10
10
  AlertType
11
- } = require('..')(consoleLogger, '127.0.0.1');
11
+ } = require('..')(consoleLogger, '127.0.0.1', {commitSize: 1});
12
12
 
13
13
  test('write cdr data', async(t) => {
14
14
  let result = await writeCdrs([{