diff --git a/checkmk/custom-files/local/monitor-postgrest b/checkmk/custom-files/local/monitor-postgrest new file mode 100644 index 0000000000000000000000000000000000000000..bf49ed4e22a3ab3a67483297f7a825f0b59583e6 --- /dev/null +++ b/checkmk/custom-files/local/monitor-postgrest @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +instance_names=() +instance_admin_ports=() +{% for instance_name, instance_conf in instances.items() %} +instance_names+=("{{ instance_name }}") +instance_admin_ports+=("{{ instance_conf['config']['admin-server-port'] }}") +{% endfor %} + +function check_endpoint() { + admin_port="$1" + endpoint="$2" + + url="127.0.0.1:$admin_port/$endpoint" + response=$(wget --quiet --spider --server-response --output-document - "$url" 2>&1) + wget_exit_code=$? + if [ $wget_exit_code -ne 0 ]; then + return $wget_exit_code + fi + status_code=$(awk 'NR==1{print $2}' <<<"$response") + echo "$status_code" +} + +function get_status_detail() { + status_code="$1" + good="$2" + bad="$3" + + if [ "$status_code" = 200 ]; then + echo "$good" + else + echo "$bad" + fi +} + +function get_checkmk_status() { + status_codes=("$@") + + for code in "${status_codes[@]}"; do + if [ "$code" != 200 ]; then + echo 2 + return + fi + done + echo 0 +} + +function crit_on_non_zero() { + instance_name="$1" + exit_code="$2" + + if [ "$exit_code" != 0 ]; then + echo "2 \"$instance_name PostgREST Status\" - Failed to connect (wget exit code: $exit_code)" + exit 0 + fi +} + +function check_instance() { + instance_name="$1" + instance_port="$2" + + live_status_code=$(check_endpoint "$instance_port" "live") + crit_on_non_zero "$instance_name" $? + ready_status_code=$(check_endpoint "$instance_port" "ready") + crit_on_non_zero "$instance_name" $? + + status_codes=("$live_status_code" "$ready_status_code") + checkmk_status=$(get_checkmk_status "${status_codes[@]}") + + live_status_detail=$(get_status_detail "$live_status_code" "running" "dead") + ready_status_detail=$(get_status_detail "$ready_status_code" "correct" "invalid") + + checkmk_status_detail="PostgREST $live_status_detail (status: $live_status_code)" + checkmk_status_detail+=", internal state $ready_status_detail (status: $ready_status_code)" + + echo "$checkmk_status \"$instance_name PostgREST Status\" - $checkmk_status_detail" +} + +for i in "${!instance_names[@]}"; do + check_instance "${instance_names[$i]}" "${instance_admin_ports[$i]}" +done diff --git a/checkmk/debian/monitor_postgrest.sls b/checkmk/debian/monitor_postgrest.sls new file mode 100644 index 0000000000000000000000000000000000000000..7c9cb2a103ad65cee5cdc437c8876035aa84c83f --- /dev/null +++ b/checkmk/debian/monitor_postgrest.sls @@ -0,0 +1,12 @@ +{% set instances = salt['pillar.get']("postgrest:instances") %} + +hsh_checkmk_monitor_postgrest_plugin: + file.managed: + - name: /usr/lib/check_mk_agent/local/monitor-postgrest + - source: salt://checkmk/custom-files/local/monitor-postgrest + - template: jinja + - context: + instances: {{ instances }} + - mode: 755 + - user: root + - group: root