Indicator: Count Distinct from payload

Muhammad Salar
Giga Sage

Hi all,

I'm trying to count distinct users based on the payload field in the sys_audit_delete table.

I want to count each user (based on the display_value attribute in the tag) only once, even if they appear in multiple records. For example, if "Alex Walker" appears in 3 records and "Alex Brown" in 2, the total count should be 2.

I’m using the following script in a Performance Analytics indicator, but it always returns 1, even when I know there are multiple users:

(function() {
    var grAudit = new GlideRecord('sys_audit_delete');
    grAudit.addEncodedQuery('sys_created_onONToday@javascript:gs.beginningOfToday()@javascript:gs.endOfToday()^tablename=sys_user_grmember^ORtablename=sys_user_has_role');
    grAudit.query();

    var users = [];

    while (grAudit.next()) {
        var payload = grAudit.getValue('payload');

        var match = payload.match(/<user[^>]*display_value="([^"]+)"/i);
        if (match) {
            var displayName = match[1].trim();
            if (users.indexOf(displayName) === -1) {
                users.push(displayName);
            }
        }
    }

    return users.length;
})();


@Ankur Bawiskar 

1 ACCEPTED SOLUTION

@Ankur Bawiskar, thanks for your reply but i figured out that i am using count distinct script so returning length won't get the result

so i have used script like this and it is working

(function() {
        var payload = current.payload;
        var match = payload.match(/<user[^>]*display_value="([^"]+)"/i);
        if (match) {
			gs.info('PA Test 2: ' + match[1].trim());
            return match[1].trim();
        }

    return '';
})();

Returning name from payload
count distinct automatically identifes unique

View solution in original post

3 REPLIES 3

Muhammad Salar
Giga Sage

@Ankur Bawiskar , can you please look into this?

 

Ankur Bawiskar
Tera Patron
Tera Patron

@Muhammad Salar 

try this

(function() {
    var grAudit = new GlideRecord('sys_audit_delete');
    grAudit.addEncodedQuery('sys_created_onONToday@javascript&colon;gs.beginningOfToday()@javascript&colon;gs.endOfToday()^tablename=sys_user_grmember^ORtablename=sys_user_has_role');
    grAudit.query();

    var userSet = {};

    while (grAudit.next()) {
        var payload = grAudit.getValue('payload');
        var match = payload && payload.match(/<user[^>]*display_value="([^"]+)"/i);
        if (match) {
            var displayName = match[1].trim().toLowerCase();
            userSet[displayName] = true;
        }
    }

    return Object.keys(userSet).length;
})();

If my response helped please mark it correct and close the thread so that it benefits future readers.

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

@Ankur Bawiskar, thanks for your reply but i figured out that i am using count distinct script so returning length won't get the result

so i have used script like this and it is working

(function() {
        var payload = current.payload;
        var match = payload.match(/<user[^>]*display_value="([^"]+)"/i);
        if (match) {
			gs.info('PA Test 2: ' + match[1].trim());
            return match[1].trim();
        }

    return '';
})();

Returning name from payload
count distinct automatically identifes unique