88 from urlparse import urlparse
99 from urllib import urlencode
1010 from urllib2 import urlopen , Request , HTTPError
11+
1112import time
1213import plugins
1314import re
15+ import base64
1416
1517
1618class Plugin (plugins .BasePlugin ):
@@ -21,60 +23,77 @@ def run(self, config):
2123 Apache/httpd status page metrics
2224 '''
2325
24- prev_cache = {}
25- next_cache = dict ()
26- next_cache ['ts' ] = time .time ()
27- prev_cache = self .get_agent_cache () # Get absolute values from previous check
26+ prev_cache = self .get_agent_cache () or {}
27+ next_cache = {'ts' : time .time ()}
2828
2929 try :
30- request = Request (config .get ('httpd' , 'status_page_url' ))
30+ url = config .get ('httpd' , 'status_page_url' )
31+
32+ # Optional Basic Auth
33+ #Add to [httpd] in config file:
34+ #username = your_username ; optional
35+ #password = your_password ; optional
36+
37+ username = config .get ('httpd' , 'username' , fallback = None )
38+ password = config .get ('httpd' , 'password' , fallback = None )
39+
40+ request = Request (url )
41+
42+ if username and password :
43+ credentials = f'{ username } :{ password } '
44+ encoded_credentials = base64 .b64encode (credentials .encode ('utf-8' )).decode ('utf-8' )
45+ request .add_header ('Authorization' , f'Basic { encoded_credentials } ' )
46+
3147 data = urlopen (request ).read ().decode ('utf-8' )
48+
3249 except Exception as e :
3350 return False
3451
35- exp = re .compile ('^([A-Za-z ]+):\s+(.+)$' )
52+ exp = re .compile (r '^([A-Za-z ]+):\s+(.+)$' )
3653 results = {}
37- def parse_score_board (sb ):
38-
39- ret = []
4054
41- ret .append (('IdleWorkers' , sb .count ('_' )))
42- ret .append (('ReadingWorkers' , sb .count ('R' )))
43- ret .append (('WritingWorkers' , sb .count ('W' )))
44- ret .append (('KeepaliveWorkers' , sb .count ('K' )))
45- ret .append (('DnsWorkers' , sb .count ('D' )))
46- ret .append (('ClosingWorkers' , sb .count ('C' )))
47- ret .append (('LoggingWorkers' , sb .count ('L' )))
48- ret .append (('FinishingWorkers' , sb .count ('G' )))
49- ret .append (('CleanupWorkers' , sb .count ('I' )))
55+ def parse_score_board (sb ):
56+ return [
57+ ('IdleWorkers' , sb .count ('_' )),
58+ ('ReadingWorkers' , sb .count ('R' )),
59+ ('WritingWorkers' , sb .count ('W' )),
60+ ('KeepaliveWorkers' , sb .count ('K' )),
61+ ('DnsWorkers' , sb .count ('D' )),
62+ ('ClosingWorkers' , sb .count ('C' )),
63+ ('LoggingWorkers' , sb .count ('L' )),
64+ ('FinishingWorkers' , sb .count ('G' )),
65+ ('CleanupWorkers' , sb .count ('I' )),
66+ ]
5067
51- return ret
5268 for line in data .split ('\n ' ):
5369 if line :
5470 m = exp .match (line )
5571 if m :
56- k = m .group (1 )
57- v = m . group ( 2 )
58-
59- # Ignore the following values
60- if k == 'IdleWorkers' or k == 'Server Built' or k == 'Server Built' \
61- or k == 'CurrentTime' or k == 'RestartTime' or k == 'ServerUptime' \
62- or k == 'CPULoad' or k == 'CPUUser' or k == 'CPUSystem' \
63- or k == 'CPUChildrenUser' or k == 'CPUChildrenSystem' \
64- or k == 'ReqPerSec' :
72+ k , v = m .group (1 ), m . group ( 2 )
73+
74+ # Skip non-metric fields
75+ ignored_keys = {
76+ 'IdleWorkers' , 'Server Built' , 'CurrentTime' , 'RestartTime' ,
77+ 'ServerUptime' , 'CPULoad' , 'CPUUser' , 'CPUSystem' ,
78+ 'CPUChildrenUser' , 'CPUChildrenSystem' , 'ReqPerSec'
79+ }
80+ if k in ignored_keys :
6581 continue
6682
6783 if k == 'Total Accesses' :
6884 results ['requests_per_second' ] = self .absolute_to_per_second (k , int (v ), prev_cache )
6985 next_cache ['Total Accesses' ] = int (v )
7086
71- if k == 'Scoreboard' :
87+ elif k == 'Scoreboard' :
7288 for sb_kv in parse_score_board (v ):
7389 results [sb_kv [0 ]] = sb_kv [1 ]
7490 else :
7591 results [k ] = v
92+
7693 self .set_agent_cache (next_cache )
7794 return results
7895
96+
7997if __name__ == '__main__' :
8098 Plugin ().execute ()
99+
0 commit comments