un-cli 0.0.61 → 0.0.65

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/adminlog.mjs CHANGED
@@ -13,10 +13,10 @@ export class AdminLog {
13
13
  this.token = token;
14
14
  }
15
15
 
16
- query (codes, serviceName ="*", pageSize = 100000, startTime = null, endTime = null)
16
+ query (codes, serviceName ="*", pageSize = 100000, startTime = null, endTime = null, logLevel = "DEBUG")
17
17
  {
18
18
  const url = this.adminServerUrl + "/logs/query?f=pjson"
19
- const level = "DEBUG"
19
+ const level = logLevel
20
20
  const filterType="json"
21
21
  const token = this.token
22
22
  const filter = {
package/cmd.txt CHANGED
@@ -1,4 +1,3 @@
1
- subnetworks
2
- arlogs --byrule --maxguid
3
- arlogs --byrule --minguid
4
- arlogs --byrule
1
+ trace --subnetwork NW53-22313
2
+ topsql --age 2
3
+ exit
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.61";
10
+ let version = "0.0.65";
11
11
  const GENERATE_TOKEN_TIME_MIN = 30;
12
12
 
13
13
  let rl = null;
@@ -178,8 +178,13 @@ const inputs = {
178
178
  "count": "Lists the number of rows in all feature layers.",
179
179
  "count --system": "Lists the number of rows in system layers.",
180
180
  "connect --service": "Connects to the another service",
181
- "arlogs": "Lists attribute rules execution logs (requires admin)",
181
+ "tracelogs --age <minutes>": "Lists utility network trace summary logs for the last x minutes (requires admin)",
182
+ "validatelogs --age <minutes>": "Lists utility network validate summary logs for the last x minutes (requires admin)",
183
+ "updatesubnetworkslog --age <minutes>": "Lists utility network update subnetworks summary logs for the last x minutes (requires admin)",
184
+ "arlogs --age <minutes>": "Lists attribute rules execution logs for the last x minutes (requires admin)",
182
185
  "arlogs --byrule [--minguid --maxguid]": "Lists attribute rules execution summary by rule (requires admin), --maxguid and --minguid show the GUID of the feature",
186
+ "topsql --age <minutes>": "Lists all queries executed in the last x minutes (requires admin)",
187
+
183
188
  "whoami": "Lists the current login info",
184
189
  "clear": "Clears this screen",
185
190
  "quit": "Exit this program"
@@ -673,17 +678,27 @@ const inputs = {
673
678
 
674
679
  },
675
680
 
676
- "^arlogs$": async () => {
681
+ "^arlogs --age": async input => {
677
682
  const topLogCount = 200;
678
683
  const pageSize = 10000
679
- console.log(`Querying attribute rules logs for ${parameters.service} ...`)
680
- console.log(`Displaying top ${topLogCount} entries only..`)
681
684
 
682
- let result= await adminLog.query([102003], [parameters.service+ ".MapServer"], topLogCount)
685
+
686
+ const inputParam = input.match(/--age .*/gm)
687
+ let mins = 30; //query logs for the last 30 minutes
688
+ if (inputParam != null && inputParam.length > 0)
689
+ mins = inputParam[0].replace("--age ", "")
690
+
691
+
692
+ console.log(`Querying attribute rules logs for ${parameters.service} for the last ${mins} minutes ...`)
693
+
694
+ const startTime = Date.now() - mins*60*1000
695
+ const endTime = Date.now();
696
+
697
+ let result= await adminLog.query([102003], [parameters.service+ ".MapServer"], topLogCount, startTime, endTime , "DEBUG")
683
698
  let jsonRes = await result.json()
684
699
  let allMessages = [].concat(jsonRes.logMessages)
685
700
 
686
- while (jsonRes.hasMore && allMessages.filter(m => m.message.indexOf("Attribute rule execution complete:") > -1).length < topLogCount )
701
+ while (jsonRes.hasMore )
687
702
  {
688
703
  //start paging
689
704
  logger.info(`Aggregating messages... total so far ${allMessages.length} debug entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
@@ -713,6 +728,254 @@ const inputs = {
713
728
 
714
729
  },
715
730
 
731
+
732
+
733
+ "^tracelogs --age": async input => {
734
+ const topLogCount = 1000;
735
+ const pageSize = 10000
736
+
737
+ const inputParam = input.match(/--age .*/gm)
738
+ let mins = 30; //query logs for the last 30 minutes
739
+ if (inputParam != null && inputParam.length > 0)
740
+ mins = inputParam[0].replace("--age ", "")
741
+
742
+ console.log(`Querying trace logs for ${parameters.service} for the last ${mins} minutes ...`)
743
+ const startTime = Date.now() - mins*60*1000
744
+ const endTime = Date.now();
745
+ let result= await adminLog.query([102002], [parameters.service+ ".MapServer"], topLogCount, startTime ,endTime , "VERBOSE")
746
+ let jsonRes = await result.json()
747
+ let allMessages = [].concat(jsonRes.logMessages)
748
+ allMessages = allMessages.filter(m => m.message.indexOf("------ Trace Parameters ----") > -1)
749
+ while (jsonRes.hasMore)
750
+ {
751
+ //start paging
752
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
753
+ result= await adminLog.query([102002], [parameters.service + ".MapServer"], pageSize, jsonRes.endTime, null, "VERBOSE")
754
+ jsonRes = await result.json()
755
+
756
+ allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("------ Trace Parameters ----") > -1))
757
+ }
758
+ allMessages.forEach(m => {
759
+ const newMessage = Object.assign({}, m);
760
+ delete newMessage.message
761
+ delete newMessage.source;
762
+ delete newMessage.machine;
763
+ delete newMessage.type;
764
+ delete newMessage.requestID;
765
+ delete newMessage.thread;
766
+ delete newMessage.time;
767
+
768
+ console.table([newMessage])
769
+ console.log(m.message)
770
+ })
771
+
772
+ },
773
+
774
+
775
+
776
+ "^validatelogs --age": async input => {
777
+
778
+ const topLogCount = 1000;
779
+ const pageSize = 10000
780
+
781
+ const inputParam = input.match(/--age .*/gm)
782
+ let mins = 30; //query logs for the last 30 minutes
783
+ if (inputParam != null && inputParam.length > 0)
784
+ mins = inputParam[0].replace("--age ", "")
785
+
786
+ console.log(`Querying validate logs for ${parameters.service} for the last ${mins} minutes ...`)
787
+ const startTime = Date.now() - mins*60*1000
788
+ const endTime = Date.now();
789
+ let result= await adminLog.query([102003], [parameters.service+ ".MapServer"], topLogCount, startTime ,endTime , "VERBOSE")
790
+ let jsonRes = await result.json()
791
+ let allMessages = [].concat(jsonRes.logMessages)
792
+ allMessages = allMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("------ Trace Parameters ----") < 0)
793
+ while (jsonRes.hasMore)
794
+ {
795
+ //start paging
796
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
797
+ result= await adminLog.query([102003], [parameters.service + ".MapServer"], pageSize, jsonRes.endTime, null, "VERBOSE")
798
+ jsonRes = await result.json()
799
+
800
+ allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("-------- Environment ---") > -1 && m.message.indexOf("------ Trace Parameters ----") == -1))
801
+ }
802
+
803
+
804
+ allMessages.forEach(m => {
805
+ const newMessage = Object.assign({}, m);
806
+ delete newMessage.message
807
+ delete newMessage.source;
808
+ delete newMessage.machine;
809
+ delete newMessage.type;
810
+ delete newMessage.requestID;
811
+ delete newMessage.thread;
812
+ delete newMessage.time;
813
+
814
+ console.table([newMessage])
815
+ console.log(m.message)
816
+ })
817
+
818
+ },
819
+
820
+
821
+
822
+
823
+ "^updatesubnetworkslogs --age": async input => {
824
+ const topLogCount = 1000;
825
+ const pageSize = 10000
826
+
827
+ const inputParam = input.match(/--age .*/gm)
828
+ let mins = 30; //query logs for the last 30 minutes
829
+ if (inputParam != null && inputParam.length > 0)
830
+ mins = inputParam[0].replace("--age ", "")
831
+
832
+ console.log(`Querying subnetwork logs for ${parameters.service} for the last ${mins} minutes ...`)
833
+ const startTime = Date.now() - mins*60*1000
834
+ const endTime = Date.now();
835
+ let result= await adminLog.query([102003], [parameters.service+ ".MapServer"], topLogCount, startTime ,endTime , "VERBOSE")
836
+ let jsonRes = await result.json()
837
+ let allMessages = [].concat(jsonRes.logMessages)
838
+ allMessages = allMessages.filter(m => m.message.indexOf("---- Subnetwork Parameters ----") > -1)
839
+ while (jsonRes.hasMore)
840
+ {
841
+ //start paging
842
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
843
+ result= await adminLog.query([102003], [parameters.service + ".MapServer"], pageSize, jsonRes.endTime, null, "VERBOSE")
844
+ jsonRes = await result.json()
845
+
846
+ allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("---- Subnetwork Parameters ----") > -1))
847
+ }
848
+ allMessages.forEach(m => {
849
+ const newMessage = Object.assign({}, m);
850
+ delete newMessage.message
851
+ delete newMessage.source;
852
+ delete newMessage.machine;
853
+ delete newMessage.type;
854
+ delete newMessage.requestID;
855
+ delete newMessage.thread;
856
+ delete newMessage.time;
857
+
858
+ console.table([newMessage])
859
+ console.log(m.message)
860
+ })
861
+
862
+ },
863
+
864
+
865
+
866
+ "^topsql --age": async input => {
867
+ const topLogCount = 1000;
868
+ const pageSize = 10000
869
+
870
+ const inputParam = input.match(/--age .*/gm)
871
+ let mins = 30; //query logs for the last 30 minutes
872
+ if (inputParam != null && inputParam.length > 0)
873
+ mins = inputParam[0].replace("--age ", "")
874
+
875
+ console.log(`Querying cursor sql logs for ${parameters.service} for the last ${mins} minutes ...`)
876
+ const startTime = Date.now() - mins*60*1000
877
+ const endTime = Date.now();
878
+ let result= await adminLog.query([102023], [parameters.service+ ".MapServer"], topLogCount, startTime ,endTime , "DEBUG")
879
+ let jsonRes = await result.json()
880
+ let allMessages = [].concat(jsonRes.logMessages)
881
+ allMessages = allMessages.filter(m => m.message.indexOf("EndCursor;") > -1)
882
+ while (jsonRes.hasMore)
883
+ {
884
+ //start paging
885
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
886
+ result= await adminLog.query([102023], [parameters.service + ".MapServer"], pageSize, jsonRes.endTime, null, "DEBUG")
887
+ jsonRes = await result.json()
888
+
889
+ allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("EndCursor;") > -1))
890
+ }
891
+ console.log ("Filtering messages...")
892
+ allMessages = allMessages
893
+ .map( m=> {
894
+ m.dataAccessElapsed = parseFloat(m.message.split(";")[1].split(" ")[1])
895
+ m.ExecuteQueryElapsed = parseFloat(m.message.split(";")[2].split(" ")[1])
896
+ m.totalTimeElapsed = m.dataAccessElapsed + m.ExecuteQueryElapsed
897
+ m.elapsed = parseFloat(m.elapsed); return m;
898
+
899
+ })
900
+ .sort( (m1,m2) => m2.totalTimeElapsed - m1.totalTimeElapsed)
901
+ .slice(0, 10) ;//first 10
902
+
903
+
904
+ console.log("-----Top 10 SQL----")
905
+ let i =0;
906
+ allMessages= allMessages.forEach(m =>
907
+ {
908
+
909
+ const x = m.message.split(";")
910
+ console.log(`id: ${i++}`)
911
+ console.log(`\tAt: ${new Date(m.time)} (${m.time})`)
912
+ console.log(`\tUser: ${m.user}`)
913
+ console.log(`\tElapsed: ${m.elapsed*1000} ms`)
914
+ console.log(`\ttotalTimeElapsed: ${m.totalTimeElapsed} ms`)
915
+ console.log(`\tQuery:`)
916
+ x.forEach(a => console.log(`\t${a}`))
917
+ console.log(`\n`)
918
+
919
+ })
920
+
921
+ },
922
+
923
+
924
+
925
+ "^cursorlogs --age": async input => {
926
+ const topLogCount = 1000;
927
+ const pageSize = 10000
928
+
929
+ const inputParam = input.match(/--age .*/gm)
930
+ let mins = 30; //query logs for the last 30 minutes
931
+ if (inputParam != null && inputParam.length > 0)
932
+ mins = inputParam[0].replace("--age ", "")
933
+
934
+ console.log(`Querying cursor sql logs for ${parameters.service} for the last ${mins} minutes ...`)
935
+ const startTime = Date.now() - mins*60*1000
936
+ const endTime = Date.now();
937
+ let result= await adminLog.query([102023], [parameters.service+ ".MapServer"], topLogCount, startTime ,endTime , "DEBUG")
938
+ let jsonRes = await result.json()
939
+ let allMessages = [].concat(jsonRes.logMessages)
940
+ allMessages = allMessages.filter(m => m.message.indexOf("EndCursor;") > -1)
941
+ while (jsonRes.hasMore)
942
+ {
943
+ //start paging
944
+ logger.info(`Aggregating messages... total so far ${allMessages.length} entries but more left, pulling logs before ${new Date(jsonRes.endTime)}`)
945
+ result= await adminLog.query([102023], [parameters.service + ".MapServer"], pageSize, jsonRes.endTime, null, "DEBUG")
946
+ jsonRes = await result.json()
947
+
948
+ allMessages = allMessages.concat(jsonRes.logMessages.filter(m => m.message.indexOf("EndCursor;") > -1))
949
+ }
950
+
951
+
952
+ //
953
+ allMessages= allMessages.map(m => {
954
+
955
+ const r= m.message.split (";")
956
+ delete r[0];
957
+ delete r[1];
958
+ delete r[3];
959
+ return r;
960
+
961
+ const newMessage = Object.assign({}, m);
962
+
963
+ delete newMessage.source;
964
+ delete newMessage.machine;
965
+ delete newMessage.type;
966
+ delete newMessage.requestID;
967
+ delete newMessage.methodName;
968
+ delete newMessage.process;
969
+ delete newMessage.thread;
970
+ delete newMessage.time;
971
+ delete newMessage.code;
972
+
973
+ return newMessage
974
+
975
+ })
976
+ console.table(allMessages)
977
+ },
978
+
716
979
 
717
980
  "^arlogs --byrule": async input => {
718
981
  //--minguid to show min guid
package/out.txt ADDED
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "un-cli",
3
- "version": "0.0.61",
3
+ "version": "0.0.65",
4
4
  "description": "Command line interface for working with ArcGIS Utility Network Extension",
5
5
  "main": "index.mjs",
6
6
  "bin": {