ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/CRAB/python/parseCrabFjr.py
(Generate patch)

Comparing COMP/CRAB/python/parseCrabFjr.py (file contents):
Revision 1.1 by gutsche, Mon Oct 9 23:30:23 2006 UTC vs.
Revision 1.7 by fanzago, Mon Feb 4 16:16:34 2008 UTC

# Line 2 | Line 2
2  
3   import sys, getopt, string
4  
5 < from FwkJobRep.ReportParser import readJobReport
5 > from ProdCommon.FwkJobRep.ReportParser import readJobReport
6 > from DashboardAPI import apmonSend, apmonFree
7 >
8  
9   def main(argv) :
10      """
11      parseCrabFjr
12  
13 <    parse CRAB FrameworkJobReport on WN and return parameters to WN wrapper script
14 <
15 <    prints information separated by semi-colon in fixed order:
14 <
15 <    1. ExitStatus (0 or ExitStatus from CMSSW)
13 >    - parse CRAB FrameworkJobReport on WN: { 'protocol' : { 'action' : [attempted,succedeed,total-size,total-time,min-time,max-time] , ... } , ... }
14 >    - report parameters to DashBoard using DashBoardApi.py: for all 'read' actions of all protocols, report MBPS
15 >    - return ExitStatus and dump of DashBoard report separated by semi-colon to WN wrapper script
16  
17      required parameters:
18      --input            :       input FJR xml file
19 +    --MonitorID        :       DashBoard MonitorID
20 +    --MonitorJobID     :       DashBoard MonitorJobID
21  
22      optional parameters:
23      --help             :       help
# Line 25 | Line 27 | def main(argv) :
27  
28      # defaults
29      input = ''
30 +    MonitorID = ''
31 +    MonitorJobID = ''
32      debug = 0
33  
34      try:
35 <        opts, args = getopt.getopt(argv, "", ["input=", "debug", "help"])
35 >        opts, args = getopt.getopt(argv, "", ["input=", "MonitorID=", "MonitorJobID=", "debug", "help"])
36      except getopt.GetoptError:
37          print main.__doc__
38          sys.exit(2)
# Line 40 | Line 44 | def main(argv) :
44              sys.exit()
45          elif opt == "--input" :
46              input = arg
47 +        elif opt == "--MonitorID" :
48 +            MonitorID = arg
49 +        elif opt == "--MonitorJobID" :
50 +            MonitorJobID = arg
51          elif opt == "--debug" :
52              debug = 1
53              
54 <    if input == '':
54 >    if input == '' or MonitorID == '' or MonitorJobID == '':
55          print main.__doc__
56          sys.exit()
57  
58      # load FwkJobRep
59      jobReport = readJobReport(input)[0]
60  
61 <    report = []
61 >    exit_status = ''
62      
63 <    # get ExitStatus of last error
64 <    if len(jobReport.errors) != 0 :
65 <        report.append(str(jobReport.errors[-1]['ExitStatus']))
66 <    else :
67 <        report.append(str(0))
63 >    ##### temporary fix for FJR incomplete ####
64 >    fjr = open (input)
65 >    len_fjr = len(fjr.readlines())
66 >    if (len_fjr <= 6):
67 >       ### 50115 - cmsRun did not produce a valid/readable job report at runtime
68 >       exit_status = str(50115)
69 >    else:
70 >        # get ExitStatus of last error
71 >        if len(jobReport.errors) != 0 :
72 >            exit_status = str(jobReport.errors[-1]['ExitStatus'])
73 >        else :
74 >            exit_status = str(0)
75  
76      # get i/o statistics
77      storageStatistics = str(jobReport.storageStatistics)
78  
79 <    print ';'.join(report)
79 >    # dashboard report dictionary
80 >    dashboard_report = {}
81 >
82 >    # check if storageStatistics is valid
83 >    if storageStatistics.find('Storage statistics:') != -1 :
84 >        # report form: { 'protocol' : { 'action' : [attempted,succedeed,total-size,total-time,min-time,max-time] , ... } , ... }
85 >        report = {}
86 >        data = storageStatistics.split('Storage statistics:')[1]
87 >        data_fields = data.split(';')
88 >        for data_field in data_fields:
89 >            # parse: format protocol/action = attepted/succedeed/total-size/total-time/min-time/max-time
90 >            key = data_field.split('=')[0].strip()
91 >            item = data_field.split('=')[1].strip()
92 >            protocol = str(key.split('/')[0].strip())
93 >            action = str(key.split('/')[1].strip())
94 >            item_array = item.split('/')
95 >            attempted = str(item_array[0].strip())
96 >            succeeded = str(item_array[1].strip())
97 >            total_size = str(item_array[2].strip().split('MB')[0])
98 >            total_time = str(item_array[3].strip().split('ms')[0])
99 >            min_time = str(item_array[4].strip().split('ms')[0])
100 >            max_time = str(item_array[5].strip().split('ms')[0])
101 >            # add to report
102 >            if protocol in report.keys() :
103 >                if action in report[protocol].keys() :
104 >                    print 'protocol/action:',protocol,'/',action,'listed twice in report, taking the first'
105 >                else :
106 >                    report[protocol][action] = [attempted,succeeded,total_size,total_time,min_time,max_time]
107 >            else :
108 >                report[protocol] = {action : [attempted,succeeded,total_size,total_time,min_time,max_time] }
109 >
110 >        if debug :
111 >            for protocol in report.keys() :
112 >                print 'protocol:',protocol
113 >                for action in report[protocol].keys() :
114 >                    print 'action:',action,'measurement:',report[protocol][action]
115 >
116 >        # extract information to be sent to DashBoard
117 >        # per protocol and for action=read, calculate MBPS
118 >        # dashboard key is io_action
119 >        dashboard_report['MonitorID'] = MonitorID
120 >        dashboard_report['MonitorJobID'] = MonitorJobID
121 >        for protocol in report.keys() :
122 >            for action in report[protocol].keys() :
123 >                try: size = float(report[protocol][action][2])
124 >                except: size = 'NULL'
125 >                try: time = float(report[protocol][action][3])/1000
126 >                except: time = 'NULL'
127 >                dashboard_report['io_'+protocol+'_'+action] = str(size)+'_'+str(time)
128 >
129 >        if debug :
130 >            ordered = dashboard_report.keys()
131 >            ordered.sort()
132 >            for key in ordered:
133 >                print key,'=',dashboard_report[key]
134 >
135 >        # send to DashBoard
136 >        apmonSend(MonitorID, MonitorJobID, dashboard_report)
137 >        apmonFree()
138 >
139 >    # prepare exit string
140 >    exit_string = str(exit_status)
141 >    for key in dashboard_report.keys() :
142 >        exit_string += ';' + str(key) + '=' + str(dashboard_report[key])
143 >
144      
145  
146 +    return exit_string
147 +
148  
149   if __name__ == '__main__' :
150 <    main(sys.argv[1:])
150 >    exit_status = main(sys.argv[1:])
151 >    # output for wrapper script
152 >    print exit_status
153  
154      

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines