un-cli 0.0.71 → 0.0.72
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.html +246 -179
- package/index.mjs +14 -4
- package/package.json +1 -1
package/index.html
CHANGED
|
@@ -9,16 +9,32 @@
|
|
|
9
9
|
<body>
|
|
10
10
|
|
|
11
11
|
<table>
|
|
12
|
+
<tr>
|
|
13
|
+
<td>
|
|
14
|
+
Admin User
|
|
15
|
+
</td>
|
|
16
|
+
<td colspan =3><input type = 'text' id = 'txtAdmin' value = 'admin'></td>
|
|
17
|
+
</tr>
|
|
18
|
+
<tr>
|
|
19
|
+
<td>
|
|
20
|
+
Admin Password
|
|
21
|
+
</td>
|
|
22
|
+
<td colspan =3><input type = 'password' id = 'txtPassword' value = ''></td>
|
|
23
|
+
</tr>
|
|
24
|
+
<tr>
|
|
25
|
+
|
|
26
|
+
<td colspan =5><button id = 'btnLogin'>Login</button></td>
|
|
27
|
+
</tr>
|
|
12
28
|
<tr><td>Service</td>
|
|
13
29
|
<td colspan =3 ><select id ='cmbService'>
|
|
14
|
-
|
|
30
|
+
|
|
15
31
|
</select>
|
|
16
32
|
</td>
|
|
17
33
|
</tr>
|
|
18
34
|
|
|
19
35
|
<tr>
|
|
20
36
|
<td >Age</td>
|
|
21
|
-
<td colspan =3><input type ='text' id = 'txtAge' value = '
|
|
37
|
+
<td colspan =3><input type ='text' id = 'txtAge' value = '10' style="width:30px"> minutes</td>
|
|
22
38
|
</tr>
|
|
23
39
|
<tr colspan =4>
|
|
24
40
|
<td><button id = 'btnTraceLogs'>Trace Logs</button></td>
|
|
@@ -26,7 +42,8 @@
|
|
|
26
42
|
<td><button id = 'btnUpdateSubnetworkLogs'>Update Subnetwork Logs</button></td>
|
|
27
43
|
<td><button id = 'btnAR'>Attribute Rules Logs</button></td>
|
|
28
44
|
<td><button id = 'btnSQLLogs'>SQL Logs</button></td>
|
|
29
|
-
|
|
45
|
+
<td>Message<input id = 'txtFilter' type = 'text'></td>
|
|
46
|
+
<td>User<input id = 'txtUser' type = 'text'></td>
|
|
30
47
|
</tr>
|
|
31
48
|
|
|
32
49
|
</table>
|
|
@@ -39,23 +56,42 @@
|
|
|
39
56
|
import { UtilityNetwork } from "./utilitynetwork.node.mjs"
|
|
40
57
|
import { AdminLog } from "./adminlog.mjs"
|
|
41
58
|
import logger from "./logger.mjs"
|
|
59
|
+
|
|
60
|
+
|
|
42
61
|
|
|
43
|
-
|
|
62
|
+
let parameters = {
|
|
44
63
|
"user": "unadmin",
|
|
45
|
-
"password": "
|
|
64
|
+
"password": "",
|
|
46
65
|
"portal": "https://utilitynetwork.esri.com/portal",
|
|
47
|
-
"service": "
|
|
66
|
+
"service": "",
|
|
48
67
|
"referer": "https://utilitynetwork.esri.com/log"
|
|
49
68
|
}
|
|
69
|
+
|
|
50
70
|
|
|
51
71
|
let portal;
|
|
52
72
|
let adminLog = null;
|
|
53
73
|
let cmbService
|
|
54
74
|
let token;
|
|
75
|
+
const btnLogin = document.getElementById("btnLogin")
|
|
76
|
+
const txtAdmin = document.getElementById("txtAdmin");
|
|
77
|
+
const txtPassword = document.getElementById("txtPassword")
|
|
78
|
+
|
|
79
|
+
btnLogin.addEventListener("click", () => init())
|
|
55
80
|
async function init() {
|
|
56
|
-
|
|
81
|
+
try {
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
parameters.user = txtAdmin.value;
|
|
85
|
+
parameters.password = txtPassword.value;
|
|
86
|
+
parameters.referer = window.location.href;
|
|
87
|
+
|
|
57
88
|
cmbService = document.getElementById("cmbService")
|
|
58
|
-
|
|
89
|
+
while (cmbService.firstChild) cmbService.removeChild(cmbService.firstChild)
|
|
90
|
+
|
|
91
|
+
const opt = document.createElement("option")
|
|
92
|
+
opt.textContent = "(All Services)"
|
|
93
|
+
cmbService.appendChild (opt)
|
|
94
|
+
|
|
59
95
|
token = await getToken(parameters);
|
|
60
96
|
const services = await portal.services()
|
|
61
97
|
const featureServices = services.services.filter(s => s.type == "FeatureServer")
|
|
@@ -64,6 +100,20 @@
|
|
|
64
100
|
o.text = s.name;
|
|
65
101
|
cmbService.appendChild(o);
|
|
66
102
|
})
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
document.getElementById("btnTraceLogs").disabled = false
|
|
107
|
+
document.getElementById("btnValidateLogs").disabled = false
|
|
108
|
+
document.getElementById("btnUpdateSubnetworkLogs").disabled = false
|
|
109
|
+
document.getElementById("btnAR").disabled = false
|
|
110
|
+
document.getElementById("btnSQLLogs").disabled = false
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
catch(ex){
|
|
115
|
+
alert(`Failed to login to ${parameters.portal} check the user/password and make sure its an admin`)
|
|
116
|
+
}
|
|
67
117
|
}
|
|
68
118
|
|
|
69
119
|
|
|
@@ -82,42 +132,17 @@
|
|
|
82
132
|
const tblResult = document.getElementById("tblResult");
|
|
83
133
|
//clear
|
|
84
134
|
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
85
|
-
tblResult.appendChild(document.createTextNode("Loading...."));
|
|
86
135
|
|
|
87
136
|
|
|
88
137
|
parameters.service = cmbService.options[cmbService.selectedIndex].text
|
|
89
|
-
|
|
90
|
-
//create a new admin object (user might not be admin we won't use it until the user call log )
|
|
91
|
-
adminLog = new AdminLog(token, portal.serverUrl)
|
|
92
|
-
|
|
93
|
-
logger.info("Connected.")
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
const topLogCount = 1000;
|
|
97
|
-
const pageSize = 10000
|
|
98
|
-
|
|
138
|
+
|
|
99
139
|
let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
|
|
100
140
|
|
|
101
141
|
console.log(`Querying trace logs for ${parameters.service} for the last ${mins} minutes ...`)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
services = "*"
|
|
107
|
-
let result= await adminLog.query([102002], services, topLogCount, startTime ,endTime , "VERBOSE")
|
|
108
|
-
let jsonRes = await result.json()
|
|
109
|
-
let allMessages = [].concat(jsonRes.logMessages)
|
|
110
|
-
allMessages = allMessages.filter(m => m.message.indexOf("------ Trace Parameters ----") > -1)
|
|
111
|
-
while (jsonRes.hasMore)
|
|
112
|
-
{
|
|
113
|
-
//start paging
|
|
114
|
-
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
|
|
115
|
-
result= await adminLog.query([102002], services, pageSize, jsonRes.endTime, null, "VERBOSE")
|
|
116
|
-
jsonRes = await result.json()
|
|
117
|
-
|
|
118
|
-
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("------ Trace Parameters ----") > -1))
|
|
119
|
-
}
|
|
120
|
-
|
|
142
|
+
|
|
143
|
+
//page query the admin log
|
|
144
|
+
let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102002], "------ Trace Parameters ----", "VERBOSE")
|
|
145
|
+
|
|
121
146
|
await populateMessages(allMessages)
|
|
122
147
|
|
|
123
148
|
|
|
@@ -126,49 +151,23 @@
|
|
|
126
151
|
|
|
127
152
|
|
|
128
153
|
async function loadValidateLogs () {
|
|
129
|
-
|
|
130
|
-
const tblResult = document.getElementById("tblResult");
|
|
131
|
-
//clear
|
|
132
|
-
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
133
|
-
tblResult.appendChild(document.createTextNode("Loading...."));
|
|
134
|
-
|
|
135
|
-
parameters.service = cmbService.options[cmbService.selectedIndex].text
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
//create a new admin object (user might not be admin we won't use it until the user call log )
|
|
139
|
-
adminLog = new AdminLog(token, portal.serverUrl)
|
|
154
|
+
//build table
|
|
155
|
+
const tblResult = document.getElementById("tblResult");
|
|
156
|
+
//clear
|
|
157
|
+
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
140
158
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
const topLogCount = 1000;
|
|
145
|
-
const pageSize = 10000
|
|
159
|
+
parameters.service = cmbService.options[cmbService.selectedIndex].text
|
|
146
160
|
|
|
161
|
+
|
|
147
162
|
let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
|
|
148
163
|
|
|
149
164
|
console.log(`Querying validate logs for ${parameters.service} for the last ${mins} minutes ...`)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let jsonRes = await result.json()
|
|
157
|
-
let allMessages = [].concat(jsonRes.logMessages)
|
|
158
|
-
allMessages = allMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("The network is built.") > -1 && m.methodName == 'BuildEngineLog')
|
|
159
|
-
while (jsonRes.hasMore)
|
|
160
|
-
{
|
|
161
|
-
//start paging
|
|
162
|
-
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
|
|
163
|
-
result= await adminLog.query([102003], services, pageSize, jsonRes.endTime, null, "VERBOSE")
|
|
164
|
-
jsonRes = await result.json()
|
|
165
|
-
|
|
166
|
-
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("------ Trace Parameters ----") == -1))
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
165
|
+
|
|
166
|
+
//-1 && m.message.indexOf("The network is built.") > -1 && m.methodName == 'BuildEngineLog')
|
|
167
|
+
//page query the admin log
|
|
168
|
+
let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "The network is built.", "VERBOSE")
|
|
169
|
+
|
|
170
|
+
|
|
172
171
|
//validate logs missing elapsed populate it
|
|
173
172
|
allMessages = allMessages.map( m => {
|
|
174
173
|
try{
|
|
@@ -195,45 +194,21 @@ tblResult.appendChild(document.createTextNode("Loading...."));
|
|
|
195
194
|
|
|
196
195
|
|
|
197
196
|
async function loadUpdateSubnetworkLogs () {
|
|
198
|
-
|
|
199
|
-
const tblResult = document.getElementById("tblResult");
|
|
200
|
-
//clear
|
|
201
|
-
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
202
|
-
tblResult.appendChild(document.createTextNode("Loading...."));
|
|
203
|
-
|
|
204
|
-
parameters.service = cmbService.options[cmbService.selectedIndex].text
|
|
205
|
-
//create a new admin object (user might not be admin we won't use it until the user call log )
|
|
206
|
-
adminLog = new AdminLog(token, portal.serverUrl)
|
|
197
|
+
//build table
|
|
198
|
+
const tblResult = document.getElementById("tblResult");
|
|
199
|
+
//clear
|
|
200
|
+
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
207
201
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const pageSize = 10000
|
|
202
|
+
parameters.service = cmbService.options[cmbService.selectedIndex].text
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
|
|
213
206
|
|
|
214
|
-
|
|
207
|
+
|
|
208
|
+
console.log(`Querying subnetwork logs for ${parameters.service} for the last ${mins} minutes ...`)
|
|
209
|
+
let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "---- Subnetwork Parameters ----", "VERBOSE")
|
|
215
210
|
|
|
216
|
-
|
|
217
|
-
console.log(`Querying subnetwork logs for ${parameters.service} for the last ${mins} minutes ...`)
|
|
218
|
-
const startTime = Date.now() - mins*60*1000
|
|
219
|
-
const endTime = Date.now();
|
|
220
|
-
let services = [parameters.service+ ".MapServer"]
|
|
221
|
-
if (parameters.service == "(All Services)")
|
|
222
|
-
services = "*"
|
|
223
|
-
let result= await adminLog.query([102003], services, topLogCount, startTime ,endTime , "VERBOSE")
|
|
224
|
-
let jsonRes = await result.json()
|
|
225
|
-
let allMessages = [].concat(jsonRes.logMessages)
|
|
226
|
-
allMessages = allMessages.filter(m => m.message.indexOf("---- Subnetwork Parameters ----") > -1)
|
|
227
|
-
while (jsonRes.hasMore)
|
|
228
|
-
{
|
|
229
|
-
//start paging
|
|
230
|
-
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
|
|
231
|
-
result= await adminLog.query([102003], services, pageSize, jsonRes.endTime, null, "VERBOSE")
|
|
232
|
-
jsonRes = await result.json()
|
|
233
|
-
|
|
234
|
-
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("---- Subnetwork Parameters ----") > -1))
|
|
235
|
-
}
|
|
236
|
-
|
|
211
|
+
|
|
237
212
|
//update subnetwork missing elapsed populate it
|
|
238
213
|
allMessages = allMessages.map( m => {
|
|
239
214
|
try{
|
|
@@ -265,41 +240,20 @@ async function loadAttributeRules () {
|
|
|
265
240
|
|
|
266
241
|
//build table
|
|
267
242
|
const tblResult = document.getElementById("tblResult");
|
|
268
|
-
tblResult.
|
|
269
|
-
|
|
243
|
+
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
244
|
+
|
|
270
245
|
let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
|
|
271
246
|
|
|
272
247
|
parameters.service = cmbService.options[cmbService.selectedIndex].text
|
|
273
|
-
|
|
274
|
-
adminLog = new AdminLog(token, portal.serverUrl)
|
|
275
|
-
|
|
248
|
+
|
|
276
249
|
let showMaxGuid = true
|
|
277
|
-
let showMinGuid = false
|
|
278
|
-
|
|
279
|
-
const endTime = Date.now();
|
|
280
|
-
|
|
281
|
-
let services = [parameters.service+ ".MapServer"]
|
|
282
|
-
if (parameters.service == "(All Services)")
|
|
283
|
-
services = "*"
|
|
284
|
-
|
|
285
|
-
const pageSize = 10000 //maximum messages per page
|
|
250
|
+
let showMinGuid = false
|
|
251
|
+
|
|
286
252
|
logger.info(`Querying attribute rules logs for ${parameters.service} in the past ${mins} minutes...`)
|
|
287
|
-
let
|
|
288
|
-
let jsonRes = await result.json()
|
|
289
|
-
let allMessages = [].concat(jsonRes.logMessages)
|
|
290
|
-
|
|
291
|
-
while (jsonRes.hasMore && jsonRes.endTime > startTime)
|
|
292
|
-
{
|
|
293
|
-
//start paging
|
|
294
|
-
logger.info(`Aggregating messages... total so far ${allMessages.length} debug entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
result= await adminLog.query([102003], services, pageSize, jsonRes.endTime )
|
|
298
|
-
jsonRes = await result.json()
|
|
299
|
-
allMessages = allMessages.concat(jsonRes.logMessages)
|
|
300
|
-
}
|
|
253
|
+
let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102003], "Attribute rule execution complete:", "DEBUG")
|
|
301
254
|
|
|
302
|
-
|
|
255
|
+
|
|
256
|
+
const arMessages = filterMessages(allMessages)
|
|
303
257
|
.filter(m => m.message.indexOf("Attribute rule execution complete:") > -1)
|
|
304
258
|
.map (m => JSON.parse(m.message.replace("Attribute rule execution complete:", "")))
|
|
305
259
|
.map( m => {
|
|
@@ -370,7 +324,8 @@ async function loadAttributeRules () {
|
|
|
370
324
|
│ Min execution time (m
|
|
371
325
|
|
|
372
326
|
*/
|
|
373
|
-
|
|
327
|
+
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
328
|
+
|
|
374
329
|
const header = document.createElement("tr");
|
|
375
330
|
const cAttributeRule = document.createElement("th");
|
|
376
331
|
cAttributeRule.textContent = "Attribute Rule"
|
|
@@ -439,48 +394,70 @@ async function loadSQLLogs () {
|
|
|
439
394
|
const tblResult = document.getElementById("tblResult");
|
|
440
395
|
//clear
|
|
441
396
|
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
442
|
-
|
|
443
|
-
|
|
397
|
+
|
|
444
398
|
|
|
445
399
|
parameters.service = cmbService.options[cmbService.selectedIndex].text
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
logger.info("Connected.")
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
let mins = document.getElementById("txtAge").value //query logs for the last 30 minutes
|
|
451
403
|
|
|
404
|
+
|
|
405
|
+
console.log(`Querying cursor sql logs for ${parameters.service} for the last ${mins} minutes ...`)
|
|
452
406
|
|
|
453
|
-
|
|
454
|
-
|
|
407
|
+
//startTime is the most recent
|
|
408
|
+
//endTime is the oldest
|
|
455
409
|
|
|
456
|
-
|
|
410
|
+
|
|
457
411
|
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
const startTime = Date.now()
|
|
461
|
-
const endTime = Date.now()
|
|
462
|
-
let services = [
|
|
463
|
-
if (
|
|
412
|
+
/*
|
|
413
|
+
const topLogCount = 100;
|
|
414
|
+
const startTime = Date.now()
|
|
415
|
+
const endTime = Date.now() - mins*60*1000
|
|
416
|
+
let services = [theService + ".MapServer"]
|
|
417
|
+
if (theService == "(All Services)")
|
|
464
418
|
services = "*"
|
|
465
|
-
let result= await adminLog.query([
|
|
419
|
+
let result= await adminLog.query([code], services, topLogCount, startTime ,endTime , "DEBUG")
|
|
466
420
|
let jsonRes = await result.json()
|
|
467
421
|
let allMessages = [].concat(jsonRes.logMessages)
|
|
468
422
|
allMessages = allMessages.filter(m => m.message.indexOf("EndCursor;") > -1)
|
|
469
423
|
while (jsonRes.hasMore)
|
|
470
424
|
{
|
|
471
425
|
//start paging
|
|
472
|
-
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs
|
|
473
|
-
result= await adminLog.query([102023], services, pageSize, jsonRes.endTime,
|
|
426
|
+
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs between ${new Date(jsonRes.endTime)} and ${new Date(endTime)}`)
|
|
427
|
+
result= await adminLog.query([102023], services, pageSize, jsonRes.endTime, endTime, "DEBUG")
|
|
474
428
|
jsonRes = await result.json()
|
|
475
429
|
|
|
476
430
|
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("EndCursor;") > -1))
|
|
477
431
|
}
|
|
432
|
+
*/
|
|
433
|
+
|
|
434
|
+
//page query the admin log
|
|
435
|
+
let allMessages = await adminLogQueryWithPaging(mins, parameters.service, [102023], "EndCursor;", "DEBUG")
|
|
436
|
+
|
|
437
|
+
|
|
478
438
|
console.log ("Filtering messages...")
|
|
479
439
|
|
|
480
|
-
allMessages = allMessages
|
|
440
|
+
allMessages = filterMessages(allMessages)
|
|
481
441
|
.map( m=> {
|
|
482
|
-
m.dataAccessElapsed =
|
|
483
|
-
m.executeQueryElapsed =
|
|
442
|
+
m.dataAccessElapsed =0;
|
|
443
|
+
m.executeQueryElapsed = 0;
|
|
444
|
+
const sDataAccess = "DataAccess "
|
|
445
|
+
const idxDataAccess = m.message.indexOf(sDataAccess)
|
|
446
|
+
if (idxDataAccess >=0) {
|
|
447
|
+
const idxNext = m.message.indexOf(" ",idxDataAccess + sDataAccess.length )
|
|
448
|
+
m.dataAccessElapsed = parseInt(m.message.substr( idxDataAccess + sDataAccess.length, idxNext - idxDataAccess - sDataAccess.length))
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
const sExecuteQuery = "ExecuteQuery "
|
|
452
|
+
const idxExecuteQuery = m.message.indexOf(sExecuteQuery)
|
|
453
|
+
if (idxExecuteQuery >=0) {
|
|
454
|
+
const idxNext = m.message.indexOf(" ",idxExecuteQuery + sExecuteQuery.length)
|
|
455
|
+
m.executeQueryElapsed = parseInt(m.message.substr( idxExecuteQuery + sExecuteQuery.length, idxNext - idxExecuteQuery - sExecuteQuery.length))
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
//m.dataAccessElapsed = parseFloat(m.message.split(";")[1].split(" ")[1])
|
|
460
|
+
//m.executeQueryElapsed = parseFloat(m.message.split(";")[2].split(" ")[1])
|
|
484
461
|
m.totalExecutionElapsed = m.dataAccessElapsed + m.executeQueryElapsed
|
|
485
462
|
m.elapsed = parseFloat(m.elapsed); return m;
|
|
486
463
|
|
|
@@ -489,7 +466,7 @@ tblResult.appendChild(document.createTextNode("Loading...."));
|
|
|
489
466
|
.slice(0, 100) ;//first 100
|
|
490
467
|
|
|
491
468
|
|
|
492
|
-
console.log("-----Top
|
|
469
|
+
console.log("-----Top SQL----")
|
|
493
470
|
while(tblResult.firstChild) tblResult.removeChild(tblResult.firstChild)
|
|
494
471
|
|
|
495
472
|
let i =0;
|
|
@@ -501,8 +478,8 @@ tblResult.appendChild(document.createTextNode("Loading...."));
|
|
|
501
478
|
cTime.textContent = "Time"
|
|
502
479
|
const cUser = document.createElement("th");
|
|
503
480
|
cUser.textContent = "User"
|
|
504
|
-
const
|
|
505
|
-
|
|
481
|
+
const cVersion = document.createElement("th");
|
|
482
|
+
cVersion.textContent = "Version"
|
|
506
483
|
const cQueryTime = document.createElement("th");
|
|
507
484
|
cQueryTime.textContent = "Query Time (ms)"
|
|
508
485
|
cQueryTime.title = "includes search + data access nextRow"
|
|
@@ -514,7 +491,7 @@ tblResult.appendChild(document.createTextNode("Loading...."));
|
|
|
514
491
|
header.appendChild (cService)
|
|
515
492
|
header.appendChild (cTime)
|
|
516
493
|
header.appendChild (cUser)
|
|
517
|
-
header.appendChild (
|
|
494
|
+
header.appendChild (cVersion)
|
|
518
495
|
header.appendChild (cQueryTime)
|
|
519
496
|
header.appendChild (cTotalTime)
|
|
520
497
|
header.appendChild (cLog)
|
|
@@ -544,21 +521,32 @@ tblResult.appendChild(document.createTextNode("Loading...."));
|
|
|
544
521
|
|
|
545
522
|
const cUser = document.createElement("td");
|
|
546
523
|
cUser.textContent = m.user
|
|
547
|
-
const
|
|
548
|
-
|
|
524
|
+
const cVersion = document.createElement("td");
|
|
525
|
+
const idxVersion = m.message.indexOf("Version: ")
|
|
526
|
+
if (idxVersion >=0) {
|
|
527
|
+
const idxNext = m.message.indexOf(";",idxVersion)
|
|
528
|
+
cVersion.textContent = m.message.substr( idxVersion + 9, idxNext - idxVersion - 9 )
|
|
529
|
+
}
|
|
549
530
|
const cQueryTime = document.createElement("td");
|
|
550
531
|
cQueryTime.textContent = numberWithCommas(m.totalExecutionElapsed)
|
|
551
532
|
const cTotalTime = document.createElement("td");
|
|
552
533
|
cTotalTime.textContent = numberWithCommas(Math.round(m.elapsed*1000))
|
|
553
534
|
const cLog = document.createElement("td");
|
|
554
|
-
|
|
535
|
+
const cLogText = document.createElement("input")
|
|
536
|
+
cLogText.type = "text"
|
|
537
|
+
cLogText.style = "width:500px"
|
|
538
|
+
cLogText.value = m.message.substr( m.message.indexOf("SQL: ") + 5, m.message.length)
|
|
539
|
+
cLogText.readOnly= true;
|
|
540
|
+
cLog.appendChild(cLogText)
|
|
541
|
+
//cLog.textContent = m.message.substr( m.message.indexOf("SQL: ") + 5, 50) + "..."
|
|
555
542
|
cLog.fullLog = m.message;
|
|
556
543
|
cLog.title = m.message + "\nClick to copy"
|
|
557
|
-
cLog.addEventListener("click", e=> {navigator.clipboard.writeText(e.target.fullLog);
|
|
544
|
+
cLog.addEventListener("click", e=> {navigator.clipboard.writeText(e.target.fullLog); e.target.selectionStart = 0; e.target.selectionEnd = e.target.value.length;
|
|
545
|
+
/* alert("Copied to clipboard") */})
|
|
558
546
|
logRow.appendChild (cService)
|
|
559
547
|
logRow.appendChild (cTime)
|
|
560
548
|
logRow.appendChild (cUser)
|
|
561
|
-
logRow.appendChild (
|
|
549
|
+
logRow.appendChild (cVersion)
|
|
562
550
|
logRow.appendChild (cQueryTime)
|
|
563
551
|
logRow.appendChild (cTotalTime)
|
|
564
552
|
logRow.appendChild (cLog)
|
|
@@ -584,30 +572,50 @@ function numberWithCommas(x) {
|
|
|
584
572
|
return x.toLocaleString()
|
|
585
573
|
}
|
|
586
574
|
|
|
587
|
-
init();
|
|
575
|
+
//init();
|
|
588
576
|
|
|
589
577
|
const btnTraceLogs = document.getElementById("btnTraceLogs");
|
|
590
578
|
btnTraceLogs.addEventListener("click", e => loadTraceLogs())
|
|
579
|
+
btnTraceLogs.disabled = true
|
|
591
580
|
|
|
592
581
|
const btnValidateLogs = document.getElementById("btnValidateLogs");
|
|
593
582
|
btnValidateLogs.addEventListener("click", e => loadValidateLogs())
|
|
583
|
+
btnValidateLogs.disabled = true
|
|
594
584
|
|
|
595
585
|
const btnUpdateSubnetworkLogs = document.getElementById("btnUpdateSubnetworkLogs");
|
|
596
586
|
btnUpdateSubnetworkLogs.addEventListener("click", e => loadUpdateSubnetworkLogs())
|
|
597
|
-
|
|
587
|
+
btnUpdateSubnetworkLogs.disabled = true
|
|
588
|
+
|
|
598
589
|
const btnSQLLogs = document.getElementById("btnSQLLogs");
|
|
599
590
|
btnSQLLogs.addEventListener("click", e => loadSQLLogs())
|
|
600
|
-
|
|
591
|
+
btnSQLLogs.disabled = true
|
|
592
|
+
|
|
601
593
|
const btnAR = document.getElementById("btnAR");
|
|
602
594
|
btnAR.addEventListener("click", e => loadAttributeRules())
|
|
603
|
-
|
|
604
|
-
|
|
595
|
+
btnAR.disabled = true
|
|
596
|
+
|
|
597
|
+
function filterMessages (allMessages) {
|
|
598
|
+
const txtFilter = document.getElementById("txtFilter")
|
|
599
|
+
const txtUser = document.getElementById("txtUser")
|
|
600
|
+
if (txtFilter.value == "" && txtUser.value == "") return allMessages;
|
|
601
|
+
//const filtered= allMessages.filter(m => m.message.toUpperCase().indexOf(txtFilter.value.toUpperCase()) > 0 && m.user.toUpperCase().indexOf(txtUser.value.toUpperCase()) > 0)
|
|
602
|
+
const filtered= allMessages.filter(m => {
|
|
603
|
+
|
|
604
|
+
if (m.message.toUpperCase().indexOf(txtFilter.value.toUpperCase()) >= 0
|
|
605
|
+
&&
|
|
606
|
+
m.user.toUpperCase().indexOf(txtUser.value.toUpperCase()) >= 0)
|
|
607
|
+
return true
|
|
608
|
+
|
|
609
|
+
return false
|
|
610
|
+
})
|
|
611
|
+
return filtered
|
|
612
|
+
}
|
|
605
613
|
|
|
606
614
|
async function populateMessages(allTheMessages) {
|
|
607
615
|
|
|
608
616
|
//sort messages
|
|
609
617
|
|
|
610
|
-
const allMessages = allTheMessages.map(m => {
|
|
618
|
+
const allMessages = filterMessages (allTheMessages).map(m => {
|
|
611
619
|
const newMessage = Object.assign({}, m);
|
|
612
620
|
delete newMessage.machine;
|
|
613
621
|
delete newMessage.type;
|
|
@@ -672,6 +680,65 @@ function numberWithCommas(x) {
|
|
|
672
680
|
tblResult.appendChild(logRow)
|
|
673
681
|
})
|
|
674
682
|
}
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
async function adminLogQueryWithPaging(mins, theService, code, filter, level){
|
|
686
|
+
const topLogCount = 1000;
|
|
687
|
+
let stop = false;
|
|
688
|
+
const prg = document.createTextNode("Loading.... 0%");
|
|
689
|
+
const btn = document.createElement("button")
|
|
690
|
+
btn.textContent = '🛑'
|
|
691
|
+
btn.addEventListener("click", ()=> stop = true )
|
|
692
|
+
//create a new admin object (user might not be admin we won't use it until the user call log )
|
|
693
|
+
let adminLog = new AdminLog(token, portal.serverUrl)
|
|
694
|
+
tblResult.appendChild(prg);
|
|
695
|
+
tblResult.appendChild(btn)
|
|
696
|
+
const startTime = Date.now()
|
|
697
|
+
const endTime = Date.now() - mins*60*1000
|
|
698
|
+
let services = [theService + ".MapServer"]
|
|
699
|
+
if (theService == "(All Services)")
|
|
700
|
+
services = "*"
|
|
701
|
+
let result= await adminLog.query(code, services, topLogCount, startTime ,endTime , level)
|
|
702
|
+
let jsonRes = await result.json()
|
|
703
|
+
let allMessages = [].concat(jsonRes.logMessages)
|
|
704
|
+
allMessages = allMessages.filter(m => m.message.indexOf(filter) > -1)
|
|
705
|
+
while (jsonRes.hasMore && !stop)
|
|
706
|
+
{
|
|
707
|
+
//start paging
|
|
708
|
+
prg.textContent = "Loading ... " + parseInt((( (startTime - endTime) - (jsonRes.endTime - endTime) ) /((startTime - endTime)))*100) + "%"
|
|
709
|
+
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs between ${new Date(jsonRes.endTime)} and ${new Date(endTime)}`)
|
|
710
|
+
result= await adminLog.query(code, services, topLogCount, jsonRes.endTime, endTime, level)
|
|
711
|
+
jsonRes = await result.json()
|
|
712
|
+
|
|
713
|
+
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf(filter) > -1))
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
return allMessages
|
|
717
|
+
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
/*
|
|
722
|
+
const topLogCount = 100;f
|
|
723
|
+
const startTime = Date.now()
|
|
724
|
+
const endTime = Date.now() - mins*60*1000
|
|
725
|
+
let services = [theService + ".MapServer"]
|
|
726
|
+
if (theService == "(All Services)")
|
|
727
|
+
services = "*"
|
|
728
|
+
let result= await adminLog.query([code], services, topLogCount, startTime ,endTime , "DEBUG")
|
|
729
|
+
let jsonRes = await result.json()
|
|
730
|
+
let allMessages = [].concat(jsonRes.logMessages)
|
|
731
|
+
allMessages = allMessages.filter(m => m.message.indexOf("EndCursor;") > -1)
|
|
732
|
+
while (jsonRes.hasMore)
|
|
733
|
+
{
|
|
734
|
+
//start paging
|
|
735
|
+
logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs between ${new Date(jsonRes.endTime)} and ${new Date(endTime)}`)
|
|
736
|
+
result= await adminLog.query([102023], services, pageSize, jsonRes.endTime, endTime, "DEBUG")
|
|
737
|
+
jsonRes = await result.json()
|
|
738
|
+
|
|
739
|
+
allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("EndCursor;") > -1))
|
|
740
|
+
}
|
|
741
|
+
*/
|
|
675
742
|
</script>
|
|
676
743
|
</body>
|
|
677
744
|
</html>
|
package/index.mjs
CHANGED
|
@@ -7,7 +7,7 @@ import { AdminLog } from "./adminlog.mjs"
|
|
|
7
7
|
import logger from "./logger.mjs"
|
|
8
8
|
import fetch from "node-fetch"
|
|
9
9
|
//update version
|
|
10
|
-
let version = "0.0.
|
|
10
|
+
let version = "0.0.72";
|
|
11
11
|
const GENERATE_TOKEN_TIME_MIN = 30;
|
|
12
12
|
|
|
13
13
|
let rl = null;
|
|
@@ -411,23 +411,33 @@ const inputs = {
|
|
|
411
411
|
"^update subnetworks --all" : async input => {
|
|
412
412
|
|
|
413
413
|
let subnetworks;
|
|
414
|
+
let more = false;
|
|
415
|
+
let failedSubnetworks = []
|
|
414
416
|
do {
|
|
415
417
|
|
|
416
418
|
let sort = "asc";
|
|
417
419
|
if (input.indexOf("--desc") > 0) sort = "desc"
|
|
420
|
+
let failedSubWhereClause = ""
|
|
421
|
+
|
|
422
|
+
if (failedSubnetworks.length > 0 )
|
|
423
|
+
failedSubWhereClause = " AND SUBNETWORKNAME NOT IN (" + failedSubnetworks.join(",") + ")"
|
|
418
424
|
|
|
419
425
|
console.log("Querying all subnetworks that are dirty.");
|
|
420
|
-
subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1", `domainnetworkname ${sort},tiername ${sort},subnetworkname ${sort}`);
|
|
426
|
+
subnetworks = await un.queryDistinct(500002, "domainnetworkname,tiername,subnetworkname", "isdirty=1 " + failedSubWhereClause, `domainnetworkname ${sort},tiername ${sort},subnetworkname ${sort}`);
|
|
421
427
|
console.log(`Discovered ${subnetworks.features.length} dirty subnetworks.`);
|
|
422
428
|
|
|
423
429
|
for (let i = 0; i < subnetworks.features.length; i++) {
|
|
424
430
|
const f = subnetworks.features[i]
|
|
425
|
-
|
|
431
|
+
const subnetworkName = v(f.attributes,"subnetworkName")
|
|
432
|
+
console.log("Updating Subnetwork " + subnetworkName);
|
|
426
433
|
|
|
427
434
|
const fromDate = new Date();
|
|
428
435
|
|
|
429
436
|
const subnetworkResult = await un.updateSubnetworks(v(f.attributes,"domainNetworkName"), v(f.attributes,"tierName"), v(f.attributes,"subnetworkName"),false);
|
|
430
|
-
|
|
437
|
+
//check if we have processed this subnetwork (maybe be an error)
|
|
438
|
+
if (subnetworkResult.success == false)
|
|
439
|
+
failedSubnetworks.push("'" + subnetworkName + "'")
|
|
440
|
+
|
|
431
441
|
const toDate = new Date();
|
|
432
442
|
const timeEnable = toDate.getTime() - fromDate.getTime();
|
|
433
443
|
subnetworkResult.duration = numberWithCommas(Math.round(timeEnable)) + " ms"
|