getHomePageData(); function getHomePageData() { // *** USER VARIABLES *** var deltaTime = 24; // Time span for queries - in hours and defaults to 1 day var recordNumber = 30; // Number of records to display from sys_query_pattern e.t.c. deltaTime = deltaTime * 3600; // Convert deltaTime to seconds var endTime = new GlideDateTime(); // Script window end var startTime = new GlideDateTime(); // Script window start startTime.addSeconds(-deltaTime); var sliverSize = 15; // Initial sliver size in seconds var maxRunTime = 120 // Maximum time certain components should run for before aborting // *** END OF SCRIPT VARIABLES *** // *** DETAILS OF ENVIRONMENT *** printheader("ENVIRONMENT"); gs.print("Script version: 3.0"); gs.print("Instance name: " + gs.getProperty('instance_name').toString()); gs.print("Platform version: " + gs.getProperty('glide.buildtag').toString()); gs.print("Date/time of scan (UTC): " + new GlideDateTime()); gs.print(""); // *** END OF DETAILS OF ENVIRONMENT *** // *** HOME PAGES *** printheader("HOME PAGE REFRESH"); if (gs.getProperty('glide.home.refresh_intervals') != null) { gs.print("Available choices from sys_properties (glide.home.refresh_intervals): " + gs.getProperty('glide.home.refresh_intervals').toString()); } else { gs.print("Available choices from sys_properties (glide.home.refresh_intervals): Not set (will default to 300,900,1800,3600)") } gr = new GlideRecord('sys_user_preference'); gr.addQuery('name', 'home_refresh'); gr.addQuery('system', '1'); gr.setWorkflow(false); gr.query(); if (gr.next()) { gs.print("Default from sys_user_preference (home_refresh): " + gr.value); refreshDefault=gr.value.toString(); } else { gs.print("Default from sys_user_preference (home_refresh): Not set (will default to off)"); refreshDefault="Off"; } var header=["VALUE", "NUMBER OF USERS"]; var values=[]; gr = new GlideAggregate('sys_user_preference'); gr.addQuery('name', 'home_refresh'); gr.addQuery('system', '0'); gr.addAggregate('COUNT', 'value'); gr.orderByAggregate('COUNT', 'value'); gr.setWorkflow(false); gr.query(); if (gr.getRowCount() > 0) { for (var i=0; gr.next(); i++) { values[i]=[gr.value.toString(), gr.getAggregate('COUNT', 'value').toString()] } gs.print("Count of users with explicit setting grouped by value:"); gs.print(""); dumptable(header, values); gs.print(""); } else { gs.print("") } printheader("USERS WITH MOST EXPENSIVE HOME PAGES"); // Loop querying syslog in chunks - this is expensive so only run for maxRunTime var sectionStart = new GlideDateTime().getNumericValue(); var mySliverSize = sliverSize; var sliverEnd = new GlideDateTime(endTime.getValue()); var sliverStart = new GlideDateTime(endTime.getValue()); sliverStart.addSeconds(-mySliverSize); var homeEntries = []; var totHome = 0; while (true) { var loopStart = new GlideDateTime().getNumericValue(); var gr = new GlideRecord('syslog_transaction'); gr.addQuery('url', 'STARTSWITH', '/home.do'); gr.addQuery('sys_created_on', '>=', sliverStart); gr.addQuery('sys_created_on', '<', sliverEnd); gr.setWorkflow(false); gr.query(); while (gr.next()) { totHome++; var processingTime = parseInt(gr.transaction_processing_time); for (var i = 0; i < homeEntries.length; i++) { if (homeEntries[i][0] == gr.sys_created_by.toString()) { break } } if (i < homeEntries.length) { homeEntries[i][1]++; homeEntries[i][2] += processingTime; if (processingTime > homeEntries[i][3]) { homeEntries[i][3] = processingTime } } else { homeEntries.push([gr.sys_created_by.toString(), 1, processingTime, processingTime]); } } // Have we exceeded maxRunTime? If so then we should break if (runTimeExceeded(sectionStart, maxRunTime)) { break } // Set sliver size mySliverSize = setSliverSize(mySliverSize, loopStart); if (sliverStart.getValue() == startTime.getValue()) { break; } else { sliverEnd = new GlideDateTime(sliverStart.getValue()); sliverStart.addSeconds(-mySliverSize); if (sliverStart < startTime) { sliverStart = new GlideDateTime(startTime.getValue()) } } } homeEntries.sort(sortFunction2); header=["USER", "COUNT", "TOTAL TIME(ms)", "AVERAGE TIME(ms)", "MAXIMUM TIME(ms)", "REFRESH INTERVAL(s)"]; values=[]; gs.print("Total home page load transactions from " + sliverStart + " to " + endTime + ": " + totHome); if (totHome > 0) { for (var i=0; (i < homeEntries.length) && (i < recordNumber); i++) { var gr = new GlideRecord('sys_user'); gr.addQuery('user_name', homeEntries[i][0]); gr.setWorkflow(false); gr.query(); if (gr.next()) { var userName = gr.sys_id; var gr = new GlideRecord('sys_user_preference'); gr.addQuery('name', 'home_refresh'); gr.addQuery('user', userName); gr.addQuery('system', '0'); gr.setWorkflow(false); gr.query(); if (gr.next()) { values.push([homeEntries[i][0].toString(), homeEntries[i][1].toString(), homeEntries[i][2].toString(), (homeEntries[i][2] / homeEntries[i][1]).toFixed(2).toString(), homeEntries[i][3].toString(), gr.value.toString()]); continue; } else { values.push([homeEntries[i][0].toString(), homeEntries[i][1].toString(), homeEntries[i][2].toString(), (homeEntries[i][2] / homeEntries[i][1]).toFixed(2).toString(), homeEntries[i][3].toString(), "Default (" + refreshDefault + ")"]); } } else { values.push([homeEntries[i][0].toString(), homeEntries[i][1].toString(), homeEntries[i][2].toString(), (homeEntries[i][2] / homeEntries[i][1]).toFixed(2).toString(), homeEntries[i][3].toString(), "Default (" + refreshDefault + ")"]); } } dumptable(header, values); gs.print(""); } else { gs.print("") } homeEntries = []; // *** END OF HOME PAGES *** } // *** FUNCTION DEINITIONS *** function setSliverSize(mySliverSize, loopStart) { var loopEnd = new GlideDateTime().getNumericValue(); if (((loopEnd - loopStart) / 1000) >= 5) { if (mySliverSize > 15) { mySliverSize = mySliverSize / 2 } } else { mySliverSize = mySliverSize * 2 } return mySliverSize; } function runTimeExceeded(sectionStart, maxRunTime) { var loopEnd = new GlideDateTime().getNumericValue(); if (((loopEnd - sectionStart) / 1000) > maxRunTime) { return 1 } return 0; } function sortFunction2(a, b) { if (a[2] === b[2]) { return 0; } else { return (a[2] < b[2]) ? 1 : -1; } } function printheader(header) { // Size of delimiter var delimiterWidth = 64; var outline = ""; for (var i=0; i maxlength) { maxlength=header[i].length } for (var j=0; j maxlength) { maxlength=values[j][i].length } } // Now pad header and value to max length while (header[i].length < maxlength) { header[i] = header[i] + " " } for (var j=0; j < values.length; j++) { while (values[j][i].length < maxlength) { values[j][i] = values[j][i] + " " } } } // Now dump details to screen var screenstring=""; var screenstring2=""; // First the header for (var i=0; i 0) { screenstring=screenstring+" "; screenstring2=screenstring2+" "; } screenstring=screenstring + header[i]; for (var j=0; j 0) { screenstring=screenstring+" " } screenstring=screenstring+values[i][j]; } gs.print(screenstring); } } // *** END OF FUNCTION DEFINITIONS ***