0% found this document useful (0 votes)
641 views

ServiceNow Performance Review

The document provides instructions for performing a ServiceNow performance review. It includes steps to record baseline instance statistics, review user accounts and licensing, find stalled tasks, deactivate unused applications, check for errors and issues, review infrastructure and data quality, coding practices, and interfaces. Key metrics to collect include response times, memory usage, user counts, task backlogs, and table row sizes.

Uploaded by

Rizwan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
641 views

ServiceNow Performance Review

The document provides instructions for performing a ServiceNow performance review. It includes steps to record baseline instance statistics, review user accounts and licensing, find stalled tasks, deactivate unused applications, check for errors and issues, review infrastructure and data quality, coding practices, and interfaces. Key metrics to collect include response times, memory usage, user counts, task backlogs, and table row sizes.

Uploaded by

Rizwan
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 26

ServiceNow Performance Review

Record the baseline instance statistics for Transaction Time:

System Logs> Transactions (All user)

Average Response time: 759.33

Average SQL time:

Record the baseline statistics in Client Transaction Log:

Average Client Response Time: 3960.4

Average Client Network Time: 962.37

Average Browser Time: 1725.26


Record Baseline Instance Statistics for stats.do:

1. System Diagnostics> Stats > Stats


2. Look under Servlet Memory and Record values

Max Memory: 1980.0

Allocated: 1435.0

In Use: 793.0

Free Percentage: 45

Note: Free Should be over 20%, refresh the page a few times and pay attention for free percentage.

Look under Semaphore Sets Memory and record your Default Values

Available Semaphores: 16

Maximum transaction concurrency: 16


Maximum concurrency achieved: 3

Look under Response Time, Client Network Time, Client Browser Time, and record your values

Server Response Time Client Network Time Client Browser Time


1 Min 0:00:00.087 0:00:00.000 0:00:00.000
5 Min 0:00:00.568 0:00:01.572 0:00:01.344
15 Min 0:00:00.578 0:00:00.694 0:00:01.526
60 Min 0:00:00.512 0:00:00.880 0:00:01.878
1 Day NA NA NA

REVIEW USER ACCOUNTS

1. User Accounts. Are the user accounts correct? Should these users have access to
ServiceNow? (https://instance.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Esource!%3DNULL)

https://shelldevdemand.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Esource!%3DNULL

https://shell.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Esource!%3DNULL

172777
Compare with AD team, are these user accounts correct the count –

2. Local Accounts. How many active local accounts do you have? Should you have local
accounts? A local account is one that doesn't come from Active Directory, Okta, etc and has
the password stored in ServiceNow (https://instance.service-
now.com/sys_user_list.do?sysparm_query=sourceISEMPTY%5Eactive%3Dtrue)

https://shell.service-
now.com/sys_user_list.do?sysparm_query=sourceISEMPTY%5Eactive%3Dtrue

107 Local Accounts


3. Licensing. How many licenses do you have for ServiceNow Licensed access. Do the users
fall under that limit? (https://instance.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Eroles%3Ditil)
https://shell.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Eroles%3Dservicenow_base&sysparm_first
_row=1&sysparm_view=

9192

4. User Licenses. Check Licensed User Accounts that haven't logged in in over 60 days
(https://instance.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Eroles%3Ditil%5Elast_login_
time%3Cjavascript%3Ags.daysAgoStart(60))

https://shelldevdemand.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Eroles%3Ditil%5Elast_login_
time%3Cjavascript%3Ags.daysAgoStart(60)
https://shell.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Eroles%3Dservicenow_base
%5Elast_login_time%3Cjavascript:gs.beginningOfLastMonth()&sysparm_first_row=1&sysp
arm_view=

5. Admin Users. Review admin users and remove unnecessary access


(https://instance.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Eroles%3Dadmin)

https://shelldevdemand.service-
now.com/sys_user_list.do?sysparm_query=active%3Dtrue%5Eroles%3Dadmin
36 Users

6. Service Accounts. Review access and rights for Service Accounts

FIND STALLED TASKS

1. Open Tasks with Assigned to Deactivated (https://instance.service-


now.com/task_list.do?sysparm_query=assigned_to.active%3Dfalse%5Eactive%3Dtrue)

https://shelldevdemand.service-now.com
/task_list.do?sysparm_query=assigned_to.active%3Dfalse%5Eactive%3Dtrue
2. Approval on Closed Tasks (https://instance.service-
now.com/sysapproval_approver_list.do?sysparm_query=sysapproval.active%3Dfalse%5Estate%3D
requested)

https://shelldevdemand.service-
now.com/sysapproval_approver_list.do?sysparm_query=sysapproval.active%3Dfalse%5Estate%3D
requested

3. Approver is deactivated (https://instance.service-


now.com/sysapproval_approver_list.do?sysparm_query=approver.active%3Dfalse%5Estate%3Dre
quested)

https://shelldevdemand.service-
now.com/sysapproval_approver_list.do?sysparm_query=approver.active%3Dfalse%5Estate%3Dre
quested
4. Caller is deactivated on incidents (https://instance.service-
now.com/incident_list.do?sysparm_query=active%3Dtrue%5Ecaller_id.active%3Dfalse)

https://shelldevdemand.service-now.com
/incident_list.do?sysparm_query=active%3Dtrue%5Ecaller_id.active%3Dfalse

5. Requests with Requested By is deactivated (https://instance.service-


now.com/sc_req_item_list.do?sysparm_query=active%3Dtrue%5Eu_requested_for.active%3Dfalse)

https://shelldevdemand.service-now.com
/sc_req_item_list.do?sysparm_query=active%3Dtrue%5Eu_requested_for.active%3Dfalse
6. Active Requests with all closed Requested Items.

findActiveRequestswithClosedItems();

function findActiveRequestswithClosedItems() {

var grRequest = new GlideRecord("sc_request");

grRequest.addActiveQuery();

grRequest.query();

gs.print('BAD REQUESTS, No Active Requested Items :(');

while (grRequest.next()) {

var grRequestedItem = new GlideRecord("sc_req_item");

grRequestedItem.addQuery("request",grRequest.sys_id);

grRequestedItem.addActiveQuery();

grRequestedItem.query();

if(grRequestedItem.getRowCount() == 0) {

gs.print(grRequest.number);
}

DEACTIVATE UNUSED APPLICATIONS AND FUNCTIONALITY

1. Deactivate Unused Applications


2. Deactivate Unused Modules
3. Deactivate UI Actions, related lists, and functionality that don't want being used.

ERRORS AND ISSUES

1. Request Stages properly set and Requests being closed at end of request
2. Work Queues show correct and appropriate tasks
3. Incidents being closed properly
4. Check the error, warning, and script logs for errors
5. Check stats.do for memory or performance issues

INFRASTRUCTURE AND DATA

1. Mid Servers up and operational


2. Discovery properly discovering CIs without errors
3. ServiceNow Version is up-to-date and patched
4. Check Table Row counts for large tables
5. Look at Table Rotations to insure correct tables are rotated correctly
6. Deleted Records table is correctly adding appropriate records to deleted records table
7. Look at tables for Duplicate Records
8. Check Reports and Dashboards for load times
9. Expired KB Articles and Feedback
10. Check for blank or bad homepages

CODING PRACTICES
1. Check number of update sets and update set naming convention
2. Look for Descriptions in Update Sets
3. Check Default Update Set for high number of records or admins using Default update set
4. Review Code Migration Procedures
5. Tasks Created in Development instance. If you haven't locked out users from your Sandbox, Test,
Dev, UAT instance, you should check to see if they are still using Production like they should.

INTERFACES

1. Check number and types of interfaces used in ServiceNow


2. Review Transform Maps and deactivate unused maps and maps without an import set
3. Review Scheduled Jobs

TABLE ROW COUNTS


With large ServiceNow instances, a good test is to periodically check table size. Reasons to
check table size might include:

 An import not configured with coalease properly, and is importing duplicate records.
 Table Rotation not configured properly, resulting in large tables. This can impact performance.
 Various other imports or interfaces that are creating large tables.

You can use different Database Analysis tools with the ServiceNow ODBC Driver to find out
table row counts. However if you want to run a script to find table row counts or build a
"Table Row Counts" application within ServiceNow, this article will show you how!

SCRIPTS - BACKGROUND METHOD

var grDictionary = new GlideRecord('sys_dictionary');

grDictionary.addQuery('internal_type', 'collection');

grDictionary.addQuery('name','!=','sys_template');
grDictionary.query();

gs.log('MLK Dictionary Query: ' + grDictionary.getEncodedQuery()


+ ' = ' + grDictionary.getRowCount());

while (grDictionary.next()) {

var currentTable = grDictionary.name.toString();

var count = new GlideAggregate(currentTable);

count.addAggregate('COUNT');

count.query();

if (count.next()) {

gs.log('MLK Table Count: Table: '+currentTable+ ' contains '+


count.getAggregate('COUNT') + ' rows.');

TABLE ROW COUNTS MODULE METHOD

Create Table Row Counts Module

1. Create New Table (Table Row Counts)


1. Personalize Form
Add New Field, "Table", String(50)
Add New Field, "Row Count", Integer
2. Personalize List
Table, Row Count
3. Create Script Includes
4. Script Includes:

5. Name: setTableRowCounts

6. Client Callable: true

7. Script:

8. setTableRowCounts();

9.

10. function setTableRowCounts() {

11. //Clear Table Row Count Table


12. var grTableRowCounts = new
GlideRecord('u_table_row_counts');

13. grTableRowCounts.query();

14. while (grTableRowCounts.next()) {

15. grTableRowCounts.deleteRecord();

16. }

17. gs.print('Deleted Table Row Counts Table');

18. //Set Table Row Counts

19. var grDictionary = new


GlideRecord('sys_dictionary');

20. grDictionary.addQuery('internal_type',
'collection');

21. grDictionary.addQuery('name','!=','sys_template');

22. grDictionary.query();

23. gs.log('Dictionary Query: ' +


grDictionary.getEncodedQuery() + ' = ' +
grDictionary.getRowCount());

24. while (grDictionary.next()) {

25. var currentTable =


grDictionary.name.toString();
26. var count = new GlideAggregate(currentTable);

27. count.addAggregate('COUNT');

28. count.query();

29. if (count.next()) {

30. var grTableRow = new


GlideRecord('u_table_row_counts');

31. grTableRow.initialize();

32. grTableRow.u_table = currentTable;

33. grTableRow.u_row_count =
count.getAggregate('COUNT');

34. grTableRow.insert();

35. gs.print('Table: '+grTableRow.u_table+


' contains '+ grTableRow.u_row_count + ' rows.');

36. }

37. }

38. Adjust and create New Modules (Table Row Counts)


39. Modules Created (Table Row Counts)
40. List Control (Table Row Counts)
41. UI Policy (Table Row Counts)
Try out the "Table Row Counts" Modules

1. Set "Set Table Row Counts"


2. View "Set Table Row Counts"
SUPPORTING FILES

 Table_Row_Counts_ServiceNowELITE.xml

DUPLICATE RECORD SCRIPTS


Use a script to find any "duplicate" records within your ServiceNow application.

WHY WOULD YOU NEED THIS?

One example might be duplicate user ids. Users may have duplicate user ids if the
Transform Map is coalesced off another field other than User ID. This happens in corporate
environments with multiple company mergers/partnerships where AD directories and
user name rules are not combined or determined yet.
Other times there might be a mistake in an import, discovery issue, customization mistake,
or maybe you just need to find this out for a report. Regardless of the reason to find a
"duplicate" record, these scripts may assist you.

FIND DUPLICATE RECORDS WITH A BACKGROUND SCRIPT

What I do to check for "duplicate" records most often is just to run a quick background
script. This works great for testing your imports or helping to find a permanent fix to an
existing issue.

1. Find Duplicate Users by User Name

gs.print(getDuplicates('sys_user','user_name'));

function getDuplicates(tablename,val) {

var dupRecords = [];

var gaDupCheck = new GlideAggregate(tablename);

gaDupCheck.addQuery('active','true');

gaDupCheck.addAggregate('COUNT',val);

gaDupCheck.addNotNullQuery(val);

gaDupCheck.groupBy(val);

gaDupCheck.addHaving('COUNT', '>', 1);

gaDupCheck.query();

while (gaDupCheck.next()) {

dupRecords.push(gaDupCheck[val].toString());

}
return dupRecords;

2. Find Duplicate GRC Controls by Control Id

gs.print(getDuplicates('grc_control','control_id'));

function getDuplicates(tablename,val) {

var dupRecords = [];

var gaDupCheck = new GlideAggregate(tablename);

gaDupCheck.addQuery('active','true');

gaDupCheck.addAggregate('COUNT',val);

gaDupCheck.addNotNullQuery(val);

gaDupCheck.groupBy(val);

gaDupCheck.addHaving('COUNT', '>', 1);

gaDupCheck.query();

while (gaDupCheck.next()) {

dupRecords.push(gaDupCheck[val].toString());

return dupRecords;

3. Find Duplicate CIs by Serial Number

gs.print(getDuplicates('cmdb_ci_server','serial_number'));
function getDuplicates(tablename,val) {

var dupRecords = [];

var gaDupCheck = new GlideAggregate(tablename);

gaDupCheck.addQuery('active','true');

gaDupCheck.addAggregate('COUNT',val);

gaDupCheck.addNotNullQuery(val);

gaDupCheck.groupBy(val);

gaDupCheck.addHaving('COUNT', '>', 1);

gaDupCheck.query();

while (gaDupCheck.next()) {

dupRecords.push(gaDupCheck[val].toString());

return dupRecords;

4. Find Duplicate CIs by IP Address

gs.print(getDuplicates('cmdb_ci_server','ip_address'));

function getDuplicates(tablename,val) {

var dupRecords = [];

var gaDupCheck = new GlideAggregate(tablename);

gaDupCheck.addQuery('active','true');
gaDupCheck.addAggregate('COUNT',val);

gaDupCheck.addNotNullQuery(val);

gaDupCheck.groupBy(val);

gaDupCheck.addHaving('COUNT', '>', 1);

gaDupCheck.query();

while (gaDupCheck.next()) {

dupRecords.push(gaDupCheck[val].toString());

return dupRecords;

FIND DUPLICATE RECORDS WITH A LEFT NAVIGATION BAR LINK OR REPORT

If you have a reoccurring duplicate record issue in your system, you can add a Left
Navigation Bar link or a Report

1. Script Includes
Name: getDuplicateUsers
Client Callable: true
Return an array of
Script:

function getDuplicateUsers() {

var dupRecords = [];

var gaDupCheck1 = new GlideAggregate('sys_user');


gaDupCheck1.addQuery('active','true');

gaDupCheck1.addAggregate('COUNT', 'user_name');

gaDupCheck1.addNotNullQuery('user_name');

gaDupCheck1.groupBy('user_name');

gaDupCheck1.addHaving('COUNT', '>', 1);

gaDupCheck1.query();

while (gaDupCheck1.next()) {

dupRecords.push(gaDupCheck1.user_name.toString());

return dupRecords;

2. Module
Name: Active Duplicate User IDs
Application: user admin
Roles: admin
Order: 1200
Link Type: URL from Arguments
Arguments:
sys_user_list.do?sysparm_query=user_name=javascript:getDuplicateUsers()
3. Report
Name: Active Duplicate User IDs
Type: List
Visible to: Admin Group
Table: User [sys_user]
User ID is javascript:getDuplicateUsers()
SUPPORTING FILES

Duplicate_Record_Reports_ServiceNowELITE.xml

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy