From 0f8af4dd53fc3b88eba2f76ba33106fb7deeef13 Mon Sep 17 00:00:00 2001 From: Sylvain Cresto Date: Mon, 11 Aug 2025 13:56:34 +0200 Subject: [PATCH] CTOR-792 Plugin(os::as400::connector) - Mode(messagequeue) : add an option to ignore acknowledge messages (#5700) Co-authored-by: garnier-quentin Co-authored-by: pkippes --- .../Dockerfile.packaging-plugins-java-noble | 4 +- .github/workflows/as400.yml | 2 +- .../handler/msgqueue/MessageQueueHandler.java | 6 +- src/os/as400/connector/mode/disks.pm | 77 +++++++++++++++--- src/os/as400/connector/mode/jobqueues.pm | 34 +++++++- src/os/as400/connector/mode/jobs.pm | 42 +++++----- src/os/as400/connector/mode/messagequeue.pm | 66 ++++++++++++---- src/os/as400/connector/mode/pagefaults.pm | 17 +++- src/os/as400/connector/mode/subsystems.pm | 79 +++++++++++++++---- src/os/as400/connector/mode/system.pm | 48 ++++++++++- 10 files changed, 300 insertions(+), 75 deletions(-) diff --git a/.github/docker/packaging/Dockerfile.packaging-plugins-java-noble b/.github/docker/packaging/Dockerfile.packaging-plugins-java-noble index 22529a083..2de0da023 100644 --- a/.github/docker/packaging/Dockerfile.packaging-plugins-java-noble +++ b/.github/docker/packaging/Dockerfile.packaging-plugins-java-noble @@ -8,7 +8,7 @@ apt-get update apt-get install -y \ ca-certificates \ git \ - openjdk-17-jdk \ + openjdk-17-jdk-headless \ wget \ zstd @@ -27,4 +27,4 @@ apt-get clean all EOF -WORKDIR /src \ No newline at end of file +WORKDIR /src diff --git a/.github/workflows/as400.yml b/.github/workflows/as400.yml index c56167856..b7ac73b93 100644 --- a/.github/workflows/as400.yml +++ b/.github/workflows/as400.yml @@ -85,7 +85,7 @@ jobs: run: mvn -version && mvn clean install -f as400/connector.as400/pom.xml - name: Remove me after debug - run: find / -name "centreon-as400*.jar" + run: find / -path /proc -prune -o -name "centreon-as400*.jar" - name: Package uses: ./.github/actions/package-nfpm diff --git a/as400/connector.as400/src/main/java/com/centreon/connector/as400/check/handler/msgqueue/MessageQueueHandler.java b/as400/connector.as400/src/main/java/com/centreon/connector/as400/check/handler/msgqueue/MessageQueueHandler.java index aaa3a8038..2e1ef8b5e 100644 --- a/as400/connector.as400/src/main/java/com/centreon/connector/as400/check/handler/msgqueue/MessageQueueHandler.java +++ b/as400/connector.as400/src/main/java/com/centreon/connector/as400/check/handler/msgqueue/MessageQueueHandler.java @@ -94,11 +94,6 @@ public class MessageQueueHandler extends AbstractHandler implements IMessageQueu .debug("Message found : " + message.getID() + " - " + message.getText().replace('|', ' ')); if ((message.getSeverity() >= minSeverityLevel) && (message.getSeverity() < maxSeverityLevel)) { - if ("A".equals(message.getReplyStatus())) { - // The message has been acknowledge already and we don't take it into account - continue; - } - final String messageId = message.getID(); if (messageIdfilterPattern != null && !messageId.matches(messageIdfilterPattern)) { continue; @@ -112,6 +107,7 @@ public class MessageQueueHandler extends AbstractHandler implements IMessageQueu attrs.put("jobName", message.getFromJobName()); attrs.put("jobNumber", message.getFromJobNumber()); attrs.put("user", message.getUser()); + attrs.put("replyStatus", message.getReplyStatus()); data.getResult().add(attrs); } } diff --git a/src/os/as400/connector/mode/disks.pm b/src/os/as400/connector/mode/disks.pm index 194abf8d1..ff6d35350 100644 --- a/src/os/as400/connector/mode/disks.pm +++ b/src/os/as400/connector/mode/disks.pm @@ -161,7 +161,8 @@ sub new { $options{options}->add_options(arguments => { 'disk-name:s' => { name => 'disk_name' }, - 'filter-disk-name:s' => { name => 'filter_disk_name' } + 'include-disk-name:s' => { name => 'include_disk_name' }, + 'filter-disk-name:s' => { redirect => 'include_disk_name' } }); return $self; @@ -172,7 +173,7 @@ sub check_options { $self->SUPER::check_options(%options); $self->{uuid} = ''; - foreach ('filter_counters', 'filter_disk_name') { + foreach ('filter_counters', 'include_disk_name') { if (defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne '') { $self->{uuid} .= $self->{option_results}->{$_}; } @@ -203,8 +204,8 @@ sub manage_selection { $self->{disks} = {}; my ($max, $min) = (0, 100); foreach my $disk (@{$disks->{result}}) { - if (defined($self->{option_results}->{filter_disk_name}) && $self->{option_results}->{filter_disk_name} ne '' && - $disk->{name} !~ /$self->{option_results}->{filter_disk_name}/) { + if (defined($self->{option_results}->{include_disk_name}) && $self->{option_results}->{include_disk_name} ne '' && + $disk->{name} !~ /$self->{option_results}->{include_disk_name}/) { $self->{output}->output_add(long_msg => "skipping disk '" . $disk->{name} . "': no matching filter.", debug => 1); next; } @@ -249,7 +250,7 @@ Check disks. Check exact disk. -=item B<--filter-disk-name> +=item B<--include-disk-name> Filter disks by name (can be a regexp). @@ -268,11 +269,69 @@ You can use the following variables: %{status}, %{name} Define the conditions to match for the status to be CRITICAL (default: '%{status} =~ /^(noAccess|otherDiskSubFailed|failed|notOperational|noUnitControl)$/i'). You can use the following variables: %{status}, %{name} -=item B<--warning-*> B<--critical-*> +=item B<--warning-disks-active> -Thresholds. -Can be: 'space-usage', 'space-usage-free', 'space-usage-prct', 'reserved', -'disks-total', 'disks-active', 'disks-errors', 'disks-gap-repartition'. +Threshold. + +=item B<--critical-disks-active> + +Threshold. + +=item B<--warning-disks-errors> + +Threshold. + +=item B<--critical-disks-errors> + +Threshold. + +=item B<--warning-disks-gap-repartition> + +Threshold in percentage. + +=item B<--critical-disks-gap-repartition> + +Threshold in percentage. + +=item B<--warning-disks-total> + +Threshold. + +=item B<--critical-disks-total> + +Threshold. + +=item B<--warning-reserved> + +Threshold in bytes. + +=item B<--critical-reserved> + +Threshold in bytes. + +=item B<--warning-space-usage> + +Threshold in bytes. + +=item B<--critical-space-usage> + +Threshold in bytes. + +=item B<--warning-space-usage-free> + +Threshold in bytes. + +=item B<--critical-space-usage-free> + +Threshold in bytes. + +=item B<--warning-space-usage-prct> + +Threshold in percentage. + +=item B<--critical-space-usage-prct> + +Threshold in percentage. =back diff --git a/src/os/as400/connector/mode/jobqueues.pm b/src/os/as400/connector/mode/jobqueues.pm index 8e8c4557e..17423a293 100644 --- a/src/os/as400/connector/mode/jobqueues.pm +++ b/src/os/as400/connector/mode/jobqueues.pm @@ -218,11 +218,37 @@ You can use the following variables: %{status}, %{name}, %{library} Define the conditions to match for the status to be CRITICAL (default: '%{status} =~ /HELD/i'). You can use the following variables: %{status}, %{name}, %{library} -=item B<--warning-*> B<--critical-*> +=item B<--warning-jobqueue-jobs-active> -Thresholds. -Can be: 'jobqueues-total', 'jobqueue-jobs-active', -'jobqueue-jobs-scheduled', 'jobqueue-jobs-held'. +Threshold. + +=item B<--critical-jobqueue-jobs-active> + +Threshold. + +=item B<--warning-jobqueue-jobs-held> + +Threshold. + +=item B<--critical-jobqueue-jobs-held> + +Threshold. + +=item B<--warning-jobqueue-jobs-scheduled> + +Threshold. + +=item B<--critical-jobqueue-jobs-scheduled> + +Threshold. + +=item B<--warning-jobqueues-total> + +Threshold. + +=item B<--critical-jobqueues-total> + +Threshold. =back diff --git a/src/os/as400/connector/mode/jobs.pm b/src/os/as400/connector/mode/jobs.pm index 14c27479a..dff1ea965 100644 --- a/src/os/as400/connector/mode/jobs.pm +++ b/src/os/as400/connector/mode/jobs.pm @@ -50,10 +50,13 @@ sub new { bless $self, $class; $options{options}->add_options(arguments => { - 'filter-active-status:s' => { name => 'filter_active_status' }, - 'filter-name:s' => { name => 'filter_name' }, - 'filter-subsystem:s' => { name => 'filter_subsystem' }, - 'display-jobs' => { name => 'display_jobs' } + 'include-active-status:s' => { name => 'include_active_status' }, + 'filter-active-status:s' => { redirect => 'include_active_status' }, + 'include-name:s' => { name => 'include_name' }, + 'filter-name:s' => { redirect => 'include_name' }, + 'include-subsystem:s' => { name => 'include_subsystem' }, + 'filter-subsystem:s' => { redirect => 'include_subsystem' }, + 'display-jobs' => { name => 'display_jobs' } }); return $self; @@ -64,7 +67,7 @@ sub check_options { $self->SUPER::check_options(%options); $self->{uuid} = ''; - foreach ('filter_counters', 'filter_name', 'filter_active_status', 'filter_subsystem') { + foreach ('filter_counters', 'include_name', 'include_active_status', 'include_subsystem') { if (defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne '') { $self->{uuid} .= $self->{option_results}->{$_}; } @@ -82,18 +85,18 @@ sub manage_selection { $self->{global} = { total => 0 }; foreach my $entry (@{$jobs->{result}}) { - if (defined($self->{option_results}->{filter_name}) && $self->{option_results}->{filter_name} ne '' && - $entry->{name} !~ /$self->{option_results}->{filter_name}/) { + if (defined($self->{option_results}->{include_name}) && $self->{option_results}->{include_name} ne '' && + $entry->{name} !~ /$self->{option_results}->{include_name}/) { $self->{output}->output_add(long_msg => "skipping job '" . $entry->{name} . "': no matching filter (name).", debug => 1); next; } - if (defined($self->{option_results}->{filter_subsystem}) && $self->{option_results}->{filter_subsystem} ne '' && - $entry->{subSystem} !~ /$self->{option_results}->{filter_subsystem}/) { + if (defined($self->{option_results}->{include_subsystem}) && $self->{option_results}->{include_subsystem} ne '' && + $entry->{subSystem} !~ /$self->{option_results}->{include_subsystem}/) { $self->{output}->output_add(long_msg => "skipping job '" . $entry->{name} . "': no matching filter (subsystem).", debug => 1); next; } - if (defined($self->{option_results}->{filter_active_status}) && $self->{option_results}->{filter_active_status} ne '' && - $entry->{activeStatus} !~ /$self->{option_results}->{filter_active_status}/) { + if (defined($self->{option_results}->{include_active_status}) && $self->{option_results}->{include_active_status} ne '' && + $entry->{activeStatus} !~ /$self->{option_results}->{include_active_status}/) { $self->{output}->output_add(long_msg => "skipping job '" . $entry->{name} . "': no matching filter (activeStatus).", debug => 1); next; } @@ -123,16 +126,16 @@ Check active jobs. =over 8 -=item B<--filter-active-status> +=item B<--include-active-status> Filter jobs by ACTIVE_JOB_STATUS (can be a regexp). -Example: --filter-active-status='MSGW' to count jobs with MSGW. +Example: --include-active-status='MSGW' to count jobs with MSGW. -=item B<--filter-name> +=item B<--include-name> Filter jobs by name (can be a regexp). -=item B<--filter-subsystem> +=item B<--include-subsystem> Filter jobs by subsystem (can be a regexp). @@ -140,10 +143,13 @@ Filter jobs by subsystem (can be a regexp). Display jobs in verbose output. -=item B<--warning-*> B<--critical-*> +=item B<--warning-jobs-total> -Thresholds. -Can be: 'jobs-total'. +Threshold. + +=item B<--critical-jobs-total> + +Threshold. =back diff --git a/src/os/as400/connector/mode/messagequeue.pm b/src/os/as400/connector/mode/messagequeue.pm index d478fe350..9dd60b981 100644 --- a/src/os/as400/connector/mode/messagequeue.pm +++ b/src/os/as400/connector/mode/messagequeue.pm @@ -57,16 +57,21 @@ sub set_counters { sub new { my ($class, %options) = @_; - my $self = $class->SUPER::new(package => __PACKAGE__, %options, force_new_perfdata => 1); + my $self = $class->SUPER::new(package => __PACKAGE__, %options, ); #force_new_perfdata => 1); bless $self, $class; $options{options}->add_options(arguments => { - 'message-queue-path:s' => { name => 'message_queue_path' }, - 'memory' => { name => 'memory' }, - 'filter-message-id:s' => { name => 'filter_message_id' }, - 'min-severity:s' => { name => 'min_severity' }, - 'max-severity:s' => { name => 'max_severity' }, - 'display-messages' => { name => 'display_messages' } + 'message-queue-path:s' => { name => 'message_queue_path' }, + 'memory' => { name => 'memory' }, + 'include-message-id:s' => { name => 'include_message_id', default => '' }, + 'filter-message-id:s' => { redirect => 'include_message_id' }, # for compatibility + 'include-reply-status:s' => { name => 'include_reply_status', default => '' }, + 'exclude-reply-status:s' => { name => 'exclude_reply_status', default => 'A' }, + 'include-text:s' => { name => 'include_text', default => '' }, + 'exclude-text:s' => { name => 'exclude_text', default => '' }, + 'min-severity:s' => { name => 'min_severity', default => '' }, + 'max-severity:s' => { name => 'max_severity', default => '' }, + 'display-messages' => { name => 'display_messages' } }); return $self; @@ -86,14 +91,14 @@ sub manage_selection { my ($self, %options) = @_; my %cmd = (command => 'getErrorMessageQueue', args => { messageQueuePath => $self->{option_results}->{message_queue_path} }); - $cmd{args}->{messageIdfilterPattern} = $self->{option_results}->{filter_message_id} - if (defined($self->{option_results}->{filter_message_id}) && $self->{option_results}->{filter_message_id} ne ''); + $cmd{args}->{messageIdfilterPattern} = $self->{option_results}->{include_message_id} + if $self->{option_results}->{include_message_id} ne ''; $cmd{args}->{minSeverityLevel} = $self->{option_results}->{min_severity} - if (defined($self->{option_results}->{min_severity}) && $self->{option_results}->{min_severity} ne ''); + if $self->{option_results}->{min_severity} ne ''; $cmd{args}->{maxSeverityLevel} = $self->{option_results}->{max_severity} - if (defined($self->{option_results}->{max_severity}) && $self->{option_results}->{max_severity} ne ''); + if $self->{option_results}->{max_severity} ne ''; $cmd{command} = 'getNewMessageInMessageQueue' - if (defined($self->{option_results}->{memory})); + if defined($self->{option_results}->{memory}); $self->{global} = { total => 0, mq_path => $self->{option_results}->{message_queue_path} }; my $messages = $options{custom}->request_api(%cmd); @@ -104,15 +109,24 @@ sub manage_selection { } foreach my $entry (@{$messages->{result}}) { - if (defined($self->{option_results}->{display_messages})) { + # compatibility with old as400 daemon version who does not return 'replyStatus' + $entry->{replyStatus} //= ''; + + next if $self->{option_results}->{include_reply_status} ne '' && $entry->{replyStatus} !~ /$self->{option_results}->{include_reply_status}/; + next if $self->{option_results}->{exclude_reply_status} ne '' && $entry->{replyStatus} =~ /$self->{option_results}->{exclude_reply_status}/; + next if $self->{option_results}->{include_text} ne '' && $entry->{text} !~ /$self->{option_results}->{include_text}/; + next if $self->{option_results}->{exclude_text} ne '' && $entry->{text} =~ /$self->{option_results}->{exclude_text}/; + + if (defined($self->{option_results}->{display_messages})) { $entry->{text} =~ s/\|/ /g; $self->{output}->output_add( long_msg => sprintf( - 'message [id: %s] [severity: %s] [date: %s] [user: %s]: %s', + 'message [id: %s] [severity: %s] [date: %s] [user: %s]%s: %s', $entry->{id}, $entry->{severity}, scalar(localtime($entry->{date} / 1000)), defined($entry->{user}) ? $entry->{user} : '-', + $entry->{replyStatus} ne '' ? ' [replyStatus: ' . $entry->{replyStatus} . ']': '', $entry->{text} ) ); @@ -140,10 +154,26 @@ Specify the message queue (required. Example: --message-queue-path='/QSYS.LIB/QS Check only new messages. -=item B<--filter-message-id> +=item B<--include-message-id> Filter messages by ID (can be a regexp). +=item B<--include-reply-status> + +Filter messages by reply status (can be a regexp). + +=item B<--exclude-reply-status> + +Exclude messages by reply status (can be a regexp) (default: 'A'). + +=item B<--include-text> + +Filter messages by text (can be a regexp). + +=item B<--exclude-text> + +Exclude messages by text (can be a regexp). + =item B<--min-severity> Filter messages with severity greater than or equal to X. @@ -156,7 +186,11 @@ Filter messages with severity less than to X. Display messages in verbose output. -=item B<--warning-messages> B<--critical-messages> +=item B<--warning-messages> + +Thresholds. + +=item B<--critical-messages> Thresholds. diff --git a/src/os/as400/connector/mode/pagefaults.pm b/src/os/as400/connector/mode/pagefaults.pm index 3e3ef88c7..e7c810c44 100644 --- a/src/os/as400/connector/mode/pagefaults.pm +++ b/src/os/as400/connector/mode/pagefaults.pm @@ -95,10 +95,21 @@ Check page faults. =over 8 -=item B<--warning-*> B<--critical-*> +=item B<--warning-pagefaults-database> -Thresholds. -Can be: 'pagefaults-database', 'pagefaults-nondatabase'. +Threshold in percentage. + +=item B<--critical-pagefaults-database> + +Threshold in percentage. + +=item B<--warning-pagefaults-nondatabase> + +Threshold in percentage. + +=item B<--critical-pagefaults-nondatabase> + +Threshold in percentage. =back diff --git a/src/os/as400/connector/mode/subsystems.pm b/src/os/as400/connector/mode/subsystems.pm index 96e6bb8c2..4bf21e84d 100644 --- a/src/os/as400/connector/mode/subsystems.pm +++ b/src/os/as400/connector/mode/subsystems.pm @@ -121,8 +121,10 @@ sub new { bless $self, $class; $options{options}->add_options(arguments => { - 'filter-subsystem-name:s' => { name => 'filter_subsystem_name' }, - 'filter-subsystem-library:s' => { name => 'filter_subsystem_library' } + 'include-subsystem-name:s' => { name => 'include_subsystem_name' }, + 'filter-subsystem-name:s' => { redirect => 'include_subsystem_name' }, + 'include-subsystem-library:s' => { name => 'include_subsystem_library' }, + 'filter-subsystem-library:s' => { redirect => 'include_subsystem_library' } }); return $self; @@ -133,7 +135,7 @@ sub check_options { $self->SUPER::check_options(%options); $self->{uuid} = ''; - foreach ('filter_counters', 'filter_subsystem_name', 'filter_subsystem_library') { + foreach ('filter_counters', 'include_subsystem_name', 'include_subsystem_library') { if (defined($self->{option_results}->{$_}) && $self->{option_results}->{$_} ne '') { $self->{uuid} .= $self->{option_results}->{$_}; } @@ -160,13 +162,13 @@ sub manage_selection { $self->{global} = { total => 0, active => 0, ending => 0, inactive => 0, restricted => 0, starting => 0 }; $self->{subsys} = {}; foreach my $entry (@{$subsys->{result}}) { - if (defined($self->{option_results}->{filter_subsystem_name}) && $self->{option_results}->{filter_subsystem_name} ne '' && - $entry->{name} !~ /$self->{option_results}->{filter_subsystem_name}/) { + if (defined($self->{option_results}->{include_subsystem_name}) && $self->{option_results}->{include_subsystem_name} ne '' && + $entry->{name} !~ /$self->{option_results}->{include_subsystem_name}/) { $self->{output}->output_add(long_msg => "skipping subsystem '" . $entry->{name} . "': no matching filter.", debug => 1); next; } - if (defined($self->{option_results}->{filter_subsystem_library}) && $self->{option_results}->{filter_subsystem_library} ne '' && - $entry->{library} !~ /$self->{option_results}->{filter_subsystem_library}/) { + if (defined($self->{option_results}->{include_subsystem_library}) && $self->{option_results}->{include_subsystem_library} ne '' && + $entry->{library} !~ /$self->{option_results}->{include_subsystem_library}/) { $self->{output}->output_add(long_msg => "skipping subsystem '" . $entry->{name} . "': no matching filter.", debug => 1); next; } @@ -193,11 +195,11 @@ Check subsystems. =over 8 -=item B<--filter-subsystem-name> +=item B<--include-subsystem-name> Filter subsystems by name (can be a regexp). -=item B<--filter-subsystem-library> +=item B<--include-subsystem-library> Filter subsystems by library (can be a regexp). @@ -216,12 +218,61 @@ You can use the following variables: %{status}, %{name}, %{library} Define the conditions to match for the status to be CRITICAL. You can use the following variables: %{status}, %{name}, %{library} -=item B<--warning-*> B<--critical-*> +=item B<--warning-jobs-active> -Thresholds. -Can be: 'subsystems-total', 'subsystems-active', 'subsystems-ending', -'subsystems-inactive', 'subsystems-restricted', 'subsystems-starting', -'jobs-active'. +Threshold. + +=item B<--critical-jobs-active> + +Threshold. + +=item B<--warning-subsystems-active> + +Threshold. + +=item B<--critical-subsystems-active> + +Threshold. + +=item B<--warning-subsystems-ending> + +Threshold. + +=item B<--critical-subsystems-ending> + +Threshold. + +=item B<--warning-subsystems-inactive> + +Threshold. + +=item B<--critical-subsystems-inactive> + +Threshold. + +=item B<--warning-subsystems-restricted> + +Threshold. + +=item B<--critical-subsystems-restricted> + +Threshold. + +=item B<--warning-subsystems-starting> + +Threshold. + +=item B<--critical-subsystems-starting> + +Threshold. + +=item B<--warning-subsystems-total> + +Threshold. + +=item B<--critical-subsystems-total> + +Threshold. =back diff --git a/src/os/as400/connector/mode/system.pm b/src/os/as400/connector/mode/system.pm index d5e099ed8..48efdee67 100644 --- a/src/os/as400/connector/mode/system.pm +++ b/src/os/as400/connector/mode/system.pm @@ -167,11 +167,53 @@ Check system usage. Only display some counters (regexp can be used). Example: --filter-counters='processing-units' -=item B<--warning-*> B<--critical-*> +=item B<--warning-batch-jobs-running> -Thresholds. -Can be: 'processing-units-usage' (%), 'storage-pool-space-usage' (%), +Threshold. +=item B<--critical-batch-jobs-running> + +Threshold. + +=item B<--warning-batch-jobs-waiting-message> + +Threshold. + +=item B<--critical-batch-jobs-waiting-message> + +Threshold. + +=item B<--warning-jobs-active> + +Threshold. + +=item B<--critical-jobs-active> + +Threshold. + +=item B<--warning-jobs-total> + +Threshold. + +=item B<--critical-jobs-total> + +Threshold. + +=item B<--warning-processing-units-usage> + +Threshold in percentage. + +=item B<--critical-processing-units-usage> + +Threshold in percentage. + +=item B<--warning-storage-pool-space-usage> + +Threshold in percentage. + +=item B<--critical-storage-pool-space-usage> + +Threshold in percentage. =back