Table of Contents |
---|
Starting Point
- 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 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 start.
Feature
Display feature availability StartingFromRelease 1.10.2 - This feature
- is available with
Jira server SOS JIRA columns key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution serverId 6dc67751-9d67-34cd-985b-194a8cdc9602 key JITL-228 - is a subset of
Jira server SOS JIRA columns key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution serverId 6dc67751-9d67-34cd-985b-194a8cdc9602 key JITL-212
- is available with
- 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 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.
JobChainHistory Object
This object is instantiated by a job or job monitor and provides the method to retrieve a JobCHainHistoryInformation object for a given job chain.
Object | Description |
---|---|
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 | |
| retrieves the JobHistoryInformation object within the specified limits:
|
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 |
JobChainHistoryInformation Object
This object is returned by the JobCHainHistory object for a given job chain and provides a set of JobChainHistoryInformationEntry objects for the respective job runs.
...
Object | Description |
---|---|
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 | 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 | Get the JobSchedulerHistoryInfoEntry object for the most recently completed job chain run including orders that completed successfully or failed with error. |
JobSchedulerHistoryInfoEntry | Get the JobSchedulerHistoryInfoEntry object for the most recently successfully completed job chain run. |
JobSchedulerHistoryInfoEntry | Get the JobSchedulerHistoryInfoEntry object for the most recently completed job chain run that failed with error. |
Checks for any job runs in the period of the current day | |
boolean | Indicates that a job chain run started within the current period and applies to running job chains and completed job chain runs. |
boolean | 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 errror. |
boolean | Indicates that a job chain run started and completed successfully within the current period. |
boolean | Indicates that a job chain run started and completed with error within the current period. |
Checks for any job runs that completed today | |
boolean | Indicates that a job chain run completed in the current period and applies to job runs that completed successfully or failed with error. |
boolean | Indicates that a job chain run completed successfully within the current period. |
boolean | Indicates that a job chain run completed with error within the current period. |
Checks for any job runs that ended after a specific point in time | |
boolean | indicates that a job chain run completed after the given date |
boolean | indicates that a job chain run completed successfully after the given date |
boolean | indicates that a job chain run completed with error after the given date |
Checks for any job runs that started after a specific point in time | |
boolean | indicates that a job chain run started after the given date, the job might be completed or running |
boolean | indictes that a job chain run started after the given date and does not report any errors, the job might be completed or running |
boolean | indicates that a job chain run started after the given date and does report errors, the job might be completed or running |
JobSchedulerHistoryInfoEntry Object
The object represents the history for a specific job chain run and is provided by the JobChainHistoryInformation object.
Object | Description |
---|---|
| Get the JobSchedulerHistoryInfoEntry object for the current job chain run. |
| Get the JobSchedulerHistoryInfoEntry object for the most recently started job run including running job chains and job chains that completed successfully or failed with error. |
... | |
Property | Description |
name | Contains the job name. |
found | Indicates if the associated object is not null. |
id | Exposes the unique order history identification as provided by JobScheduler. |
order_id | The order id of the current order |
position | Returns the position of the object in the job execution history: a value 0 signals the most recent entry, larger values suggest older entries. |
start | Returns the start date of the job chain run. |
end | Returns the end date of the job chain run. |
duration | Returns the duration in the format hh:mm:ss. If longer the one day d:hh:mm:ss |
state | The current state of the order |
error | Indicats 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. |
Usage
Use with a Job Script
A complete example file demonstrates the use of
...
Code Block | ||||
---|---|---|---|---|
| ||||
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 ); // reporting some info on job runs report( jobChainHistoryInfo.getLastCompleted() ); report( jobChainHistoryInfo.getRunning() ); report( jobChainHistoryInfo.getLastCompletedSuccessful() ); report( jobChainHistoryInfo.getLastCompletedWithError() ); // report on currently running job 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 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 Date 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 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" ); } } |
Use with a Monitor Script
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_IS_RERUN
...
- 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 did run before a given point in time you can query a job history object that takes a time limit into consideration as from the following samples:
Code Block language js jobChainHistoryInfo = jobChainHistory.getJobInfo( "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 language js jobChainHistory.setTimeLimit( "-1:10:43:56" ); jobChainHistoryInfo = jobHistory.getJobInfo( "job1", 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 );
Implementation
- 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.