mkresse
I'm new here

Anzahl der Fehler eines Generierungstasks auslesen

Jump to solution

Hallo zusammen,

ich möchte gerne in einem Auftragsscript die Anzahl der Warnungen / Fehler eines vorherigen Generierungstasks herausbekommen, um diese dann unserem Monitoring zukommen zu lassen. Es gibt ja sowohl in ScheduleContext als auch in TaskResult passende Accessors, leider sieht es so aus, als käme ich aus dem nachgelagerten Auftragsscript nicht an den passenden Kontext heran, oder habe ich etwas übersehen?

Gibt es eine andere Möglichkeit an die Werte heranzukommen, außer dem Parsing der fs-schedule-Files? Wie sieht es mit JMX aus?

Viele Grüße,

Martin

0 Kudos
1 Solution

Accepted Solutions
mbergmann
Crownpeak employee

Hallo Martin,

das ist tatsächlich nicht ganz so einfach - ich musste ein wenig basteln 😉

Den ScheduleContext hast Du ja schon im Auftragsscript - einfach als Variable "context". Allerdings gibt z.B. context.getErrorCount() nur die Anzahl der Fehler des jeweils laufenden Tasks im Auftrag aus - also genau die des Script-Tasks selbst. Das ist in Deinem Fall nicht wirklich hilfreich 😉

Um an das TaskResult zu kommen, muss man ein wenig suchen - hier hilft es, in der API beim TaskResult über "Use" zu gehen und sich damit dann immer weiter hochzuhangeln.

Letztlich kommt dabei heraus, dass man ein ScheduleEntryControl braucht...

Versuch es mal mit dem Code unten. Zum schnellen Testen als Script irgendwo hinter einen Generierungstask hängen - wenn es klappt, sollte das natürlich in ein Executable eines Moduls verpackt werden.

Der Code sucht den letzten aktiven Generierungstask vor seinem eigenen Script-Task (d.h. da dürften auch noch andere Sachen dazwischen sein) und liest dessen Ergebnisse aus.

Wenn Du vor hast es für ein Monitoring zu nutzen, macht es ggf. Sinn, nicht beim ersten "rückwärts" gefundenen Generierungs-Task aufzuhören, sondern einfach alle abzugrasen - dann könntest Du auch einfach vorwärts iterieren.

// find the schedule entry control for THIS running entry

// only works if this schedule entry is NOT allowed to run with multiple instances in parallel,

// which should be the case for generation schedules

ScheduleEntryControl thisScheduleEntryControl = null;

List<ScheduleEntryControl> scheduleEntryControls = context.getTask().getScheduleEntry().getRunningEntries();

for (ScheduleEntryControl scheduleEntryControl : scheduleEntryControls) {

    if (scheduleEntryControl.isRunning()) {

        thisScheduleEntryControl = scheduleEntryControl;

        break;

    }

}

// search for the task index of the last ACTIVE generation before this script task

//

// if you are sure the generation task is directly before the script task,

// you can also directly use

// taskIndex = context.getTaskIndex() -1;

for (int taskIndex = context.getTaskIndex() - 1; taskIndex >= 0; taskIndex--) {

    ScheduleTask scheduleTask = context.getTasks().get(taskIndex);

    if ((scheduleTask instanceof GenerateTask) && scheduleTask.isActive()) {

        // found last generation task BEFORE this script

        ScheduleEntryState state = thisScheduleEntryControl.getState();

        List<TaskResult> taskResults = state.getTaskResults();

        TaskResult result = taskResults.get(taskIndex);

        // Do something with these values, in this case just log...

        String message = String.format("State of generation task %s: %s. It had %d warnings and %d errors.",

                // task name

                scheduleTask.getName(),

                // One of: NOT_STARTED, RUNNING, ABORTED, ERROR, SUCCESS, FINISHED_WITH_ERRORS

                // where NOT_STARTED or RUNNING should not be possible in this case

                result.getState().name(),

                //warnings

                result.getWarningCount(),

                //errors

                result.getErrorCount()

        );

        context.logInfo(message);

        //stop after first found here

        break;

    }

}

Viele Grüße

Michael

View solution in original post

0 Kudos
2 Replies
mbergmann
Crownpeak employee

Hallo Martin,

das ist tatsächlich nicht ganz so einfach - ich musste ein wenig basteln 😉

Den ScheduleContext hast Du ja schon im Auftragsscript - einfach als Variable "context". Allerdings gibt z.B. context.getErrorCount() nur die Anzahl der Fehler des jeweils laufenden Tasks im Auftrag aus - also genau die des Script-Tasks selbst. Das ist in Deinem Fall nicht wirklich hilfreich 😉

Um an das TaskResult zu kommen, muss man ein wenig suchen - hier hilft es, in der API beim TaskResult über "Use" zu gehen und sich damit dann immer weiter hochzuhangeln.

Letztlich kommt dabei heraus, dass man ein ScheduleEntryControl braucht...

Versuch es mal mit dem Code unten. Zum schnellen Testen als Script irgendwo hinter einen Generierungstask hängen - wenn es klappt, sollte das natürlich in ein Executable eines Moduls verpackt werden.

Der Code sucht den letzten aktiven Generierungstask vor seinem eigenen Script-Task (d.h. da dürften auch noch andere Sachen dazwischen sein) und liest dessen Ergebnisse aus.

Wenn Du vor hast es für ein Monitoring zu nutzen, macht es ggf. Sinn, nicht beim ersten "rückwärts" gefundenen Generierungs-Task aufzuhören, sondern einfach alle abzugrasen - dann könntest Du auch einfach vorwärts iterieren.

// find the schedule entry control for THIS running entry

// only works if this schedule entry is NOT allowed to run with multiple instances in parallel,

// which should be the case for generation schedules

ScheduleEntryControl thisScheduleEntryControl = null;

List<ScheduleEntryControl> scheduleEntryControls = context.getTask().getScheduleEntry().getRunningEntries();

for (ScheduleEntryControl scheduleEntryControl : scheduleEntryControls) {

    if (scheduleEntryControl.isRunning()) {

        thisScheduleEntryControl = scheduleEntryControl;

        break;

    }

}

// search for the task index of the last ACTIVE generation before this script task

//

// if you are sure the generation task is directly before the script task,

// you can also directly use

// taskIndex = context.getTaskIndex() -1;

for (int taskIndex = context.getTaskIndex() - 1; taskIndex >= 0; taskIndex--) {

    ScheduleTask scheduleTask = context.getTasks().get(taskIndex);

    if ((scheduleTask instanceof GenerateTask) && scheduleTask.isActive()) {

        // found last generation task BEFORE this script

        ScheduleEntryState state = thisScheduleEntryControl.getState();

        List<TaskResult> taskResults = state.getTaskResults();

        TaskResult result = taskResults.get(taskIndex);

        // Do something with these values, in this case just log...

        String message = String.format("State of generation task %s: %s. It had %d warnings and %d errors.",

                // task name

                scheduleTask.getName(),

                // One of: NOT_STARTED, RUNNING, ABORTED, ERROR, SUCCESS, FINISHED_WITH_ERRORS

                // where NOT_STARTED or RUNNING should not be possible in this case

                result.getState().name(),

                //warnings

                result.getWarningCount(),

                //errors

                result.getErrorCount()

        );

        context.logInfo(message);

        //stop after first found here

        break;

    }

}

Viele Grüße

Michael

0 Kudos

Genau, den (falschen) ScheduleContext hatte ich auch gefunden, aber dass ich über den ScheduleEntryControl an die der anderen Tasks komme hatte ich nicht gesehen.

Danke für das Snippet - es hat auf Anhieb funktioniert.

Viele Grüße,

Martin

0 Kudos