Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

Recorder.py

00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2004
00004 #                                     by
00005 #                        The Board of Trustees of the
00006 #                     Leland Stanford Junior University.
00007 #                            All rights reserved.
00008 #
00009 
00010 __facility__ = "Online"
00011 __abstract__ = "GLAST LAT Housekeeping server infrastructure"
00012 __author__   = "Jim Panetta <panetta@slac.stanford.edu> SLAC - GLAST I&T"
00013 __date__     = "07/28/04"
00014 __version__  = "$Revision: 1.3 $"
00015 __release__  = "$Name: R04-12-00 $"
00016 __credits__  = "SLAC"
00017 
00018 import LATTE.copyright_SLAC
00019 import logging
00020 import os
00021 
00022 class Recorder(object):
00023   """\brief Recorder class
00024   
00025   Base class for the Recorder portion of the monitoring system.
00026   Recorders send on the data that the Retriever class acquires.
00027   """
00028   def __init__(self):
00029     self.__cachedValues={}
00030     self.__log=logging.getLogger('monitoring.Recorder')
00031   
00032   def updateTrends(self, trendables):
00033     if trendables is None: return
00034     for t in trendables:
00035       self.__cachedValues[t.name]=t
00036     self.processTrends(trendables)
00037   
00038   def processTrends(self, trendables):
00039     raise NotImplementedError('processTrends(trendables)'\
00040                               +'must be implemented in a subclass.')
00041 
00042   def shutdown(self):
00043     pass
00044 
00045 class DummyRecorder(Recorder):
00046   """\brief Example recorder that dumps the trendables to a logger
00047   """
00048   def __init__(self):
00049     Recorder.__init__(self)
00050     self.__log=logging.getLogger('monitoring.Recorder')
00051     
00052   def processTrends(self, trendables):
00053     for t in trendables: 
00054       self.__log.info(t)
00055       
00056 class FlatFileRecorder(Recorder):
00057   def __init__(self, flatFile):
00058     Recorder.__init__(self)
00059     self.__flatFile = open(flatFile, 'a+')
00060     
00061     keyList         = self.__flatFile.readline()
00062     if keyList == '':  # No file, 
00063       self.processTrends = self.__createFileHeader
00064     else:
00065       # create a list of keys from whitespace separated text blobs
00066       self.__keyList = keyList.split()
00067       self.processTrends = self.__processTrends
00068     self.__flatFile.seek(0,2)
00069     self.__pad = '   '
00070     
00071   def shutdown(self):
00072     self.__flatFile.close()
00073     
00074   def __processTrends(self, trendables):
00075     trendMap  = {}
00076     # Add the timestamp
00077     timeStamp = trendables[0].time
00078     trendMap['TimeStamp'] =timeStamp
00079     line = ''
00080     
00081     for t in trendables:
00082       trendMap[t.name] = t.content['Raw Value']
00083     
00084     for k in self.__keyList:
00085       line += str(trendMap[k]) + self.__pad
00086     line += '\n'
00087     self.__flatFile.write(line)
00088     self.__flatFile.flush()
00089       
00090   def __createFileHeader(self, trendables):
00091     # 1: reset function pointer to processTrends
00092     self.processTrends = self.__processTrends
00093     # 2: create the sorted key list
00094     self.__keyList     = []
00095     for t in trendables:
00096       self.__keyList.append(t.name)
00097     self.__keyList.sort()
00098     self.__keyList.insert(0, 'TimeStamp')
00099     line = ''
00100     # 3: write the index line of the file:
00101     for k in self.__keyList:
00102       line += (k + self.__pad)
00103     line += '\n'
00104     self.__flatFile.writelines([line])
00105     # 4: Profit!
00106     self.processTrends(trendables)
00107       
00108 
00109 class UDPRecorder(Recorder):
00110   """\brief Example recorder that UDP broadcasts trendables
00111   
00112   Uses LATTE.tools.DataDistributionServer
00113   """
00114   def __init__(self):
00115     Recorder.__init__(self)
00116     self.__dds=None
00117     self.__log=logging.getLogger('monitoring.UDPRecorder')
00118 
00119   def startUDPServer(self,name,server):
00120     from LATTE.tools.DataDistributor import DataDistributorServer
00121     self.__log.info("Starting DataDistributorServer %s on %s",name,server)
00122     self.__dds=DataDistributorServer(name)
00123     self.__dds.connect(server)
00124 
00125   def stopUDPServer(self):
00126     if self.__dds:
00127       self.__log.info('Disconnecting Broadcast Server')
00128       self.__dds.disconnect()
00129       self.__dds=None
00130           
00131   def processTrends(self,trendables):
00132     if self.__dds:
00133       from cPickle import dumps
00134       # Send to receiver as a binary pickled object
00135       self.__dds.publish(dumps(trendables,1))
00136           
00137   def shutdown(self):
00138     self.stopUDPServer()

Generated on Fri Jul 21 13:26:32 2006 for LATTE R04-12-00 by doxygen 1.4.3