Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • Users would like to check in individual job scripts or monitor scripts
    • if a job chain has been executed in the current period, e.g. for the current day,
    • what is the last job chain order state of the job chain,
    • did the order end if an order previously completed successfully or with an error or successful.
  • The intention for checking the job chain order execution history is to automate decision making based on the point in time or execution result of a previous job chain startrun.

Feature

  • Display feature availability
    StartingFromRelease1.10.2
  • This feature 
    • is available with
      Jira
      serverSOS JIRA
      columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
      serverId6dc67751-9d67-34cd-985b-194a8cdc9602
      keyJITL-228
    • is a subset of
      Jira
      serverSOS JIRA
      columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
      serverId6dc67751-9d67-34cd-985b-194a8cdc9602
      keyJITL-212
  • A JobChainHistory object is provided for job chain history checks that can be used
    • in individual jobs that are implemented with Java or JavaScript.
    • in individual job monitors that are implemented with Java or JavaScript.
  • The JobChainHistory object returns a JobChainHistoryInformation object for a given job chain that contains the history of the job chain runs.
  • The JobChainHistoryInformation object provides a set of JobChainHistoryInformationEntry objects that expose the history information for the respective job chain runs.

...

ObjectDescription
jobChainHistory = new Packages.com.sos.jitl.checkrunhistory.JobChainHistory( spooler.delegate )
object for use with jobs and job monitors that are implemented with Java or JavaScript
Methods 
JobSchedulerHistoryInfoEntry = jobChainHistory.getJobChainInfo( jobchain, limit, timelimit )

retrieves the JobHistoryInformation object within the specified limits:

  • jobchain: for a specific job chain (the path of the job chain)
    • an specific order id can be addedspecified with the syntax: jobchain(order_id)
  • limit: for the specified number of entries from the job chain history
  • timelimit: for a specific point in time up to that time range for which the job chain history is considered
    • it is a from to intervallthe range is an interval for from and to
    • the default for from is 00:00:00
    • the default for to is the current time
    • the interval is specified with from..to
    • if a single only one time is givenspecified, it is the from time.
jobChainHistory.getNumberOfCompleted()The number of completed entries
jobChainHistory.getNumberOfStarts()The number of starts
jobChainHistory.getNumberOfCompletedSuccessful()The number of completed runs with a state that is not an error state
jobChainHistory.getNumberOfCompletedWithError()The number of completed runs with a state that is an error state
jobChainHistory.getCount()The number of entries

...

This object is returned by the JobCHainHistory JobChainHistory object for a given job chain and provides a set of JobChainHistoryInformationEntry objects for the respective job chain runs.

  • Completed means translates to: "has an end date"
  • With error means translates to: "has a state that is an error state in the job chain"
ObjectDescription
jobChainHistoryInfo = jobChainHistory.getChainJobInfo( jobchain, limit, timelimit )
The JobChainHistoryInformation object is retrieved from the JobChainHistory object for a given job chain Please note that an order can be specified with the jobchain: jobchain(order_id).
Methods Description
Retrieve JobChainHistoryInformationEntry objects
JobSchedulerHistoryInfoEntry jobChainHistoryInfo.getRunning()Get the JobSchedulerHistoryInfoEntry object for the current job chain run. 
JobSchedulerHistoryInfoEntry jobChainHistoryInfo.getLastExecution()Get the JobSchedulerHistoryInfoEntry object for the most recently started job chain run including running order and orders that completed successfully or failed with error.
JobSchedulerHistoryInfoEntry jobChainHistoryInfo.getLastCompleted()Get the JobSchedulerHistoryInfoEntry object for the most recently completed job chain run including orders that completed successfully or failed with error.
JobSchedulerHistoryInfoEntry jobChainHistoryInfo.getLastCompletedSuccessful()Get the JobSchedulerHistoryInfoEntry object for the most recently successfully completed job chain run.
JobSchedulerHistoryInfoEntry jobChainHistoryInfo.getLastCompletedWithError()Get the JobSchedulerHistoryInfoEntry object for the most recently completed job chain run that failed with error.
Checks for any job chain runs in the period of the current day
boolean jobChainHistoryInfo.isStartedToday()Indicates that a job chain run started within the current period and applies to running job chains and completed job chain runs.
boolean jobChainHistoryInfo.isStartedTodayCompleted()Indicates that a job chain run started and completed within the current period and applies to job chain runs that completed successfully or failed with errrorerror.
boolean jobChainHistoryInfo.isStartedTodayCompletedSuccessful()Indicates that a job chain run started and completed successfully within the current period.
boolean jobChainHistoryInfo.isStartedTodayCompletedWithError()Indicates that a job chain run started and completed with error within the current period.
Checks for any job chain runs that completed today 
boolean jobChainHistoryInfo.isCompletedToday()Indicates that a job chain run completed in the current period and applies to job runs that completed successfully or failed with error.
boolean jobChainHistoryInfo.isCompletedTodaySuccessful()

Indicates that a job chain run completed successfully within the current period.

boolean jobChainHistoryInfo.isCompletedTodayWithError()Indicates that a job chain run completed with error within the current period.
Checks for any job chain runs that ended after a specific point in time
boolean jobChainHistoryInfo.isCompleteddAfter( "03:00:00" )indicates that a job chain run completed after the given date
boolean jobChainHistoryInfo.isCompletedWithSuccessfulAfter( "03:00:00" )indicates that a job chain run completed successfully after the given date
boolean jobChainHistoryInfo.isCompletedWithErrorAfter( "03:00:00" )indicates that a job chain run completed with error after the given date
Checks for any job chain runs that started after a specific point in time
boolean jobChainHistoryInfo.startedAfter( "03:00:00" )

indicates that a job chain run started after the given date, the job chain might be completed or running

boolean jobChainHistoryInfo.startedSuccessfulAfter( "03:00:00" )indictes that a job chain run started after the given date and does not report any errors, the job chain might be completed or running
boolean jobChainHistoryInfo.startedWithErrorAfter( "03:00:00" )indicates that a job chain run started after the given date and does report errors, the job chain might be completed or running

...

ObjectDescription
JobSchedulerHistoryInfoEntry jobChainHistoryInfo.getRunning()Get the JobSchedulerHistoryInfoEntry object for the current job chain run.
JobSchedulerHistoryInfoEntry jobChainHistoryInfo.getLastExecution()Get the JobSchedulerHistoryInfoEntry object for the most recently started job chain run including running job chains and job chains that completed successfully or failed with error.
... 
PropertyDescription
nameContains the job chain name.
foundIndicates if the associated object is not null.
idExposes the unique order history identification as provided by JobScheduler.
order_idThe order id of the current order
positionReturns the position of the object in the job chain execution history: a value 0 signals the most recent entry, larger values suggest older entries.
startReturns the start date of the job chain run.
endReturns the end date of the job chain run.
durationReturns the duration in the format hh:mm:ss. If longer the than one day the format provided is d:hh:mm:ss.
stateThe current state of the order.
errorIndicats Indicates an error status, 1=error, 0=no error. An order execution will be assumed as an error if the state is an error state in the job chain.

...

Code Block
languagejs
collapsetrue
function spooler_process()  {
 
    // using the current job name and default limit
    var jobChainHistoryInfo = getjobChainHistoryInfoObject("test");

    // using the current job chain name and the given limit        
    // var jobChainHistoryInfo = getjobChainHistoryInfoObject( "", 30 );

    // using the given job chain name and default limit
    // var jobChainHistoryInfo = getjobChainHistoryInfoObject( "jobchain1" );

    // using the given job chain name and the given limit
    // var jobChainHistoryInfo = getjobChainHistoryInfoObject( "jobchain1", 20 );

    // using the given job chain name and a given order_id
    // var jobChainHistoryInfo = getjobChainHistoryInfoObject( "jobchain1(order_id)", 20 );

    // reportingreport some info on job chain runs

    report( jobChainHistoryInfo.getLastCompleted() );
    report( jobChainHistoryInfo.getRunning() );
    report( jobChainHistoryInfo.getLastCompletedSuccessful() );
    report( jobChainHistoryInfo.getLastCompletedWithError() );

    // report on currently running job chains
    report( jobChainHistoryInfo.getLastExecution() );
 
    spooler_log.info("isStartedToday: " + jobChainHistoryInfo.isStartedToday());
    spooler_log.info("isStartedTodayCompletedSuccessful: " + jobChainHistoryInfo.isStartedTodayCompletedSuccessful());
    spooler_log.info("isStartedTodayCompletedWithError: " + jobChainHistoryInfo.isStartedTodayCompletedWithError());
    spooler_log.info("isStartedTodayCompleted: " + jobChainHistoryInfo.isStartedTodayCompleted());
    spooler_log.info("isCompletedToday: " + jobChainHistoryInfo.isCompletedToday());
    spooler_log.info("isCompletedTodaySuccessful: " + jobChainHistoryInfo.isCompletedTodaySuccessful());
    spooler_log.info("isCompletedTodayWithError: " + jobChainHistoryInfo.isCompletedTodayWithError());

    spooler_log.info("endedAfter: " + jobChainHistoryInfo.endedAfter("03:00:00"));
    spooler_log.info("endedWithErrorAfter: " + jobChainHistoryInfo.endedWithErrorAfter("03:00:00"));
    spooler_log.info("endedSuccessfulAfter: " + jobChainHistoryInfo.endedSuccessfulAfter("03:00:00"));

    spooler_log.info("startedAfter: " + jobChainHistoryInfo.startedAfter("03:00:00"));
    spooler_log.info("startedWithErrorAfter: " + jobChainHistoryInfo.startedWithErrorAfter("03:00:00"));
    spooler_log.info("startedSuccessfulAfter: " + jobChainHistoryInfo.startedSuccessfulAfter("03:00:00"));

 

    spooler_log.info("isStartedToday:" + jobChainHistoryInfo.queryHistory("isStartedToday"));
    spooler_log.info("isStartedTodayCompletedSuccessful:" + jobChainHistoryInfo.queryHistory("isStartedTodayCompletedSuccessful"));
    spooler_log.info("isStartedTodayCompletedWithError:" + jobChainHistoryInfo.queryHistory("isStartedTodayCompletedWithError"));
    spooler_log.info("isStartedTodayCompleted:" + jobChainHistoryInfo.queryHistory("isStartedTodayCompleted"));
    spooler_log.info("isCompletedToday:" + jobChainHistoryInfo.queryHistory("isCompletedToday"));
    spooler_log.info("isCompletedTodaySuccessfully:" + jobChainHistoryInfo.queryHistory("isCompletedTodaySuccessful"));
    spooler_log.info("isCompletedTodayWithError:" + jobChainHistoryInfo.queryHistory("isCompletedTodayWithError "));
        
    // since release 1.10.2, 1.9.8 also possible
    spooler_log.info("isCompletedAfter:" + jobChainHistoryInfo.queryHistory("isCompletedAfter(-1:10:48:33)"));
    spooler_log.info("isCompletedWithErrorAfter:" + jobChainHistoryInfo.queryHistory("isCompletedWithErrorAfter(03:00:00)"));
    spooler_log.info("isCompletedSuccessfulAfter:" + jobChainHistoryInfo.queryHistory("isCompletedSuccessfulAfter(03:00:00)"));

    spooler_log.info("isStartedAfter:" + jobChainHistoryInfo.queryHistory("isStartedAfter(-1:10:48:33)"));
    spooler_log.info("isStartedWithErrorAfter:" + jobChainHistoryInfo.queryHistory("isStartedWithErrorAfter(03:00:00)"));
    spooler_log.info("isStartedSuccessfulAfter:" + jobChainHistoryInfo.queryHistory("isStartedSuccessfulAfter(03:00:00)"));

    // example how to convert Datedate fields (start date)
    if ( jobChainHistoryInfo.getLastCompletedSuccessful().found ) {
        var d = jobChainHistoryInfo.getLastCompletedSuccessful().start;
        if (d != null) {
            var d2 = new Date(d.getTime());
            spooler_log.info ("------->" + d2.getFullYear() );
        }
    }

    spooler_log.info ( "check if the job chain started on the previous day before a specific point in time" );
    var jobChainHistoryInfo = getjobChainHistoryInfoObject( "jobchain1", "", "-1:10:43:56" );
    spooler_log.info ( "completedBefore -1:10:43:56: " + jobChainHistoryInfo.isCompletedBefore());
    spooler_log.info ( "completedWithErrorBefore -1:10:43:56: " + jobChainHistoryInfo.isCompletedWithErrorBefore() );
    spooler_log.info ( "completedSuccessfulBefore -1:10:43:56: " + jobChainHistoryInfo.isCompletedSuccessfulBefore() );

    // since release 1.10.2, 1.9.8 also possible
    spooler_log.info ( "completedBefore -1:10:43:56: " + jobChainHistoryInfo.queryHistory("isCompletedBefore"));
    spooler_log.info ( "completedWithErrorBefore -1:10:43:56: " + jobChainHistoryInfo.queryHistory("isCompletedWithErrorBefore"));
    spooler_log.info ( "completedSuccessfulBefore -1:10:43:56: " + jobChainHistoryInfo.queryHistory("isCompletedSuccessfulBefore"));
     
    return false;
}

function getjobChainHistoryInfoObject(jobchain, limit, timelimit) {
    var jobChainHistory = new Packages.com.sos.jitl.checkrunhistory.JobChainHistory( spooler.delegate );

    if ((jobchain === undefined) || (jobchain === "")) {
      jobchain = spooler_task.order.job_chain.name;
    }
    if (limit === undefined || limit === "") {
       limit = "100";
    }
    if (timelimit === undefined) {
       timelimit = "";
    }

    var jobChainHistoryInfo = jobChainHistory.getJobChainInfo( jobchain, limit, timelimit );

    spooler_log.info("Number of completed: " + jobChainHistory.getNumberOfCompleted());
    spooler_log.info("Number of starts: " + jobChainHistory.getNumberOfStarts());
    spooler_log.info("Number of completed successfull: " + jobChainHistory.getNumberOfCompletedSuccessful());
    spooler_log.info("Number of completed with error: " + jobChainHistory.getNumberOfCompletedWithError());
    spooler_log.info("Number of entries: " + jobChainHistory.getCount());

    return jobChainHistoryInfo;
}

function report( reportItem ) {
    spooler_log.info( "_____________________________" );
    if (reportItem.found) {
        spooler_log.info( "Name:" + reportItem.name );
        spooler_log.info( "id: " + reportItem.id );
        spooler_log.info( "Job chain name: " + reportItem.jobChainName );
        spooler_log.info( "Position: " + reportItem.position );
        spooler_log.info( "Start Time: " + reportItem.start );
        spooler_log.info( "End Time: " + reportItem.end );
        spooler_log.info( "Duration: " + reportItem.duration );
        spooler_log.info( "Error: " + reportItem.error );
        
        
    } else {
        spooler_log.info( "Name: " + reportItem.name + " not found" );
    }
}

...

To identify if a running job chain is a rerun of a previously failed job chain execution you can use the following script for a pre-processing monitor. The script will expose the information if a rerun has been identified with the environment variable SCHEDULER_PARAM_JOB_CHAIN_IS_RERUN

...

Code Block
languagejs
collapsetrue
function spooler_task_before() {
    var jobChainHistory = new Packages.com.sos.jitl.checkrunhistory.JobChainHistory( spooler.delegate );
    var jobChainHistoryInfo = jobChainHistory.getJobChainInfo( spooler_task.order.job_chain.name, 100, "" );
    var isRerun = (jobChainHistoryInfo.getLastCompletedWithError().found && jobCHainHistoryInfo.getLastCompletedWithError().position == 0);

    var params = spooler_task.params;
    params.set_var("JOB_CHAIN_IS_RERUN", isRerun );
    spooler_log.info("Job chain rerun identified: " + isRerun);

    return true;
}

...

  • The script retrieves the last job chain execution that completed with error and checks if the position of the object provided is the first in the recent history list. The first position of a job chain that recently completed with error is
    • 0 if the script is executed as a pre-processing monitor script before a task start.
    • 1 if the script is executed as a job script for a running task. That task would be added to the begin of the recent history list.
  • In order to check if a job chain did run before a given point in time you can query a job chain history object that takes a time limit into consideration as from the following samples:
    • Code Block
      languagejs
      jobChainHistoryInfo = jobChainHistory.getJobInfogetJobChainInfo( "jobchain1", 100, "-1:10:43:56" );
      
      spooler_log.info( "endedBefore -1:10:43:16:" + jobChainHistoryInfo.getLastCompleted().found );
      spooler_log.info( "endedBeforeWithError -1:10:43:16:" + jobChainHistoryInfo.getLastComletedWithError().found );
      spooler_log.info( "endedBeforeSuccessful -1:10:43:16:" + jobChainHistoryInfo.getLastCompletedSuccessful().found );
    • Code Block
      languagejs
      jobChainHistory.setTimeLimit( "-1:10:43:56" );
      jobChainHistoryInfo = jobHistoryjobChainHistory.getJobInfogetJobChainInfo( "job1jobchain1", 100, "" );
      
      spooler_log.info( "endedBefore -1:10:43:16:" + jobChainHistoryInfo.getLastCompleted().found );
      spooler_log.info( "endedBeforeWithError -1:10:43:16:" + jobChainHistoryInfo.getLastComletedWithError().found );
      spooler_log.info( "endedBeforeSuccessful -1:10:43:16:" + jobChainHistoryInfo.getLastCompletedSuccessful().found );

...

  • The implementation makes use of API methods, i.e. XML commands, to retrieve the job history instead of a database connection.
  • The solution can be used with Agents.
  • No separate HTTP connection is created, the solution makes use of the HTTP(S) connection that is established between Master and Agent.

References

Change Management References

Jira
serverSOS JIRA
columnstype,key,issuelinks,fixversions,status,priority,summary,updated
maximumIssues20
jqlQuerylabels in (job-chain-history)
serverId6dc67751-9d67-34cd-985b-194a8cdc9602

Documentation