1
0
Fork 0
mirror of https://github.com/munin-monitoring/contrib.git synced 2025-07-21 18:41:03 +00:00

add adguardhome plugin

Display blocking stats, dns queries, client protocols and average
processing time of AdGuardHome
This commit is contained in:
Sebastian L 2021-11-19 00:18:18 +01:00 committed by Lars Kruse
parent f184607bbc
commit 0d2bef5ce6

View file

@ -0,0 +1,185 @@
#!/bin/sh
set -e
: << =cut
=head1 NAME
adguardhome - Monitor dns queries
=head1 APPLICABLE SYSTEMS
AdGuardHome instances
=head1 CONFIGURATION
On a low traffic AdGuardHome instance you may want to lower
querylog_size_memory parameter in AdGuardHome configuration, otherwise
there won't be enough data for munin graphs.
log - Querylog file of AdGuardHome
interval - Interval of munin cronjob in minutes
binary - Path to AdGuardHome binary
[adguardhome_dns]
env.log /opt/AdGuardHome/data/querylog.json
env.interval 5
env.binary /opt/AdGuardHome/AdGuardHome
=head1 AUTHOR
Copyright (C) 2020 Sebastian L. (https://momou.ch)
=head1 LICENSE
GPLv2
=head1 MAGIC MARKERS
#%# family=auto
#%# capabilities=autoconf
=cut
. "$MUNIN_LIBDIR/plugins/plugin.sh"
RECORDS="A AAAA ANY CNAME MX NS NXDOMAIN PTR SIG SOA SRV TXT"
CLIENTS="dns doh dot"
case $1 in
autoconf)
if [ -x "${binary:-/opt/AdGuardHome/AdGuardHome}" ]; then
if [ -z "$(command -v AdGuardHome)" ]; then
echo "no (AdGuardHome not found)"
exit 0
else
echo "yes"
exit 0
fi
else
echo "no (/opt/AdGuardHome/AdGuardHome not found)"
exit 0
fi
;;
config)
echo "multigraph adguardhome_queries"
echo "graph_title AdGuardHome - DNS Queries"
echo "graph_info DNS Queries made over AdGuardHome"
echo "graph_args -Y -A -l 0"
echo "graph_category network"
echo "graph_vlabel queries"
echo "queries.label Queries"
echo "queries.info All queries"
echo "queries.min 0"
echo "blocked.label Blocked"
echo "blocked.info Blocked queries by filterlist"
echo "blocked.min 0"
echo "parental.label Parental"
echo "parental.info Blocked by parental filter"
echo "parental.min 0"
echo "safesearch.label Safe search"
echo "safesearch.info Filtered for safe searching"
echo "safesearch.min 0"
echo "safebrowsing.label Safe browsing"
echo "safebrowsing.info Filtered for safe browsing"
echo "safebrowsing.min 0"
echo "multigraph adguardhome_avgproc"
echo "multigraph adguardhome_query_types"
echo "graph_title AdGuardHome - Query types"
echo "graph_info Query types made by AdGuardHome"
echo "graph_vlabel query types"
echo "graph_args -Y -A -l 0"
echo "graph_category network"
for KEY in $RECORDS; do
echo "$KEY.label $KEY"
echo "$KEY.info $KEY"
echo "$KEY.min 0"
done
echo "multigraph adguardhome_client_protos"
echo "graph_title AdGuardHome - Client protocols"
echo "graph_info Client protocols used on AdGuardHome"
echo "graph_vlabel client protocols"
echo "graph_args -A -Y -l 0"
echo "graph_category network"
for KEY in $CLIENTS; do
echo "$KEY.label $KEY"
echo "$KEY.info $KEY"
echo "$KEY.min 0"
done
echo "multigraph adguardhome_avgproc"
echo "graph_title AdGuardHome - Processing time (ms)"
echo "graph_info Average processing time of queries in miliseconds"
echo "graph_vlabel average processing (ms)"
echo "graph_args -A -Y -l 0"
echo "graph_category network"
echo "avgproc.label Average processing time (ms)"
echo "avgproc.info Average processing time in miliseconds"
echo "avgproc.min 0"
exit 0
;;
esac
INTERVAL=$(date -d "${interval:-5} minutes ago" +%FT%H:%M)
LOGDATA=$(sed -ne "s/^\\(.*\\)\\($INTERVAL\\)/\\1\\2/p" "${log:-"/opt/AdGuardHome/data/querylog.json"}")
if [ -z "$LOGDATA" ]; then
for VALUE in queries blocked safesearch safebrowsing parental "$RECORDS" "$CLIENTS" avgproc; do
export $VALUE="U"
done
else
# See internal/filtering.go in AdGuardHome sources
# Reason 0 = NotFilteredNotFound
# Reason 1 = NotFilteredAllowList
# Reason 2 = NotFilteredError
# Reason 3 = FilteredBlockList
# Reason 4 = FilteredSafeBrowsing
# Reason 5 = FilteredParental
# Reason 6 = FilteredInvalid
# Reason 7 = FilteredSafeSearch
# Reason 8 = FilteredBlockedService
queries=$(echo "$LOGDATA" | grep -o \"QT\": | wc -l)
blocked=$(echo "$LOGDATA" | grep -o '\"Reason\":[3,5,8]' | wc -l)
safesearch=$(echo "$LOGDATA" | grep -o \"Reason\":7 | wc -l)
safebrowsing=$(echo "$LOGDATA" | grep -o \"Reason\":4 | wc -l)
parental=$(echo "$LOGDATA" | grep -o \"Reason\":5 | wc -l)
for KEY in $RECORDS; do
export $KEY="$(echo "$LOGDATA" | grep -o \"QT\":\"$KEY\" | wc -l)"
done
for KEY in $CLIENTS; do
if [ $KEY = "dns" ]; then
export $KEY="$(echo "$LOGDATA" | grep -o \"CP\":\"\" | wc -l)"
else
export $KEY="$(echo "$LOGDATA" | grep -o \"CP\":\"$KEY\" | wc -l)"
fi
done
avgproc=$(echo "$LOGDATA" | grep -Po '\"Elapsed\":[0-9]+' | sed "s/\"Elapsed\"://g" | awk '{ total += $0/1000000; count++ } END { print total/count }')
fi
echo "multigraph adguardhome_queries"
echo "queries.value $queries"
echo "blocked.value $blocked"
echo "safesearch.value $safesearch"
echo "safebrowsing.value $safebrowsing"
echo "parental.value $parental"
echo "multigraph adguardhome_query_types"
for KEY in $RECORDS; do
echo "$KEY.value $(eval echo \$"$KEY")"
done
echo "multigraph adguardhome_client_protos"
for KEY in $CLIENTS; do
echo "$KEY.value $(eval echo \$"$KEY")"
done
echo "multigraph adguardhome_avgproc"
echo "avgproc.value $avgproc"