@nsshunt/stsappframework 3.0.103 → 3.0.105

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 (140) hide show
  1. package/dist/authutilsnode.js +6 -7
  2. package/dist/authutilsnode.js.map +1 -1
  3. package/dist/influxdb/influxDBManager.js +16 -17
  4. package/dist/influxdb/influxDBManager.js.map +1 -1
  5. package/dist/influxdb/influxDBManagerAgent.js +9 -13
  6. package/dist/influxdb/influxDBManagerAgent.js.map +1 -1
  7. package/dist/influxdb/influxDBManagerBase.js +2 -6
  8. package/dist/influxdb/influxDBManagerBase.js.map +1 -1
  9. package/dist/influxdb/influxDBManagerService.js +10 -14
  10. package/dist/influxdb/influxDBManagerService.js.map +1 -1
  11. package/dist/instrumentationsubscriber.js +11 -15
  12. package/dist/instrumentationsubscriber.js.map +1 -1
  13. package/dist/kafka/IMKafkaManager.js +2 -6
  14. package/dist/kafka/IMKafkaManager.js.map +1 -1
  15. package/dist/kafkatesting/produce.js +1 -5
  16. package/dist/kafkatesting/produce.js.map +1 -1
  17. package/dist/masterprocessbase.js +19 -20
  18. package/dist/masterprocessbase.js.map +1 -1
  19. package/dist/processbase.js +8 -10
  20. package/dist/processbase.js.map +1 -1
  21. package/dist/server.js +1 -1
  22. package/dist/server.js.map +1 -1
  23. package/dist/singleprocessbase.js +3 -4
  24. package/dist/singleprocessbase.js.map +1 -1
  25. package/dist/tcpclient/app2.js +2 -2
  26. package/dist/tcpserver/appmaster.js +39 -16
  27. package/dist/tcpserver/appmaster.js.map +1 -1
  28. package/dist/workerprocessbase.js +3 -4
  29. package/dist/workerprocessbase.js.map +1 -1
  30. package/package.json +7 -7
  31. package/src/authutilsnode.ts +8 -10
  32. package/src/influxdb/influxDBManager.ts +16 -18
  33. package/src/influxdb/influxDBManagerAgent.ts +9 -11
  34. package/src/influxdb/influxDBManagerBase.ts +2 -4
  35. package/src/influxdb/influxDBManagerService.ts +10 -12
  36. package/src/instrumentationsubscriber.ts +11 -14
  37. package/src/kafka/IMKafkaManager.ts +2 -4
  38. package/src/kafkatesting/produce.ts +1 -3
  39. package/src/masterprocessbase.ts +32 -24
  40. package/src/processbase.ts +7 -11
  41. package/src/server.ts +1 -1
  42. package/src/singleprocessbase.ts +3 -5
  43. package/src/tcpclient/app2.ts +2 -2
  44. package/src/tcpserver/appmaster.ts +39 -17
  45. package/src/workerprocessbase.ts +3 -5
  46. package/types/authutilsnode.d.ts.map +1 -1
  47. package/types/influxdb/influxDBManager.d.ts.map +1 -1
  48. package/types/influxdb/influxDBManagerAgent.d.ts.map +1 -1
  49. package/types/influxdb/influxDBManagerBase.d.ts.map +1 -1
  50. package/types/influxdb/influxDBManagerService.d.ts.map +1 -1
  51. package/types/instrumentationsubscriber.d.ts.map +1 -1
  52. package/types/kafka/IMKafkaManager.d.ts.map +1 -1
  53. package/types/masterprocessbase.d.ts.map +1 -1
  54. package/types/processbase.d.ts +2 -2
  55. package/types/processbase.d.ts.map +1 -1
  56. package/types/singleprocessbase.d.ts.map +1 -1
  57. package/types/tcpserver/appmaster.d.ts.map +1 -1
  58. package/types/workerprocessbase.d.ts.map +1 -1
  59. package/src_new/authDefs.ts +0 -37
  60. package/src_new/authutilsnode.ts +0 -375
  61. package/src_new/commonTypes.ts +0 -239
  62. package/src_new/index.ts +0 -22
  63. package/src_new/influxdb/influxDBManager.ts +0 -972
  64. package/src_new/influxdb/influxDBManagerAgent.ts +0 -316
  65. package/src_new/influxdb/influxDBManagerBase.ts +0 -111
  66. package/src_new/influxdb/influxDBManagerService.ts +0 -375
  67. package/src_new/instrumentationsubscriber.ts +0 -286
  68. package/src_new/kafka/IMKafkaManager.ts +0 -154
  69. package/src_new/kafka/kafkaconsumer.ts +0 -82
  70. package/src_new/kafka/kafkamanager.ts +0 -186
  71. package/src_new/kafka/kafkaproducer.ts +0 -58
  72. package/src_new/kafkatesting/config.ts +0 -10
  73. package/src_new/kafkatesting/consume.ts +0 -116
  74. package/src_new/kafkatesting/produce.ts +0 -155
  75. package/src_new/masterprocessbase.ts +0 -590
  76. package/src_new/middleware/serverNetworkMiddleware.ts +0 -240
  77. package/src_new/network.ts +0 -36
  78. package/src_new/processbase.ts +0 -413
  79. package/src_new/processoptions.ts +0 -164
  80. package/src_new/publishertransports/publishTransportDirect.ts +0 -45
  81. package/src_new/publishertransports/publishTransportUtils.ts +0 -53
  82. package/src_new/server.ts +0 -141
  83. package/src_new/serverprocessbase.ts +0 -393
  84. package/src_new/singleprocessbase.ts +0 -123
  85. package/src_new/socketIoServerHelper.ts +0 -177
  86. package/src_new/stscontrollerbase.ts +0 -15
  87. package/src_new/stslatencycontroller.ts +0 -27
  88. package/src_new/stslatencyroute.ts +0 -16
  89. package/src_new/stsrouterbase.ts +0 -22
  90. package/src_new/tcpclient/app.ts +0 -19
  91. package/src_new/tcpclient/app2.ts +0 -56
  92. package/src_new/tcpserver/app.ts +0 -11
  93. package/src_new/tcpserver/appConfig.ts +0 -65
  94. package/src_new/tcpserver/appmaster.ts +0 -522
  95. package/src_new/validation/errors.ts +0 -6
  96. package/src_new/webworkertesting/app.ts +0 -49
  97. package/src_new/webworkertesting/worker.ts +0 -24
  98. package/src_new/workerprocessbase.test.ts +0 -47
  99. package/src_new/workerprocessbase.ts +0 -187
  100. package/src_working/authDefs.ts +0 -37
  101. package/src_working/authutilsnode.ts +0 -373
  102. package/src_working/commonTypes.ts +0 -239
  103. package/src_working/index.ts +0 -22
  104. package/src_working/influxdb/influxDBManager.ts +0 -970
  105. package/src_working/influxdb/influxDBManagerAgent.ts +0 -314
  106. package/src_working/influxdb/influxDBManagerBase.ts +0 -109
  107. package/src_working/influxdb/influxDBManagerService.ts +0 -373
  108. package/src_working/instrumentationsubscriber.ts +0 -283
  109. package/src_working/kafka/IMKafkaManager.ts +0 -152
  110. package/src_working/kafka/kafkaconsumer.ts +0 -82
  111. package/src_working/kafka/kafkamanager.ts +0 -186
  112. package/src_working/kafka/kafkaproducer.ts +0 -58
  113. package/src_working/kafkatesting/config.ts +0 -10
  114. package/src_working/kafkatesting/consume.ts +0 -116
  115. package/src_working/kafkatesting/produce.ts +0 -153
  116. package/src_working/masterprocessbase.ts +0 -598
  117. package/src_working/middleware/serverNetworkMiddleware.ts +0 -240
  118. package/src_working/network.ts +0 -36
  119. package/src_working/processbase.ts +0 -411
  120. package/src_working/processoptions.ts +0 -164
  121. package/src_working/publishertransports/publishTransportDirect.ts +0 -45
  122. package/src_working/publishertransports/publishTransportUtils.ts +0 -53
  123. package/src_working/server.ts +0 -141
  124. package/src_working/serverprocessbase.ts +0 -393
  125. package/src_working/singleprocessbase.ts +0 -121
  126. package/src_working/socketIoServerHelper.ts +0 -177
  127. package/src_working/stscontrollerbase.ts +0 -15
  128. package/src_working/stslatencycontroller.ts +0 -27
  129. package/src_working/stslatencyroute.ts +0 -16
  130. package/src_working/stsrouterbase.ts +0 -22
  131. package/src_working/tcpclient/app.ts +0 -19
  132. package/src_working/tcpclient/app2.ts +0 -56
  133. package/src_working/tcpserver/app.ts +0 -11
  134. package/src_working/tcpserver/appConfig.ts +0 -65
  135. package/src_working/tcpserver/appmaster.ts +0 -544
  136. package/src_working/validation/errors.ts +0 -6
  137. package/src_working/webworkertesting/app.ts +0 -49
  138. package/src_working/webworkertesting/worker.ts +0 -24
  139. package/src_working/workerprocessbase.test.ts +0 -47
  140. package/src_working/workerprocessbase.ts +0 -185
@@ -1,373 +0,0 @@
1
- /* eslint @typescript-eslint/no-explicit-any: 0, @typescript-eslint/no-unused-vars: 0 */ // --> OFF
2
- // https://www.influxdata.com/blog/tldr-influxdb-tech-tips-multiple-aggregations-yield-flux/
3
- // https://www.influxdata.com/blog/top-5-hurdles-for-intermediate-flux-users-and-resources-for-optimizing-flux/
4
-
5
- /*
6
- option task = {
7
- name: "task-sts-service-stats",
8
- every: 1s,
9
- }
10
-
11
- data =
12
- from(bucket: "TestBucket01")
13
- |> range(start: -5s)
14
- |> last()
15
- |> filter(fn: (r) => r["_measurement"] == "service" and r["_field"] != "memory")
16
-
17
- r1 =
18
- data
19
- |> filter(
20
- fn: (r) =>
21
- r["_field"] == "requestCount" or r["_field"] == "errorCount" or r["_field"]
22
- ==
23
- "retryCount" or r["_field"] == "authenticationCount" or r["_field"]
24
- ==
25
- "activeRequestCount" or r["_field"] == "connectionCount" or r["_field"]
26
- ==
27
- "connectionPoolCount" or r["_field"] == "connectionIdleCount" or r["_field"]
28
- ==
29
- "connectionWaitingCount" or r["_field"] == "coreCount" or r["_field"] == "cpu"
30
- or
31
- r["_field"] == "systemcpu" or r["_field"] == "velocity" or r["_field"]
32
- ==
33
- "timer" or r["_field"] == "rx" or r["_field"] == "tx",
34
- )
35
-
36
- r2 =
37
- data
38
- |> filter(
39
- fn: (r) =>
40
- float(v: r["_value"]) > 0.0 and (r["_field"] == "duration" or r["_field"]
41
- ==
42
- "latency"),
43
- )
44
-
45
- serviceInstanceProcessSum =
46
- r1
47
- |> group(columns: ["serviceId", "serviceInstanceId", "serviceInstanceProcessId", "_field"])
48
- |> sum()
49
- |> toFloat()
50
-
51
- serviceInstanceProcessMean =
52
- r2
53
- |> group(columns: ["serviceId", "serviceInstanceId", "serviceInstanceProcessId", "_field"])
54
- |> mean()
55
- |> toFloat()
56
-
57
- union(tables: [serviceInstanceProcessSum, serviceInstanceProcessMean])
58
- |> map(fn: (r) => ({r with _time: now(), _measurement: "sts-stats-by-serviceinstanceprocess"}))
59
- |> to(org: "my-org", bucket: "TestBucket01")
60
-
61
- serviceInstanceSum =
62
- r1
63
- |> group(columns: ["serviceId", "serviceInstanceId", "_field"])
64
- |> sum()
65
- |> toFloat()
66
-
67
- serviceInstanceMean =
68
- r2
69
- |> group(columns: ["serviceId", "serviceInstanceId", "_field"])
70
- |> mean()
71
- |> toFloat()
72
-
73
- union(tables: [serviceInstanceSum, serviceInstanceMean])
74
- |> map(fn: (r) => ({r with _time: now(), _measurement: "sts-stats-by-serviceinstance"}))
75
- |> to(org: "my-org", bucket: "TestBucket01")
76
-
77
- serviceSum =
78
- r1
79
- |> group(columns: ["serviceId", "_field"])
80
- |> sum()
81
- |> toFloat()
82
-
83
- serviceMean =
84
- r2
85
- |> group(columns: ["serviceId", "_field"])
86
- |> mean()
87
- |> toFloat()
88
-
89
- union(tables: [serviceSum, serviceMean])
90
- |> map(fn: (r) => ({r with _time: now(), _measurement: "sts-stats-by-service"}))
91
- |> to(org: "my-org", bucket: "TestBucket01")
92
-
93
- globalServiceSum =
94
- r1
95
- |> group(columns: ["_field"])
96
- |> sum()
97
- |> toFloat()
98
-
99
- globalServiceMean =
100
- r2
101
- |> group(columns: ["_field"])
102
- |> mean()
103
- |> toFloat()
104
-
105
- union(tables: [globalServiceSum, globalServiceMean])
106
- |> map(fn: (r) => ({r with _time: now(), _measurement: "sts-stats-globalservice"}))
107
- |> to(org: "my-org", bucket: "TestBucket01")
108
-
109
- */
110
-
111
- import { Point, WriteApi, QueryApi } from '@influxdata/influxdb-client'
112
-
113
- import { Gauge, InstrumentVelocity } from '@nsshunt/stsinstrumentation'
114
-
115
- import { InfluxDBManagerBase } from './influxDBManagerBase'
116
-
117
- import { IInfluxDBManagerOptions, InstrumentPayload } from './../commonTypes'
118
- import { ISubscriptionPayload, ISubscriptionKey } from '@nsshunt/stssocketio-client'
119
-
120
- const _logPrefix = 'InfluxDBManagerService:'
121
-
122
- /*
123
- const SERVICE_STATS_BY_SERVICE_INSTANCE_PROCESS = "sts-stats-sum-byserviceInstanceprocessid";
124
- const SERVICE_STATS_BY_SERVICE_INSTANCE = "sts-stats-sum-byserviceinstance";
125
- const SERVICE_STATS_BY_SERVICE = "sts-stats-sum-byservice";
126
- const SERVICE_STATS_GLOBAL = "sts-stats-sum";
127
- */
128
-
129
- const SERVICE_STATS_BY_SERVICE_INSTANCE_PROCESS = "sts-stats-by-serviceinstanceprocess";
130
- const SERVICE_STATS_BY_SERVICE_INSTANCE = "sts-stats-by-serviceinstance";
131
- const SERVICE_STATS_BY_SERVICE = "sts-stats-by-service";
132
- const SERVICE_STATS_GLOBAL = "sts-stats-globalservice";
133
-
134
- export class InfluxDBManagerService extends InfluxDBManagerBase
135
- {
136
- constructor(options: IInfluxDBManagerOptions, queryApi: QueryApi) {
137
- super(options, queryApi);
138
- }
139
-
140
- override get modelType(): string {
141
- return 'service'
142
- }
143
-
144
- // Queries --------------------------------------------------------------------------------------------------------
145
-
146
- /*
147
- data = from(bucket: "my-bucket")
148
- |> range(start: -task.every)
149
- |> filter(fn: (r) => r._measurement == "my_measurement")
150
-
151
- data
152
- |> mean()
153
- |> set(key: "agg_type",value: "mean_temp")
154
- |> to(bucket: "downsampled", org: "my-org", tagColumns: ["agg_type"])
155
-
156
- data
157
- |> count()
158
- |> set(key: "agg_type",value: "count_temp")
159
- |> to(bucket: "downsampled", org: "my-org", tagColumns: ["agg_type"])
160
- */
161
-
162
- #GetSTSCountGenericService = async (measurement: string, filterClause: string, showOutput: boolean = false): Promise<any> => {
163
- try {
164
- const query = `r1 = from(bucket: "${this.options.bucket}")
165
- |> range(start: -5s)
166
- |> last()
167
- |> filter(fn: (r) => r["_measurement"] == "${measurement}" ${filterClause})
168
-
169
- r2 = from(bucket: "${this.options.bucket}")
170
- |> range(start: -5s)
171
- |> last()
172
- |> filter(fn: (r) => r["_measurement"] == "service" ${filterClause} and r["_field"] == "memory")
173
-
174
- union(tables: [r1, r2])`;
175
-
176
- if (showOutput) {
177
- console.log(query);
178
- }
179
-
180
- return this.queryApi.collectRows(query)
181
- } catch (error) {
182
- console.error(`${_logPrefix}#GetSTSCountGeneric: Error: [${error}]`.red);
183
- }
184
- }
185
-
186
- // Histo metrics
187
- #GetSTSHistoGenericService = async (measurement: string, filterClause: string): Promise<any> => {
188
- try {
189
- const query = `import "math"
190
- from(bucket: "${this.options.bucket}")
191
- |> range(start: -10m)
192
- |> filter(fn: (r) => r["_measurement"] == "${measurement}" and (r["_field"] =="latency" or
193
- r["_field"] =="duration") ${filterClause})
194
- |> histogram(bins: [0.0, 10.0, 20.0, 50.0, 100.0, 1000.0, 50000.0, math.mInf(sign: 1) ])
195
- |> difference()`;
196
- return this.queryApi.collectRows(query)
197
- } catch (error) {
198
- console.error(`${_logPrefix}#GetSTSHistoGeneric: Error: [${error}]`.red);
199
- }
200
- }
201
-
202
- // Quantile metrics
203
- #GetSTSQuantileGenericService = async (measurement: string, filterClause: string): Promise<any> => {
204
- try {
205
- const query = `data = from(bucket: "${this.options.bucket}")
206
- |> range(start: -10m)
207
- |> filter(fn: (r) => r["_measurement"] == "${measurement}" and (r["_field"] == "latency" or
208
- r["_field"] == "duration" or
209
- r["_field"] == "cpu" or
210
- r["_field"] == "systemcpu") ${filterClause})
211
- |> aggregateWindow(every: 5s, fn: max, createEmpty: false)
212
-
213
- dostsquantileex = (q) =>
214
- data
215
- |> quantile(q: q, method: "estimate_tdigest", compression: 1000.0)
216
- |> set(key: "quantile", value: string(v:q))
217
- |> group(columns: ["quantile"])
218
-
219
- union(tables: [
220
- dostsquantileex(q: 0.5),
221
- dostsquantileex(q: 0.8),
222
- dostsquantileex(q: 0.9),
223
- dostsquantileex(q: 0.95),
224
- dostsquantileex(q: 0.99)
225
- ])`;
226
-
227
- return this.queryApi.collectRows(query)
228
- } catch (error) {
229
- console.error(`${_logPrefix}#GetSTSQuantileGeneric: Error: [${error}]`.red);
230
- }
231
- }
232
-
233
- // Metric queries -------------------------------------------------------------------------------------------------
234
- // Root level metrics
235
- async GetInfluxDBResultsRootService(subscriptionKey: ISubscriptionKey): Promise<ISubscriptionPayload> {
236
- let retVal = null;
237
- try {
238
- retVal = await this.ProcessInfluxDBResults([
239
- this.#GetSTSCountGenericService(SERVICE_STATS_GLOBAL, ''),
240
- this.#GetSTSQuantileGenericService(SERVICE_STATS_GLOBAL, ''),
241
- this.#GetSTSHistoGenericService(SERVICE_STATS_GLOBAL, '')],
242
- [ ])
243
- } catch (error) {
244
- console.error(`${_logPrefix}GetInfluxDBResultsRoot: Error: [${error}]`.red);
245
- }
246
- return {
247
- subscriptionKey,
248
- data: retVal
249
- };
250
- }
251
-
252
- // Service level metrics
253
- async GetInfluxDBResultsService(subscriptionKey: ISubscriptionKey): Promise<ISubscriptionPayload> {
254
- let retVal = null;
255
- try {
256
- retVal = await this.ProcessInfluxDBResults([
257
- this.#GetSTSCountGenericService(SERVICE_STATS_BY_SERVICE, ''),
258
- this.#GetSTSQuantileGenericService(SERVICE_STATS_BY_SERVICE, ''),
259
- this.#GetSTSHistoGenericService(SERVICE_STATS_BY_SERVICE, '')],
260
- ['serviceId'])
261
- } catch (error) {
262
- console.error(`${_logPrefix}GetInfluxDBResultsService: Error: [${error}]`.red);
263
- }
264
- return {
265
- subscriptionKey,
266
- data: retVal
267
- };
268
-
269
- }
270
-
271
- // Service instance metrics for a particular service type
272
- async GetInfluxDBResultsServiceInstances(subscriptionKey: ISubscriptionKey): Promise<ISubscriptionPayload> {
273
- let retVal = null;
274
- try {
275
- const serviceId = subscriptionKey.key as string;
276
- retVal = await this.ProcessInfluxDBResults([
277
- this.#GetSTSCountGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE, `and r["serviceId"] == "${serviceId}"`),
278
- this.#GetSTSQuantileGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE, `and r["serviceId"] == "${serviceId}"`),
279
- this.#GetSTSHistoGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE, `and r["serviceId"] == "${serviceId}"`)],
280
- ['serviceId', 'serviceInstanceId'])
281
- } catch (error) {
282
- console.error(`${_logPrefix}GetInfluxDBResultsServiceInstances: Error: [${error}]`.red);
283
- }
284
- return {
285
- subscriptionKey,
286
- data: retVal
287
- };
288
- }
289
-
290
- // Service instance thread metrics for a particular service instance
291
- async GetInfluxDBResultsServiceInstance(subscriptionKey: ISubscriptionKey): Promise<ISubscriptionPayload> {
292
- let retVal = null;
293
- try {
294
- const serviceInstanceId = subscriptionKey.key as string;
295
- retVal = await this.ProcessInfluxDBResults([
296
- this.#GetSTSCountGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE_PROCESS, `and r["serviceInstanceId"] == "${serviceInstanceId}"`),
297
- this.#GetSTSQuantileGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE_PROCESS, `and r["serviceInstanceId"] == "${serviceInstanceId}"`),
298
- this.#GetSTSHistoGenericService(SERVICE_STATS_BY_SERVICE_INSTANCE_PROCESS, `and r["serviceInstanceId"] == "${serviceInstanceId}"`)],
299
- ['serviceId', 'serviceInstanceId', 'serviceInstanceProcessId'])
300
- } catch (error) {
301
- console.error(`${_logPrefix}GetInfluxDBResultsServiceInstance: Error: [${error}]`.red);
302
- }
303
- return {
304
- subscriptionKey,
305
- data: retVal
306
- };
307
- }
308
-
309
- // Write data points ----------------------------------------------------------------------------------------------
310
- // Agent context payload
311
- // {"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"}
312
- async OutputInfluxDB(writeApi: WriteApi, instrumentPayload: InstrumentPayload): Promise<boolean> {
313
- if (writeApi) {
314
- try {
315
- if (this.shuttingDown) {
316
- return false;
317
- }
318
-
319
- const { serviceId, serviceInstanceId, hostName, serviceInstanceProcessId,
320
- pid, ppid, serviceName, serviceVersion } = instrumentPayload.context;
321
-
322
- let systemcpu = 0.0;
323
- if (instrumentPayload.instruments[Gauge.CPU_SYSTEM_LOAD_GAUGE]) {
324
- systemcpu = (instrumentPayload.instruments[Gauge.CPU_SYSTEM_LOAD_GAUGE].val as number);
325
- }
326
-
327
- const point = new Point('all')
328
- .measurement('service')
329
- // Context settings
330
- .tag('serviceId', serviceId as string)
331
- .tag('serviceName', serviceName as string)
332
- .tag('serviceVersion', serviceVersion as string)
333
- .tag('serviceInstanceId', serviceInstanceId as string)
334
- .tag('serviceInstanceProcessId', serviceInstanceProcessId as string)
335
- .tag('hostName', hostName as string)
336
- .tag('pid', (pid as number).toString())
337
- .tag('ppid', (ppid as number).toString())
338
- // Data fields
339
- .intField('requestCount', instrumentPayload.instruments[Gauge.REQUEST_COUNT_GAUGE].val)
340
- .intField('errorCount', instrumentPayload.instruments[Gauge.ERROR_COUNT_GAUGE].val)
341
- .intField('retryCount', instrumentPayload.instruments[Gauge.RETRY_COUNT_GAUGE].val)
342
- .intField('authenticationCount', instrumentPayload.instruments[Gauge.AUTHENTICATION_COUNT_GAUGE].val)
343
- .floatField('velocity', (instrumentPayload.instruments[Gauge.VELOCITY_GAUGE] as InstrumentVelocity).va) // Note: Using va not val here
344
- .floatField('cpu', instrumentPayload.instruments[Gauge.CPU_LOAD_GAUGE].val)
345
- .intField('activeRequestCount', instrumentPayload.instruments[Gauge.ACTIVE_REQUEST_GAUGE].val)
346
- .intField('connectionCount', instrumentPayload.instruments[Gauge.CONNECTION_COUNT_GAUGE].val)
347
- .intField('connectionPoolCount', instrumentPayload.instruments[Gauge.CONNECTION_POOL_TOTAL_GAUGE].val)
348
- .intField('connectionIdleCount', instrumentPayload.instruments[Gauge.CONNECTION_POOL_IDLE_GAUGE].val)
349
- .intField('connectionWaitingCount', instrumentPayload.instruments[Gauge.CONNECTION_POOL_WAITING_GAUGE].val)
350
- .intField('coreCount', instrumentPayload.instruments[Gauge.CORE_COUNT_GAUGE].val)
351
- //.intField('rx', instrumentPayload.instruments[Gauge.NETWORK_RX_GAUGE].val)
352
- //.intField('tx', instrumentPayload.instruments[Gauge.NETWORK_TX_GAUGE].val)
353
- .floatField('rx', (instrumentPayload.instruments[Gauge.NETWORK_RX_GAUGE] as InstrumentVelocity).va) // Note: Using va not val here
354
- .floatField('tx', (instrumentPayload.instruments[Gauge.NETWORK_TX_GAUGE] as InstrumentVelocity).va) // Note: Using va not val here
355
- .floatField('timer', instrumentPayload.instruments[Gauge.TIMER_GAUGE].val)
356
- .floatField('duration', instrumentPayload.instruments[Gauge.DURATION_GAUGE].val)
357
- .floatField('latency', instrumentPayload.instruments[Gauge.LATENCY_GAUGE].val)
358
- .floatField('systemcpu', systemcpu)
359
- .stringField('memory', JSON.stringify(instrumentPayload.instruments[Gauge.OBJECT_GAUGE].val))
360
-
361
- writeApi.writePoint(point);
362
- return true;
363
- } catch (error: any) {
364
- console.error(`${_logPrefix}OutputInfluxDB: Could not write data point: [${error}]`.red);
365
- console.error(`${JSON.stringify(instrumentPayload.context)}`.red);
366
- return false;
367
- }
368
- } else {
369
- console.error(`${_logPrefix}OutputInfluxDBService: Could not write data point as writeClient is null`.red);
370
- return false;
371
- }
372
- }
373
- }
@@ -1,283 +0,0 @@
1
- import { IKafkaConsumer, logFunction } from './commonTypes'
2
- import { ISubscriptionPayload, ISubscriptionKey, SubscriptionTopic, IKafkaData } from '@nsshunt/stssocketio-client'
3
-
4
- import { KafkaManager, IKafkaManagerConfig } from './kafka/kafkamanager'
5
- import { InfluxDBManager } from './influxdb/influxDBManager'
6
- import { v4 as uuidv4 } from 'uuid';
7
-
8
- import { $Options } from '@nsshunt/stsconfig'
9
- import { STSOptionsBase } from '@nsshunt/stsutils';
10
- const goptions = $Options()
11
-
12
- declare interface IKafkaSubscription {
13
- kafkaTopic: string
14
- kafkaGroupId: string
15
- kafkaConsumer: IKafkaConsumer
16
- kafkaFromBeginning: boolean
17
- }
18
-
19
- declare interface ISubscription {
20
- subscriptionKey: ISubscriptionKey
21
- kafka?: IKafkaSubscription
22
- cb: (payload: ISubscriptionPayload) => void
23
- }
24
-
25
- declare type ISubscriptions = Record<string, ISubscription>;
26
-
27
- export interface IInstrumentationSubscriberOptions {
28
- SubscriptionInterval: number
29
- logger?: logFunction
30
- }
31
-
32
- export class InstrumentationSubscriber extends STSOptionsBase {
33
- #subscriptions: ISubscriptions = { };
34
- #influxDBManager: InfluxDBManager;
35
- #interval: NodeJS.Timer | null = null;
36
- #km: KafkaManager;
37
- #logger: logFunction | null = null;
38
-
39
- constructor(options: IInstrumentationSubscriberOptions) {
40
- super(options);
41
-
42
- if (options.logger) {
43
- this.#logger = options.logger;
44
- }
45
-
46
- this.#influxDBManager = new InfluxDBManager();
47
-
48
- const kmc: IKafkaManagerConfig = {
49
- clientId: `${goptions.kafka_clientId}_${uuidv4()}`,
50
- brokers: goptions.kafka_brokers.split(','),
51
- keepAlive: goptions.kafka_keep_alive,
52
- adminTimeout: goptions.kafka_admin_timeout,
53
- connectionTimeout: goptions.kafka_connection_timeout,
54
- logLevel: goptions.kafka_log_level,
55
- useSSL: goptions.kafka_use_ssl,
56
- requestTimeout: goptions.kafka_request_timeout
57
- }
58
- if (goptions.kafka_use_ssl) {
59
- kmc.ssl = {
60
- rejectUnauthorized: goptions.kafka_ssl_rejectUnauthorized,
61
- cafile: goptions.kafka_ssl_cafile,
62
- certfileFile: goptions.kafka_ssl_certfile,
63
- keyfile: goptions.kafka_ssl_keyfile
64
- }
65
- }
66
- this.#km = new KafkaManager(kmc);
67
- }
68
-
69
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
- #Log(msg: any): void {
71
- if (this.#logger) {
72
- this.#logger(msg);
73
- } else {
74
- console.log(msg);
75
- }
76
- }
77
-
78
- async #UnSubscribeKafka(subscription: ISubscription): Promise<void> {
79
- const unsubscribeKafka = async () => {
80
- const kafka = subscription.kafka;
81
- if (kafka) {
82
- // Un-Subscribe from this kafka topic
83
- this.#Log(`InstrumentationSubscriber:#UnSubscribeKafka(): Unsubscribe from Kafka topc: [${kafka.kafkaTopic}] Starting`.yellow)
84
- await kafka.kafkaConsumer?.Stop();
85
- await kafka.kafkaConsumer?.Disconnect();
86
- this.#Log(`InstrumentationSubscriber:#UnSubscribeKafka(): Unsubscribe from Kafka topc: [${kafka.kafkaTopic}] Completed.`.yellow)
87
- } else {
88
- this.#Log(`InstrumentationSubscriber:#UnSubscribeKafka(): Kafka details do not exist for this topc: [${JSON.stringify(subscription.subscriptionKey)}].`.magenta)
89
- }
90
- };
91
- return unsubscribeKafka();
92
- }
93
-
94
- async #SubscribeKafka(subscription: ISubscription): Promise<void> {
95
- const kafkaSubscribe = async () => {
96
- if (subscription.subscriptionKey.id) {
97
-
98
- const kafkaSafeKey = `${subscription.subscriptionKey.key}`.replace(/@/g, '_').replace(/\|/g, '_');
99
-
100
- const kafkaGroupId = uuidv4();
101
- subscription.kafka = {
102
- kafkaTopic: kafkaSafeKey,
103
- kafkaGroupId: kafkaGroupId,
104
- kafkaConsumer: this.#km.CreateConsumer(kafkaGroupId),
105
- kafkaFromBeginning: goptions.kafka_consume_from_beginning
106
- };
107
- this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Subscribe to Kafka topc: [${subscription.kafka.kafkaTopic}] Starting`.yellow)
108
-
109
- const kafka = subscription.kafka;
110
- await kafka.kafkaConsumer.Connect();
111
- await kafka.kafkaConsumer.Subscribe([kafka.kafkaTopic], subscription.kafka.kafkaFromBeginning );
112
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
113
- await kafka.kafkaConsumer.StartConsumingMessages((topic, key, partition, value, headers) => {
114
- try {
115
- if (key != "" && value != "") {
116
- if (topic.localeCompare(key) === 0) {
117
- subscription.cb({
118
- subscriptionKey: subscription.subscriptionKey,// Original requested topic (may be kafka un-safe)
119
- data: {
120
- kafkaTopic: kafka.kafkaTopic, // Safe kafka topic key with prefix. kafkaTopic, topic and key should be same value
121
- kafkaGroupId: kafka.kafkaGroupId,
122
- partition,
123
- topic, // kafkaTopic, topic and key should be same value
124
- key, // kafkaTopic, topic and key should be same value
125
- value
126
- } as IKafkaData
127
- });
128
- } else {
129
- this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Invalid message format from Kafka data, topic: [${topic}] and key: [${key}] do not match`.red);
130
- }
131
- } else {
132
- this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Invalid message format from Kafka data, topic: [${topic}], key: [${key}], value: [${value}]`.red);
133
- }
134
- } catch (error) {
135
- this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Error: [${error}]`.red);
136
- }
137
- });
138
- this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Subscribe to Kafka topc: [${kafka.kafkaTopic}] Completed`.yellow)
139
- } else {
140
- this.#Log(`InstrumentationSubscriber:#SubscribeKafka(): Could not subscribe to Kafka topc, missing combinedKey for topic: [${JSON.stringify(subscription.subscriptionKey)}]`.magenta);
141
- }
142
- }
143
- return kafkaSubscribe();
144
- }
145
-
146
- async #OutputSubscription(subscription: ISubscription): Promise<ISubscriptionPayload> {
147
- // Service subscriptions
148
- const { subscriptionKey } = subscription;
149
- switch (subscriptionKey.topic) {
150
- // Services -------------------------------------------------------------------------------------------
151
- case SubscriptionTopic.AllServicesCombined :
152
- return this.#influxDBManager.serviceManager.GetInfluxDBResultsRootService(subscriptionKey);
153
- case SubscriptionTopic.Services :
154
- return this.#influxDBManager.serviceManager.GetInfluxDBResultsService(subscriptionKey);
155
- case SubscriptionTopic.ServiceInstances :
156
- if (subscriptionKey.key) { // key = service_id
157
- return this.#influxDBManager.serviceManager.GetInfluxDBResultsServiceInstances(subscriptionKey);
158
- } else {
159
- throw new Error(`#OutputSubscription: key not provided for subscription: [${JSON.stringify(subscriptionKey)}]`);
160
- }
161
- case SubscriptionTopic.ServiceInstance :
162
- if (subscriptionKey.key) { // key = service instance id
163
- return this.#influxDBManager.serviceManager.GetInfluxDBResultsServiceInstance(subscriptionKey);
164
- } else {
165
- throw new Error(`#OutputSubscription: key not provided for subscription: [${JSON.stringify(subscriptionKey)}]`);
166
- }
167
-
168
- // User Agents -------------------------------------------------------------------------------------------
169
- case SubscriptionTopic.AllAgentsCombined :
170
- return this.#influxDBManager.agentManager.GetInfluxDBResultsRootAgent(subscriptionKey);
171
- case SubscriptionTopic.Agents :
172
- return this.#influxDBManager.agentManager.GetInfluxDBResultsAgent(subscriptionKey);
173
- case SubscriptionTopic.AgentWorkers :
174
- if (subscriptionKey.key) { // key = agent instance id
175
- return this.#influxDBManager.agentManager.GetInfluxDBResultsAgentThreads(subscriptionKey);
176
- } else {
177
- throw new Error(`#OutputSubscription: key not provided for subscription: [${JSON.stringify(subscriptionKey)}]`);
178
- }
179
- case SubscriptionTopic.AgentWorker :
180
- if (subscriptionKey.key && subscriptionKey.subkey) { // key = agent instance id, subkey = agent instance worker id
181
- return this.#influxDBManager.agentManager.GetInfluxDBResultsAgentThread(subscriptionKey);
182
- } else {
183
- throw new Error(`#OutputSubscription: key and/or subkey not provided for subscription: [${JSON.stringify(subscriptionKey.topic)}]`);
184
- }
185
-
186
- // Logging (both service and agent) -----------------------------------------------------------------------
187
- case SubscriptionTopic.LogProcessing :
188
- // Kafka processing will be handled by a dedicated kafka run consumer
189
- return { subscriptionKey, data: null };
190
- default :
191
- return { subscriptionKey, data: null };
192
- }
193
- }
194
-
195
- #ExecuteSubscriptions = async () => {
196
- const promArray: Promise<ISubscriptionPayload>[] = [ ];
197
- const indexArray: ISubscription[] = [ ];
198
-
199
- for (const [, subscription] of Object.entries(this.#subscriptions)) {
200
- // If NOT Kafka, go get the data from influxdb
201
- if (subscription.subscriptionKey.topic.localeCompare(SubscriptionTopic.LogProcessing.toString()) !== 0) {
202
- promArray.push(this.#OutputSubscription(subscription));
203
- indexArray.push(subscription);
204
- }
205
- }
206
- const retVal = await Promise.all(promArray);
207
- try {
208
- for (let i=0; i < retVal.length; i++) {
209
- // Provided we have data, invoke the callback
210
- if (retVal[i].data) {
211
- indexArray[i].cb(retVal[i]);
212
- }
213
- }
214
- } catch (error) {
215
- this.#Log(`InstrumentationSubscriber:#ExecuteSubscriptions(): Error: [${error}], [${JSON.stringify(retVal)}]`.red);
216
- }
217
- }
218
-
219
- Subscribe(subscriptionKey: ISubscriptionKey, cb: (payload: ISubscriptionPayload) => void) {
220
- if (this.#interval) {
221
- clearInterval(this.#interval);
222
- this.#interval = null;
223
- }
224
- if (this.#subscriptions[subscriptionKey.id]) {
225
- // Subscription already exists - ignoring
226
- this.#Log(`InstrumentationSubscriber.Subscribe(): Subscription already exists: [${subscriptionKey.id}] - ignoring.`.magenta);
227
- } else {
228
- this.#subscriptions[subscriptionKey.id] = {
229
- subscriptionKey,
230
- cb
231
- }
232
- if (subscriptionKey.topic.localeCompare(SubscriptionTopic.LogProcessing) === 0) {
233
- this.#SubscribeKafka(this.#subscriptions[subscriptionKey.id]);
234
- }
235
- this.#Log(`InstrumentationSubscriber.Subscribe(): subscriptionKey.id: [${subscriptionKey.id}] successfully subscribed.`.grey);
236
-
237
- if (!this.#interval) {
238
- // Output subscription immediately and then iterate ...
239
- this.#ExecuteSubscriptions();
240
- let interval = 1000; // default
241
- if (this.options) {
242
- interval = this.options.SubscriptionInterval
243
- }
244
- this.#interval = setInterval(() => {
245
- this.#ExecuteSubscriptions();
246
- }, interval);
247
- }
248
- }
249
- }
250
-
251
- UnSubscribe(subscriptionKey: ISubscriptionKey) {
252
- if (!this.#subscriptions[subscriptionKey.id]) {
253
- this.#Log(`UnSubscribe(): Warning, subscriptionKey.id: [${subscriptionKey.id}] does not exist within subscription records`.magenta);
254
- } else {
255
- if (subscriptionKey.topic.localeCompare(SubscriptionTopic.LogProcessing) === 0) {
256
- this.#UnSubscribeKafka(this.#subscriptions[subscriptionKey.id]);
257
- }
258
- delete this.#subscriptions[subscriptionKey.id];
259
-
260
- if (Object.keys(this.#subscriptions).length === 0) {
261
- if (this.#interval) {
262
- clearInterval(this.#interval);
263
- this.#interval = null;
264
- }
265
- }
266
- }
267
- }
268
-
269
- #UnSubscribeAll() {
270
- for (const [, subscription] of Object.entries(this.#subscriptions)) {
271
- this.UnSubscribe(subscription.subscriptionKey);
272
- }
273
- }
274
-
275
- async Start() {
276
- return this.#influxDBManager.Start();
277
- }
278
-
279
- async Stop() {
280
- this.#UnSubscribeAll();
281
- return this.#influxDBManager.Terminate();
282
- }
283
- }