alarming: add additional performance data

Options -p or --perfdata (in alarming mode) now enable the output of
additional performance data, i.e.  used, touched and backup addresses per
subnet.

Signed-off-by: Manuel Hachtkemper <hacman@math.uni-bonn.de>
Signed-off-by: Sami Kerola <kerolasa@iki.fi>
This commit is contained in:
Manuel Hachtkemper 2016-03-29 14:49:06 +02:00 committed by Sami Kerola
parent c305e2f82c
commit 32e2d399a0
No known key found for this signature in database
GPG key ID: A9553245FDE9B739
12 changed files with 103 additions and 4 deletions

1
THANKS
View file

@ -38,3 +38,4 @@ Martijn van Brummelen
Anton Tkachev Anton Tkachev
Derrick Lin Derrick Lin
Ivanov Ivan Ivanov Ivan
Manuel Hachtkemper

View file

@ -192,6 +192,12 @@ defined size. This option is meaningful only in context of alarming, and
will intented to supress for example single host ranges. By default this will intented to supress for example single host ranges. By default this
option is not in use. option is not in use.
.TP .TP
\fB\-p\fR, \fB\-\-perfdata\fR
Print additional performance data, like lease count, touched leases and
backup leases. This option is meaningful only in context of alarming and
will print lots of data, if there are many networks. By default this option
is not in use.
.TP
\fB\-v\fR, \fB\-\-version\fR \fB\-v\fR, \fB\-\-version\fR
Print version information to standard output and exit successfully. Print version information to standard output and exit successfully.
.TP .TP

View file

@ -129,6 +129,7 @@ int main(int argc, char **argv)
{"warn-count", required_argument, NULL, OPT_WARN_COUNT}, {"warn-count", required_argument, NULL, OPT_WARN_COUNT},
{"crit-count", required_argument, NULL, OPT_CRIT_COUNT}, {"crit-count", required_argument, NULL, OPT_CRIT_COUNT},
{"minsize", required_argument, NULL, OPT_MINSIZE}, {"minsize", required_argument, NULL, OPT_MINSIZE},
{"perfdata", no_argument, NULL, 'p'},
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
@ -148,6 +149,7 @@ int main(int argc, char **argv)
config.critical = ALARM_CRIT; config.critical = ALARM_CRIT;
config.warn_count = 0x100000000; /* == 2^32 that is the entire IPv4 space */ config.warn_count = 0x100000000; /* == 2^32 that is the entire IPv4 space */
config.crit_count = 0x100000000; /* basically turns off the count criteria */ config.crit_count = 0x100000000; /* basically turns off the count criteria */
config.perfdata = false;
/* File location defaults */ /* File location defaults */
strncpy(config.dhcpdconf_file, DHCPDCONF_FILE, MAXLEN - 1); strncpy(config.dhcpdconf_file, DHCPDCONF_FILE, MAXLEN - 1);
strncpy(config.dhcpdlease_file, DHCPDLEASE_FILE, MAXLEN - 1); strncpy(config.dhcpdlease_file, DHCPDLEASE_FILE, MAXLEN - 1);
@ -165,7 +167,7 @@ int main(int argc, char **argv)
while (1) { while (1) {
int c; int c;
c = getopt_long(argc, argv, "c:l:f:o:s:rL:vh", long_options, &option_index); c = getopt_long(argc, argv, "c:l:f:o:s:rL:pvh", long_options, &option_index);
if (c == EOF) if (c == EOF)
break; break;
switch (c) { switch (c) {
@ -235,6 +237,10 @@ int main(int argc, char **argv)
case OPT_MINSIZE: case OPT_MINSIZE:
config.minsize = strtod_or_err(optarg, "illegal argument"); config.minsize = strtod_or_err(optarg, "illegal argument");
break; break;
case 'p':
/* Print additional performance data in alarming mode */
config.perfdata = true;
break;
case 'v': case 'v':
/* Print version */ /* Print version */
print_version(); print_version();

View file

@ -210,6 +210,7 @@ struct configuration_t {
backups_found:1, backups_found:1,
snet_alarms:1, snet_alarms:1,
print_mac_addreses:1, print_mac_addreses:1,
perfdata:1,
header_limit:3, header_limit:3,
number_limit:3; number_limit:3;
}; };

View file

@ -474,6 +474,7 @@ void __attribute__ ((__noreturn__)) usage(int status)
fputs( " --crit-count=NR a number of free leases before critical raised\n", out); fputs( " --crit-count=NR a number of free leases before critical raised\n", out);
fputs( " --minsize=size disable alarms for small ranges and shared-nets\n", out); fputs( " --minsize=size disable alarms for small ranges and shared-nets\n", out);
fputs( " --snet-alarms suppress range alarms that are part of a shared-net\n", out); fputs( " --snet-alarms suppress range alarms that are part of a shared-net\n", out);
fputs( " -p --perfdata print additional perfdata in alarming mode\n", out);
fputs( " -v, --version output version information and exit\n", out); fputs( " -v, --version output version information and exit\n", out);
fputs( " -h, --help display this help and exit\n", out); fputs( " -h, --help display this help and exit\n", out);
fputs( "\n", out); fputs( "\n", out);

View file

@ -1014,6 +1014,29 @@ int output_alarming(void)
if (ri != 0) { if (ri != 0) {
fprintf(outfile, " range_ignored=%d", ri); fprintf(outfile, " range_ignored=%d", ri);
} }
if (config.perfdata == 1 && config.number_limit & R_BIT) {
for (i = 0; i < num_ranges; i++) {
range_p--;
range_size = get_range_size(range_p);
if (config.minsize < range_size) {
fprintf(outfile, " %s_r=",
ntop_ipaddr(&range_p->first_ip));
fprintf(outfile, "%g;%g;%g;0;%g",
range_p->count,
(range_size * config.warning / 100),
(range_size * config.critical / 100),
range_size);
fprintf(outfile, " %s_rt=%g",
ntop_ipaddr(&range_p->first_ip),
range_p->touched);
if (config.backups_found == 1) {
fprintf(outfile, " %s_rbu=%g",
ntop_ipaddr(&range_p->first_ip),
range_p->backups);
}
}
}
}
fprintf(outfile, "\n"); fprintf(outfile, "\n");
} else { } else {
fprintf(outfile, " "); fprintf(outfile, " ");
@ -1025,7 +1048,29 @@ int output_alarming(void)
} }
fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sc, sw, so); fprintf(outfile, "; | snet_crit=%d snet_warn=%d snet_ok=%d", sc, sw, so);
if (si != 0) { if (si != 0) {
fprintf(outfile, " snet_ignored=%d\n", si); fprintf(outfile, " snet_ignored=%d", si);
}
if (config.perfdata == 1 && config.header_limit & R_BIT) {
for (i = 0; i < num_shared_networks; i++) {
if (config.minsize < shared_p->available) {
fprintf(outfile, " '%s_s'=%g;%g;%g;0;%g",
shared_p->name,
shared_p->used,
(shared_p->available * config.warning / 100),
(shared_p->available * config.critical / 100),
shared_p->available);
fprintf(outfile, " '%s_st'=%g",
shared_p->name,
shared_p->touched);
if (config.backups_found == 1) {
fprintf(outfile, " '%s_sbu'=%g",
shared_p->name,
shared_p->backups);
}
}
shared_p--;
}
fprintf(outfile, "\n");
} }
} }
fprintf(outfile, "\n"); fprintf(outfile, "\n");

View file

@ -13,6 +13,7 @@ TESTS = \
tests/big-small \ tests/big-small \
tests/bootp \ tests/bootp \
tests/complete \ tests/complete \
tests/complete-perfdata \
tests/empty \ tests/empty \
tests/full-json \ tests/full-json \
tests/full-xml \ tests/full-xml \
@ -22,7 +23,8 @@ TESTS = \
tests/same-twice \ tests/same-twice \
tests/simple \ tests/simple \
tests/sorts \ tests/sorts \
tests/v6 tests/v6 \
tests/v6-perfdata
EXTRA_DIST += \ EXTRA_DIST += \
tests/confs \ tests/confs \

16
tests/complete-perfdata Executable file
View file

@ -0,0 +1,16 @@
#!/bin/sh
#
# Minimal regression test suite.
IAM=$(basename $0)
TESTDATA=${IAM%-*}
if [ ! -d tests/outputs ]; then
mkdir tests/outputs
fi
dhcpd-pools -c $top_srcdir/tests/confs/$TESTDATA \
-l $top_srcdir/tests/leases/$TESTDATA -o tests/outputs/$IAM \
--warning 80 --perfdata
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
exit $?

View file

@ -9,7 +9,6 @@ Shared nets - crit: 1 warn: 0 ok: 1; | snet_crit=1 snet_warn=0 snet_ok=1
== minsize == == minsize ==
OK: Ranges - crit: 0 warn: 0 ok: 0 ignored: 5; | range_crit=0 range_warn=0 range_ok=0 range_ignored=5 OK: Ranges - crit: 0 warn: 0 ok: 0 ignored: 5; | range_crit=0 range_warn=0 range_ok=0 range_ignored=5
Shared nets - crit: 0 warn: 0 ok: 0 ignored: 2; | snet_crit=0 snet_warn=0 snet_ok=0 snet_ignored=2 Shared nets - crit: 0 warn: 0 ok: 0 ignored: 2; | snet_crit=0 snet_warn=0 snet_ok=0 snet_ignored=2
0 0
== snet alarms == == snet alarms ==
WARNING: dhcpd-pools: Ranges - crit: 0 warn: 0 ok: 0; | range_crit=0 range_warn=0 range_ok=0 WARNING: dhcpd-pools: Ranges - crit: 0 warn: 0 ok: 0; | range_crit=0 range_warn=0 range_ok=0

View file

@ -0,0 +1,3 @@
OK: Ranges - crit: 0 warn: 0 ok: 5; | range_crit=0 range_warn=0 range_ok=5 10.4.0.1_r=5;16;18;0;20 10.4.0.1_rt=0 10.3.0.1_r=9;16;18;0;20 10.3.0.1_rt=0 10.2.0.1_r=8;16;18;0;20 10.2.0.1_rt=0 10.1.0.1_r=10;16;18;0;20 10.1.0.1_rt=0 10.0.0.1_r=11;16;18;0;20 10.0.0.1_rt=0
Shared nets - crit: 0 warn: 0 ok: 2; | snet_crit=0 snet_warn=0 snet_ok=2 'example2_s'=17;32;36;0;40 'example2_st'=0 'example1_s'=21;32;36;0;40 'example1_st'=0

View file

@ -0,0 +1,3 @@
OK: Ranges - crit: 0 warn: 0 ok: 2; | range_crit=0 range_warn=0 range_ok=2 dead:abba:4000::2_r=1;203.2;228.6;0;254 dead:abba:4000::2_rt=0 dead:abba:1000::2_r=2;3.77789e+21;4.25013e+21;0;4.72237e+21 dead:abba:1000::2_rt=1
Shared nets - crit: 0 warn: 0 ok: 0; | snet_crit=0 snet_warn=0 snet_ok=0

16
tests/v6-perfdata Executable file
View file

@ -0,0 +1,16 @@
#!/bin/sh
#
# Minimal regression test suite.
IAM=$(basename $0)
TESTDATA=${IAM%-*}
if [ ! -d tests/outputs ]; then
mkdir tests/outputs
fi
dhcpd-pools -c $top_srcdir/tests/confs/$TESTDATA \
-l $top_srcdir/tests/leases/$TESTDATA -o tests/outputs/$IAM \
--warning 80 --perfdata
diff -u $top_srcdir/tests/expected/$IAM tests/outputs/$IAM
exit $?