From b01f46e2c8ae9b3d6252987957f4cc5241a77f8c Mon Sep 17 00:00:00 2001 From: Julien Riou Date: Sun, 16 Aug 2026 14:24:55 +0200 Subject: [PATCH] Print results on one line Nagios notifications send only the first line of the check result. Also, order by severity. When result is not OK, return only the results that need attention. Signed-off-by: Julien Riou --- check_docker/check_docker.py | 12 ++++++++++-- check_docker/check_swarm.py | 10 +++++++++- tests/test_check_docker.py | 12 ++++++++---- tests/test_check_swarm.py | 4 +++- 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/check_docker/check_docker.py b/check_docker/check_docker.py index 73fb2d0..33d7619 100755 --- a/check_docker/check_docker.py +++ b/check_docker/check_docker.py @@ -952,17 +952,25 @@ def socketfile_permissions_failure(parsed_args): return False +def sort_by_severity(messages): + severities = ('CRITICAL: ', 'WARNING: ', 'UNKNOWN: ', 'OK: ') + rank = lambda message: next((index for index, severity in enumerate(severities) + if message.startswith(severity)), len(severities)) + return sorted(messages, key=rank) + + def print_results(): + # Nagios notifications only carry the first line of the plugin output if no_ok: # Remove all the "OK"s filtered_messages = [message for message in messages if not message.startswith('OK: ')] if len(filtered_messages) == 0: messages_concat = 'OK' else: - messages_concat = '\n'.join(filtered_messages) + messages_concat = ', '.join(sort_by_severity(filtered_messages)) else: - messages_concat = '\n'.join(messages) + messages_concat = ', '.join(sort_by_severity(messages)) if no_performance or len(performance_data) == 0: print(messages_concat) diff --git a/check_docker/check_swarm.py b/check_docker/check_swarm.py index 6b75987..6de5619 100755 --- a/check_docker/check_swarm.py +++ b/check_docker/check_swarm.py @@ -360,8 +360,16 @@ def socketfile_permissions_failure(parsed_args): return False +def sort_by_severity(messages): + severities = ('CRITICAL: ', 'WARNING: ', 'UNKNOWN: ', 'OK: ') + rank = lambda message: next((index for index, severity in enumerate(severities) + if message.startswith(severity)), len(severities)) + return sorted(messages, key=rank) + + def print_results(): - print('\n'.join(messages)) + # Nagios notifications only carry the first line of the plugin output + print(', '.join(sort_by_severity(messages))) def perform_checks(raw_args): diff --git a/tests/test_check_docker.py b/tests/test_check_docker.py index 2eea30a..4803dd7 100644 --- a/tests/test_check_docker.py +++ b/tests/test_check_docker.py @@ -709,8 +709,11 @@ def test_perform(check_docker, fs, args, called): @pytest.mark.parametrize("messages, perf_data, expected", ( (['TEST'], [], 'TEST'), - (['FOO', 'BAR'], [], 'FOO\nBAR'), - (['FOO', 'BAR'], ['1;2;3;4;'], 'FOO\nBAR|1;2;3;4;') + (['FOO', 'BAR'], [], 'FOO, BAR'), + (['FOO', 'BAR'], ['1;2;3;4;'], 'FOO, BAR|1;2;3;4;'), + (['OK: FOO', 'WARNING: BAR', 'CRITICAL: BAZ', 'UNKNOWN: QUX'], [], + 'CRITICAL: BAZ, WARNING: BAR, UNKNOWN: QUX, OK: FOO'), + (['WARNING: FOO', 'WARNING: BAR'], [], 'WARNING: FOO, WARNING: BAR') )) def test_print_results(check_docker, capsys, messages, perf_data, expected): # These sometimes get set to true when using random-order plugin, for example --random-order-seed=620808 @@ -726,12 +729,13 @@ def test_print_results(check_docker, capsys, messages, perf_data, expected): @pytest.mark.parametrize("messages, perf_data, no_ok, no_performance, expected", ( ([], [], False, False, ''), (['TEST'], [], False, False, 'TEST'), - (['FOO', 'BAR'], [], False, False, 'FOO\nBAR'), - (['FOO', 'BAR'], ['1;2;3;4;'], False, False, 'FOO\nBAR|1;2;3;4;'), + (['FOO', 'BAR'], [], False, False, 'FOO, BAR'), + (['FOO', 'BAR'], ['1;2;3;4;'], False, False, 'FOO, BAR|1;2;3;4;'), ([], [], True, False, 'OK'), (['OK: TEST'], [], True, False, 'OK'), (['OK: FOO', 'OK: BAR'], [], True, False, 'OK'), (['OK: FOO', 'BAR'], ['1;2;3;4;'], True, False, 'BAR|1;2;3;4;'), + (['OK: FOO', 'WARNING: BAR', 'CRITICAL: BAZ'], [], True, False, 'CRITICAL: BAZ, WARNING: BAR'), ([], [], False, True, ''), (['OK: TEST'], [], False, True, 'OK: TEST'), (['OK: TEST'], ['1;2;3;4;'], False, True, 'OK: TEST'), diff --git a/tests/test_check_swarm.py b/tests/test_check_swarm.py index 4df8d22..37e3685 100644 --- a/tests/test_check_swarm.py +++ b/tests/test_check_swarm.py @@ -391,7 +391,9 @@ def test_check_not_swarm_service(check_swarm, fs): @pytest.mark.parametrize("messages, perf_data, expected", ( ([], [], ''), (['TEST'], [], 'TEST'), - (['FOO', 'BAR'], [], 'FOO\nBAR'), + (['FOO', 'BAR'], [], 'FOO, BAR'), + (['OK: FOO', 'WARNING: BAR', 'CRITICAL: BAZ', 'UNKNOWN: QUX'], [], + 'CRITICAL: BAZ, WARNING: BAR, UNKNOWN: QUX, OK: FOO'), )) def test_print_results(check_swarm, capsys, messages, perf_data, expected): check_swarm.messages = messages