#!/usr/bin/python

__version__ = '0.5'
__author__ = 'Peter Poeml <peter@poeml.de>'
__copyright__ = 'Novell Inc.'
__license__ = 'GPL'

import sys, os, time
import pyrrdtool as rrd

rrd_db = '/var/log/apache2/server-status.rrd'
out_dir = '/srv/www/apachestats/images'
pidfile = '/var/run/graph_server_status_rrd.pid'

if len(sys.argv) > 1:
    rrd_db = sys.argv[1]
if len(sys.argv) > 2:
    out_dir = sys.argv[2]

os.chdir(out_dir)

end_time = int(time.time())

open(pidfile, 'w').write('%s\n' % os.getpid())

for timeframe, duration in [
                            ('6hours',  21600),
                            ('day',     86400),
                            ('week',   604800),
                            ('month', 2592000),
                            ('year', 31536000),
                           ]:

    start_time = end_time - duration

    g = rrd.RoundRobinGraph("workers-%s.png" % timeframe)
    g.graph(rrd.Def('busy', rrd_db, data_source='busyWorkers', cf=rrd.AverageCF),
            rrd.Def('idle', rrd_db, data_source='idleWorkers', cf=rrd.AverageCF),
            "CDEF:total=busy,idle,+",
            rrd.AREA('total', rrggbb='00ff00', legend='Total Workers'),
            rrd.GPRINT('total', cf=rrd.LastCF, format='cur\: %.0lf\\n'),
            rrd.AREA('busy', rrggbb='0000ff', legend='Busy Workers '),
            rrd.GPRINT('busy', cf=rrd.LastCF, format='cur\: %.0lf'),
            rrd.GPRINT('busy', cf=rrd.MinCF, format='min\: %.0lf'),
            rrd.GPRINT('busy', cf=rrd.MaxCF, format='max\: %.0lf'),
            rrd.GPRINT('busy', cf=rrd.AverageCF, format='avg\: %.1lf\\n'),
            "--alt-autoscale-max",
            #width=600,
            #height=150,
            #x_grid='HOUR:1:HOUR:2:HOUR:4:0:%H:00',
            title='Apache Workers',
            vertical_label=' ',
            lower_limit=0,
            start=start_time,
            end=end_time,
        )

    g = rrd.RoundRobinGraph("requests-%s.png" % timeframe)
    g.graph(rrd.Def('rps', rrd_db, data_source='reqPerSec', cf=rrd.AverageCF),
            rrd.LINE1('rps', rrggbb='ff0000', legend='Requests/s        '),
            rrd.GPRINT('rps', cf=rrd.LastCF, format='cur\: %.0lf'),
            rrd.GPRINT('rps', cf=rrd.MinCF, format='min\: %.0lf'),
            rrd.GPRINT('rps', cf=rrd.MaxCF, format='max\: %.0lf'),
            rrd.GPRINT('rps', cf=rrd.AverageCF, format='avg\: %.1lf\\n'),
            rrd.Def('rps_avg', rrd_db, data_source='reqPerSecSlidingAvg', cf=rrd.AverageCF),
            rrd.LINE2('rps_avg', rrggbb='0000ff', legend='Sliding Average   '),
            rrd.GPRINT('rps_avg', cf=rrd.LastCF, format='cur\: %.0lf'),
            rrd.GPRINT('rps_avg', cf=rrd.MinCF, format='min\: %.0lf'),
            rrd.GPRINT('rps_avg', cf=rrd.MaxCF, format='max\: %.0lf'),
            "--alt-autoscale-max",
            #width=600,
            #height=150,
            #x_grid='HOUR:1:HOUR:2:HOUR:4:0:%H:00',
            title='Apache Requests/s',
            vertical_label=' ',
            lower_limit=0,
            start=start_time,
            end=end_time,
        )

    g = rrd.RoundRobinGraph("latency-%s.png" % timeframe)
    g.graph(rrd.Def('lat', rrd_db, data_source='latency', cf=rrd.AverageCF),
            rrd.AREA('lat', rrggbb='0000ff', legend='Latency'),
            rrd.GPRINT('lat', cf=rrd.LastCF, format='cur\: %.0lf'),
            rrd.GPRINT('lat', cf=rrd.MinCF, format='min\: %.0lf'),
            rrd.GPRINT('lat', cf=rrd.MaxCF, format='max\: %.0lf'),
            rrd.GPRINT('lat', cf=rrd.AverageCF, format='avg\: %.1lf'),
            "--alt-autoscale-max",
            #width=600,
            #height=150,
            #x_grid='HOUR:1:HOUR:2:HOUR:4:0:%H:00',
            title='Apache server-status Latency',
            vertical_label='ms',
            lower_limit=0,
            start=start_time,
            end=end_time,
        )

os.unlink(pidfile)
