209 lines
6.1 KiB
Bash
Executable File
209 lines
6.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# vim: expandtab:ts=4:sw=4
|
|
|
|
: << =cut
|
|
|
|
=head1 NAME
|
|
|
|
http_response - Monitor HTTP response statistics
|
|
|
|
=head1 CONFIGURATION
|
|
|
|
The following environment variables are used
|
|
|
|
sites - Sites to check
|
|
- separated by spaces
|
|
- can contain basic auth credentials
|
|
- defaults to "http://localhost/"
|
|
max_time - Timeout for each site check in seconds
|
|
- defaults to 5 seconds
|
|
short_label - Switch for shortening the label below the graph
|
|
- defaults to false
|
|
follow_redirect - Follow http redirects
|
|
- defaults to false
|
|
|
|
=head2 CONFIGURATION EXAMPLE
|
|
|
|
[http_response]
|
|
env.sites http://example.com/ https://user:secret@example2.de
|
|
env.max_time 20
|
|
env.short_label true
|
|
env.follow_redirect true
|
|
|
|
=head1 PREREQUISITES
|
|
|
|
This plugin needs at least bash version 4 to run
|
|
|
|
=head1 NOTES
|
|
|
|
This plugin unifies the functionalities of the following plugins into one
|
|
multigraph plugin
|
|
|
|
http_loadtime - https://gallery.munin-monitoring.org/plugins/munin/http_loadtime/
|
|
http_responsecode - https://gallery.munin-monitoring.org/plugins/munin-contrib/http_responsecode/
|
|
|
|
In contrast to using these two plugins with the same configuration, this plugin
|
|
performs only one request per site and munin run to gather its statistics.
|
|
|
|
=head1 AUTHOR
|
|
|
|
Copyright (C) 2020 Klaus Sperner
|
|
|
|
=head1 LICENSE
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; version 2 dated June,
|
|
1991.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
=head1 MAGIC MARKERS
|
|
|
|
#%# family=manual
|
|
|
|
=cut
|
|
|
|
. "$MUNIN_LIBDIR/plugins/plugin.sh"
|
|
|
|
readonly uri_regex='^(https?://)([^:]*):(.*)@(.*)$'
|
|
|
|
strip_credentials_from_url() {
|
|
if [[ "$1" =~ $uri_regex ]]; then
|
|
echo "${BASH_REMATCH[1]}${BASH_REMATCH[4]}"
|
|
else
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
extract_username_from_url() {
|
|
if [[ "$1" =~ $uri_regex ]]; then
|
|
echo "${BASH_REMATCH[2]}"
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
extract_password_from_url() {
|
|
if [[ "$1" =~ $uri_regex ]]; then
|
|
echo "${BASH_REMATCH[3]}"
|
|
else
|
|
echo ""
|
|
fi
|
|
}
|
|
|
|
compute_label() {
|
|
if [[ "${short_label,,}" == "true" || "${short_label,,}" == "yes" ]]; then
|
|
if [[ ${#1} -gt 33 ]]; then
|
|
echo "${1:0:30}..."
|
|
else
|
|
echo "$1"
|
|
fi
|
|
else
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
if [[ "${BASH_VERSINFO:-0}" -lt 4 ]]; then
|
|
>&2 echo "The plugin http_response needs at least bash version 4"
|
|
exit 1
|
|
fi
|
|
|
|
sites=${sites:-"http://localhost/"}
|
|
max_time=${max_time:-5}
|
|
short_label=${short_label:-"false"}
|
|
follow_redirect=${follow_redirect:-"false"}
|
|
|
|
if [[ "$1" == "config" ]]; then
|
|
echo 'multigraph http_response_code'
|
|
echo 'graph_args --base 1000 -l 0 -u 511'
|
|
echo 'graph_title HTTP Response Codes'
|
|
echo 'graph_vlabel Response Code'
|
|
echo 'graph_category network'
|
|
echo 'graph_info This graph shows HTTP response code statistics'
|
|
echo 'graph_printf %3.0lf'
|
|
for site in $sites; do
|
|
site_without_credentials=$( strip_credentials_from_url "$site" )
|
|
siteid="$( clean_fieldname "$site_without_credentials" )"
|
|
echo "$siteid.label $( compute_label "$site_without_credentials" )"
|
|
echo "$siteid.info HTTP response code statistics for $site_without_credentials"
|
|
echo "$siteid.critical 99:399";
|
|
done
|
|
echo 'multigraph http_response_time'
|
|
echo 'graph_args --base 1000 -l 0'
|
|
echo 'graph_title HTTP Response Times'
|
|
echo 'graph_vlabel Response Time in seconds'
|
|
echo 'graph_category network'
|
|
echo 'graph_info This graph shows HTTP response time statistics'
|
|
for site in $sites; do
|
|
site_without_credentials=$( strip_credentials_from_url "$site" )
|
|
siteid="$( clean_fieldname "$site_without_credentials" )"
|
|
echo "$siteid.label $( compute_label "$site_without_credentials" )"
|
|
echo "$siteid.info HTTP response time statistics for $site_without_credentials"
|
|
done
|
|
exit 0
|
|
fi
|
|
|
|
declare -A response_codes
|
|
declare -A response_times
|
|
|
|
for site in $sites; do
|
|
site_without_credentials=$( strip_credentials_from_url "$site" )
|
|
username=$( extract_username_from_url "$site" )
|
|
password=$( extract_password_from_url "$site" )
|
|
|
|
curl_config_file=""
|
|
curl_auth_opt=()
|
|
if [ -n "$username" ]; then
|
|
if [ -z "$password" ]; then
|
|
>&2 echo "Invalid configuration: username specified without password"
|
|
exit 1
|
|
fi
|
|
curl_config_file=$(mktemp) || exit 1
|
|
trap 'rm -f "$curl_config_file"' EXIT
|
|
echo "user=${username}:${password}" >> "$curl_config_file"
|
|
curl_auth_opt=(--config "$curl_config_file")
|
|
fi
|
|
|
|
curl_arg=""
|
|
if $follow_redirect; then
|
|
curl_arg="--location"
|
|
fi
|
|
|
|
siteid="$( clean_fieldname "$site_without_credentials" )"
|
|
statuscode=
|
|
loadtime=
|
|
start=$(date +%s.%N)
|
|
statuscode=$( curl "${curl_auth_opt[@]}" --write-out '%{http_code}' --max-time "$max_time" $curl_arg --silent --output /dev/null "$site_without_credentials" )
|
|
returncode=$?
|
|
loadtime=$( echo "$start" "$(date +%s.%N)" | awk '{ print($2 - $1); }' )
|
|
if [[ $returncode -ne 0 ]]; then
|
|
loadtime="U"
|
|
statuscode="U"
|
|
fi
|
|
response_codes+=(["$siteid"]="$statuscode")
|
|
response_times+=(["$siteid"]="$loadtime")
|
|
|
|
if [ -n "$curl_config_file" ]; then
|
|
rm -f "$curl_config_file"
|
|
fi
|
|
done
|
|
|
|
echo 'multigraph http_response_code'
|
|
for siteid in "${!response_codes[@]}"; do
|
|
echo "${siteid}.value ${response_codes[${siteid}]}"
|
|
done
|
|
|
|
echo 'multigraph http_response_time'
|
|
for siteid in "${!response_times[@]}"; do
|
|
echo "${siteid}.value ${response_times[${siteid}]}"
|
|
done
|
|
|