Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Metrics definition for certain group

SM123
Tera Expert

Hello All,

I'm trying to create a metric definition on task table, on assigned to field. But my matric should only calculate where assignment group is "Prep Group". I believe type should be script calculation duration. could anyone help me with what I'm doing wrong in this code.

if (!current.active) {

	if (current.assignment_group == 'PREP group Sys_id')
        createMetric();
}
    function createMetric() {
        var mi = new MetricInstance(definition, current);
        if (mi.metricExists())
            return;

        var gr = mi.getNewRecord();
        gr.field_value = value;
       gr.calculation_complete = true;
        gr.insert();
		
    }

 

1 ACCEPTED SOLUTION

Kieran Anson
Kilo Patron

I would be careful with directly querying sys_audit because of the impact on performance.

 

Try the following

answer = (function(mi){
	var incidentGR = mi.current;
	//Hard-coding sys-id to Help Desk for testing purposes
	if(incidentGR.getValue('assignment_group') != '679434f053231300e321ddeeff7b12d8'){
		//End the existing duration field
		mi.endDuration();
		//Don't allow the creation of a new metric instance
		return false;
	}

	return true;

}(mi))

KieranAnson_0-1741085958882.png

 

This works in my PDI - it'll create a metric for the assigned to as long as the assignment group is the sys_id I've specified. If it's not, it'll stop the metric

 

 

View solution in original post

18 REPLIES 18

@SM123 

 

Perfect! then try this updated script 

 

(function calculateMetric(task, metric) {
    var totalDuration = 0;
    var previousTime = null;
    var prepGroupSysId = null;

    // Step 1: Fetch "Prep Group" sys_id dynamically
    var prepGroup = new GlideRecord('sys_user_group');
    prepGroup.addQuery('name', 'Prep Group'); 
    prepGroup.query();
    
    if (prepGroup.next()) {
        prepGroupSysId = prepGroup.getUniqueValue();
        gs.info('Found Prep Group sys_id: ' + prepGroupSysId);
    } else {
        gs.info('Prep Group not found, exiting script.');
        return 0; // Exit if group is not found
    }

    // Step 2: Fetch assignment group change logs from sys_audit
    var audit = new GlideRecord('sys_audit');
    audit.addQuery('documentkey', task.sys_id);
    audit.addQuery('fieldname', 'assignment_group');
    audit.orderBy('sys_created_on'); 
    audit.query();

    while (audit.next()) {
        var newValue = audit.getValue('newvalue');
        var currentTime = new GlideDateTime(audit.sys_created_on).getNumericValue();
        gs.info('Audit Record: assignment_group changed to ' + newValue + ' at ' + audit.sys_created_on);

        if (newValue === prepGroupSysId) {
            if (previousTime) {
                totalDuration += (currentTime - previousTime) / 1000; // Convert to seconds
                gs.info('Adding duration: ' + (currentTime - previousTime) / 1000 + ' seconds');
            }
            previousTime = currentTime;
        }
    }

    // Step 3: If still in Prep Group, add duration from last change to now
    if (task.assignment_group.getValue() === prepGroupSysId && previousTime) {
        var now = new GlideDateTime().getNumericValue();
        totalDuration += (now - previousTime) / 1000;
        gs.info('Adding ongoing duration: ' + (now - previousTime) / 1000 + ' seconds');
    }

    gs.info('Final Duration Calculated: ' + totalDuration + ' seconds');
    return totalDuration;
})(task, metric);

✔️ If this solves your issue, please mark it as Correct.


✔️ If you found it helpful, please mark it as Helpful.



Shubham Jain


@Shubham_Jain 

It's not working please only suggest if it's working for you i have tried all your suggestions nothing is working. 

Kieran Anson
Kilo Patron

I would be careful with directly querying sys_audit because of the impact on performance.

 

Try the following

answer = (function(mi){
	var incidentGR = mi.current;
	//Hard-coding sys-id to Help Desk for testing purposes
	if(incidentGR.getValue('assignment_group') != '679434f053231300e321ddeeff7b12d8'){
		//End the existing duration field
		mi.endDuration();
		//Don't allow the creation of a new metric instance
		return false;
	}

	return true;

}(mi))

KieranAnson_0-1741085958882.png

 

This works in my PDI - it'll create a metric for the assigned to as long as the assignment group is the sys_id I've specified. If it's not, it'll stop the metric

 

 

@Kieran Anson ,

Thank you so much it's working as expected