Project

General

Profile

Actions

Howto Munin » History » Revision 2

« Previous | Revision 2/10 (diff) | Next »
icy, 2009-10-10 18:38


Howto Munin

Screenshots

Plugin

Use the following script as a plugin for munin to monitor lighty and create pretty graphs.

#!/usr/bin/python
""" 
Munin plugin to monitor lighttpd 2.x statistics

Install:
Copy this script to the directory of your other munin plugins
(e.g. /usr/share/munin/plugins) and make it executeable (chmod +x).
Then issue any of the following commands to enable the graphs:
ln -s path_to_this_script /etc/munin/plugins/lighttpd_requests
ln -s path_to_this_script /etc/munin/plugins/lighttpd_connections
ln -s path_to_this_script /etc/munin/plugins/lighttpd_traffic

Also ensure that lighttpd has mod_status enabled and that your
config contains a status.info action.
Adjust the STATUS_URL below if needed.
Example lighttpd 2.x config: if req.path == "/status" { status.info; }

Copyright (c) 2009 Thomas Porzelt

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
""" 

STATUS_URL = 'http://127.0.0.1/status?format=plain'

import os, sys, urllib2

def print_config(param):
    # generates and returns a munin config for a given chart
    if param == 'requests':
        print 'graph_title lighttpd: requests'
        print 'graph_category lighttpd'
        print 'graph_vlabel requests / s'
        print 'graph_info Requests per second'
        print 'requests.label requests / s'
        print 'requests.type DERIVE'
        print 'requests.min 0'
    elif param == 'traffic':
        print 'graph_title lighttpd: traffic'
        print 'graph_category lighttpd'
        print 'graph_vlabel bytes / s'
        print 'graph_info Traffic in bytes per second'
        print 'traffic_in.label incoming'
        print 'traffic_in.type DERIVE'
        print 'traffic_in.min 0'
        print 'traffic_out.label outgoing'
        print 'traffic_out.type DERIVE'
        print 'traffic_out.min 0'
    elif param == 'connections':
        print 'graph_title lighttpd: connections'
        print 'graph_category lighttpd'
        print 'graph_vlabel connections'
        print 'graph_info Connections'
        print 'con_start.type GAUGE'
        print 'con_start.label start'
        print 'con_read_header.label read header'
        print 'con_handle_request.label handle request'
        print 'con_write_response.label write response'
        print 'con_keepalive.label keep alive'
        print 'con_total.label total'

def print_status(param):
    global STATUS_URL
    statuslist = urllib2.urlopen(STATUS_URL).readlines()

    for entry in statuslist:
        if len(entry) == 1 or entry[0] == '#':
            continue
        key, value = entry.split(': ')
        if param == 'requests' and key == 'requests_abs':
            print 'requests.value %s' % (value)
        elif param == 'traffic':
            if key == 'traffic_out_abs':
                print 'traffic_out.value %s' % (value)
            elif key == 'traffic_in_abs':
                print 'traffic_in.value %s' % (value)
        elif param == 'connections':
            if key == 'connections_abs':
                print 'con_total.value %s' % (value)
            if key == 'connection_state_start':
                print 'con_start.value %s' % (value)
            elif key == 'connection_state_read_header':
                print 'con_read_header.value %s' % (value)
            elif key == 'connection_state_handle_request':
                print 'con_handle_request.value %s' % (value)
            elif key == 'connection_state_write_response':
                print 'con_write_response.value %s' % (value)
            elif key == 'connection_state_keep_alive':
                print 'con_keepalive.value %s' % (value)

if __name__ == '__main__':
    try:
        param = os.path.split(sys.argv[0])[-1].split('_')[1]
    except IndexError:
        param = 'requests'

    if param not in ['requests', 'traffic', 'connections']:
        print 'unknown parameter %s' % (param)
        sys.exit(1)

    if len(sys.argv) > 1:
        if sys.argv[1] == 'autoconf':
            print 'yes'
            sys.exit(0)
        elif sys.argv[1] == 'config':
            print_config(param)
            sys.exit(0)

    print_status(param)

Updated by icy over 14 years ago · 2 revisions