@jambonz/time-series 0.1.6 → 0.1.9

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
@@ -28,7 +28,8 @@ const schemas = {
28
28
  duration: Influx.FieldType.INTEGER,
29
29
  terminated_at: Influx.FieldType.INTEGER,
30
30
  termination_reason: Influx.FieldType.STRING,
31
- remote_host: Influx.FieldType.STRING
31
+ remote_host: Influx.FieldType.STRING,
32
+ trace_id: Influx.FieldType.STRING
32
33
  },
33
34
  tags: [
34
35
  'account_sid',
@@ -48,6 +49,15 @@ const schemas = {
48
49
  'account_sid',
49
50
  'alert_type'
50
51
  ]
52
+ },
53
+ call_counts: {
54
+ measurement: 'call_counts',
55
+ fields: {
56
+ calls_in_progress: Influx.FieldType.INTEGER,
57
+ },
58
+ tags: [
59
+ 'account_sid'
60
+ ]
51
61
  }
52
62
  };
53
63
 
@@ -69,9 +79,33 @@ const writeData = async(client) => {
69
79
  }
70
80
  };
71
81
 
82
+ const createCallCountsQuery = ({account_sid, page, page_size, days, start, end}) => {
83
+ let sql = `SELECT * from call_counts WHERE account_sid = '${account_sid}'`;
84
+ if (days) sql += `AND time > now() - ${days}d `;
85
+ else {
86
+ if (start) sql += `AND time >= '${start}' `;
87
+ if (end) sql += `AND time <= '${end}' `;
88
+ }
89
+ sql += ' ORDER BY time DESC';
90
+ if (page_size) sql += ` LIMIT ${page_size}`;
91
+ if (page) sql += ` OFFSET ${(page - 1) * page_size}`;
92
+ //console.log(sql);
93
+ return sql;
94
+ };
95
+
96
+ const createCallCountsCountQuery = ({account_sid, days, start, end}) => {
97
+ let sql = `SELECT COUNT(calls_in_progress) from call_counts WHERE account_sid = '${account_sid}' `;
98
+ if (days) sql += `AND time > now() - ${days}d `;
99
+ else {
100
+ if (start) sql += `AND time >= '${start}' `;
101
+ if (end) sql += `AND time <= '${end}' `;
102
+ }
103
+ //console.log(sql);
104
+ return sql;
105
+ };
72
106
 
73
107
  const createCdrQuery = ({account_sid, page, page_size, trunk, direction, answered, days, start, end}) => {
74
- let sql = `SELECT * from cdrs WHERE account_sid = '${account_sid}' `;
108
+ let sql = `SELECT * from cdrs WHERE account_sid = '${account_sid}'`;
75
109
  if (trunk) sql += `AND trunk = '${trunk}' `;
76
110
  if (direction) sql += `AND direction = '${direction}' `;
77
111
  if (['true', 'false'].includes(answered)) sql += `AND answered = '${answered}' `;
@@ -135,6 +169,57 @@ const initDatabase = async(client, dbName) => {
135
169
  client.locals.initialized = true;
136
170
  };
137
171
 
172
+ const writeCallCount = async(client, count) => {
173
+ if (!client.locals.initialized) await initDatabase(client, 'call_counts');
174
+ const {account_sid, ...fields} = count;
175
+ const data = {
176
+ measurement: 'call_counts',
177
+ fields,
178
+ tags: {
179
+ account_sid
180
+ }
181
+ };
182
+ client.locals.data = [...client.locals.data, ...[data]];
183
+ if (client.locals.data.length >= client.locals.commitSize) {
184
+ await writeData(client);
185
+ }
186
+ return;
187
+ };
188
+
189
+ const queryCallCounts = async(client, opts) => {
190
+ if (!client.locals.initialized) await initDatabase(client, 'call_counts');
191
+ const response = {
192
+ total: 0,
193
+ page_size: opts.page_size,
194
+ page: opts.page,
195
+ data: []
196
+ };
197
+ const sqlTotal = createCallCountsCountQuery(opts);
198
+ const obj = await client.queryRaw(sqlTotal);
199
+ //console.log(`sqlTotal: ${sqlTotal}, results: ${JSON.stringify(obj)}`);
200
+ if (!obj.results || !obj.results[0].series) return response;
201
+ response.total = obj.results[0].series[0].values[0][1];
202
+
203
+ const sql = createCallCountsQuery(opts);
204
+ const res = await client.queryRaw(sql);
205
+ //console.log(`sql: ${sqlTotal}, results: ${JSON.stringify(res)}`);
206
+ if (res.results[0].series && res.results[0].series.length) {
207
+ const {columns, values} = res.results[0].series[0];
208
+ const data = values.map((v) => {
209
+ const obj = {};
210
+ v.forEach((val, idx) => {
211
+ v.forEach((val, idx) => {
212
+ const key = columns[idx];
213
+ obj[key] = val;
214
+ });
215
+ });
216
+ return obj;
217
+ });
218
+ response.data = data;
219
+ }
220
+ return response;
221
+ };
222
+
138
223
  const writeCdrs = async(client, cdrs) => {
139
224
  if (!client.locals.initialized) await initDatabase(client, 'cdrs');
140
225
  cdrs = (Array.isArray(cdrs) ? cdrs : [cdrs])
@@ -294,6 +379,7 @@ module.exports = (logger, opts) => {
294
379
 
295
380
  const cdrClient = new Influx.InfluxDB({database: 'cdrs', schemas: schemas.cdr, ...opts});
296
381
  const alertClient = new Influx.InfluxDB({database: 'alerts', schemas: schemas.alerts, ...opts});
382
+ const callCountClient = new Influx.InfluxDB({database: 'call_counts', schemas: schemas.call_counts, ...opts});
297
383
 
298
384
  cdrClient.locals = {
299
385
  db: 'cdrs',
@@ -311,13 +397,24 @@ module.exports = (logger, opts) => {
311
397
  commitInterval: opts.commitInterval || 10,
312
398
  data: []
313
399
  };
400
+ callCountClient.locals = {
401
+ db: 'call_counts',
402
+ initialized: false,
403
+ writing: false,
404
+ commitSize: opts.commitSize || 1,
405
+ commitInterval: opts.commitInterval || 10,
406
+ data: []
407
+ };
314
408
 
315
409
  if (opts.commitSize > 1 && opts.commitInterval && opts.commitInterval > 2) {
410
+ setInterval(writeData.bind(null, callCountClient), opts.commitInterval * 1000);
316
411
  setInterval(writeData.bind(null, cdrClient), opts.commitInterval * 1000);
317
412
  setInterval(writeData.bind(null, alertClient), opts.commitInterval * 1000);
318
413
  }
319
414
 
320
415
  return {
416
+ writeCallCount: writeCallCount.bind(null, callCountClient),
417
+ queryCallCounts: queryCallCounts.bind(null, callCountClient),
321
418
  writeCdrs: writeCdrs.bind(null, cdrClient),
322
419
  queryCdrs: queryCdrs.bind(null, cdrClient),
323
420
  writeAlerts: writeAlerts.bind(null, alertClient),
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@jambonz/time-series",
3
- "version": "0.1.6",
3
+ "version": "0.1.9",
4
4
  "description": "write and query data to time series daetabase",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
- "test": "node test/ | ./node_modules/.bin/tap-spec",
7
+ "test": "node test/",
8
8
  "coverage": "./node_modules/.bin/nyc --reporter html --report-dir ./coverage npm run test",
9
9
  "jslint": "eslint index.js"
10
10
  },
@@ -18,7 +18,6 @@
18
18
  "eslint": "^7.23.0",
19
19
  "eslint-plugin-promise": "^4.3.1",
20
20
  "nyc": "^15.1.0",
21
- "tap-spec": "^5.0.0",
22
21
  "tape": "^5.2.2"
23
22
  }
24
23
  }
@@ -2,6 +2,6 @@ version: '3'
2
2
 
3
3
  services:
4
4
  influxdb:
5
- image: influxdb:1.8-alpine
5
+ image: influxdb:1.8
6
6
  ports:
7
7
  - "8086:8086"
@@ -3,6 +3,8 @@ const Influx = require('influx');
3
3
  const consoleLogger = {error: console.error, info: console.log, debug: console.log};
4
4
 
5
5
  const {
6
+ writeCallCount,
7
+ queryCallCounts,
6
8
  writeCdrs,
7
9
  queryCdrs,
8
10
  writeAlerts,
@@ -10,7 +12,7 @@ const {
10
12
  AlertType
11
13
  } = require('..')(consoleLogger, '127.0.0.1', {commitSize: 1});
12
14
 
13
- test('write cdr data', async(t) => {
15
+ test('write timeseries data', async(t) => {
14
16
  let result = await writeCdrs([{
15
17
  from: 'me',
16
18
  to: 'you',
@@ -115,6 +117,22 @@ test('write cdr data', async(t) => {
115
117
 
116
118
  result = await queryAlerts({account_sid: 'yyyy', page: 1, page_size: 25, days: 7});
117
119
  //console.log(JSON.stringify(result));
118
- t.ok(result.data.length === 11, 'queried alerts')
120
+ t.ok(result.data.length === 11, 'queried alerts');
121
+
122
+ result = await writeCallCount(
123
+ {
124
+ calls_in_progress: 49,
125
+ account_sid: 'yyyy'
126
+ });
127
+ result = await writeCallCount(
128
+ {
129
+ calls_in_progress: 50,
130
+ account_sid: 'yyyy'
131
+ });
132
+ t.pass('wrote call counts');
133
+
134
+ result = await queryCallCounts({account_sid: 'yyyy', page: 1, page_size: 25, days: 7});
135
+ //console.log(JSON.stringify(result));
136
+ t.ok(result.data.length === 2, 'queried call counts');
119
137
 
120
138
  });