rrdweb/backend.py
author Tero Marttila <terom@fixme.fi>
Tue, 25 Jan 2011 01:28:06 +0200
changeset 32 47e977c23ba2
permissions -rw-r--r--
implement rendering of pmacct rrd graphs, and a dir/top.png feature
32
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
from rrdweb import rrd
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
import operator
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
def host_def (idx, name, dir, ds_in, ds_out, cf) :
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
    """
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
        VDEFs for given host, giving its avg/max values:
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
            DEF:in/out_{idx}
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
            CDEFtraf_{idx}
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
            VDEF:avg/max_{idx}
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
            PRINT:{idx} avg/max {value}
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    """
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
    params = dict(
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
        dir=dir, ds_in=ds_in, ds_out=ds_out, cf=cf,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
        idx=idx, rrd='%s/%s.rrd' % (dir, name)
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    )
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    return [
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        # in/out bandwidth in bytes/s
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
        'DEF:in_%(idx)d=%(rrd)s:%(ds_in)s:%(cf)s' % params,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        'DEF:out_%(idx)d=%(rrd)s:%(ds_out)s:%(cf)s' % params,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        # total traffic in bits/s
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        'CDEF:traf_%(idx)d=in_%(idx)d,out_%(idx)d,+,8,*' % params,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        # average + maximum values
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        'VDEF:avg_%(idx)d=traf_%(idx)d,AVERAGE' % params,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
        'VDEF:max_%(idx)d=traf_%(idx)d,MAXIMUM' % params,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
        # output
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
        'PRINT:avg_%(idx)d:%(idx)d avg %%lf' % params,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
        'PRINT:max_%(idx)d:%(idx)d max %%lf' % params,
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    ]
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
def parse_report (rrds, lines) :
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    """
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
        Parse the report output into a [ (name, avg, max) ] list
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    """
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    # idx values by type
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    data = {
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        'avg': {},
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        'max': {},
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        }
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    # interpret output
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    for line in lines :
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        # parse
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        idx, type, value = line.split()
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
        # convert
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        idx = int(idx)
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        value = float(value)
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
        # store
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        data[type][idx] = value
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    # build into name : (values) dict
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    return [
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        (
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
            (name, data['avg'][idx], data['max'][idx])
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        ) for idx, name in enumerate(rrds)
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    ]
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
def calc_top_hosts (dir, rrds, ds_in, ds_out, period='15m', count=5, cf='AVERAGE') :
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    """
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        Return the list of top-N rrd's in the given dir, sorted by total in/out bandwidth average over the given period.
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    """
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    # vdefs for hosts, avg/max_<idx> in bits/s + prints
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    defs = [stmt for idx, name in enumerate(rrds) for stmt in host_def(idx, name, dir, ds_in, ds_out, cf)]
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    # execute
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    _, _, output, _ = rrd.graph(False, *defs, start=('-%s' % period))
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    # parse
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    data = parse_report(rrds, output)
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    # sort for top-N avg
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    data.sort(key=operator.itemgetter(1))
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    top_avg = data[:count]
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    # sort for top-N max
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    data.sort(key=operator.itemgetter(2))
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    top_max = data[:count]
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    # merge hosts (we lose sorting order)
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    return set(host for host, avg, max in top_avg + top_max)
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
47e977c23ba2 implement rendering of pmacct rrd graphs, and a dir/top.png feature
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92