...
No Format |
---|
<?xml version="1.0" encoding="UTF-8"?> <testResults version="1.2"> <httpSample t="511" lt="461" ts="1184177284608" s="true" lb="http://www.website.com/home.html" rc="200" rm="OK" tn="Thread Group 1-1" dt="text"/> <httpSample t="581" lt="481" ts="1184177284718" s="true" lb="http://www.website.com/home.html" rc="200" rm="OK" tn="Thread Group 1-1" dt="text"/> ... |
Extracting JTL files to CSV with Python (JMeter 2.3.x)
This script does two things. First it filters the JTL file for a regular expression. Then it strips them and outputs a CSV file. This also includes the conversion of the timestamp to a readable format.
The script only works with JTL files from JMeter 2.3.x (JTL version 2.1). Please see http://jakarta.apache.org/jmeter/usermanual/listeners.html#xmlformat2.1 for details.
Usage is:
" program.py <JTL input file> <CSV output file> "<regular expression>"
No Format |
---|
#!/usr/bin/python """ Description : Split JTL file into a comma delimited CVS by : Oliver Erlewein (c)2008 Date : 04.02.2008 Lang : Python 2.4+ JMeter JTL field contents: Attribute & Content by Bytes de Data encoding dt Data type ec Error count (0 or 1, unless multiple samples are aggregated) hn Hostname where the sample was generated lb Label lt Latency = time to initial response (milliseconds) - not all samplers support this na Number of active threads for all thread groups ng Number of active threads in this group rc Response Code (e.g. 200) rm Response Message (e.g. OK) s Success flag (true/false) sc Sample count (1, unless multiple samples are aggregated) t Elapsed time (milliseconds) tn Thread Name ts timeStamp (milliseconds since midnight Jan 1, 1970 UTC) """ import sys import string import re import datetime import time startTime = time.time() cnt = 0 cnt2 = 0 failCnt = 0 reCompile = re.compile("\s([^\s]*?)=\"(.*?)\"") delimiterCharacterOut = "," def writeCSVLine(line): x = reCompile.findall(line) a = dict((row[0], row[1]) for row in x) try: a['ts'] = str(int(int(a['ts'])/1000)) x = str(datetime.datetime.fromtimestamp(float(a['ts'])))[0:19] b = a['ts'] + ",\"" + x + "\"," + a['t'] + "," + a['lt'] + ",\"" + a['s'] + "\",\"" + a['lb'] + "\"," + a['rc'] + ",\"" + a['rm'] + "\",\"" + a['tn'] + "\",\"" + a['dt'] + "\"," + a['by'] + "\n" except: return -1 o.write(b) return 1 print "Splitting JTL file" try: runArgv = sys.argv # Save the command line jtlInfile = str(sys.argv[1]) # Name of JTL input file cvsOutfile = str(sys.argv[2]) # Name of CVS output file reFilter = str(sys.argv[3]) # Filter the labels (lb) for the filter except: print "Error: Input format: <input file> <output file> <Filter by regular expression>" raise try: f = open(jtlInfile, "r") o = open(cvsOutfile, "w") except: raise print "Filtering on regular expression : " + reFilter cmpFilter = re.compile(reFilter) for line in f: try: if cmpFilter.search(line): returnVal = writeCSVLine(line) if returnVal < 0: failCnt += 1 else: cnt2 += 1 except: print 'Error in line : ', cnt, line raise cnt += 1 endTime = time.time() print "Time taken : ", str(endTime-startTime) print "Lines processed : ", cnt print "Lines that passed the filter : ", cnt2 print "Lines skipped (error?) : ", failCnt f.close() o.close() |