Changeset 9


Ignore:
Timestamp:
03/22/05 12:48:19 (19 years ago)
Author:
bastiaans
Message:

daemon/togad.py:

First attempt at rrd handling

  • Need to parse gmetad.conf first: class added
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/togad.py

    r8 r9  
    55import socket
    66import sys
     7import rrdtool
     8import string
    79
    810# Specify debugging level here;
     
    1012# >10 = metric XML
    1113# >9  = host,cluster,grid,ganglia XML
     14# >8  = RRD activity,gmetad config parsing
    1215#
    1316DEBUG_LEVEL = 9
     17
     18# Where is the gmetad.conf located
     19#
     20GMETAD_CONF = '/etc/gmetad.conf'
     21
     22# Where to store the archived rrd's
     23#
     24ARCHIVE_PATH = '/data/toga/rrds'
     25
     26# List of data_source names to archive for
     27#
     28ARCHIVE_SOURCES = [ "LISA Cluster" ]
     29
     30#
     31# Configuration ends
     32#
    1433
    1534"""
     
    3655                elif name == 'CLUSTER':
    3756                        self.clusterName = attrs.get('NAME',"")
     57                        self.rrd = RRDHandler( self.clusterName )
    3858                        if (DEBUG_LEVEL>9): print ' |-Cluster found: %s' %( self.clusterName )
    3959
     
    4262                        self.hostIp = attrs.get('IP',"")
    4363                        self.hostReported = attrs.get('REPORTED',"")
     64                        # Reset the metrics list for each host
     65                        self.metrics = [ ]
    4466                        if (DEBUG_LEVEL>9): print ' | |-Host found: %s - ip %s reported %s' %( self.hostName, self.hostIp, self.hostReported )
    4567
     
    5476                return
    5577
    56         #def endElement( self, name ):
     78        def endElement( self, name ):
    5779                #if name == 'ganglia_xml':
    5880
     
    6183                #if name == 'cluster':
    6284
    63                 #if name == 'host':     
     85                if name == 'host':     
     86                        self.storeMetrics( self.hostName )
    6487
    6588                #if name == 'metric':
     89
     90        def storeMetrics( self, hostname ):
     91
     92                for metric in self.metrics:
     93                        self.rrd.checkCreate( hostname, metric['name'] )       
     94                        self.rrd.update( hostname, metric['name'], metric['val'] )
     95                        if (DEBUG_LEVEL>8): print 'stored metric %s for %s: %s' %( hostname, metric['name'], metric['val'] )
     96                        sys.exit(1)
     97       
    6698
    6799class GangliaXMLGatherer:
     
    107139class GangliaXMLProcessor:
    108140
    109         def daemon(self):
     141        def daemon( self ):
    110142                "Run as daemon forever"
    111143
     
    143175                self.run()
    144176
    145         def run(self):
     177        def run( self ):
    146178                "Main thread"
    147179
     
    161193                myParser.parse( myXMLGatherer.getFileObject() )
    162194
     195class GangliaConfigParser:
     196
     197        sources = [ ]
     198
     199        def __init__( self, config ):
     200                self.config = config
     201                self.parseValues()
     202
     203        def parseValues(self):
     204                "Parse certain values from gmetad.conf"
     205
     206                readcfg = open( self.config, 'r' )
     207
     208                for line in readcfg.readlines():
     209
     210                        if line.count( '"' ) > 1:
     211
     212                                source = { }
     213                                source['name'] = line.split( '"' )[1]
     214
     215                                if line.find( 'data_source' ) and line[0] != '#':
     216
     217                                        source_words = line.split( '"' )[2].split( ' ' )
     218                                        print line.split( '"' )
     219                                        print source_words
     220
     221                                        for word in source_words:
     222
     223                                                print 'word %s' %word
     224                                                valid_interval = 1
     225
     226                                                for letter in word:
     227                                                        print 'letter %s' %letter
     228                                                        if letter not in string.digits:
     229                                                                valid_interval = 0
     230
     231                                                if valid_interval:
     232                                                        source['interval'] = word
     233                                                        if (DEBUG_LEVEL>8): print 'polling interval for %s = %s' %(source['name'], source['interval'] )
     234               
     235                # No interval found, use Ganglia's default     
     236                if not source.has_key( 'interval' ):
     237                        source['interval'] = 15
     238
     239                self.sources.append( source )
     240
     241        def getInterval( self, source_name ):
     242                for source in self.sources:
     243                        if source['name'] == name:
     244                                return source['interval']
     245                return None
     246
     247class RRDHandler:
     248
     249        def __init__( self, cluster ):
     250                self.cluster = cluster
     251
     252                self.gmetad_conf = GangliaConfigParser( GMETAD_CONF )
     253
     254        def createCheck( self, host, metric ):
     255                "Check if an .rrd allready exists for this metric, create if not"
     256
     257                rrd_dir = '%s/%s/%s' %( check_dir(ARCHIVE_PATH), self.cluster, host )
     258
     259                if not os.path.exists( rrd_dir ):
     260                        os.makedirs( rrd_dir )
     261
     262                rrd_file = '%s/%s.rrd' %( rrd_dir, metric )
     263
     264                interval = self.gmetad_conf.getInterval( self.cluster )
     265
     266        def update( self, metric, timestamp, val ):
     267
     268                pass
     269
     270                #rrd.update( bla )
     271               
     272
    163273def main():
    164274        "Program startup"
     
    167277        myProcessor.processXML()
    168278
     279def check_dir( directory ):
     280        "Check if directory is a proper directory. I.e.: Does _not_ end with a '/'"
     281
     282        if directory[-1] == '/':
     283                directory = directory[:-1]
     284
     285        return directory
     286
    169287# Let's go
    170 main()
     288if __name__ == '__main__':
     289        main()
Note: See TracChangeset for help on using the changeset viewer.