1<?php
2#
3# Plugin: check_apachestatus.pl by De Bodt Lieven
4# http://exchange.nagios.org/directory/Plugins/Web-Servers/Apache/check_apachestatus/details
5# plugin produces GAUGE values
6#
7# pnp4nagios templating: Roman Ovchinnikov <coolthecold@gmail.com>
8# pnp version >= 0.6.5
9#
10#
11# from apache's scoreboard.h
12#	 #define SERVER_DEAD 0
13#	 #define SERVER_STARTING 1   /* Server Starting up */
14#	 #define SERVER_READY 2      /* Waiting for connection (or accept() lock) */
15#	 #define SERVER_BUSY_READ 3  /* Reading a client request */
16#	 #define SERVER_BUSY_WRITE 4 /* Processing a client request */
17#	 #define SERVER_BUSY_KEEPALIVE 5 /* Waiting for more requests via keepalive */
18#	 #define SERVER_BUSY_LOG 6   /* Logging the request */
19#	 #define SERVER_BUSY_DNS 7   /* Looking up a hostname */
20#	 #define SERVER_CLOSING 8    /* Closing the connection */
21#	 #define SERVER_GRACEFUL 9   /* server is gracefully finishing request */
22#	 #define SERVER_IDLE_KILL 10     /* Server is cleaning up idle children. */
23#	 #define SERVER_NUM_STATUS 11    /* number of status settings */
24
25# perfdata example:
26# Performance Data: 'Waiting for Connection'=90 'Starting Up'=0 'Reading Request'=10 'Sending Reply'=196 'Keepalive (read)'=360 'DNS Lookup'=0 'Closing Connection'=77 'Logging'=0 'Gracefully finishing'=0 'Idle cleanup'=0 'Open slot'=547 'Requests/sec'=119.0 'kB per sec'=8294.4KB 'kB per Request'=69.9KB
27#
28
29
30# first graph - workers that do smth, not just idling..
31$ds_name[1]="Working slots";
32$opt[1] = " --vertical-label \"Workers\" --title \"Apache Workers: working on $hostname / $servicedesc\" ";
33$opt[1] .= " --slope-mode ";
34$def[1] = rrd::def("var2",$RRDFILE[2],$DS[2],"AVERAGE"); #starting
35$def[1] .= rrd::cdef("negstarting","var2,-1,*"); #starting
36$def[1] .= rrd::def("var3",$RRDFILE[3],$DS[3],"AVERAGE"); #reading
37$def[1] .= rrd::cdef("negreading","var3,-1,*"); #reading
38$def[1] .= rrd::def("var4",$RRDFILE[4],$DS[4],"AVERAGE"); #reply
39$def[1] .= rrd::def("var6",$RRDFILE[6],$DS[6],"AVERAGE"); #DNS LOOKUP
40$def[1] .= rrd::cdef("negdns","var6,-1,*"); #DNS LOOKUP
41$def[1] .= rrd::def("var7",$RRDFILE[7],$DS[7],"AVERAGE"); #closing
42$def[1] .= rrd::cdef("negclosing","var7,-1,*"); #closing
43$def[1] .= rrd::def("var8",$RRDFILE[8],$DS[8],"AVERAGE"); #logging
44$def[1] .= rrd::cdef("neglogging","var8,-1,*"); #logging
45$def[1] .= rrd::area("negclosing","#b7ff9e","closing",true ); #closing
46$def[1] .= rrd::line1("negclosing","#2eae00");
47$def[1] .= rrd::gprint("var7",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
48$def[1] .= rrd::area("negstarting","#993300","starting"); #startung
49$def[1] .= rrd::gprint("var2",array("LAST","MAX","AVERAGE"),"%7.0lf");
50$def[1] .= rrd::area("negreading","#001919","reading",true); #reading
51$def[1] .= rrd::gprint("var3",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
52$def[1] .= rrd::area("negdns","#009900","DNS lookup",true); #dns lookup
53$def[1] .= rrd::gprint("var6",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
54$def[1] .= rrd::area("neglogging","#ff0000","logging",true); #logging
55$def[1] .= rrd::gprint("var8",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
56$def[1] .= rrd::area("var4","#6fb7ff","replying"); #replying
57$def[1] .= rrd::line1("var4","#0019ff",FALSE,FALSE);
58$def[1] .= rrd::gprint("var4",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
59
60
61# second graph - idling workers
62#some idle actions like graceful shutdown, open slots & such
63$ds_name[2]="Idling slots";
64$opt[2] = " --vertical-label \"Workers\" --title \"Apache Workers: idling on $hostname / $servicedesc\" ";
65$opt[2] .= " --slope-mode ";
66$def[2] = rrd::def("var2",$RRDFILE[5],$DS[5],"AVERAGE"); #keepalive (read)
67$def[2] .= rrd::def("var3",$RRDFILE[1],$DS[1],"AVERAGE"); #waiting
68$def[2] .= rrd::def("var4",$RRDFILE[10],$DS[10],"AVERAGE"); #idle cleanup
69$def[2] .= rrd::def("var5",$RRDFILE[9],$DS[9],"AVERAGE"); #gracefully finishing
70$def[2] .= rrd::area("var3","#ffe4c4","waiting for conn");
71$def[2] .= rrd::line1("var3","#eb891d");
72$def[2] .= rrd::gprint("var3",array("LAST","MAX","AVERAGE"),"%7.0lf") ;#TODO - add border lines like for finishing
73$def[2] .= rrd::area("var2","#503020","keepalive",true); #TODO - add border lines like for finishing
74$def[2] .= rrd::gprint("var2",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
75$def[2] .= rrd::area("var4","#66cdaa","idle cleanup",true);
76$def[2] .= rrd::gprint("var4",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
77$def[2] .= rrd::area("var5","#6fb7ff","gracefully finishing",true);
78$def[2] .= rrd::cdef("grline","var2,var3,var4,var5,+,+,+"); #line shouldn't be stacked over
79$def[2] .= rrd::line1("grline","#0019ff",FALSE,FALSE);
80$def[2] .= rrd::gprint("var5",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
81
82#third graph - open slots count
83$ds_name[3]="Open slots";
84$opt[3] = " --vertical-label \"Workers\" --title \"Apache open slots on $hostname / $servicedesc\" ";
85$opt[3] .= " --slope-mode ";
86$def[3] = rrd::def("var1",$RRDFILE[11],$DS[11],"AVERAGE");
87$def[3] .= rrd::area("var1","#e0e0e0","open slots" );
88$def[3] .= rrd::line1("var1","#858585");
89$def[3] .= rrd::gprint("var1",array("LAST","MAX","AVERAGE"),"%7.0lf") ;
90
91
92#fourth graph - server's traffic total and per request
93$ds_name[4]="Apache Traffic";
94$opt[4] = " --vertical-label \"Traffic\" -b 1024 --title \"Apache Traffic for $hostname / $servicedesc\" ";
95$opt[4] .= " --slope-mode ";
96$def[4] = rrd::def("var1",$RRDFILE[13],$DS[13],"AVERAGE");
97$def[4] .= rrd::cdef("trbytes","var1,1024,*");
98$def[4] .= rrd::def("var2",$RRDFILE[14],$DS[14],"AVERAGE");
99$def[4] .= rrd::cdef("negperreq","var2,-1,*");
100$def[4] .= "VDEF:totalbytes=trbytes,TOTAL ";
101$def[4] .= rrd::area("trbytes","#b0c0fb","throughput");
102$def[4] .= rrd::line1("trbytes","#3c63ff");
103$def[4] .= rrd::gprint("trbytes",array("LAST","MAX","AVERAGE"),"%7.2lf %sB/sec") ;
104$def[4] .= rrd::line2("negperreq","#00ff00","kB/request");
105$def[4] .= rrd::gprint("var2",array("LAST","MAX","AVERAGE"),"%7.2lf %s$UNIT[14]") ;
106$def[4] .= "GPRINT:totalbytes:\"%3.0lf %sB total\\n\" ";
107
108#fifth graph - requests per sec ( rate is calculated by apache, time smoothed, very averaged, shouldn't be believed)
109$ds_name[5]="Apache requests";
110$opt[5] = " --vertical-label \"Request/sec\" --title \"Apache request/sec for $hostname / $servicedesc\" ";
111$opt[5] .= " --slope-mode ";
112$def[5] = rrd::def("var1",$RRDFILE[12],$DS[12],"AVERAGE");
113$def[5] .= rrd::area("var1","#b7ff9e","Requests / sec");
114$def[5] .= rrd::line1("var1","#2eae00");
115$def[5] .= rrd::gprint("var1",array("LAST","MAX","AVERAGE"),"%7.2lf %s") ;
116
117?>
118