diff --git a/check_couchdb b/check_couchdb index 150ceaa93b11fdf43880028ba31bae30fc5f19a8..38388c0877696569feb2d6373ce2e2bbdb1499be 100755 --- a/check_couchdb +++ b/check_couchdb @@ -15,11 +15,12 @@ # ---------------------------------------------------------------------- # 2023-08-28 v0.1 <axel.hahn@unibe.ch> first lines # 2023-08-28 v0.2 <axel.hahn@unibe.ch> first check "up" +# 2023-08-28 v0.3 <axel.hahn@unibe.ch> add check "replication" # ====================================================================== . $(dirname $0)/inc_pluginfunctions -export self_APPVERSION=0.2 +export self_APPVERSION=0.3 cfgfile=/etc/icingaclient/.couchdb @@ -42,7 +43,12 @@ OPTIONS: -h or --help show this help. -c CFGFILE set a custom config file default: ${cfgfile} - -m MODE test a value; for debugging purposes + -m MODE test a value; for debugging purposes the full json + response will be shown + + MODE is one of + up show general couchdb status + replication show last replication status EXAMPLE: $_self -m up @@ -51,6 +57,27 @@ $_self -m up EOF } +# get couchdb status by given url and a filter +# The check aborts here if no data were found. +# param string url to request; the part behind couchdb base url +# param string string to search for in the content +function get(){ + _path="$1" + curl -s "${COUCH_URL}${_path}" +} + +function abortOnWrongResponse(){ + _response="$1" + _path="$2" + _filter="$3" + + if ! grep "$_filter" <<< "$_response" >/dev/null ; then + echo "ERROR: Wrong response from $_path - it does not contain $_filter" + curl -si "${COUCH_URL}${2}" + ph.abort + fi +} + # ---------------------------------------------------------------------- # MAIN # ---------------------------------------------------------------------- @@ -64,6 +91,8 @@ case "$1" in *) esac +ph.require jq + sMode=$(ph.getValueWithParam '' "m" "$@") cfgfile=$(ph.getValueWithParam "${cfgfile}" "c" "$@") @@ -84,12 +113,32 @@ fi case "${sMode}" in "up") - response=$( curl -s "${COUCH_URL}/_up" ) + response=$( get "/_up" ) + abortOnWrongResponse "$response" "/_up" '"status":"' + _status=$( jq '.status' <<< "${response}" | tr -d '"') if ! echo "$_status" | grep "ok" >/dev/null; then ph.setStatus critical fi - ph.status "Couchdb status (value in /_up is '$_status')" + ph.status "Couchdb status (value 'status' in /_up is '$_status')" + echo "Reponse: "; echo "${response}" | jq + ;; + "replication") + response=$( get "/_up" ) + abortOnWrongResponse "$response" "/_up" '"status":"' + + _status=$( jq '.seeds[] | .last_replication_status' <<< "${response}" | grep -v "null" | tr -d '"') + + # there can be multiple sections "seeds" and multiple line responses. + # remove all lines with "ok" and check if there is any "bad content" left + _nonok=$( echo "$_status" | grep -v "ok" ) + if [ -n "$_nonok" ]; then + ph.setStatus critical + fi + if ! echo "$_status" | grep "ok" >/dev/null; then + ph.setStatus critical + fi + ph.status "Couchdb replication" echo "Reponse: "; echo "${response}" | jq ;; *) @@ -101,4 +150,4 @@ esac ph.exit -# ---------------------------------------------------------------------- +# ---------------------------------------------------------------------- \ No newline at end of file diff --git a/docs/20_Checks/check_couchdb.md b/docs/20_Checks/check_couchdb.md index 8698c95db4c07b13181809f2a2c704fdbfe361dd..b5fd68875816e95d9b488820a55de1ac11f19043 100644 --- a/docs/20_Checks/check_couchdb.md +++ b/docs/20_Checks/check_couchdb.md @@ -6,6 +6,8 @@ Check couchdb status. ### Requirements +* curl +* jq * a running couchdb service * authentication (see section Installation below) @@ -16,7 +18,7 @@ Check couchdb status. ______________________________________________________________________ CHECK_COUCHDB -v0.2 +v0.3 (c) Institute for Medical Education - University of Bern Licence: GNU GPL 3 @@ -33,7 +35,12 @@ OPTIONS: -h or --help show this help. -c CFGFILE set a custom config file default: /etc/icingaclient/.couchdb - -m MODE test a value; for debugging purposes + -m MODE test a value; for debugging purposes the full json + response will be shown + + MODE is one of + up show general couchdb status + replication show last replication status EXAMPLE: check_couchdb -m up @@ -66,13 +73,17 @@ With the parameter ``-m METHOD`` you define what kind of check to perform. ### up Simple check if couchdb is up and running. + +From url ``/up`` it fetches the value status. +It switches to critical if one of the seeds is not "ok". + `check_couchdb -m up` returns ```txt OK: Couchdb status (value in /_up is 'ok') Reponse: { - "status": "ok", + "status": "ok", <<< checked value "seeds": { "couchdb@192.168.25.172": { "timestamp": "2023-08-28T07:27:54.938619Z", @@ -87,3 +98,30 @@ Reponse: } } ``` + +### replication + +From url ``/up`` it fetches seeds -> [node] -> last_replication_status. +It switches to critical if one of the seeds is not "ok". + +``check_couchdb -m replication`` returns + +```txt +OK: Couchdb replication +Reponse: +{ + "status": "ok", + "seeds": { + "couchdb@192.168.25.172": { + "timestamp": "2023-08-28T07:27:54.938619Z", + "last_replication_status": "ok", <<< checked value + "pending_updates": { + "_nodes": 0, + "_dbs": 0, + "_users": 0 + } + }, + "couchdb@192.168.25.61": {} + } +} +```