@nsshunt/stsappframework 2.19.282 → 2.19.283

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.
Files changed (34) hide show
  1. package/dist/index.js +5 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/influxdb/influxDBManager.js +334 -0
  4. package/dist/influxdb/influxDBManager.js.map +1 -0
  5. package/dist/influxdb/influxDBManagerAgent.js +211 -0
  6. package/dist/influxdb/influxDBManagerAgent.js.map +1 -0
  7. package/dist/influxdb/influxDBManagerBase.js +97 -0
  8. package/dist/influxdb/influxDBManagerBase.js.map +1 -0
  9. package/dist/influxdb/influxDBManagerService.js +240 -0
  10. package/dist/influxdb/influxDBManagerService.js.map +1 -0
  11. package/dist/kafka/IMKafkaManager.js +103 -0
  12. package/dist/kafka/IMKafkaManager.js.map +1 -0
  13. package/package.json +2 -1
  14. package/src/commonTypes.ts +15 -0
  15. package/src/index.ts +5 -0
  16. package/src/influxdb/influxDBManager.ts +359 -0
  17. package/src/influxdb/influxDBManagerAgent.ts +227 -0
  18. package/src/influxdb/influxDBManagerBase.ts +119 -0
  19. package/src/influxdb/influxDBManagerService.ts +257 -0
  20. package/src/kafka/IMKafkaManager.ts +119 -0
  21. package/types/commonTypes.d.ts +14 -0
  22. package/types/commonTypes.d.ts.map +1 -1
  23. package/types/index.d.ts +5 -0
  24. package/types/index.d.ts.map +1 -1
  25. package/types/influxdb/influxDBManager.d.ts +18 -0
  26. package/types/influxdb/influxDBManager.d.ts.map +1 -0
  27. package/types/influxdb/influxDBManagerAgent.d.ts +27 -0
  28. package/types/influxdb/influxDBManagerAgent.d.ts.map +1 -0
  29. package/types/influxdb/influxDBManagerBase.d.ts +19 -0
  30. package/types/influxdb/influxDBManagerBase.d.ts.map +1 -0
  31. package/types/influxdb/influxDBManagerService.d.ts +27 -0
  32. package/types/influxdb/influxDBManagerService.d.ts.map +1 -0
  33. package/types/kafka/IMKafkaManager.d.ts +11 -0
  34. package/types/kafka/IMKafkaManager.d.ts.map +1 -0
package/dist/index.js CHANGED
@@ -29,4 +29,9 @@ __exportStar(require("./stslatencyroute"), exports);
29
29
  __exportStar(require("./kafka/kafkamanager"), exports);
30
30
  __exportStar(require("./kafka/kafkaproducer"), exports);
31
31
  __exportStar(require("./kafka/kafkaconsumer"), exports);
32
+ __exportStar(require("./kafka/IMKafkaManager"), exports);
33
+ __exportStar(require("./influxdb/influxDBManager"), exports);
34
+ __exportStar(require("./influxdb/influxDBManagerBase"), exports);
35
+ __exportStar(require("./influxdb/influxDBManagerService"), exports);
36
+ __exportStar(require("./influxdb/influxDBManagerAgent"), exports);
32
37
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA6B;AAC7B,mDAAgC;AAChC,6CAA0B;AAC1B,kDAA+B;AAC/B,kDAA+B;AAC/B,sDAAmC;AACnC,sDAAmC;AACnC,sDAAmC;AACnC,sDAAmC;AACnC,yDAAsC;AACtC,yDAAsC;AACtC,oDAAiC;AACjC,uDAAoC;AACpC,wDAAqC;AACrC,wDAAqC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA6B;AAC7B,mDAAgC;AAChC,6CAA0B;AAC1B,kDAA+B;AAC/B,kDAA+B;AAC/B,sDAAmC;AACnC,sDAAmC;AACnC,sDAAmC;AACnC,sDAAmC;AACnC,yDAAsC;AACtC,yDAAsC;AACtC,oDAAiC;AACjC,uDAAoC;AACpC,wDAAqC;AACrC,wDAAqC;AACrC,yDAAsC;AACtC,6DAA0C;AAC1C,iEAA8C;AAC9C,oEAAiD;AACjD,kEAA+C"}
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InfluxDBManager = void 0;
4
+ /* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
5
+ const influxdb_client_1 = require("@influxdata/influxdb-client");
6
+ const http_1 = require("http");
7
+ const stsconfig_1 = require("@nsshunt/stsconfig");
8
+ const goptions = (0, stsconfig_1.$Options)();
9
+ const influxDBManagerService_1 = require("./influxDBManagerService");
10
+ const influxDBManagerAgent_1 = require("./influxDBManagerAgent");
11
+ /*
12
+ Manual docker run command and setup -------------------------------------------------------
13
+
14
+ docker run -d -p 8086:8086 --name influxdb \
15
+ -v $PWD/data:/var/lib/influxdb2 \
16
+ -v $PWD/config:/etc/influxdb2 \
17
+ -e DOCKER_INFLUXDB_INIT_MODE=setup \
18
+ -e DOCKER_INFLUXDB_INIT_USERNAME=my-user \
19
+ -e DOCKER_INFLUXDB_INIT_PASSWORD=my-password \
20
+ -e DOCKER_INFLUXDB_INIT_ORG=my-org \
21
+ -e DOCKER_INFLUXDB_INIT_BUCKET=my-bucket \
22
+ -e DOCKER_INFLUXDB_INIT_RETENTION=1w \
23
+ -e DOCKER_INFLUXDB_INIT_ADMIN_TOKEN=my-super-secret-auth-token \
24
+ --restart unless-stopped \
25
+ influxdb:latest
26
+
27
+ Then access admin portal via;
28
+ https://192.168.14.92:8086
29
+
30
+ Login using credentials above
31
+ username: my-user
32
+ password: my-password
33
+
34
+ Select Buckets from the menu
35
+ Create buckets as required
36
+ Example: TestBucket01
37
+ Note: We will not use the default bucket as specified in the docker initial setup (my-bucket)
38
+
39
+ Select API Tokens from the menu
40
+ Generate an API token / custom API token for read/write access to the bucket about
41
+ Bucket: TestBucket01 (from above bucket create)
42
+
43
+ Copy the API token and use in the ENV file for access
44
+ INFLUXDB_API_TOKEN=<< generated from InfluxDB web admin tool >> \
45
+ INFLUXDB_URL=http://192.168.14.92:8086 \
46
+ INFLUXDB_ORG=my-org \
47
+ INFLUXDB_BUCKET=TestBucket01 \
48
+
49
+ Docker compose file --------------------------------------------------------------
50
+
51
+ version: '2'
52
+ services:
53
+ influxdb:
54
+ image: influxdb:latest
55
+ ports:
56
+ - "8086:8086"
57
+ environment:
58
+ DOCKER_INFLUXDB_INIT_MODE: setup
59
+ DOCKER_INFLUXDB_INIT_USERNAME: my-user
60
+ DOCKER_INFLUXDB_INIT_PASSWORD: my-password
61
+ DOCKER_INFLUXDB_INIT_ORG: my-org
62
+ DOCKER_INFLUXDB_INIT_BUCKET: my-bucket
63
+ DOCKER_INFLUXDB_INIT_RETENTION: 1w
64
+ DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: my-super-secret-auth-token
65
+ volumes:
66
+ - /var/run/influxdb/data:/var/lib/influxdb2
67
+ - /var/run/influxdb/config:/etc/influxdb2
68
+ restart: unless-stopped
69
+
70
+
71
+ // Exam Queries Below ----------------------------------------------------------------------
72
+
73
+ from(bucket: "TestBucket01")
74
+ |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
75
+ |> filter(fn: (r) => r["_measurement"] == "stsServicePointV3")
76
+ |> group(columns: ["serviceId"], mode: "by")
77
+ |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
78
+ |> yield(name: "mean")
79
+
80
+ from(bucket: "TestBucket01")
81
+ |> range(start: -10m)
82
+ |> filter(fn: (r) => r["_measurement"] == "requestCount")
83
+ |> group(columns: ["serviceInstanceId"])
84
+ |> mean()
85
+
86
+ from(bucket: "TestBucket01")
87
+ |> range(start: -10m)
88
+ |> filter(fn: (r) => r["_measurement"] == "cpu")
89
+ |> group(columns: ["serviceInstanceId"])
90
+ |> aggregateWindow(every: 1m, fn: mean, createEmpty: false)
91
+
92
+ from(bucket: "TestBucket01")
93
+ |> range(start: -2m)
94
+ |> filter(fn: (r) => r["_measurement"] == "cpu")
95
+ |> group(columns: ["serviceInstanceId"])
96
+ |> aggregateWindow(every: 1m, fn: mean, createEmpty: false)
97
+
98
+ from(bucket: "TestBucket01")
99
+ |> range(start: -10s)
100
+ |> filter(fn: (r) => r["_measurement"] == "all")
101
+ |> filter(fn: (r) => r["_field"] == "requestCount")
102
+ |> group(columns: ["serviceInstanceId"])
103
+ |> max()
104
+
105
+ from(bucket: "TestBucket01")
106
+ |> range(start: -10s)
107
+ |> filter(fn: (r) => r["_measurement"] == "all")
108
+ |> filter(fn: (r) => r["_field"] == "requestCount" or r["_field"] == "errorCount")
109
+ |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
110
+ |> group(columns: ["serviceInstanceId"])
111
+ |> max()
112
+
113
+ from(bucket: "TestBucket01")
114
+ |> range(start: -5s)
115
+ |> filter(fn: (r) => r["_measurement"] == "all") |> filter(fn: (r) => r["_field"] == "cpu")
116
+ |> last()
117
+ |> group(columns: ["serviceInstanceId", "serviceId", "_field"])
118
+ |> sum()
119
+ |> group(columns: ["_field"])
120
+ |> sum()
121
+
122
+ // Histo ---------------------------------------
123
+
124
+ import "math"
125
+ from(bucket: "TestBucket01")
126
+ |> range(start: -10m)
127
+ |> filter(fn: (r) => r["_measurement"] == "all") |> filter(fn: (r) => r["_field"] == "latency")
128
+ |> group(columns: ["serviceInstanceIsssd", "serviceId", "_field"])
129
+ |> aggregateWindow(every: 1s, fn: mean, createEmpty: false)
130
+ |> histogram(bins: [0.0, 5.0, 10.0, 20.0, 50.0, math.mInf(sign: 1) ])
131
+ |> difference()
132
+
133
+ // Velocity ------------------------------------------------------------------------
134
+
135
+ dostsvelocityex = (r, ds, d) =>
136
+ from(bucket: "TestBucket01")
137
+ |> range(start: r)
138
+ |> filter(fn: (r) => r["_measurement"] == "all")
139
+ |> filter(fn: (r) => r["_field"] == "requestCount")
140
+ |> group(columns: ["serviceInstanceIsssd", "serviceId", "_field", "serviceInstanceProcessId"])
141
+ |> aggregateWindow(every: ds, fn: last, createEmpty: false)
142
+ |> limit(n: 5)
143
+ |> difference()
144
+ |> last()
145
+ |> group(columns: ["serviceInstanceIsssd", "serviceId", "_field"])
146
+ |> sum()
147
+ |> map(fn: (r) => ({r with _value: float(v: r._value) / d}))
148
+
149
+ dostsvelocity = () =>
150
+ dostsvelocityex(r: -30s, ds: 5s, d: 5.0)
151
+
152
+ dostsvelocity()
153
+
154
+ // Velocity - for a specific service instance ----------------------------------
155
+
156
+ dostsvelocitybyserviceinstanceex = (sid, r, ds, d) =>
157
+ from(bucket: "TestBucket01")
158
+ |> range(start: r)
159
+ |> filter(fn: (r) => r["_measurement"] == "all")
160
+ |> filter(fn: (r) => r["_field"] == "requestCount")
161
+ |> filter(fn: (r) => r["serviceId"] == sid)
162
+ |> group(columns: ["serviceInstanceId", "serviceId", "_field", "serviceInstanceProcessId"])
163
+ |> aggregateWindow(every: ds, fn: last, createEmpty: false)
164
+ |> limit(n: 5)
165
+ |> difference()
166
+ |> last()
167
+ |> sum()
168
+ |> map(fn: (r) => ({r with _value: float(v: r._value) / d}))
169
+
170
+ dostsvelocitybyserviceinstance = (sid) =>
171
+ dostsvelocitybyserviceinstanceex(sid: sid, r: -30s, ds: 5s, d: 5.0)
172
+
173
+ dostsvelocitybyserviceinstance(sid: "STSAuth@1.0.0")
174
+
175
+ // Percentile --------------------------------------------------------------
176
+
177
+ from(bucket: "TestBucket01")
178
+ |> range(start: -10m)
179
+ |> filter(fn: (r) => r["_measurement"] == "all") |> filter(fn: (r) => r["_field"] == "latency")
180
+ |> group(columns: ["serviceInstanceIsssd", "serviceId", "_field"])
181
+ |> aggregateWindow(every: 10s, fn: mean, createEmpty: false)
182
+ |> quantile(q: 0.99, method: "exact_mean")
183
+ */
184
+ // export INFLUXDB_TOKEN=W6GztqLmWEqqpP9hAOW9nucgVfESk32dC0JYzFCaYD2yJtS8Ox_WK_1hwSkPUaheWjwwcavkE7_J2aRzm3-E7w==
185
+ const _logPrefix = 'InfluxDBManager:';
186
+ class InfluxDBManager {
187
+ #shuttingDown = false;
188
+ #options;
189
+ //#token = process.env.INFLUXDB_TOKEN;
190
+ #token = '';
191
+ #url = ''; // 'http://192.168.14.92:8086'
192
+ #org = ''; // `my-org`
193
+ #bucket = ''; // `TestBucket01`
194
+ #client;
195
+ #writeClient;
196
+ #queryApi;
197
+ #writeDataPointFlushTimeout = null;
198
+ #agent = null;
199
+ #influxDBManagerClients = {};
200
+ constructor(options) {
201
+ this.#options = options;
202
+ this.#token = options.token;
203
+ this.#url = options.url;
204
+ this.#org = options.org;
205
+ this.#bucket = options.bucket;
206
+ if (options.agent) {
207
+ this.#agent = new http_1.Agent({
208
+ keepAlive: options.agent.influxDB_keepAlive,
209
+ keepAliveMsecs: 20000,
210
+ maxSockets: options.agent.influxDB_maxSockets,
211
+ maxTotalSockets: options.agent.influxDB_maxTotalSockets,
212
+ maxFreeSockets: options.agent.influxDB_maxFreeSockets,
213
+ timeout: options.agent.influxDB_timeout,
214
+ //.rejectUnauthorized: options.agent.influxDB_rejectUnauthorized, // only for SSL
215
+ });
216
+ this.#client = new influxdb_client_1.InfluxDB({
217
+ url: this.#url,
218
+ token: this.#token,
219
+ transportOptions: { agent: this.#agent }
220
+ });
221
+ }
222
+ else {
223
+ this.#agent = null;
224
+ this.#client = new influxdb_client_1.InfluxDB({
225
+ url: this.#url,
226
+ token: this.#token
227
+ });
228
+ }
229
+ this.#queryApi = this.#client.getQueryApi(this.#org);
230
+ this.#writeClient = this.#client.getWriteApi(this.#org, this.#bucket, 'ns');
231
+ this.CreateInfluxDBManagerClient('service');
232
+ this.CreateInfluxDBManagerClient('agent');
233
+ const StartWriteClient = () => {
234
+ this.#writeDataPointFlushTimeout = setTimeout(() => {
235
+ this.#writeClient.flush();
236
+ StartWriteClient();
237
+ }, 1000).unref();
238
+ };
239
+ StartWriteClient();
240
+ }
241
+ CreateInfluxDBManagerClient(modelType) {
242
+ switch (modelType) {
243
+ case 'service':
244
+ this.#influxDBManagerClients[modelType] = new influxDBManagerService_1.InfluxDBManagerService(this.#options, this.#queryApi, this.#writeClient);
245
+ break;
246
+ case 'agent':
247
+ this.#influxDBManagerClients[modelType] = new influxDBManagerAgent_1.InfluxDBManagerAgent(this.#options, this.#queryApi, this.#writeClient);
248
+ break;
249
+ default:
250
+ throw new Error(`Model type: [${modelType} not supported.]`);
251
+ }
252
+ }
253
+ get serviceManager() {
254
+ return this.#influxDBManagerClients['service'];
255
+ }
256
+ get agentManager() {
257
+ return this.#influxDBManagerClients['agent'];
258
+ }
259
+ Start = async () => {
260
+ // perform any setup here
261
+ };
262
+ Terminate = async () => {
263
+ if (this.#shuttingDown) {
264
+ console.log(`${_logPrefix}Terminate: Terminate already called. Ignoring.`.yellow);
265
+ }
266
+ else {
267
+ this.#shuttingDown = true;
268
+ try {
269
+ this.#writeClient.flush();
270
+ this.#shuttingDown = true;
271
+ if (this.#writeDataPointFlushTimeout) {
272
+ clearTimeout(this.#writeDataPointFlushTimeout);
273
+ this.#writeDataPointFlushTimeout = null;
274
+ }
275
+ if (this.#agent) {
276
+ this.#agent?.destroy();
277
+ this.#agent = null;
278
+ }
279
+ console.log(`ProducerDisconnect`.yellow);
280
+ }
281
+ catch (error) {
282
+ console.error(`${_logPrefix}#Terminate: Error: [${error}]`.red);
283
+ }
284
+ }
285
+ };
286
+ /*
287
+ .floatField('timer', instrumentPayload.instruments[Gauge.TIMER_GAUGE].val)
288
+ .floatField('duration', instrumentPayload.instruments[Gauge.DURATION_GAUGE].val)
289
+ .floatField('latency', instrumentPayload.instruments[Gauge.LATENCY_GAUGE].val)
290
+ */
291
+ CreateGlobalCountModel = (stscount) => {
292
+ try {
293
+ const results = {};
294
+ stscount.forEach((o) => {
295
+ results[o._field] = o._value;
296
+ });
297
+ return results;
298
+ }
299
+ catch (error) {
300
+ console.error(`${_logPrefix}#CreateGlobalCountModel: Error: [${error}]`.red);
301
+ }
302
+ };
303
+ CreateNestedObject(combinedResults, keyList) {
304
+ let workingObject = combinedResults;
305
+ keyList.forEach((key) => {
306
+ if (!workingObject[key]) {
307
+ workingObject[key] = {};
308
+ workingObject = workingObject[key];
309
+ }
310
+ });
311
+ return combinedResults;
312
+ }
313
+ // Agent context payload
314
+ // {"nid":"somehost@e58f5d75-6ff6-4e04-92a4-f2bcd722fec0-someuseragent|MainProcess|0","id":"somehost@e58f5d75-6ff6-4e04-92a4-f2bcd722fec0-someuseragent|MainProcess|0","hostName":"somehost","agentName":"e58f5d75-6ff6-4e04-92a4-f2bcd722fec0-someuseragent","threadId":"MainProcess","asyncRunnerId":"0"}
315
+ async OutputInfluxDB(instrumentPayload) {
316
+ try {
317
+ if (this.#shuttingDown) {
318
+ return false;
319
+ }
320
+ if (instrumentPayload.context.agentName) {
321
+ return this.#influxDBManagerClients['agent'].OutputInfluxDB(instrumentPayload);
322
+ }
323
+ else {
324
+ return this.#influxDBManagerClients['service'].OutputInfluxDB(instrumentPayload);
325
+ }
326
+ }
327
+ catch (error) {
328
+ console.error(`${_logPrefix}OutputInfluxDB: Could not write data point: [${error}]`.red);
329
+ return false;
330
+ }
331
+ }
332
+ }
333
+ exports.InfluxDBManager = InfluxDBManager;
334
+ //# sourceMappingURL=influxDBManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"influxDBManager.js","sourceRoot":"","sources":["../../src/influxdb/influxDBManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InfluxDBManagerAgent = void 0;
4
+ /* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
5
+ const influxdb_client_1 = require("@influxdata/influxdb-client");
6
+ const stsinstrumentation_1 = require("@nsshunt/stsinstrumentation");
7
+ const influxDBManagerBase_1 = require("./influxDBManagerBase");
8
+ const _logPrefix = 'InfluxDBManagerService:';
9
+ class InfluxDBManagerAgent extends influxDBManagerBase_1.InfluxDBManagerBase {
10
+ constructor(options, queryApi, writeClient) {
11
+ super(options, queryApi, writeClient);
12
+ }
13
+ get modelType() {
14
+ return 'agent';
15
+ }
16
+ // Queries --------------------------------------------------------------------------------------------------------
17
+ // Counter metrics
18
+ #GetSTSCountGenericAgent = async (modelType, filterClause, groupClause, showOutput = false) => {
19
+ try {
20
+ const query = `dostscountex = (q, d) =>
21
+ from(bucket: "${this.options.bucket}")
22
+ |> range(start: d)
23
+ |> filter(fn: (r) => r["_measurement"] == "all" and r["modelType"] == "${modelType}" ${filterClause})
24
+ |> filter(fn: (r) => r["_field"] == q)
25
+ |> last()
26
+ |> ${groupClause}
27
+ |> sum()
28
+
29
+ dostscount = (d) =>
30
+ union(tables: [
31
+ dostscountex(q: "requestCount", d: d),
32
+ dostscountex(q: "errorCount", d: d),
33
+ dostscountex(q: "retryCount", d: d),
34
+ dostscountex(q: "authenticationCount", d: d),
35
+ dostscountex(q: "velocity", d: d),
36
+ dostscountex(q: "coreCount", d: d),
37
+ dostscountex(q: "timer", d: d),
38
+ dostscountex(q: "duration", d: d),
39
+ dostscountex(q: "latency", d: d),
40
+ dostscountex(q: "activeRequestCount", d: d)
41
+ ])
42
+ dostscount(d: -5s)`;
43
+ if (showOutput) {
44
+ console.log(query);
45
+ }
46
+ return this.queryApi.collectRows(query);
47
+ }
48
+ catch (error) {
49
+ console.error(`${_logPrefix}#GetSTSCountGeneric: Error: [${error}]`.red);
50
+ }
51
+ };
52
+ // Histo metrics
53
+ #GetSTSHistoGenericService = async (modelType, filterClause, groupClause) => {
54
+ try {
55
+ const query = `import "math"
56
+
57
+ dostshistoex = (q, d) =>
58
+ from(bucket: "${this.options.bucket}")
59
+ |> range(start: d)
60
+ |> filter(fn: (r) => r["_measurement"] == "all")
61
+ |> filter(fn: (r) => r["_field"] == q and r["modelType"] == "${modelType}" ${filterClause})
62
+ |> ${groupClause}
63
+ |> histogram(bins: [0.0, 10.0, 20.0, 50.0, 100.0, 1000.0, 50000.0, math.mInf(sign: 1) ])
64
+ |> difference()
65
+
66
+ dostshisto = (d) =>
67
+ union(tables: [
68
+ dostshistoex(q: "latency", d: d),
69
+ dostshistoex(q: "duration", d: d)
70
+ ])
71
+
72
+ dostshisto(d: -10m)`;
73
+ return this.queryApi.collectRows(query);
74
+ }
75
+ catch (error) {
76
+ console.error(`${_logPrefix}#GetSTSHistoGeneric: Error: [${error}]`.red);
77
+ }
78
+ };
79
+ // Quantile metrics
80
+ #GetSTSQuantileGenericAgent = async (modelType, filterClause, groupClause) => {
81
+ try {
82
+ const query = `dostsquantileex = (q, d, i, f) =>
83
+ from(bucket: "${this.options.bucket}")
84
+ |> range(start: d)
85
+ |> filter(fn: (r) => r["_measurement"] == "all")
86
+ |> filter(fn: (r) => r["_field"] == f and r["modelType"] == "${modelType}" ${filterClause})
87
+ |> ${groupClause}
88
+ |> aggregateWindow(every: i, fn: max, createEmpty: false)
89
+ |> quantile(q: q, method: "estimate_tdigest", compression: 1000.0)
90
+ |> set(key: "quantile", value: string(v:q))
91
+ |> group(columns: ["LatencyType","quantile"])
92
+
93
+ dostsquantile = (d, i, f) =>
94
+ union(tables: [
95
+ dostsquantileex(q: 0.5, d: d, i: i, f: f),
96
+ dostsquantileex(q: 0.8, d: d, i: i, f: f),
97
+ dostsquantileex(q: 0.9, d: d, i: i, f: f),
98
+ dostsquantileex(q: 0.95, d: d, i: i, f: f),
99
+ dostsquantileex(q: 0.99, d: d, i: i, f: f)
100
+ ])
101
+
102
+ union(tables: [
103
+ dostsquantile(d: -10m, i: 5s, f: "latency"),
104
+ dostsquantile(d: -10m, i: 5s, f: "duration")
105
+ ])`;
106
+ return this.queryApi.collectRows(query);
107
+ }
108
+ catch (error) {
109
+ console.error(`${_logPrefix}#GetSTSQuantileGeneric: Error: [${error}]`.red);
110
+ }
111
+ };
112
+ // Metric queries -------------------------------------------------------------------------------------------------
113
+ // Root level metrics
114
+ async GetInfluxDBResultsRootAgent() {
115
+ try {
116
+ const combinedResults = await this.ProcessInfluxDBResults([
117
+ this.#GetSTSCountGenericAgent('agent', '', 'group(columns: ["_field"])'),
118
+ this.#GetSTSQuantileGenericAgent(`agent`, '', 'group(columns: ["_field"])'),
119
+ this.#GetSTSHistoGenericService('agent', '', 'group(columns: ["_field"])')
120
+ ], []);
121
+ return { SubscriptionType: "ID_Agent_Root", data: combinedResults };
122
+ }
123
+ catch (error) {
124
+ console.error(`${_logPrefix}GetInfluxDBResultsRootAgent: Error: [${error}]`.red);
125
+ }
126
+ }
127
+ // Service level metrics
128
+ async GetInfluxDBResultsAgent() {
129
+ try {
130
+ const combinedResults = await this.ProcessInfluxDBResults([
131
+ this.#GetSTSCountGenericAgent('agent', '', 'group(columns: ["agentName", "_field"])'),
132
+ this.#GetSTSQuantileGenericAgent(`agent`, '', 'group(columns: ["agentName", "_field"])'),
133
+ this.#GetSTSHistoGenericService('agent', '', 'group(columns: ["agentName", "_field"])')
134
+ ], ['agentName']);
135
+ return { SubscriptionType: "ID_Agent_Agents", data: combinedResults };
136
+ }
137
+ catch (error) {
138
+ console.error(`${_logPrefix}GetInfluxDBResultsAgent: Error: [${error}]`.red);
139
+ }
140
+ }
141
+ // Service instance metrics for a particular service type
142
+ async GetInfluxDBResultsAgentThreads(agentName) {
143
+ try {
144
+ const combinedResults = await this.ProcessInfluxDBResults([
145
+ this.#GetSTSCountGenericAgent('agent', `and r["agentName"] == "${agentName}"`, `group(columns: ["agentName", "threadId", "_field"])`),
146
+ this.#GetSTSQuantileGenericAgent(`agent`, `and r["agentName"] == "${agentName}"`, 'group(columns: ["agentName", "threadId", "_field"])'),
147
+ this.#GetSTSHistoGenericService('agent', `and r["agentName"] == "${agentName}"`, 'group(columns: ["agentName", "threadId", "_field"])')
148
+ ], ['agentName', 'threadId']);
149
+ console.log(`${JSON.stringify(combinedResults)}`.magenta);
150
+ return { SubscriptionType: `ID_Agent_Agent_Threads_${agentName}`, data: combinedResults };
151
+ }
152
+ catch (error) {
153
+ console.error(`${_logPrefix}GetInfluxDBResultsAgentThreads: Error: [${error}]`.red);
154
+ }
155
+ }
156
+ // Service instance thread metrics for a particular service instance
157
+ async GetInfluxDBResultsAgentThread(agentName, threadId) {
158
+ try {
159
+ const combinedResults = await this.ProcessInfluxDBResults([
160
+ this.#GetSTSCountGenericAgent('agent', `and r["agentName"] == "${agentName}" and r["threadId"] == "${threadId}"`, `group(columns: ["agentName", "threadId", "asyncRunnerId", "_field"])`),
161
+ this.#GetSTSQuantileGenericAgent(`agent`, `and r["agentName"] == "${agentName}" and r["threadId"] == "${threadId}"`, 'group(columns: ["agentName", "threadId", "asyncRunnerId", "_field"])'),
162
+ this.#GetSTSHistoGenericService('agent', `and r["agentName"] == "${agentName}" and r["threadId"] == "${threadId}"`, 'group(columns: ["agentName", "threadId", "asyncRunnerId", "_field"])')
163
+ ], ['agentName', 'threadId', 'asyncRunnerId']);
164
+ return { SubscriptionType: `ID_Agent_Agent_Thread_${agentName}_${threadId}`, data: combinedResults };
165
+ }
166
+ catch (error) {
167
+ console.error(`${_logPrefix}GetInfluxDBResultsAgentThread: Error: [${error}]`.red);
168
+ }
169
+ }
170
+ // Agent context payload
171
+ // {"nid":"somehost@e58f5d75-6ff6-4e04-92a4-f2bcd722fec0-someuseragent|MainProcess|0","id":"somehost@e58f5d75-6ff6-4e04-92a4-f2bcd722fec0-someuseragent|MainProcess|0","hostName":"somehost"
172
+ // ,"agentName":"e58f5d75-6ff6-4e04-92a4-f2bcd722fec0-someuseragent","threadId":"MainProcess","asyncRunnerId":"0"}
173
+ async OutputInfluxDB(instrumentPayload) {
174
+ try {
175
+ const { nid, id, hostName, agentName, threadId, asyncRunnerId } = instrumentPayload.context;
176
+ let systemcpu = 0.0;
177
+ if (instrumentPayload.instruments[stsinstrumentation_1.Gauge.CPU_SYSTEM_LOAD_GAUGE]) {
178
+ systemcpu = instrumentPayload.instruments[stsinstrumentation_1.Gauge.CPU_SYSTEM_LOAD_GAUGE].val;
179
+ }
180
+ const point = new influxdb_client_1.Point('all')
181
+ // Context settings
182
+ .tag('id', id) // Must be unique (uuid)
183
+ .tag('hostName', hostName) // Must be unique (uuid)
184
+ .tag('agentName', agentName) // Must be unique (uuid)
185
+ .tag('threadId', threadId) // Must be unique (uuid)
186
+ .tag('asyncRunnerId', asyncRunnerId)
187
+ .tag('modelType', 'agent')
188
+ // Data fields
189
+ .intField('requestCount', instrumentPayload.instruments[stsinstrumentation_1.Gauge.REQUEST_COUNT_GAUGE].val) // q
190
+ .intField('errorCount', instrumentPayload.instruments[stsinstrumentation_1.Gauge.ERROR_COUNT_GAUGE].val) // j
191
+ .intField('retryCount', instrumentPayload.instruments[stsinstrumentation_1.Gauge.RETRY_COUNT_GAUGE].val) // r
192
+ .intField('authenticationCount', instrumentPayload.instruments[stsinstrumentation_1.Gauge.AUTHENTICATION_COUNT_GAUGE].val) // b
193
+ .floatField('velocity', instrumentPayload.instruments[stsinstrumentation_1.Gauge.VELOCITY_GAUGE].va) // t
194
+ .intField('coreCount', instrumentPayload.instruments[stsinstrumentation_1.Gauge.CORE_COUNT_GAUGE].val) // x
195
+ .floatField('timer', instrumentPayload.instruments[stsinstrumentation_1.Gauge.TIMER_GAUGE].val) // s
196
+ .floatField('duration', instrumentPayload.instruments[stsinstrumentation_1.Gauge.DURATION_GAUGE].val) // h
197
+ .floatField('latency', instrumentPayload.instruments[stsinstrumentation_1.Gauge.LATENCY_GAUGE].val) // h
198
+ .intField('activeRequestCount', instrumentPayload.instruments[stsinstrumentation_1.Gauge.ACTIVE_REQUEST_GAUGE].val); // a
199
+ // logger // m
200
+ // duration histo // i
201
+ this.writeClient.writePoint(point);
202
+ return true;
203
+ }
204
+ catch (error) {
205
+ console.error(`${_logPrefix}OutputInfluxDBAgent: Could not write data point: [${error}]`.red);
206
+ return false;
207
+ }
208
+ }
209
+ }
210
+ exports.InfluxDBManagerAgent = InfluxDBManagerAgent;
211
+ //# sourceMappingURL=influxDBManagerAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"influxDBManagerAgent.js","sourceRoot":"","sources":["../../src/influxdb/influxDBManagerAgent.ts"],"names":[],"mappings":"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"}