2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00
contrib-munin/plugins/nginx/nginx_error

154 lines
3.5 KiB
Plaintext
Raw Normal View History

2013-05-29 18:50:58 +02:00
#!/bin/bash
# -*- bash -*-
2013-06-02 22:49:38 +02:00
: <<=cut
2013-05-29 18:50:58 +02:00
=head1 NAME
nginx error - Munin plugin to monitor nginx error rates (http status codes per minute).
=head1 APPLICABLE SYSTEMS
Any Linux host, running nginx, with bash version > 4.0
=head1 CONFIGURATION
This shows the default configuration of this plugin. You can override
the log file path and the logpattern.
[nginx_error]
env.logpath /var/log/nginx
env.logpattern a.*.log
Nginx must also be configured to log accesses in "combined" log format (default)
=head1 USAGE
Link this plugin to /etc/munin/plugins/ and restart the munin-node.
This plugin also can be used like wildcard-plugin for monitoring particular virtual host log.
E.g.
ln -s /usr/share/munin/plugins/nginx_error /etc/munin/plugins/nginx_error_mydomaincom
will parse the log file /var/log/nginx/a.mydomaincom.log
You can change 'env.logpattern' using asterisk ('*') to match your logs filenames.
=head1 INTERPRETATION
The plugin shows nginx http "error" status rates by parsing access log.
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf
=head1 BUGS
None known.
=head1 VERSION
1.1 - 2018/01/20
* add 'dirty config' capability support
* fix shell style issues reported by shellcheck
* improve readability of symlink configuration code
1.0 - 2017/02/21
2013-05-29 18:50:58 +02:00
2013-05-29 18:50:58 +02:00
=head1 AUTHOR
vovansystems@gmail.com, 2013
=head1 LICENSE
GPLv3
=cut
# default environment variable values
logpath=${logpath:-/var/log/nginx}
2013-05-29 18:50:58 +02:00
# derive the name of the log file from a potential symlink-configured virtual host
script_name=$(basename "$0")
plugin_suffix=${script_name#nginx_error}
if [ -n "${plugin_suffix#_}" ]; then
# a domain was given via symlink configuration: adjust the logpattern
domain=${plugin_suffix#_}
# default logpattern for symlink configuration mode
logpattern=${logpattern:-a.*.log}
log_filename=${logpattern/\*/$domain}
2013-05-29 18:50:58 +02:00
else
log_filename='access.log'
2013-05-29 18:50:58 +02:00
fi
log="$logpath/$log_filename"
2013-05-29 18:50:58 +02:00
# declaring an array with http status codes, we are interested in
declare -A http_codes
http_codes[400]='Bad Request'
http_codes[401]='Unauthorized'
http_codes[403]='Forbidden'
http_codes[404]='Not Found'
http_codes[405]='Method Not Allowed'
http_codes[406]='Not Acceptable'
http_codes[408]='Request Timeout'
http_codes[429]='Too Many Requests'
http_codes[499]='Client Connection Terminated'
http_codes[500]='Internal Server Error'
http_codes[502]='Bad Gateway'
http_codes[503]='Service Unavailable'
# parse error counts from log file
do_fetch () {
local count status_code
declare -A line_counts
while read -r count status_code; do
line_counts[$status_code]=$count
done <<< "$(awk '{print $9}' "$log" | sort | uniq -c)"
for status_code in "${!http_codes[@]}"; do
echo "error${status_code}.value ${line_counts[$status_code]:-0}"
2013-05-29 18:50:58 +02:00
done
}
2013-05-29 18:50:58 +02:00
do_config () {
local status_code
echo "graph_title $(basename "$log") - Nginx errors per minute"
echo "graph_vlabel pages with http error codes / \${graph_period}"
echo "graph_category webserver"
2013-05-29 18:50:58 +02:00
echo "graph_period minute"
echo "graph_info This graph shows nginx error amount per minute"
for status_code in "${!http_codes[@]}"; do
echo "error${status_code}.type DERIVE"
echo "error${status_code}.min 0"
echo "error${status_code}.label $status_code ${http_codes[$status_code]}"
2013-05-29 18:50:58 +02:00
done
}
2013-05-29 18:50:58 +02:00
do_autoconf () {
echo yes
}
2013-05-29 18:50:58 +02:00
case $1 in
config)
do_config
# support "dirty config" capability
if [ "${MUNIN_CAP_DIRTYCONFIG:-}" = "1" ]; then do_fetch; fi
;;
autoconf)
do_autoconf
;;
'')
do_fetch
;;
2013-05-29 18:50:58 +02:00
esac
2013-06-02 22:49:38 +02:00
exit $?