diff --git a/bin/report-template/content/js/dashboard.js.fmkr b/bin/report-template/content/js/dashboard.js.fmkr index 04a6255fee8..62af2442aee 100644 --- a/bin/report-template/content/js/dashboard.js.fmkr +++ b/bin/report-template/content/js/dashboard.js.fmkr @@ -41,7 +41,7 @@ function summaryTableHeader(header) { cell = document.createElement('th'); cell.setAttribute("data-sorter", false); cell.colSpan = 7; - cell.innerHTML = "Response Times (ms)"; + cell.innerHTML = "Response Times (${jmeter_reportgenerator_ms_ns})"; newRow.appendChild(cell); cell = document.createElement('th'); diff --git a/bin/report-template/content/js/graph.js.fmkr b/bin/report-template/content/js/graph.js.fmkr index f997e218aa1..9734f513593 100644 --- a/bin/report-template/content/js/graph.js.fmkr +++ b/bin/report-template/content/js/graph.js.fmkr @@ -58,7 +58,7 @@ var responseTimePercentilesInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Percentile value in ms", + axisLabel: "Percentile value in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -70,7 +70,7 @@ var responseTimePercentilesInfos = { }, tooltip: true, tooltipOpts: { - content: "%s : %x.2 percentile was %y ms" + content: "%s : %x.2 percentile was %y ${jmeter_reportgenerator_ms_ns}" }, selection: { mode: "xy" }, }; @@ -127,7 +127,7 @@ var responseTimeDistributionInfos = { container: '#legendResponseTimeDistribution' }, xaxis:{ - axisLabel: "Response times in ms", + axisLabel: "Response times in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -151,7 +151,7 @@ var responseTimeDistributionInfos = { tooltip: true, tooltipOpts: { content: function(label, xval, yval, flotItem){ - return yval + " responses for " + label + " were between " + xval + " and " + (xval + granularity) + " ms"; + return yval + " responses for " + label + " were between " + xval + " and " + (xval + granularity) + " ${jmeter_reportgenerator_ms_ns}"; } } }; @@ -355,7 +355,7 @@ var timeVsThreadsInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Average response times in ms", + axisLabel: "Average response times in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -370,7 +370,7 @@ var timeVsThreadsInfos = { }, tooltip: true, tooltipOpts: { - content: "%s: At %x.2 active threads, Average response time was %y.2 ms" + content: "%s: At %x.2 active threads, Average response time was %y.2 ${jmeter_reportgenerator_ms_ns}" } }; }, @@ -505,7 +505,7 @@ var responseTimesOverTimeInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Average response time in ms", + axisLabel: "Average response time in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -525,7 +525,7 @@ var responseTimesOverTimeInfos = { }, tooltip: true, tooltipOpts: { - content: "%s : at %x Average response time was %y ms" + content: "%s : at %x Average response time was %y ${jmeter_reportgenerator_ms_ns}" } }; }, @@ -586,7 +586,7 @@ var latenciesOverTimeInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Average response latencies in ms", + axisLabel: "Average response latencies in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -606,7 +606,7 @@ var latenciesOverTimeInfos = { }, tooltip: true, tooltipOpts: { - content: "%s : at %x Average latency was %y ms" + content: "%s : at %x Average latency was %y ${jmeter_reportgenerator_ms_ns}" } }; }, @@ -667,7 +667,7 @@ var connectTimeOverTimeInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Average Connect Time in ms", + axisLabel: "Average Connect Time in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -687,7 +687,7 @@ var connectTimeOverTimeInfos = { }, tooltip: true, tooltipOpts: { - content: "%s : at %x Average connect time was %y ms" + content: "%s : at %x Average connect time was %y ${jmeter_reportgenerator_ms_ns}" } }; }, @@ -749,7 +749,7 @@ var responseTimePercentilesOverTimeInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Response Time in ms", + axisLabel: "Response Time in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -769,7 +769,7 @@ var responseTimePercentilesOverTimeInfos = { }, tooltip: true, tooltipOpts: { - content: "%s : at %x Response time was %y ms" + content: "%s : at %x Response time was %y ${jmeter_reportgenerator_ms_ns}" } }; }, @@ -825,7 +825,7 @@ var responseTimeVsRequestInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Median Response Time in ms", + axisLabel: "Median Response Time in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -844,7 +844,7 @@ var responseTimeVsRequestInfos = { }, tooltip: true, tooltipOpts: { - content: "%s : Median response time at %x req/s was %y ms" + content: "%s : Median response time at %x req/s was %y ${jmeter_reportgenerator_ms_ns}" }, colors: ["#9ACD32", "#FF6347"] }; @@ -899,7 +899,7 @@ var latenciesVsRequestInfos = { axisLabelPadding: 20, }, yaxis: { - axisLabel: "Median Latency in ms", + axisLabel: "Median Latency in ${jmeter_reportgenerator_ms_ns}", axisLabelUseCanvas: true, axisLabelFontSizePixels: 12, axisLabelFontFamily: 'Verdana, Arial', @@ -914,7 +914,7 @@ var latenciesVsRequestInfos = { }, tooltip: true, tooltipOpts: { - content: "%s : Median Latency time at %x req/s was %y ms" + content: "%s : Median Latency time at %x req/s was %y ${jmeter_reportgenerator_ms_ns}" }, colors: ["#9ACD32", "#FF6347"] }; @@ -1413,4 +1413,3 @@ function toggleAll(id, checked){ }); } } - diff --git a/bin/reportgenerator.properties b/bin/reportgenerator.properties index 68bfbf67a12..0df2a1dfc24 100644 --- a/bin/reportgenerator.properties +++ b/bin/reportgenerator.properties @@ -34,6 +34,9 @@ # Reporting configuration #--------------------------------------------------------------------------- +#The time unit in reports and visualizers: ms(millisecond) / ns(nanosecond) +jmeter.reportgenerator.ms_ns=ms + # Sets the satisfaction threshold for the APDEX calculation (in milliseconds). #jmeter.reportgenerator.apdex_satisfied_threshold=500 diff --git a/bin/testfiles/ns.json b/bin/testfiles/ns.json new file mode 100644 index 00000000000..dd7b3ed4dc7 --- /dev/null +++ b/bin/testfiles/ns.json @@ -0,0 +1,50 @@ +{ + "JR-KO" : { + "transaction" : "JR-KO", + "sampleCount" : 3, + "errorCount" : 3, + "errorPct" : 100.0, + "meanResTime" : 1.9966666666666666E8, + "medianResTime" : 1.7E8, + "minResTime" : 1.0E8, + "maxResTime" : 3.29E8, + "pct1ResTime" : 3.29E8, + "pct2ResTime" : 3.29E8, + "pct3ResTime" : 3.29E8, + "throughput" : 0.07922465471254654, + "receivedKBytesPerSec" : 0.0015473565373544248, + "sentKBytesPerSec" : 6.1894261494177E-4 + }, + "Total" : { + "transaction" : "Total", + "sampleCount" : 255, + "errorCount" : 3, + "errorPct" : 1.1764706, + "meanResTime" : 2.354745098039215E8, + "medianResTime" : 2.32E8, + "minResTime" : 1.0E8, + "maxResTime" : 3.53E8, + "pct1ResTime" : 3.37E8, + "pct2ResTime" : 3.392E8, + "pct3ResTime" : 3.53E8, + "throughput" : 4.2369361136495804, + "receivedKBytesPerSec" : 0.07457474869153444, + "sentKBytesPerSec" : 0.03310106338788735 + }, + "JR-OK" : { + "transaction" : "JR-OK", + "sampleCount" : 252, + "errorCount" : 0, + "errorPct" : 0.0, + "meanResTime" : 2.359007936507938E8, + "medianResTime" : 2.32E8, + "minResTime" : 1.01E8, + "maxResTime" : 3.53E8, + "pct1ResTime" : 3.37E8, + "pct2ResTime" : 3.3935E8, + "pct3ResTime" : 3.53E8, + "throughput" : 4.187089806430174, + "receivedKBytesPerSec" : 0.0736011880036554, + "sentKBytesPerSec" : 0.03271163911273573 + } +} \ No newline at end of file diff --git a/bin/testfiles/ns.jtl b/bin/testfiles/ns.jtl new file mode 100644 index 00000000000..1c59d6eaaed --- /dev/null +++ b/bin/testfiles/ns.jtl @@ -0,0 +1,256 @@ +timeStamp,timeStamp_ns,elapsed,elapsed_ns,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,Latency_ns,IdleTime,IdleTime_ns,Connect,Connect_ns +0,1551783627191000000,1,351000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783627543000000,1,192000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783627735000000,1,131000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783627866000000,1,261000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783628128000000,1,266000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783628395000000,1,279000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783628674000000,1,304000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783628979000000,1,353000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783629333000000,1,196000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783629530000000,1,139000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783629670000000,1,278000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783629949000000,1,303000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783630253000000,1,351000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783630605000000,1,194000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783630799000000,1,134000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783630934000000,1,268000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783631202000000,1,282000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783631485000000,1,308000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783631794000000,1,108000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783631903000000,1,217000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783632120000000,1,180000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783632301000000,1,107000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783632408000000,1,213000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783632622000000,1,171000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783632794000000,1,342000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783633137000000,1,176000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783633313000000,1,353000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783633666000000,1,196000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783633863000000,1,137000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783634001000000,1,275000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783634276000000,1,296000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783634573000000,1,336000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783634910000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783635075000000,1,328000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783635404000000,1,148000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783635552000000,1,297000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783635850000000,1,338000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783636189000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783636357000000,1,337000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783636695000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783636859000000,1,329000000,JR-KO,400,Bad request,Thread Group 1-1,text,FALSE,,20,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783637189000000,1,147000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783637337000000,1,296000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783637634000000,1,339000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783637974000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783638142000000,1,337000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783638480000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783638644000000,1,329000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783638974000000,1,148000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783639122000000,1,297000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783639420000000,1,338000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783639759000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783639927000000,1,337000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783640264000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783640429000000,1,329000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783640758000000,1,148000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783640907000000,1,295000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783641203000000,1,336000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783641540000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783641705000000,1,328000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783642034000000,1,148000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783642182000000,1,297000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783642480000000,1,339000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783642819000000,1,169000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783642989000000,1,338000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783643327000000,1,166000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783643493000000,1,333000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783643827000000,1,156000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783643983000000,1,313000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783644297000000,1,116000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783644413000000,1,233000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783644647000000,1,211000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783644858000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783645027000000,1,336000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783645363000000,1,163000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783645527000000,1,325000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783645853000000,1,142000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783645995000000,1,285000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783646280000000,1,315000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783646596000000,1,120000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783646717000000,1,241000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783646958000000,1,227000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783647186000000,1,200000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783647386000000,1,146000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783647533000000,1,292000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783647826000000,1,331000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783648157000000,1,152000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783648310000000,1,304000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783648615000000,1,353000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783648968000000,1,199000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783649167000000,1,142000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783649310000000,1,284000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783649594000000,1,314000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783649909000000,1,118000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783650027000000,1,238000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783650265000000,1,220000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783650486000000,1,185000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783650671000000,1,116000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783650788000000,1,232000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783651021000000,1,210000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783651231000000,1,166000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783651398000000,1,332000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783651730000000,1,155000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783651886000000,1,309000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783652196000000,1,110000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783652307000000,1,221000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783652528000000,1,187000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783652715000000,1,121000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783652836000000,1,241000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783653078000000,1,227000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783653306000000,1,200000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783653506000000,1,146000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783653653000000,1,292000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783653945000000,1,330000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783654275000000,1,150000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783654425000000,1,300000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783654726000000,1,344000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783655071000000,1,180000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783655251000000,1,106000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783655358000000,1,212000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783655571000000,1,170000000,JR-KO,400,Bad request,Thread Group 1-1,text,FALSE,,20,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783655741000000,1,340000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783656081000000,1,171000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783656253000000,1,342000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783656595000000,1,174000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783656770000000,1,348000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783657118000000,1,189000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783657307000000,1,123000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783657430000000,1,245000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783657675000000,1,235000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783657911000000,1,215000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783658126000000,1,176000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783658303000000,1,352000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783658656000000,1,195000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783658852000000,1,136000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783658989000000,1,272000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783659262000000,1,291000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783659553000000,1,327000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783659880000000,1,145000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783660025000000,1,290000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783660316000000,1,324000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783660641000000,1,140000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783660782000000,1,281000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783661063000000,1,307000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783661370000000,1,105000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783661476000000,1,210000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783661687000000,1,166000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783661853000000,1,333000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783662186000000,1,157000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783662343000000,1,313000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783662657000000,1,116000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783662774000000,1,232000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783663007000000,1,211000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783663219000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783663387000000,1,337000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783663725000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783663889000000,1,329000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783664218000000,1,149000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783664367000000,1,297000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783664664000000,1,339000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783665004000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783665172000000,1,337000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783665510000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783665675000000,1,328000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783666004000000,1,148000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783666152000000,1,297000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783666450000000,1,339000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783666789000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783666958000000,1,336000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783667295000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783667460000000,1,328000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783667789000000,1,148000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783667937000000,1,297000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783668234000000,1,339000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783668574000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783668742000000,1,337000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783669079000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783669244000000,1,328000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783669573000000,1,147000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783669720000000,1,295000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783670015000000,1,335000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783670351000000,1,162000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783670513000000,1,324000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783670837000000,1,137000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783670975000000,1,274000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783671249000000,1,294000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783671544000000,1,333000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783671877000000,1,157000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783672035000000,1,314000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783672349000000,1,118000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783672468000000,1,237000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783672705000000,1,220000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783672926000000,1,185000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783673111000000,1,116000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783673228000000,1,232000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783673460000000,1,210000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783673671000000,1,165000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783673836000000,1,331000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783674167000000,1,153000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783674320000000,1,305000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783674626000000,1,100000000,JR-KO,400,Bad request,Thread Group 1-1,text,FALSE,,20,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783674727000000,1,201000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783674928000000,1,149000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783675077000000,1,297000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783675374000000,1,339000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783675714000000,1,168000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783675882000000,1,337000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783676219000000,1,164000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783676384000000,1,327000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783676712000000,1,146000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783676859000000,1,292000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783677152000000,1,331000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783677484000000,1,153000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783677638000000,1,306000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783677945000000,1,104000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783678050000000,1,208000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783678259000000,1,163000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783678422000000,1,327000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783678750000000,1,144000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783678894000000,1,289000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783679183000000,1,323000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783679507000000,1,135000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783679643000000,1,272000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783679915000000,1,290000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783680205000000,1,325000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783680530000000,1,141000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783680671000000,1,281000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783680952000000,1,307000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783681260000000,1,104000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783681365000000,1,208000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783681574000000,1,163000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783681738000000,1,326000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783682065000000,1,144000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783682209000000,1,289000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783682499000000,1,323000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783682822000000,1,137000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783682960000000,1,274000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783683234000000,1,293000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783683527000000,1,332000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783683859000000,1,155000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783684014000000,1,309000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783684323000000,1,108000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783684432000000,1,216000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783684648000000,1,178000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783684827000000,1,101000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783684928000000,1,203000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783685132000000,1,151000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783685283000000,1,303000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783685587000000,1,350000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783685938000000,1,192000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783686130000000,1,131000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783686261000000,1,261000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783686523000000,1,267000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783686790000000,1,280000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 +0,1551783687071000000,1,305000000,JR-OK,200,Good request,Thread Group 1-1,text,TRUE,,18,8,1,1,null,0,2000000,0,3000000,0,4000000 diff --git a/bin/testfiles/ns.properties b/bin/testfiles/ns.properties new file mode 100644 index 00000000000..c032483dd62 --- /dev/null +++ b/bin/testfiles/ns.properties @@ -0,0 +1 @@ +jmeter.reportgenerator.ms_ns=ns diff --git a/src/components/src/main/java/org/apache/jmeter/assertions/CompareAssertion.java b/src/components/src/main/java/org/apache/jmeter/assertions/CompareAssertion.java index 1dafa4c4ff9..98575a09295 100644 --- a/src/components/src/main/java/org/apache/jmeter/assertions/CompareAssertion.java +++ b/src/components/src/main/java/org/apache/jmeter/assertions/CompareAssertion.java @@ -77,7 +77,7 @@ private void compareTime(CompareAssertionResult result) { for (SampleResult currentResult : responses) { long currentTime = currentResult.getTime(); if (prevTime != -1) { - boolean failure = Math.abs(prevTime - currentTime) > compareTime; + boolean failure = Math.abs(prevTime - currentTime) > compareTime * 1000000L; if (failure) { markTimeFailure(result, prevResult, prevTime, currentResult, currentTime); return; diff --git a/src/components/src/main/java/org/apache/jmeter/assertions/DurationAssertion.java b/src/components/src/main/java/org/apache/jmeter/assertions/DurationAssertion.java index 4a7b2119023..407d7e99d3a 100644 --- a/src/components/src/main/java/org/apache/jmeter/assertions/DurationAssertion.java +++ b/src/components/src/main/java/org/apache/jmeter/assertions/DurationAssertion.java @@ -49,7 +49,7 @@ public AssertionResult getResult(SampleResult response) { if (duration > 0) { long responseTime=response.getTime(); // has the Sample lasted too long? - if ( responseTime > duration ) { + if ( responseTime > duration * 1000000L ) { result.setFailure(true); Object[] arguments = {responseTime, duration}; String message = MessageFormat.format( diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/GraphVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/GraphVisualizer.java index 90a3af2ced7..cbc8675f08d 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/GraphVisualizer.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/GraphVisualizer.java @@ -44,6 +44,7 @@ import org.apache.jmeter.gui.TestElementMetadata; import org.apache.jmeter.gui.util.JMeterColor; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.Clearable; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.util.JMeterUtils; @@ -255,8 +256,8 @@ private JPanel createYAxis() { maxYField = createYAxisField(5); minYField = createYAxisField(3); - graphYAxisPanel.add(createYAxisPanel("graph_results_ms", maxYField), BorderLayout.NORTH); // $NON-NLS-1$ - graphYAxisPanel.add(createYAxisPanel("graph_results_ms", minYField), BorderLayout.SOUTH); // $NON-NLS-1$ + graphYAxisPanel.add(createYAxisPanel(ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? "graph_results_ms" : "graph_results_ns", maxYField), BorderLayout.NORTH); // $NON-NLS-1$ + graphYAxisPanel.add(createYAxisPanel(ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? "graph_results_ms" : "graph_results_ns", minYField), BorderLayout.SOUTH); // $NON-NLS-1$ return graphYAxisPanel; } diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java index 99e4da7dccd..d7a6e835178 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/RespTimeGraphVisualizer.java @@ -57,6 +57,7 @@ import org.apache.jmeter.gui.action.SaveGraphics; import org.apache.jmeter.gui.util.FilePanel; import org.apache.jmeter.gui.util.VerticalPanel; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.Clearable; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.testelement.TestElement; @@ -164,7 +165,7 @@ public class RespTimeGraphVisualizer extends AbstractVisualizer implements Actio private static final String Y_AXIS_LABEL = JMeterUtils.getResString("aggregate_graph_response_time");//$NON-NLS-1$ - private static final String Y_AXIS_TITLE = JMeterUtils.getResString("aggregate_graph_ms"); //$NON-NLS-1$ + private static final String Y_AXIS_TITLE = JMeterUtils.getResString(ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? "aggregate_graph_ms" : "aggregate_graph_ns"); //$NON-NLS-1$ /** * Lock used to protect list update @@ -410,7 +411,7 @@ public double[][] getData() { long keyShift = minStartTime + idx; StatCalculatorLong value = subList.get(keyShift); if (value != null) { - nanLast = value.getMean(); + nanLast = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? value.getMean() / 100000.0D : value.getMean(); data[s][idx] = nanLast; // Calculate intermediate values (if needed) int nlsize = nanList.size(); @@ -556,7 +557,7 @@ public void actionPerformed(ActionEvent event) { tempList.addAll(internalList); this.clearData(); for (RespTimeGraphDataBean data : tempList) { - SampleResult sr = new SampleResult(data.getStartTime(), data.getTime()); + SampleResult sr = new SampleResult(data.getStartTime() / 1000000L / 1000000L, data.getTime() / 1000000L / 1000000L); sr.setSampleLabel(data.getSamplerLabel()); this.add(sr); } diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java b/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java index 90819ac6c45..fe88824ac3b 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/SamplerResultTab.java @@ -67,6 +67,7 @@ import org.apache.jmeter.gui.util.JSyntaxTextArea; import org.apache.jmeter.gui.util.JTextScrollPane; import org.apache.jmeter.gui.util.TextBoxDialoger.TextBoxDoubleClick; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.util.JMeterUtils; import org.apache.jmeter.visualizers.SearchTextExtension.JEditorPaneSearchProvider; @@ -266,7 +267,7 @@ public void setupTabPane() { .getResString("view_results_thread_name")).append(SPACE) //$NON-NLS-1$ .append(sampleResult.getThreadName()).append(NL); String startTime = dateFormat - .format(Instant.ofEpochMilli(sampleResult.getStartTime())); + .format(Instant.ofEpochMilli(sampleResult.getStartTime() / 1000000L)); statsBuff .append(JMeterUtils .getResString("view_results_sample_start")).append(SPACE) //$NON-NLS-1$ @@ -274,15 +275,15 @@ public void setupTabPane() { statsBuff .append(JMeterUtils .getResString("view_results_load_time")).append(SPACE) //$NON-NLS-1$ - .append(sampleResult.getTime()).append(NL); + .append(ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getTime() / 1000000L : sampleResult.getTime()).append(NL); statsBuff .append(JMeterUtils .getResString("view_results_connect_time")).append(SPACE) //$NON-NLS-1$ - .append(sampleResult.getConnectTime()).append(NL); + .append(ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getConnectTime() / 1000000L : sampleResult.getConnectTime()).append(NL); statsBuff .append(JMeterUtils .getResString("view_results_latency")).append(SPACE) //$NON-NLS-1$ - .append(sampleResult.getLatency()).append(NL); + .append(ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getLatency() / 1000000L : sampleResult.getLatency()).append(NL); statsBuff .append(JMeterUtils .getResString("view_results_size_in_bytes")).append(SPACE) //$NON-NLS-1$ @@ -376,13 +377,13 @@ public void setupTabPane() { startTime)); resultModel.addRow(new RowResult( JMeterUtils.getParsedLabel("view_results_load_time"), //$NON-NLS-1$ - sampleResult.getTime())); + ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getTime() / 1000000L : sampleResult.getTime())); resultModel.addRow(new RowResult( JMeterUtils.getParsedLabel("view_results_connect_time"), //$NON-NLS-1$ - sampleResult.getConnectTime())); + ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getConnectTime() / 1000000L : sampleResult.getConnectTime())); resultModel.addRow(new RowResult( JMeterUtils.getParsedLabel("view_results_latency"), //$NON-NLS-1$ - sampleResult.getLatency())); + ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getLatency() / 1000000L : sampleResult.getLatency())); resultModel.addRow(new RowResult( JMeterUtils .getParsedLabel("view_results_size_in_bytes"), //$NON-NLS-1$ diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java b/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java index 1d909eba6b9..e11b412c998 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/StatGraphVisualizer.java @@ -73,6 +73,7 @@ import org.apache.jmeter.gui.util.FilePanel; import org.apache.jmeter.gui.util.HeaderAsPropertyRendererWrapper; import org.apache.jmeter.gui.util.VerticalPanel; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.Clearable; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.save.CSVSaveService; @@ -202,7 +203,7 @@ public class StatGraphVisualizer extends AbstractVisualizer implements Clearable private final String yAxisLabel = JMeterUtils.getResString("aggregate_graph_response_time");//$NON-NLS-1$ - private final String yAxisTitle = JMeterUtils.getResString("aggregate_graph_ms"); //$NON-NLS-1$ + private final String yAxisTitle = JMeterUtils.getResString(ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? "aggregate_graph_ms" : "aggregate_graph_ns"); //$NON-NLS-1$ private boolean saveGraphToFile = false; diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java index 6222c9d8086..6c3b56c9be8 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java @@ -24,6 +24,7 @@ import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; import org.apache.jmeter.control.TransactionController; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.report.processor.DescriptiveStatisticsFactory; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.util.JMeterUtils; @@ -230,7 +231,7 @@ public int getFailures() { * been added yet */ public double getOkMaxTime() { - return okResponsesStats.getMax(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? okResponsesStats.getMax() / 1000000.0D : okResponsesStats.getMax(); } /** @@ -240,7 +241,7 @@ public double getOkMaxTime() { * added yet */ public double getOkMinTime() { - return okResponsesStats.getMin(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? okResponsesStats.getMin() / 1000000.0D : okResponsesStats.getMin(); } /** @@ -249,7 +250,7 @@ public double getOkMinTime() { * @return The arithmetic mean of the stored values */ public double getOkMean() { - return okResponsesStats.getMean(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? okResponsesStats.getMean() / 1000000.0D : okResponsesStats.getMean(); } /** @@ -261,7 +262,7 @@ public double getOkMean() { * values. */ public double getOkPercentile(double percentile) { - return okResponsesStats.getPercentile(percentile); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? okResponsesStats.getMean() / 1000000.0D : okResponsesStats.getMean(); } /** @@ -271,7 +272,7 @@ public double getOkPercentile(double percentile) { * been added yet */ public double getKoMaxTime() { - return koResponsesStats.getMax(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? koResponsesStats.getMax() / 1000000.0D : koResponsesStats.getMax(); } /** @@ -281,7 +282,7 @@ public double getKoMaxTime() { * added yet */ public double getKoMinTime() { - return koResponsesStats.getMin(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? koResponsesStats.getMin() / 1000000.0D : koResponsesStats.getMin(); } /** @@ -290,7 +291,7 @@ public double getKoMinTime() { * @return The arithmetic mean of the stored values */ public double getKoMean() { - return koResponsesStats.getMean(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? koResponsesStats.getMean() / 1000000.0D : koResponsesStats.getMean(); } /** @@ -302,7 +303,7 @@ public double getKoMean() { * values. */ public double getKoPercentile(double percentile) { - return koResponsesStats.getPercentile(percentile); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? koResponsesStats.getPercentile(percentile) / 1000000.0D : koResponsesStats.getPercentile(percentile); } /** @@ -312,7 +313,7 @@ public double getKoPercentile(double percentile) { * been added yet */ public double getAllMaxTime() { - return allResponsesStats.getMax(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? allResponsesStats.getMax() / 1000000.0D : allResponsesStats.getMax(); } /** @@ -322,7 +323,7 @@ public double getAllMaxTime() { * added yet */ public double getAllMinTime() { - return allResponsesStats.getMin(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? allResponsesStats.getMin() / 1000000.0D : allResponsesStats.getMin(); } /** @@ -331,7 +332,7 @@ public double getAllMinTime() { * @return The arithmetic mean of the stored values */ public double getAllMean() { - return allResponsesStats.getMean(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? allResponsesStats.getMean() / 1000000.0D : allResponsesStats.getMean(); } /** @@ -343,7 +344,7 @@ public double getAllMean() { * values. */ public double getAllPercentile(double percentile) { - return pctResponseStats.getPercentile(percentile); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? pctResponseStats.getPercentile(percentile) / 1000000.0D : pctResponseStats.getPercentile(percentile); } /** diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/InfluxDBRawBackendListenerClient.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/InfluxDBRawBackendListenerClient.java index 2d18049c2e5..707c9c379f3 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/InfluxDBRawBackendListenerClient.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/InfluxDBRawBackendListenerClient.java @@ -23,6 +23,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.jmeter.config.Arguments; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.visualizers.backend.BackendListenerClient; import org.apache.jmeter.visualizers.backend.BackendListenerContext; @@ -125,7 +126,7 @@ public void handleSampleResults( private void addMetricFromSampleResult(SampleResult sampleResult) { String tags = "," + createTags(sampleResult); String fields = createFields(sampleResult); - long timestamp = sampleResult.getTimeStamp(); + long timestamp = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getTimeStamp() / 1000000L : sampleResult.getTimeStamp(); influxDBMetricsManager.addMetric(measurement, tags, fields, timestamp); } @@ -145,9 +146,9 @@ static String createTags(SampleResult sampleResult) { @VisibleForTesting static String createFields(SampleResult sampleResult) { - long duration = sampleResult.getTime(); - long latency = sampleResult.getLatency(); - long connectTime = sampleResult.getConnectTime(); + long duration = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getTime() / 1000000L : sampleResult.getTime(); + long latency = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getLatency() / 1000000L : sampleResult.getLatency(); + long connectTime = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sampleResult.getConnectTime() / 1000000L : sampleResult.getConnectTime(); return "duration=" + duration + ",ttfb=" + latency + ",connectTime=" + connectTime; diff --git a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java index 8fdac49e5e0..1a2386dc375 100644 --- a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java +++ b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricFixedModeTest.java @@ -95,7 +95,7 @@ private SampleResult createSampleResult(boolean success) { result.setSampleCount(1); result.setErrorCount(success ? 0 : 1); result.sampleStart(); - result.setEndTime(result.getStartTime() + DEFAULT_ELAPSED_TIME); + result.setEndTime_ns(result.getStartTime() + DEFAULT_ELAPSED_TIME * 1000000L); result.setSentBytes(1000); result.setBytes(2000L); return result; @@ -116,7 +116,7 @@ private SampleResult createSampleResultWithSubresults(boolean success) { result.setSuccessful(success); result.addSubResult(createSampleResult(success)); result.addSubResult(createSampleResult(success)); - result.setEndTime(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getEndTime).max().orElse(0)); + result.setEndTime_ns(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getEndTime).max().orElse(0)); result.setBytes(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getBytesAsLong).sum()); result.setSentBytes(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getSentBytes).sum()); result.setResponseMessage("Number of samples in transaction : "); // This is a constant in TransactionController diff --git a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java index 42c3835f7a5..f42386fe1ce 100644 --- a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java +++ b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/SamplerMetricTimedModeTest.java @@ -86,7 +86,7 @@ private SampleResult createSampleResult(boolean success) { result.sampleStart(); result.setSentBytes(1000); result.setBytes(2000L); - result.setEndTime(result.getStartTime() + DEFAULT_ELAPSED_TIME); + result.setEndTime_ns(result.getStartTime() + DEFAULT_ELAPSED_TIME * 1000000L); return result; } @@ -98,7 +98,7 @@ private SampleResult createSampleResultWithSubresults(boolean success) { result.setSuccessful(success); result.addSubResult(createSampleResult(success)); result.addSubResult(createSampleResult(success)); - result.setEndTime(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getEndTime).max().orElse(0)); + result.setEndTime_ns(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getEndTime).max().orElse(0)); result.setBytes(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getBytesAsLong).sum()); result.setSentBytes(Arrays.stream(result.getSubResults()).mapToLong(SampleResult::getSentBytes).sum()); result.setResponseMessage("Number of samples in transaction : "); // This is a constant in TransactionController diff --git a/src/components/src/test/kotlin/org/apache/jmeter/assertions/CompareAssertionTest.kt b/src/components/src/test/kotlin/org/apache/jmeter/assertions/CompareAssertionTest.kt index c33bac5faeb..2d7e008c94a 100644 --- a/src/components/src/test/kotlin/org/apache/jmeter/assertions/CompareAssertionTest.kt +++ b/src/components/src/test/kotlin/org/apache/jmeter/assertions/CompareAssertionTest.kt @@ -39,7 +39,6 @@ class CompareAssertionTest { fun simpleResult(data: String, elapsed: Long) = SampleResult(0, elapsed).apply { setResponseData(data, Charsets.UTF_8.name()) - sampleEnd() } @JvmStatic diff --git a/src/core/src/main/java/org/apache/jmeter/control/TransactionController.java b/src/core/src/main/java/org/apache/jmeter/control/TransactionController.java index 467aaf2fa30..09b969a27cf 100644 --- a/src/core/src/main/java/org/apache/jmeter/control/TransactionController.java +++ b/src/core/src/main/java/org/apache/jmeter/control/TransactionController.java @@ -215,7 +215,7 @@ private Sampler nextWithoutTransactionSampler() { long processingTimeOfLastChild = res.currentTimeInMillis() - prevEndTime; pauseTime += processingTimeOfLastChild; } - res.setIdleTime(pauseTime+res.getIdleTime()); + res.setIdleTime_ns(pauseTime+res.getIdleTime()); res.sampleEnd(); res.setResponseMessage( TransactionController.NUMBER_OF_SAMPLES_IN_TRANSACTION_PREFIX @@ -252,7 +252,7 @@ public static boolean isFromTransactionController(SampleResult res) { public void triggerEndOfLoop() { if(!isGenerateParentSample()) { if (res != null) { - res.setIdleTime(pauseTime + res.getIdleTime()); + res.setIdleTime_ns(pauseTime + res.getIdleTime()); res.sampleEnd(); res.setSuccessful(TRUE.equals(JMeterContextService.getContext().getVariables().get(JMeterThread.LAST_SAMPLE_OK))); res.setResponseMessage( @@ -320,8 +320,8 @@ public void sampleOccurred(SampleEvent se) { } res.setAllThreads(sampleResult.getAllThreads()); res.setGroupThreads(sampleResult.getGroupThreads()); - res.setLatency(res.getLatency() + sampleResult.getLatency()); - res.setConnectTime(res.getConnectTime() + sampleResult.getConnectTime()); + res.setLatency_ns(res.getLatency() + sampleResult.getLatency()); + res.setConnectTime_ns(res.getConnectTime() + sampleResult.getConnectTime()); } } } diff --git a/src/core/src/main/java/org/apache/jmeter/control/TransactionSampler.java b/src/core/src/main/java/org/apache/jmeter/control/TransactionSampler.java index b8ee999cb62..b1b8899cdb5 100644 --- a/src/core/src/main/java/org/apache/jmeter/control/TransactionSampler.java +++ b/src/core/src/main/java/org/apache/jmeter/control/TransactionSampler.java @@ -132,11 +132,11 @@ protected void setTransactionDone() { // Bug 50080 (not include pause time when generate parent) if (!transactionController.isIncludeTimers()) { long end = transactionSampleResult.currentTimeInMillis(); - transactionSampleResult.setIdleTime(end + transactionSampleResult.setIdleTime_ns(end - transactionSampleResult.getStartTime() - totalTime); - transactionSampleResult.setEndTime(end); + transactionSampleResult.setEndTime_ns(end); } - transactionSampleResult.setConnectTime(totalConnectTime); + transactionSampleResult.setConnectTime_ns(totalConnectTime); } protected void setSubSampler(Sampler subSampler) { diff --git a/src/core/src/main/java/org/apache/jmeter/report/config/ReportGeneratorConfiguration.java b/src/core/src/main/java/org/apache/jmeter/report/config/ReportGeneratorConfiguration.java index 1291c6627d5..91d5705ab0d 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/config/ReportGeneratorConfiguration.java +++ b/src/core/src/main/java/org/apache/jmeter/report/config/ReportGeneratorConfiguration.java @@ -28,6 +28,7 @@ import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; +import org.apache.jmeter.util.JMeterUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -125,6 +126,9 @@ public class ReportGeneratorConfiguration { public static final String SUBCONF_KEY_CLASSNAME = "classname"; public static final String SUBCONF_KEY_PROPERTY = "property"; + public static final String jmeter_reportgenerator_ms_ns = "ms".equalsIgnoreCase(JMeterUtils.getProperty(REPORT_GENERATOR_KEY_PREFIX + KEY_DELIMITER + "ms_ns")) ? "ms" : "ns".equalsIgnoreCase(JMeterUtils.getProperty(REPORT_GENERATOR_KEY_PREFIX + KEY_DELIMITER + "ms_ns")) ? "ns" : "ms"; + public static final boolean jmeter_reportgenerator_ms_ns_isMs = "ms".equals(jmeter_reportgenerator_ms_ns); + private static final class ExporterConfigurationFactory implements SubConfigurationFactory { private final Props props; diff --git a/src/core/src/main/java/org/apache/jmeter/report/core/Sample.java b/src/core/src/main/java/org/apache/jmeter/report/core/Sample.java index 62ffac26fdf..4fb90e9c885 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/core/Sample.java +++ b/src/core/src/main/java/org/apache/jmeter/report/core/Sample.java @@ -148,7 +148,10 @@ public String toString() { * @return the time stamp */ public long getTimestamp() { - return getData(long.class, CSVSaveService.TIME_STAMP); + if (metadata.indexOf(CSVSaveService.TIME_STAMP_NS) > -1) { + return getData(long.class, CSVSaveService.TIME_STAMP_NS); + } + return getData(long.class, CSVSaveService.TIME_STAMP) * 1000000L; } /** @@ -157,7 +160,10 @@ public long getTimestamp() { * @return the elapsed time stored in the sample */ public long getElapsedTime() { - return getData(long.class, CSVSaveService.CSV_ELAPSED); + if (metadata.indexOf(CSVSaveService.CSV_ELAPSED_NS) > -1) { + return getData(long.class, CSVSaveService.CSV_ELAPSED_NS); + } + return getData(long.class, CSVSaveService.CSV_ELAPSED) * 1000000L; } /** @@ -242,7 +248,10 @@ public String getResponseMessage() { * @return the latency stored in the sample */ public long getLatency() { - return getData(long.class, CSVSaveService.CSV_LATENCY); + if (metadata.indexOf(CSVSaveService.CSV_LATENCY_NS) > -1) { + return getData(long.class, CSVSaveService.CSV_LATENCY_NS); + } + return getData(long.class, CSVSaveService.CSV_LATENCY) * 1000000L; } /** @@ -251,8 +260,11 @@ public long getLatency() { * @return the connect time stored in the sample or 0 is column is not in results */ public long getConnectTime() { + if (metadata.indexOf(CSVSaveService.CSV_CONNECT_TIME_NS) > -1) { + return getData(long.class, CSVSaveService.TIME_STAMP_NS); + } if(metadata.indexOf(CSVSaveService.CSV_CONNECT_TIME) >= 0) { - return getData(long.class, CSVSaveService.CSV_CONNECT_TIME); + return getData(long.class, CSVSaveService.CSV_CONNECT_TIME) * 1000000L; } else { return 0L; } diff --git a/src/core/src/main/java/org/apache/jmeter/report/core/TimeHelper.java b/src/core/src/main/java/org/apache/jmeter/report/core/TimeHelper.java index 0c1953f8706..00d91f42626 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/core/TimeHelper.java +++ b/src/core/src/main/java/org/apache/jmeter/report/core/TimeHelper.java @@ -78,7 +78,7 @@ public static String formatTimeStamp(long timeStamp) { */ @SuppressWarnings("JavaUtilDate") public static String formatTimeStamp(long timeStamp, String format) { - SimpleDateFormat dateFormat = format != null ? new SimpleDateFormat( + SimpleDateFormat dateFormat = format != null && !"ms".equals(format) ? new SimpleDateFormat( format) : new SimpleDateFormat(); return dateFormat.format(new Date(timeStamp)); } diff --git a/src/core/src/main/java/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java b/src/core/src/main/java/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java index cdb25dc3a46..28f8e43e69b 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java +++ b/src/core/src/main/java/org/apache/jmeter/report/dashboard/HtmlTemplateExporter.java @@ -438,6 +438,8 @@ public void export(SampleContext context, File file, // Add the overall filter property to the context addToContext(DATA_CTX_OVERALL_FILTER, configuration.getSampleFilter(), dataContext); + dataContext.put("jmeter_reportgenerator_ms_ns", ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns); + // Walk template directory to copy files and process templated ones Configuration templateCfg = new Configuration(Configuration.VERSION_2_3_30); try { diff --git a/src/core/src/main/java/org/apache/jmeter/report/dashboard/ReportGenerator.java b/src/core/src/main/java/org/apache/jmeter/report/dashboard/ReportGenerator.java index 8c3f9f42e76..24134e8e507 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/dashboard/ReportGenerator.java +++ b/src/core/src/main/java/org/apache/jmeter/report/dashboard/ReportGenerator.java @@ -500,7 +500,7 @@ private FilterConsumer createNameFilter() { */ private static AggregateConsumer createEndDateConsumer() { AggregateConsumer endDateConsumer = new AggregateConsumer( - new MaxAggregator(), sample -> (double) sample.getEndTime()); + new MaxAggregator(), sample -> ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? (double) sample.getEndTime() : sample.getEndTime() / 1000000.0D); endDateConsumer.setName(END_DATE_CONSUMER_NAME); return endDateConsumer; } @@ -510,7 +510,7 @@ private static AggregateConsumer createEndDateConsumer() { */ private static AggregateConsumer createBeginDateConsumer() { AggregateConsumer beginDateConsumer = new AggregateConsumer( - new MinAggregator(), sample -> (double) sample.getStartTime()); + new MinAggregator(), sample -> ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? (double) sample.getStartTime() : sample.getStartTime() / 1000000.0D); beginDateConsumer.setName(BEGIN_DATE_CONSUMER_NAME); return beginDateConsumer; } diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/ApdexSummaryConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/ApdexSummaryConsumer.java index 6fc9144ae06..a5a591adcbf 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/ApdexSummaryConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/ApdexSummaryConsumer.java @@ -122,19 +122,19 @@ protected void updateData(SummaryInfo info, Sample sample) { // Increment the counters depending on the elapsed time. ApdexThresholdsInfo thresholdsInfo = data.getApdexThresholdInfo(); - if (elapsedTime <= thresholdsInfo.getSatisfiedThreshold()) { + if (elapsedTime <= thresholdsInfo.getSatisfiedThreshold() * 1000000L) { data.incSatisfiedCount(); - } else if (elapsedTime <= thresholdsInfo.getToleratedThreshold()) { + } else if (elapsedTime <= thresholdsInfo.getToleratedThreshold() * 1000000L) { data.incToleratedCount(); } // Increment the overall counters depending on the elapsed time. ApdexThresholdsInfo overallThresholdsInfo = overallData .getApdexThresholdInfo(); - if (elapsedTime <= overallThresholdsInfo.getSatisfiedThreshold()) { + if (elapsedTime <= overallThresholdsInfo.getSatisfiedThreshold() * 1000000L) { overallData.incSatisfiedCount(); } else if (elapsedTime <= overallThresholdsInfo - .getToleratedThreshold()) { + .getToleratedThreshold() * 1000000L) { overallData.incToleratedCount(); } } diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/MaxAggregator.java b/src/core/src/main/java/org/apache/jmeter/report/processor/MaxAggregator.java index 7ceb2e712cd..e39cbe8e0f2 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/MaxAggregator.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/MaxAggregator.java @@ -17,6 +17,8 @@ package org.apache.jmeter.report.processor; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; + /** * The class MaxAggregator is used to get maximum from samples. * @@ -44,7 +46,7 @@ public long getCount() { */ @Override public double getResult() { - return value; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? value / 1000000.0D : value; } /* diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/MeanAggregator.java b/src/core/src/main/java/org/apache/jmeter/report/processor/MeanAggregator.java index 3258f946316..5f216f92311 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/MeanAggregator.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/MeanAggregator.java @@ -18,6 +18,7 @@ package org.apache.jmeter.report.processor; import org.apache.commons.math3.stat.descriptive.moment.Mean; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; /** * The class MeanAggregator is used to get mean from samples. @@ -26,7 +27,7 @@ */ public class MeanAggregator implements Aggregator { - private final Mean mean = new Mean(); + protected final Mean mean = new Mean(); /* * (non-Javadoc) @@ -45,7 +46,7 @@ public long getCount() { */ @Override public double getResult() { - return mean.getResult(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? mean.getResult() / 1000000.0D : mean.getResult(); } /* diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/MinAggregator.java b/src/core/src/main/java/org/apache/jmeter/report/processor/MinAggregator.java index d020c4099e0..4671601bff6 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/MinAggregator.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/MinAggregator.java @@ -17,6 +17,8 @@ package org.apache.jmeter.report.processor; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; + /** * The class MinAggregator is used to get minimum from samples. * @@ -44,7 +46,7 @@ public long getCount() { */ @Override public double getResult() { - return value; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? value / 1000000.0D : value; } /* diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/NormalizerSampleConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/NormalizerSampleConsumer.java index 55df979911e..c4d65bdbaf2 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/NormalizerSampleConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/NormalizerSampleConsumer.java @@ -107,6 +107,9 @@ public void consume(Sample s, int channel) { TIMESTAMP_FORMAT, s.toString()), e); } long time = date.getTime(); + if (!isMillisFormat) { + time *= 1000000L; + } int cc = sampleMetadata.getColumnCount(); String[] data = new String[cc]; for (int i = 0; i < cc; i++) { diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java b/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java index ca81b2ebf72..4214d5f2653 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/PercentileAggregator.java @@ -71,7 +71,7 @@ public long getCount() { */ @Override public double getResult() { - return statistics.getPercentile(percentileIndex); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? statistics.getPercentile(percentileIndex) / 1000000.0D : statistics.getPercentile(percentileIndex); } /* diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/StatisticsSummaryData.java b/src/core/src/main/java/org/apache/jmeter/report/processor/StatisticsSummaryData.java index a217c377d18..2c277923959 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/StatisticsSummaryData.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/StatisticsSummaryData.java @@ -17,6 +17,8 @@ package org.apache.jmeter.report.processor; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; + /** * The class ApdexSummaryData provides information for * StatisticsSummaryConsumer. @@ -41,7 +43,7 @@ public class StatisticsSummaryData { private long max = Long.MIN_VALUE; public long getElapsedTime() { - return endTime - firstTime; + return (endTime - firstTime) / 1000000L; } /** @@ -50,7 +52,7 @@ public long getElapsedTime() { * @return the firstTime */ public final long getFirstTime() { - return firstTime; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? firstTime / 1000000L : firstTime; } /** @@ -69,7 +71,7 @@ public final void setFirstTime(long firstTime) { * @return the endTime */ public final long getEndTime() { - return endTime; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? endTime / 1000000L : endTime; } /** @@ -135,7 +137,7 @@ public final void setTotal(long total) { * @return the min */ public final long getMin() { - return min; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? min / 1000000L : min; } /** @@ -150,7 +152,7 @@ public final void setMin(long min) { * @return the max */ public final long getMax() { - return max; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? max / 1000000L : max; } /** diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/SumAggregator.java b/src/core/src/main/java/org/apache/jmeter/report/processor/SumAggregator.java index 3f5cf10f7bf..327fd0803d7 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/SumAggregator.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/SumAggregator.java @@ -17,6 +17,8 @@ package org.apache.jmeter.report.processor; +import java.math.BigDecimal; + /** * The class SumAggregator is used to get sum from samples. * @@ -25,7 +27,7 @@ public class SumAggregator implements Aggregator { private long count = 0; - private double sum = 0; + private BigDecimal sum = BigDecimal.ZERO; /* * (non-Javadoc) @@ -44,7 +46,7 @@ public long getCount() { */ @Override public double getResult() { - return sum; + return sum.doubleValue(); } /* @@ -55,7 +57,7 @@ public double getResult() { @Override public void addValue(double value) { count++; - sum += value; + sum = sum.add(BigDecimal.valueOf(value)); } /* @@ -66,7 +68,7 @@ public void addValue(double value) { @Override public void reset() { count = 0; - sum = 0; + sum = BigDecimal.ZERO; } } diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractGraphConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractGraphConsumer.java index 673722df7ec..de87117b34a 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractGraphConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractGraphConsumer.java @@ -288,6 +288,9 @@ private void addKeyData(MapResultData result, @SuppressWarnings("unused") String for (Map.Entry entry : aggInfo.entrySet()) { // Init key and value depending on invertKeysAndValues property Double key = entry.getKey(); + if (this instanceof AbstractOverTimeGraphConsumer) { + key /= 1000000.0D; + } Double value = entry.getValue().getResult(); if (invertKeysAndValues) { diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractOverTimeGraphConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractOverTimeGraphConsumer.java index a04d9358733..5707ffb10c3 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractOverTimeGraphConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractOverTimeGraphConsumer.java @@ -104,6 +104,6 @@ protected void initializeExtraResults(MapResultData parentResult) { @Override public void initialize() { super.initialize(); - ((TimeStampKeysSelector) getKeysSelector()).setGranularity(granularity); + ((TimeStampKeysSelector) getKeysSelector()).setGranularity(granularity * 1000000L); } } diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractVersusRequestsGraphConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractVersusRequestsGraphConsumer.java index 59202d113d9..520694bb725 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractVersusRequestsGraphConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/AbstractVersusRequestsGraphConsumer.java @@ -219,7 +219,7 @@ public TimeCountConsumer(AbstractVersusRequestsGraphConsumer parent) { private Long getTimeInterval(Sample sample) { long time = sample.getEndTime(); - return time - (time % parent.getGranularity()); + return time - (time % (parent.getGranularity() * 1000000L)); } // Adds a new field in the sample metadata for each channel diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ActiveThreadsGraphConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ActiveThreadsGraphConsumer.java index a62f86e3c6a..16ec09aa45e 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ActiveThreadsGraphConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ActiveThreadsGraphConsumer.java @@ -21,6 +21,8 @@ import java.util.Map; import org.apache.jmeter.report.core.Sample; +import org.apache.jmeter.report.processor.Aggregator; +import org.apache.jmeter.report.processor.MeanAggregator; import org.apache.jmeter.report.processor.MeanAggregatorFactory; import org.apache.jmeter.report.processor.graph.AbstractGraphConsumer; import org.apache.jmeter.report.processor.graph.AbstractOverTimeGraphConsumer; @@ -85,7 +87,17 @@ public Iterable select(Sample sample) { return Collections.singletonMap( AbstractGraphConsumer.DEFAULT_GROUP, - new GroupInfo(new MeanAggregatorFactory(), seriesSelector, graphValueSelector, false, false)); + new GroupInfo(new MeanAggregatorFactory() { + @Override + protected Aggregator createAggregator() { + return new MeanAggregator() { + @Override + public double getResult() { + return mean.getResult(); + } + }; + } + }, seriesSelector, graphValueSelector, false, false)); } } diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimeDistributionGraphConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimeDistributionGraphConsumer.java index 0d83696948d..11abc692d0e 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimeDistributionGraphConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimeDistributionGraphConsumer.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.Map; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.report.processor.MapResultData; import org.apache.jmeter.report.processor.SumAggregatorFactory; import org.apache.jmeter.report.processor.ValueResultData; @@ -67,7 +68,7 @@ public final void setGranularity(long granularity) { protected final GraphKeysSelector createKeysSelector() { return sample -> { long elapsed = sample.getElapsedTime(); - return (double) elapsed - elapsed % granularity; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? (elapsed - elapsed % (granularity * 1000000L)) / 1000000.0D : (double) elapsed - elapsed % (granularity * 1000000L); }; } diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesGraphConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesGraphConsumer.java index a25b5141a4f..041140580c0 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesGraphConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesGraphConsumer.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.Map; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.report.processor.MapResultData; import org.apache.jmeter.report.processor.SumAggregatorFactory; import org.apache.jmeter.report.processor.graph.AbstractGraphConsumer; @@ -56,7 +57,7 @@ public void initialize() { */ @Override protected final GraphKeysSelector createKeysSelector() { - return sample -> (double) sample.getElapsedTime(); + return sample -> ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sample.getElapsedTime() / 1000000.0D : (double) sample.getElapsedTime(); } /* diff --git a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/SyntheticResponseTimeDistributionGraphConsumer.java b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/SyntheticResponseTimeDistributionGraphConsumer.java index 8058f950932..2ac52143722 100644 --- a/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/SyntheticResponseTimeDistributionGraphConsumer.java +++ b/src/core/src/main/java/org/apache/jmeter/report/processor/graph/impl/SyntheticResponseTimeDistributionGraphConsumer.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.report.core.Sample; import org.apache.jmeter.report.processor.ListResultData; import org.apache.jmeter.report.processor.MapResultData; @@ -69,9 +70,9 @@ public Iterable select(Sample sample) { return Collections.singletonList(FAILED_LABEL); } else { long elapsedTime = sample.getElapsedTime(); - if (elapsedTime <= getSatisfiedThreshold()) { + if (elapsedTime <= satisfiedThreshold * 1000000L) { return satisfiedLabels; - } else if (elapsedTime <= getToleratedThreshold()) { + } else if (elapsedTime <= toleratedThreshold * 1000000L) { return toleratedLabels; } else { return untoleratedLabels; @@ -91,9 +92,9 @@ protected final GraphKeysSelector createKeysSelector() { return sample -> { if (sample.getSuccess()) { long elapsedTime = sample.getElapsedTime(); - if (elapsedTime <= satisfiedThreshold) { + if (elapsedTime <= satisfiedThreshold * 1000000L) { return (double) 0; - } else if (elapsedTime <= toleratedThreshold) { + } else if (elapsedTime <= toleratedThreshold * 1000000L) { return 1d; } else { return 2d; @@ -124,9 +125,9 @@ protected Map createGroupInfos() { protected void initializeExtraResults(MapResultData parentResult) { ListResultData listResultData = new ListResultData(); String[] seriesLabels = new String[]{ - SATISFIED_LABEL.format(new Object[]{getSatisfiedThreshold()}), - TOLERATED_LABEL.format(new Object[]{getSatisfiedThreshold(), getToleratedThreshold()}), - UNTOLERATED_LABEL.format(new Object[]{getToleratedThreshold()}), + SATISFIED_LABEL.format(new Object[] { ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? satisfiedThreshold : satisfiedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns }), + TOLERATED_LABEL.format(new Object[] { ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? satisfiedThreshold : satisfiedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? toleratedThreshold : toleratedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns }), + UNTOLERATED_LABEL.format(new Object[] { ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? toleratedThreshold : toleratedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns }), FAILED_LABEL }; String[] colors = new String[]{ @@ -191,10 +192,10 @@ public void setToleratedThreshold(long toleratedThreshold) { private void formatLabels() { this.satisfiedLabels = Collections.singletonList( - SATISFIED_LABEL.format(new Object[]{this.satisfiedThreshold})); + SATISFIED_LABEL.format(new Object[] { ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? satisfiedThreshold : satisfiedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns })); this.toleratedLabels = Collections.singletonList( - TOLERATED_LABEL.format(new Object[]{this.satisfiedThreshold, this.toleratedThreshold})); + TOLERATED_LABEL.format(new Object[] { ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? satisfiedThreshold : satisfiedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? toleratedThreshold : toleratedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns })); this.untoleratedLabels = Collections.singletonList( - UNTOLERATED_LABEL.format(new Object[]{this.toleratedThreshold})); + UNTOLERATED_LABEL.format(new Object[] { ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? toleratedThreshold : toleratedThreshold * 1000000L, ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns })); } } diff --git a/src/core/src/main/java/org/apache/jmeter/reporters/SummariserRunningSample.java b/src/core/src/main/java/org/apache/jmeter/reporters/SummariserRunningSample.java index 3e22d749022..5f1ea8d39dd 100644 --- a/src/core/src/main/java/org/apache/jmeter/reporters/SummariserRunningSample.java +++ b/src/core/src/main/java/org/apache/jmeter/reporters/SummariserRunningSample.java @@ -17,8 +17,10 @@ package org.apache.jmeter.reporters; +import java.math.BigInteger; import java.text.DecimalFormat; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.SampleResult; /** @@ -40,7 +42,7 @@ class SummariserRunningSample { private long counter; - private long runningSum; + private BigInteger runningSum; private long max; @@ -79,7 +81,7 @@ public SummariserRunningSample(SummariserRunningSample src) { private void init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or final) counter = 0L; - runningSum = 0L; + runningSum = BigInteger.ZERO; max = Long.MIN_VALUE; min = Long.MAX_VALUE; errorCount = 0L; @@ -101,7 +103,7 @@ public void clear() { public void addSample(SummariserRunningSample rs) { counter += rs.counter; errorCount += rs.errorCount; - runningSum += rs.runningSum; + runningSum = runningSum.add(rs.runningSum); if (max < rs.max) { max = rs.max; } @@ -120,7 +122,7 @@ public void addSample(SampleResult res) { counter += res.getSampleCount(); errorCount += res.getErrorCount(); long aTimeInMillis = res.getTime(); - runningSum += aTimeInMillis; + runningSum = runningSum.add(BigInteger.valueOf(aTimeInMillis)); if (aTimeInMillis > max) { max = aTimeInMillis; } @@ -182,7 +184,7 @@ public long getAverage() { if (counter == 0) { return 0; } - return runningSum / counter; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? runningSum.divide(BigInteger.valueOf(counter)).divide(BigInteger.valueOf(1000000L)).longValue() : runningSum.divide(BigInteger.valueOf(counter)).longValue(); } /** @@ -225,7 +227,7 @@ public double getErrorPercentage() { * @return the time in milliseconds of the slowest sample. */ public long getMax() { - return max; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? max / 1000000L : max; } /** @@ -234,7 +236,7 @@ public long getMax() { * @return the time in milliseconds of the quickest sample. */ public long getMin() { - return min; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? min / 1000000L : min; } /** diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java index 66589162432..a9294e337bd 100644 --- a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java +++ b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java @@ -135,6 +135,9 @@ public class SampleResult implements Serializable, Cloneable, Searchable { private static final String NULL_FILENAME = "NULL"; + private static final long ms = System.currentTimeMillis() * 1000000L; + private static final long ns = System.nanoTime(); + static { if (START_TIMESTAMP) { log.info("Note: Sample TimeStamps are START times"); @@ -147,7 +150,7 @@ public class SampleResult implements Serializable, Cloneable, Searchable { if (USE_NANO_TIME && NANOTHREAD_SLEEP > 0) { // Make sure we start with a reasonable value - NanoOffset.nanoOffset = System.currentTimeMillis() - SampleResult.sampleNsClockInMs(); + NanoOffset.nanoOffset = ms + System.nanoTime() - ns - sampleNsClockInMs(); NanoOffset nanoOffset = new NanoOffset(); nanoOffset.setDaemon(true); nanoOffset.setName("NanoOffset"); @@ -379,12 +382,12 @@ protected SampleResult(long elapsed, boolean atend) { */ public SampleResult(long stamp, long elapsed) { this(); - stampAndTime(stamp, elapsed); + stampAndTime(stamp * 1000000L, elapsed * 1000000L); } private long initOffset(){ if (useNanoTime){ - return nanoThreadSleep > 0 ? NanoOffset.getNanoOffset() : System.currentTimeMillis() - sampleNsClockInMs(); + return nanoThreadSleep > 0 ? NanoOffset.getNanoOffset() : ms + System.nanoTime() - ns - sampleNsClockInMs(); } else { return Long.MIN_VALUE; } @@ -439,7 +442,7 @@ public static SampleResult createTestSample(long elapsed) { } private static long sampleNsClockInMs() { - return System.nanoTime() / 1000000; + return ms + System.nanoTime() - ns; } /** @@ -457,7 +460,7 @@ public long currentTimeInMillis() { } return sampleNsClockInMs() + nanoTimeOffset; } - return System.currentTimeMillis(); + return ms + System.nanoTime() - ns; } // Helper method to maintain timestamp relationships @@ -485,6 +488,13 @@ private void stampAndTime(long stamp, long elapsed) { * set already */ public void setStampAndTime(long stamp, long elapsed) { + setStampAndTime_ns(stamp * 1000000L, elapsed * 1000000L); + } + + /** + * @see #setStampAndTime, But param in nanosecond format + */ + public void setStampAndTime_ns(long stamp, long elapsed) { if (startTime != 0 || endTime != 0){ throw new IllegalStateException("Calling setStampAndTime() after start/end times have been set"); } @@ -647,7 +657,7 @@ public void addSubResult(SampleResult subResult, boolean renameSubResults) { subResult.setThreadName(tn); // Extend the time to the end of the added sample - setEndTime(Math.max(getEndTime(), subResult.getEndTime() + nanoTimeOffset - subResult.nanoTimeOffset)); // Bug 51855 + setEndTime_ns(Math.max(getEndTime(), subResult.getEndTime() + nanoTimeOffset - subResult.nanoTimeOffset)); // Bug 51855 // Include the byte count for the added sample setBytes(getBytesAsLong() + subResult.getBytesAsLong()); setSentBytes(getSentBytes() + subResult.getSentBytes()); @@ -1143,6 +1153,13 @@ public long getStartTime() { * allow the original start time to be kept */ protected final void setStartTime(long start) { + setStartTime_ns(start * 1000000L); + } + + /** + * @see #setStartTime , But param in nanosecond format + */ + protected final void setStartTime_ns(long start) { startTime = start; if (START_TIMESTAMP) { timeStamp = startTime; @@ -1150,6 +1167,13 @@ protected final void setStartTime(long start) { } public void setEndTime(long end) { + setEndTime_ns(end * 1000000L); + } + + /** + * @see #setEndTime , But param in nanosecond format + */ + public void setEndTime_ns(long end) { endTime = end; if (!START_TIMESTAMP) { timeStamp = endTime; @@ -1167,6 +1191,13 @@ public void setEndTime(long end) { * @param idle long */ public void setIdleTime(long idle) { + setIdleTime_ns(idle * 1000000L); + } + + /** + * @see #setIdleTime , But param in nanosecond format + */ + public void setIdleTime_ns(long idle) { idleTime = idle; } @@ -1181,7 +1212,7 @@ private void setTimes(long start, long end) { */ public void sampleStart() { if (startTime == 0) { - setStartTime(currentTimeInMillis()); + setStartTime_ns(currentTimeInMillis()); } else { log.error("sampleStart called twice", new Throwable(INVALID_CALL_SEQUENCE_MSG)); } @@ -1193,7 +1224,7 @@ public void sampleStart() { */ public void sampleEnd() { if (endTime == 0) { - setEndTime(currentTimeInMillis()); + setEndTime_ns(currentTimeInMillis()); } else { log.error("sampleEnd called twice", new Throwable(INVALID_CALL_SEQUENCE_MSG)); } @@ -1382,6 +1413,13 @@ public void latencyEnd() { * The latency to set. */ public void setLatency(long latency) { + setLatency_ns(latency * 1000000L); + } + + /** + * @see #setLatency , But param in nanosecond format + */ + public void setLatency_ns(long latency) { this.latency = latency; } @@ -1405,6 +1443,13 @@ public void connectEnd() { * @param time The connect time to set. */ public void setConnectTime(long time) { + setConnectTime_ns(time * 1000000L); + } + + /** + * @see #setConnectTime , But param in nanosecond format + */ + public void setConnectTime_ns(long time) { this.connectTime = time; } @@ -1415,6 +1460,13 @@ public void setConnectTime(long time) { * The timeStamp to set. */ public void setTimeStamp(long timeStamp) { + setTimeStamp_ns(timeStamp * 1000000L); + } + + /** + * @see #setTimeStamp , But param in nanosecond format + */ + public void setTimeStamp_ns(long timeStamp) { this.timeStamp = timeStamp; } @@ -1561,7 +1613,7 @@ public void run() { private static void getOffset(long wait) { try { TimeUnit.MILLISECONDS.sleep(wait); - long clock = System.currentTimeMillis(); + long clock = ms + System.nanoTime() - ns; long nano = SampleResult.sampleNsClockInMs(); nanoOffset = clock - nano; } catch (InterruptedException ignore) { diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java b/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java index 77b1bf65c65..8f6da8a3d1b 100644 --- a/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java +++ b/src/core/src/main/java/org/apache/jmeter/samplers/StatisticalSampleResult.java @@ -51,6 +51,10 @@ public StatisticalSampleResult(long stamp, long elapsed) { this.elapsed = elapsed; } + public StatisticalSampleResult(long elapsed) { + this.elapsed = elapsed; + } + /** * Create a statistical sample result from an ordinary sample result. * @@ -82,14 +86,14 @@ public void add(SampleResult res) { // Set start/end times if (getStartTime()==0){ // Bug 40954 - ensure start time gets started! - this.setStartTime(res.getStartTime()); + this.setStartTime_ns(res.getStartTime()); } else { - this.setStartTime(Math.min(getStartTime(), res.getStartTime())); + this.setStartTime_ns(Math.min(getStartTime(), res.getStartTime())); } - this.setEndTime(Math.max(getEndTime(), res.getEndTime())); + this.setEndTime_ns(Math.max(getEndTime(), res.getEndTime())); - setLatency(getLatency()+ res.getLatency()); - setConnectTime(getConnectTime()+ res.getConnectTime()); + setLatency_ns(getLatency()+ res.getLatency()); + setConnectTime_ns(getConnectTime()+ res.getConnectTime()); elapsed += res.getTime(); } diff --git a/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java b/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java index b9da12d7ea6..8ddfe042999 100644 --- a/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java +++ b/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java @@ -85,12 +85,14 @@ public final class CSVSaveService { public static final String SUCCESSFUL = "success"; // $NON-NLS-1$ public static final String THREAD_NAME = "threadName"; // $NON-NLS-1$ public static final String TIME_STAMP = "timeStamp"; // $NON-NLS-1$ + public static final String TIME_STAMP_NS = "timeStamp_ns"; // $NON-NLS-1$ // --------------------------------------------------------------------- // ADDITIONAL CSV RESULT FILE CONSTANTS AND FIELD NAME CONSTANTS // --------------------------------------------------------------------- public static final String CSV_ELAPSED = "elapsed"; // $NON-NLS-1$ + public static final String CSV_ELAPSED_NS = "elapsed_ns"; // $NON-NLS-1$ public static final String CSV_BYTES = "bytes"; // $NON-NLS-1$ public static final String CSV_SENT_BYTES = "sentBytes"; // $NON-NLS-1$ public static final String CSV_THREAD_COUNT1 = "grpThreads"; // $NON-NLS-1$ @@ -100,10 +102,13 @@ public final class CSVSaveService { public static final String CSV_URL = "URL"; // $NON-NLS-1$ public static final String CSV_FILENAME = "Filename"; // $NON-NLS-1$ public static final String CSV_LATENCY = "Latency"; // $NON-NLS-1$ + public static final String CSV_LATENCY_NS = "Latency_ns"; // $NON-NLS-1$ public static final String CSV_CONNECT_TIME = "Connect"; // $NON-NLS-1$ + public static final String CSV_CONNECT_TIME_NS = "Connect_ns"; // $NON-NLS-1$ public static final String CSV_ENCODING = "Encoding"; // $NON-NLS-1$ public static final String CSV_HOSTNAME = "Hostname"; // $NON-NLS-1$ public static final String CSV_IDLETIME = "IdleTime"; // $NON-NLS-1$ + public static final String CSV_IDLETIME_NS = "IdleTime_ns"; // $NON-NLS-1$ // Used to enclose variable name labels, to distinguish from any of the // above labels @@ -245,9 +250,21 @@ private static SampleEvent makeResultFromDelimitedString( throw new ParseException("No date-time format found matching "+text,-1); } } + try { + timeStamp = Long.parseLong(parts[i++]); + } catch (NumberFormatException e) { + i--; + timeStamp *= 100000L; + } } else if (saveConfig.strictDateFormatter() != null) { Date stamp = saveConfig.strictDateFormatter().parse(text); timeStamp = stamp.getTime(); + try { + timeStamp = Long.parseLong(parts[i++]); + } catch (NumberFormatException e) { + i--; + timeStamp *= 100000L; + } } else { // can this happen? final String msg = "Unknown timestamp format"; log.warn(msg); @@ -259,14 +276,22 @@ private static SampleEvent makeResultFromDelimitedString( field = CSV_ELAPSED; text = parts[i++]; elapsed = Long.parseLong(text); + try { + elapsed = Long.parseLong(parts[i++]); + } catch (NumberFormatException e) { + i--; + elapsed *= 100000L; + } } if (saveConfig.saveSampleCount()) { @SuppressWarnings("deprecation") - StatisticalSampleResult sampleResult = new StatisticalSampleResult(timeStamp, elapsed); + StatisticalSampleResult sampleResult = new StatisticalSampleResult(elapsed); + sampleResult.setStampAndTime_ns(timeStamp, elapsed); result = sampleResult; } else { - result = new SampleResult(timeStamp, elapsed); + result = new SampleResult(); + result.setStampAndTime_ns(timeStamp, elapsed); } if (saveConfig.saveLabel()) { @@ -345,6 +370,11 @@ private static SampleEvent makeResultFromDelimitedString( field = CSV_LATENCY; text = parts[i++]; result.setLatency(Long.parseLong(text)); + try { + result.setLatency_ns(Long.parseLong(parts[i++])); + } catch (NumberFormatException e) { + i--; + } } if (saveConfig.saveEncoding()) { @@ -371,11 +401,21 @@ private static SampleEvent makeResultFromDelimitedString( field = CSV_IDLETIME; text = parts[i++]; result.setIdleTime(Long.parseLong(text)); + try { + result.setIdleTime_ns(Long.parseLong(parts[i++])); + } catch (NumberFormatException e) { + i--; + } } if (saveConfig.saveConnectTime()) { field = CSV_CONNECT_TIME; text = parts[i++]; result.setConnectTime(Long.parseLong(text)); + try { + result.setConnectTime_ns(Long.parseLong(parts[i++])); + } catch (NumberFormatException e) { + i--; + } } if (i + saveConfig.getVarCount() < parts.length) { @@ -416,8 +456,8 @@ public static String printableFieldNamesToString( StringBuilder text = new StringBuilder(); String delim = saveConfig.getDelimiter(); - appendFields(saveConfig.saveTimestamp(), text, delim, TIME_STAMP); - appendFields(saveConfig.saveTime(), text, delim, CSV_ELAPSED); + appendFields(saveConfig.saveTimestamp(), text, delim, TIME_STAMP, TIME_STAMP_NS); + appendFields(saveConfig.saveTime(), text, delim, CSV_ELAPSED, CSV_ELAPSED_NS); appendFields(saveConfig.saveLabel(), text, delim, LABEL); appendFields(saveConfig.saveCode(), text, delim, RESPONSE_CODE); appendFields(saveConfig.saveMessage(), text, delim, RESPONSE_MESSAGE); @@ -430,12 +470,12 @@ public static String printableFieldNamesToString( appendFields(saveConfig.saveThreadCounts(), text, delim, CSV_THREAD_COUNT1, CSV_THREAD_COUNT2); appendFields(saveConfig.saveUrl(), text, delim, CSV_URL); appendFields(saveConfig.saveFileName(), text, delim, CSV_FILENAME); - appendFields(saveConfig.saveLatency(), text, delim, CSV_LATENCY); + appendFields(saveConfig.saveLatency(), text, delim, CSV_LATENCY, CSV_LATENCY_NS); appendFields(saveConfig.saveEncoding(), text, delim, CSV_ENCODING); appendFields(saveConfig.saveSampleCount(), text, delim, CSV_SAMPLE_COUNT, CSV_ERROR_COUNT); appendFields(saveConfig.saveHostname(), text, delim, CSV_HOSTNAME); - appendFields(saveConfig.saveIdleTime(), text, delim, CSV_IDLETIME); - appendFields(saveConfig.saveConnectTime(), text, delim, CSV_CONNECT_TIME); + appendFields(saveConfig.saveIdleTime(), text, delim, CSV_IDLETIME, CSV_IDLETIME_NS); + appendFields(saveConfig.saveConnectTime(), text, delim, CSV_CONNECT_TIME, CSV_CONNECT_TIME_NS); for (int i = 0; i < SampleEvent.getVarCount(); i++) { text.append(VARIABLE_NAME_QUOTE_CHAR); @@ -473,7 +513,9 @@ private static void appendFields(final boolean condition, StringBuilder textBuff static { headerLabelMethods.put(TIME_STAMP, new Functor("setTimestamp")); + headerLabelMethods.put(TIME_STAMP_NS, new Functor("setTimestamp")); headerLabelMethods.put(CSV_ELAPSED, new Functor("setTime")); + headerLabelMethods.put(CSV_ELAPSED_NS, new Functor("setTime")); headerLabelMethods.put(LABEL, new Functor("setLabel")); headerLabelMethods.put(RESPONSE_CODE, new Functor("setCode")); headerLabelMethods.put(RESPONSE_MESSAGE, new Functor("setMessage")); @@ -493,6 +535,7 @@ private static void appendFields(final boolean condition, StringBuilder textBuff headerLabelMethods.put(CSV_URL, new Functor("setUrl")); headerLabelMethods.put(CSV_FILENAME, new Functor("setFileName")); headerLabelMethods.put(CSV_LATENCY, new Functor("setLatency")); + headerLabelMethods.put(CSV_LATENCY_NS, new Functor("setLatency")); headerLabelMethods.put(CSV_ENCODING, new Functor("setEncoding")); // Both these are needed in the list even though they set the same // variable @@ -500,7 +543,9 @@ private static void appendFields(final boolean condition, StringBuilder textBuff headerLabelMethods.put(CSV_ERROR_COUNT, new Functor("setSampleCount")); headerLabelMethods.put(CSV_HOSTNAME, new Functor("setHostname")); headerLabelMethods.put(CSV_IDLETIME, new Functor("setIdleTime")); + headerLabelMethods.put(CSV_IDLETIME_NS, new Functor("setIdleTime")); headerLabelMethods.put(CSV_CONNECT_TIME, new Functor("setConnectTime")); + headerLabelMethods.put(CSV_CONNECT_TIME_NS, new Functor("setConnectTime")); } /** @@ -851,15 +896,17 @@ public static String resultToDelimitedString(SampleEvent event, StringQuoter text = new StringQuoter(delimiter.charAt(0)); if (saveConfig.saveTimestamp()) { if (saveConfig.printMilliseconds()) { + text.append(sample.getTimeStamp() / 1000000L); text.append(sample.getTimeStamp()); } else if (saveConfig.threadSafeLenientFormatter() != null) { String stamp = saveConfig.threadSafeLenientFormatter().format( - new Date(sample.getTimeStamp())); + new Date(sample.getTimeStamp() / 1000000L)); text.append(stamp); } } if (saveConfig.saveTime()) { + text.append(sample.getTime() / 1000000L); text.append(sample.getTime()); } @@ -918,6 +965,7 @@ public static String resultToDelimitedString(SampleEvent event, } if (saveConfig.saveLatency()) { + text.append(sample.getLatency() / 1000000L); text.append(sample.getLatency()); } @@ -936,10 +984,12 @@ public static String resultToDelimitedString(SampleEvent event, } if (saveConfig.saveIdleTime()) { + text.append(sample.getIdleTime() / 1000000L); text.append(sample.getIdleTime()); } if (saveConfig.saveConnectTime()) { + text.append(sample.getConnectTime() / 1000000L); text.append(sample.getConnectTime()); } diff --git a/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java b/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java index 857bb3f959e..a0d55ed1fb7 100644 --- a/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java +++ b/src/core/src/main/java/org/apache/jmeter/save/converters/SampleResultConverter.java @@ -72,7 +72,9 @@ public class SampleResultConverter extends AbstractCollectionConverter { private static final String ATT_HOSTNAME = "hn"; //$NON-NLS-1$ private static final String ATT_LABEL = "lb"; //$NON-NLS-1$ private static final String ATT_LATENCY = "lt"; //$NON-NLS-1$ + private static final String ATT_LATENCY_NS = "lt_ns"; //$NON-NLS-1$ private static final String ATT_CONNECT_TIME = "ct"; //$NON-NLS-1$ + private static final String ATT_CONNECT_TIME_NS = "ct_ns"; //$NON-NLS-1$ private static final String ATT_ALL_THRDS = "na"; //$NON-NLS-1$ private static final String ATT_GRP_THRDS = "ng"; //$NON-NLS-1$ @@ -87,9 +89,12 @@ public class SampleResultConverter extends AbstractCollectionConverter { private static final String ATT_SUCCESS = "s"; //$NON-NLS-1$ private static final String ATT_SAMPLE_COUNT = "sc"; //$NON-NLS-1$ private static final String ATT_TIME = "t"; //$NON-NLS-1$ + private static final String ATT_TIME_NS = "t_ns"; //$NON-NLS-1$ private static final String ATT_IDLETIME = "it"; //$NON-NLS-1$ + private static final String ATT_IDLETIME_NS = "it_ns"; //$NON-NLS-1$ private static final String ATT_THREADNAME = "tn"; //$NON-NLS-1$ private static final String ATT_TIME_STAMP = "ts"; //$NON-NLS-1$ + private static final String ATT_TIME_STAMP_NS = "ts_ns"; //$NON-NLS-1$ /** * Returns the converter version; used to check for possible @@ -281,19 +286,24 @@ protected void saveAssertions(HierarchicalStreamWriter writer, MarshallingContex protected void setAttributes(HierarchicalStreamWriter writer, MarshallingContext context, SampleResult res, SampleSaveConfiguration save) { if (save.saveTime()) { - writer.addAttribute(ATT_TIME, Long.toString(res.getTime())); + writer.addAttribute(ATT_TIME, Long.toString(res.getTime() / 1000000L)); + writer.addAttribute(ATT_TIME_NS, Long.toString(res.getTime())); } if (save.saveIdleTime()) { - writer.addAttribute(ATT_IDLETIME, Long.toString(res.getIdleTime())); + writer.addAttribute(ATT_IDLETIME, Long.toString(res.getIdleTime() / 1000000L)); + writer.addAttribute(ATT_IDLETIME_NS, Long.toString(res.getIdleTime())); } if (save.saveLatency()) { - writer.addAttribute(ATT_LATENCY, Long.toString(res.getLatency())); + writer.addAttribute(ATT_LATENCY, Long.toString(res.getLatency() / 1000000L)); + writer.addAttribute(ATT_LATENCY_NS, Long.toString(res.getLatency())); } if (save.saveConnectTime()) { - writer.addAttribute(ATT_CONNECT_TIME, Long.toString(res.getConnectTime())); + writer.addAttribute(ATT_CONNECT_TIME, Long.toString(res.getConnectTime() / 1000000L)); + writer.addAttribute(ATT_CONNECT_TIME_NS, Long.toString(res.getConnectTime())); } if (save.saveTimestamp()) { - writer.addAttribute(ATT_TIME_STAMP, Long.toString(res.getTimeStamp())); + writer.addAttribute(ATT_TIME_STAMP, Long.toString(res.getTimeStamp() / 1000000L)); + writer.addAttribute(ATT_TIME_STAMP_NS, Long.toString(res.getTimeStamp())); } if (save.saveSuccess()) { writer.addAttribute(ATT_SUCCESS, Boolean.toString(res.isSuccessful())); @@ -441,11 +451,28 @@ protected void retrieveAttributes(HierarchicalStreamReader reader, Unmarshalling res.setResponseMessage(ConversionHelp.decode(reader.getAttribute(ATT_RESPONSE_MESSAGE))); res.setSuccessful(Converter.getBoolean(reader.getAttribute(ATT_SUCCESS), true)); res.setThreadName(ConversionHelp.decode(reader.getAttribute(ATT_THREADNAME))); - res.setStampAndTime(Converter.getLong(reader.getAttribute(ATT_TIME_STAMP)), - Converter.getLong(reader.getAttribute(ATT_TIME))); - res.setIdleTime(Converter.getLong(reader.getAttribute(ATT_IDLETIME))); - res.setLatency(Converter.getLong(reader.getAttribute(ATT_LATENCY))); - res.setConnectTime(Converter.getLong(reader.getAttribute(ATT_CONNECT_TIME))); + if (reader.getAttribute(ATT_TIME_STAMP_NS) != null && reader.getAttribute(ATT_TIME_NS) != null) { + res.setStampAndTime_ns(Converter.getLong(reader.getAttribute(ATT_TIME_STAMP_NS)), + Converter.getLong(reader.getAttribute(ATT_TIME_NS))); + } else { + res.setStampAndTime(Converter.getLong(reader.getAttribute(ATT_TIME_STAMP)), + Converter.getLong(reader.getAttribute(ATT_TIME))); + } + if (reader.getAttribute(ATT_IDLETIME_NS) != null) { + res.setIdleTime_ns(Converter.getLong(reader.getAttribute(ATT_IDLETIME_NS))); + } else { + res.setIdleTime(Converter.getLong(reader.getAttribute(ATT_IDLETIME))); + } + if (reader.getAttribute(ATT_LATENCY_NS) != null) { + res.setLatency_ns(Converter.getLong(reader.getAttribute(ATT_LATENCY_NS))); + } else { + res.setLatency(Converter.getLong(reader.getAttribute(ATT_LATENCY))); + } + if (reader.getAttribute(ATT_CONNECT_TIME_NS) != null) { + res.setConnectTime_ns(Converter.getLong(reader.getAttribute(ATT_CONNECT_TIME_NS))); + } else { + res.setConnectTime(Converter.getLong(reader.getAttribute(ATT_CONNECT_TIME))); + } res.setBytes(Converter.getLong(reader.getAttribute(ATT_BYTES))); res.setSentBytes(Converter.getLong(reader.getAttribute(ATT_SENT_BYTES))); res.setSampleCount(Converter.getInt(reader.getAttribute(ATT_SAMPLE_COUNT),1)); // default is 1 diff --git a/src/core/src/main/java/org/apache/jmeter/util/Calculator.java b/src/core/src/main/java/org/apache/jmeter/util/Calculator.java index 0107186160c..a7baefdbc95 100644 --- a/src/core/src/main/java/org/apache/jmeter/util/Calculator.java +++ b/src/core/src/main/java/org/apache/jmeter/util/Calculator.java @@ -17,11 +17,14 @@ package org.apache.jmeter.util; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.DoubleAdder; import java.util.concurrent.atomic.LongAccumulator; import java.util.concurrent.atomic.LongAdder; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.SampleResult; /** @@ -35,9 +38,9 @@ */ public class Calculator { - private final DoubleAdder sum = new DoubleAdder(); + private BigDecimal sum = BigDecimal.ZERO; - private final DoubleAdder sumOfSquares = new DoubleAdder(); + private BigDecimal sumOfSquares = BigDecimal.ZERO; private final LongAdder count = new LongAdder(); @@ -69,8 +72,8 @@ public Calculator(String label) { public void clear() { maximum.set(Long.MIN_VALUE); minimum.set(Long.MAX_VALUE); - sum.reset(); - sumOfSquares.reset(); + sum = BigDecimal.ZERO; + sumOfSquares = BigDecimal.ZERO; count.reset(); bytes.reset(); sentBytes.reset(); @@ -88,7 +91,7 @@ public void clear() { */ private void addValue(long newValue, int sampleCount) { count.add(sampleCount); - sum.add((double) newValue); + sum = sum.add(BigDecimal.valueOf(newValue)); long value; double extraSumOfSquares; if (sampleCount > 1) { @@ -100,7 +103,7 @@ private void addValue(long newValue, int sampleCount) { value = newValue; extraSumOfSquares = (double) newValue * (double) newValue; } - sumOfSquares.add(extraSumOfSquares); + sumOfSquares = sumOfSquares.add(BigDecimal.valueOf(extraSumOfSquares)); long currentMinimum = minimum.get(); if (currentMinimum > value) { @@ -155,12 +158,11 @@ public long getTotalBytes() { public double getMean() { - double sum = this.sum.sum(); double count = this.count.sum(); if (count == 0) { return 0.0; } - return sum / count; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? sum.divide(BigDecimal.valueOf(count), 16, RoundingMode.HALF_UP).divide(BigDecimal.valueOf(1000000L), 16, RoundingMode.HALF_UP).doubleValue() : sum.divide(BigDecimal.valueOf(count), 16, RoundingMode.HALF_UP).doubleValue(); } public Number getMeanAsNumber() { @@ -169,23 +171,20 @@ public Number getMeanAsNumber() { } public double getStandardDeviation() { - double sum = this.sum.sum(); - double sumOfSquares = this.sumOfSquares.sum(); double count = this.count.sum(); // Just in case if (count == 0) { return 0.0; } - double mean = sum / count; - return Math.sqrt((sumOfSquares / count) - (mean * mean)); + return Math.sqrt(sumOfSquares.divide(BigDecimal.valueOf(count), 16, RoundingMode.HALF_UP).subtract(sum.divide(BigDecimal.valueOf(count), 16, RoundingMode.HALF_UP).pow(2)).doubleValue()); } public long getMin() { - return minimum.get(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? minimum.get() / 1000000L : minimum.get(); } public long getMax() { - return maximum.get(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? maximum.get() / 1000000L : maximum.get(); } public int getCount() { @@ -286,7 +285,7 @@ public double getSentKBPerSecond() { private double getRatePerSecond(long value) { long elapsedTime = this.elapsedTime.get(); if (elapsedTime > 0) { - return value / ((double) elapsedTime / 1000); // 1000 = millisecs/sec + return value / (elapsedTime / 1000000.0D / 1000.0D); // 1000 = millisecs/sec } return 0.0; } diff --git a/src/core/src/main/java/org/apache/jmeter/visualizers/RunningSample.java b/src/core/src/main/java/org/apache/jmeter/visualizers/RunningSample.java index 308bdb7b124..6e843208d43 100644 --- a/src/core/src/main/java/org/apache/jmeter/visualizers/RunningSample.java +++ b/src/core/src/main/java/org/apache/jmeter/visualizers/RunningSample.java @@ -17,8 +17,10 @@ package org.apache.jmeter.visualizers; +import java.math.BigInteger; import java.text.DecimalFormat; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.SampleResult; /** @@ -43,7 +45,7 @@ public class RunningSample { private long counter; - private long runningSum; + private BigInteger runningSum; private long max; @@ -91,7 +93,7 @@ public RunningSample(RunningSample src) { private void init() { // WARNING: called from ctor so must not be overridden (i.e. must be private or final) counter = 0L; - runningSum = 0L; + runningSum = BigInteger.ZERO; max = Long.MIN_VALUE; min = Long.MAX_VALUE; errorCount = 0L; @@ -138,7 +140,7 @@ public double getRate() { return Double.MAX_VALUE; } - return (double) counter / howLongRunning * 1000.0; + return (double) counter / (howLongRunning / 100000.0D / 1000.0D); } /** @@ -232,7 +234,7 @@ public void addSample(SampleResult res) { if (lastTime < endTime) { lastTime = endTime; } - runningSum += aTimeInMillis; + runningSum = runningSum.add(BigInteger.valueOf(aTimeInMillis)); if (aTimeInMillis > max) { max = aTimeInMillis; @@ -253,7 +255,7 @@ public void addSample(SampleResult res) { public void addSample(RunningSample rs) { this.counter += rs.counter; this.errorCount += rs.errorCount; - this.runningSum += rs.runningSum; + runningSum = runningSum.add(rs.runningSum); if (this.firstTime > rs.firstTime) { this.firstTime = rs.firstTime; } @@ -305,7 +307,7 @@ public long getAverage() { if (counter == 0) { return 0; } - return runningSum / counter; + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? runningSum.divide(BigInteger.valueOf(counter)).divide(BigInteger.valueOf(1000000L)).longValue() : runningSum.divide(BigInteger.valueOf(counter)).longValue(); } /** diff --git a/src/core/src/main/java/org/apache/jmeter/visualizers/Sample.java b/src/core/src/main/java/org/apache/jmeter/visualizers/Sample.java index c3ce2d3ed21..49f52efb7fd 100644 --- a/src/core/src/main/java/org/apache/jmeter/visualizers/Sample.java +++ b/src/core/src/main/java/org/apache/jmeter/visualizers/Sample.java @@ -210,6 +210,6 @@ public long getStartTime() { */ @SuppressWarnings("JavaUtilDate") public String getStartTimeFormatted(Format format) { - return format.format(new Date(getStartTime())); + return format.format(new Date(getStartTime() / 1000000L)); } } diff --git a/src/core/src/main/java/org/apache/jmeter/visualizers/SamplingStatCalculator.java b/src/core/src/main/java/org/apache/jmeter/visualizers/SamplingStatCalculator.java index 487d51a01f8..e0f32e6b2ba 100644 --- a/src/core/src/main/java/org/apache/jmeter/visualizers/SamplingStatCalculator.java +++ b/src/core/src/main/java/org/apache/jmeter/visualizers/SamplingStatCalculator.java @@ -17,8 +17,10 @@ package org.apache.jmeter.visualizers; +import java.math.BigInteger; import java.util.Map; +import org.apache.jmeter.report.config.ReportGeneratorConfiguration; import org.apache.jmeter.samplers.SampleResult; import org.apache.jorphan.math.StatCalculatorLong; @@ -74,7 +76,7 @@ public long getElapsed() { if (getCurrentSample().getEndTime() == 0) { return 0;// No samples collected ... } - return getCurrentSample().getEndTime() - firstTime; + return (getCurrentSample().getEndTime() - firstTime) / 1000000L; } /** @@ -190,16 +192,16 @@ public Sample addSample(SampleResult res) { eCount += res.getErrorCount(); endTime = getEndTime(res); long howLongRunning = endTime - firstTime; - throughput = ((double) calculator.getCount() / (double) howLongRunning) * 1000.0; + throughput = (double) calculator.getCount() / (howLongRunning / 1000000.0D / 1000.0D); if (throughput > maxThroughput) { maxThroughput = throughput; } rtime = res.getTime(); - cmean = (long)calculator.getMean(); + cmean = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? (long) calculator.getMean() / 1000000L : (long) calculator.getMean(); cstdv = (long)calculator.getStandardDeviation(); - cmedian = calculator.getMedian(); - cpercent = calculator.getPercentPoint(0.500); + cmedian = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getMedian().divide(BigInteger.valueOf(1000000L)).longValue() : calculator.getMedian().longValue(); + cpercent = ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getPercentPoint(0.500D).divide(BigInteger.valueOf(1000000L)).longValue() : calculator.getPercentPoint(0.500D).longValue(); // TODO cpercent is the same as cmedian here - why? and why pass it to "distributionLine"? rbool = res.isSuccessful(); } @@ -273,7 +275,7 @@ public Map getDistribution() { } public Number getPercentPoint(double percent) { - return calculator.getPercentPoint(percent); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getPercentPoint(percent).divide(BigInteger.valueOf(1000000L)) : calculator.getPercentPoint(percent); } public long getCount() { @@ -281,30 +283,30 @@ public long getCount() { } public Number getMax() { - return calculator.getMax(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getMax().divide(BigInteger.valueOf(1000000L)) : calculator.getMax(); } public double getMean() { - return calculator.getMean(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getMean() / 1000000.0D : calculator.getMean(); } public Number getMeanAsNumber() { - return (long) calculator.getMean(); + return (long) getMean(); } public Number getMedian() { - return calculator.getMedian(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getMedian().divide(BigInteger.valueOf(1000000L)) : calculator.getMedian(); } public Number getMin() { - if (calculator.getMin() < 0) { + if (calculator.getMin().compareTo(BigInteger.valueOf(0L)) < 0) { return 0L; } - return calculator.getMin(); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getMin().divide(BigInteger.valueOf(1000000L)) : calculator.getMin(); } public Number getPercentPoint(float percent) { - return calculator.getPercentPoint(percent); + return ReportGeneratorConfiguration.jmeter_reportgenerator_ms_ns_isMs ? calculator.getPercentPoint(percent).divide(BigInteger.valueOf(1000000L)) : calculator.getPercentPoint(percent); } public double getStandardDeviation() { diff --git a/src/core/src/main/java/org/apache/jmeter/visualizers/TableSample.java b/src/core/src/main/java/org/apache/jmeter/visualizers/TableSample.java index c8623157463..2dcbd398cc5 100644 --- a/src/core/src/main/java/org/apache/jmeter/visualizers/TableSample.java +++ b/src/core/src/main/java/org/apache/jmeter/visualizers/TableSample.java @@ -109,7 +109,7 @@ public long getStartTime() { */ @SuppressWarnings("JavaUtilDate") public String getStartTimeFormatted(Format format) { - return format.format(new Date(getStartTime())); + return format.format(new Date(getStartTime() / 1000000L)); } public String getThreadName() { diff --git a/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties b/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties index 23721c4b4c9..d4814c7b1ae 100644 --- a/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties +++ b/src/core/src/main/resources/org/apache/jmeter/resources/messages.properties @@ -59,6 +59,7 @@ aggregate_graph_legend.placement.top=Top aggregate_graph_legend_placement=Placement\: aggregate_graph_max_length_xaxis_label=Max length of x-axis label\: aggregate_graph_ms=Milliseconds +aggregate_graph_ns=Nanoseconds aggregate_graph_no_values_to_graph=No values to graph aggregate_graph_number_grouping=Show number grouping? aggregate_graph_response_time=Response Time @@ -447,6 +448,7 @@ graph_results_deviation=Deviation graph_results_latest_sample=Latest Sample graph_results_median=Median graph_results_ms=ms +graph_results_ns=ns graph_results_no_samples=No of Samples graph_results_throughput=Throughput graph_results_title=Graph Results @@ -999,9 +1001,9 @@ reportgenerator_summary_total=Total request_data=Request Data reset=Reset response_save_as_md5=Save response as MD5 hash? -response_time_distribution_satisfied_label=Requests having \nresponse time <= {0}ms -response_time_distribution_tolerated_label= Requests having \nresponse time > {0}ms and <= {1}ms -response_time_distribution_untolerated_label=Requests having \nresponse time > {0}ms +response_time_distribution_satisfied_label=Requests having \nresponse time <= {0}{1} +response_time_distribution_tolerated_label=Requests having \nresponse time > {0}{2} and <= {1}{2} +response_time_distribution_untolerated_label=Requests having \nresponse time > {0}{1} response_time_distribution_failed_label=Requests in error restart=Restart restart_error=Restart error diff --git a/src/core/src/test/java/org/apache/jmeter/samplers/TestSampleResult.java b/src/core/src/test/java/org/apache/jmeter/samplers/TestSampleResult.java index a551a5287f1..247ce08bc18 100644 --- a/src/core/src/test/java/org/apache/jmeter/samplers/TestSampleResult.java +++ b/src/core/src/test/java/org/apache/jmeter/samplers/TestSampleResult.java @@ -74,7 +74,7 @@ void testPauseFalse() throws Exception { } private static void assertAlmostEquals(long expected, long actual, long delta, String message) { - long actualDelta = Math.abs(expected - actual); + long actualDelta = Math.abs(expected - actual / 1000000L); if (actualDelta > delta) { Assertions.fail(() -> message + ", expected " + expected + " within delta of " + delta + ", but got " + actual @@ -277,7 +277,7 @@ private void testSubResults(boolean nanoTime, long nanoThreadSleep, long pause) */ long diff = parentElapsedTotal - sumSamplesTimes; - long maxDiff = nanoTime ? 10 : 16; // TimeMillis has granularity of 10-20 + long maxDiff = nanoTime ? 10 * 1000000L : 16 * 1000000L; // TimeMillis has granularity of 10-20 if (diff < 0 || diff > maxDiff) { Assertions.fail("ParentElapsed: " + parentElapsedTotal + " - " + " sum(samples): " + sumSamplesTimes + " => " + diff + " not in [0," + maxDiff + "]; nanotime=" + nanoTime); @@ -297,9 +297,9 @@ private void testSubResults(boolean nanoTime, long nanoThreadSleep, long pause) calculator.addSample(parent); Assertions.assertEquals(600, calculator.getTotalBytes()); Assertions.assertEquals(1, calculator.getCount()); - Assertions.assertEquals(1d / (parentElapsedTotal / 1000d), calculator.getRate(), 0.0001d); // Allow for some margin of error + Assertions.assertEquals(1d / (parentElapsedTotal / 1000000.0D / 1000d), calculator.getRate(), 0.0001d); // Allow for some margin of error // Check that the throughput uses the time elapsed for the sub results - Assertions.assertFalse(1d / (parentElapsed / 1000d) <= calculator.getRate()); + Assertions.assertFalse(1d / (parentElapsed / 1000000.0D / 1000d) <= calculator.getRate()); } // TODO some more invalid sequence tests needed diff --git a/src/core/src/test/java/org/apache/jmeter/save/TestCSVSaveService.java b/src/core/src/test/java/org/apache/jmeter/save/TestCSVSaveService.java index cb9d959f172..547086b6b8e 100644 --- a/src/core/src/test/java/org/apache/jmeter/save/TestCSVSaveService.java +++ b/src/core/src/test/java/org/apache/jmeter/save/TestCSVSaveService.java @@ -152,8 +152,8 @@ public void testShortFile() throws Exception { // header text should not change unexpectedly // if this test fails, check whether the default was intentionally changed or not public void testHeader() { - final String HDR = "timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success," - + "failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect"; + final String HDR = "timeStamp,timeStamp_ns,elapsed,elapsed_ns,label,responseCode,responseMessage,threadName,dataType,success," + + "failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,Latency_ns,IdleTime,IdleTime_ns,Connect,Connect_ns"; assertEquals(HDR, CSVSaveService.printableFieldNamesToString(), "Header text has changed"); } @@ -161,7 +161,7 @@ public void testHeader() { // sample format should not change unexpectedly // if this test fails, check whether the default was intentionally changed or not public void testSample() throws MalformedURLException { - final String RESULT = "1,2,3,4,5,6,7,true,,8,9,10,11,https://jmeter.apache.org,12,13,14"; + final String RESULT = "1,1000000,2,2000000,3,4,5,6,7,true,,8,9,10,11,https://jmeter.apache.org,12,12000000,13,13000000,14,14000000"; SampleResult result = new SampleResult(); result.setSaveConfig(new SampleSaveConfiguration()); result.setStampAndTime(1, 2); diff --git a/src/core/src/test/kotlin/org/apache/jmeter/util/CalculatorTest.kt b/src/core/src/test/kotlin/org/apache/jmeter/util/CalculatorTest.kt index d4be64a6b4f..3d9bcc07a6b 100644 --- a/src/core/src/test/kotlin/org/apache/jmeter/util/CalculatorTest.kt +++ b/src/core/src/test/kotlin/org/apache/jmeter/util/CalculatorTest.kt @@ -28,7 +28,7 @@ class CalculatorTest { @Test fun min() { - assertEquals(Long.MAX_VALUE, calculator.min, "min()") + assertEquals(Long.MAX_VALUE / 1000000L, calculator.min, "min()") calculator.addSample(SampleResult(10, 42)) assertEquals(42, calculator.min, "min(42)") calculator.addSample(SampleResult(10, 40)) @@ -41,7 +41,7 @@ class CalculatorTest { @Test fun max() { - assertEquals(Long.MIN_VALUE, calculator.max, "max()") + assertEquals(Long.MIN_VALUE / 1000000L, calculator.max, "max()") calculator.addSample(SampleResult(10, 40)) assertEquals(40, calculator.max, "max(40)") calculator.addSample(SampleResult(10, 42)) @@ -80,18 +80,18 @@ class CalculatorTest { calculator.addSample(SampleResult(10, 40)) assertEquals(0.0, calculator.standardDeviation, "standardDeviation(40)") calculator.addSample(SampleResult(10, 42)) - assertEquals(1.0, calculator.standardDeviation, "standardDeviation(40, 42)") + assertEquals(1000000.0, calculator.standardDeviation, "standardDeviation(40, 42)") calculator.addSample(SampleResult(10, 43)) // Math.sqrt((sumOfSquares / count) - (mean * mean)) assertEquals( - sqrt((40 * 40 + 42 * 42 + 43 * 43) / 3.0 - ((40.0 + 42 + 43) / 3).pow(2)), + sqrt((40 * 1000000L * 40 * 1000000L + 42 * 1000000L * 42 * 1000000L + 43 * 1000000L * 43 * 1000000L) / 3.0 - ((40.0 * 1000000.0 + 42 * 1000000.0 + 43 * 1000000.0) / 3).pow(2)), calculator.standardDeviation, 0.001, "standardDeviation(40, 42, 43)" ) calculator.addSample(SampleResult(10, 48).apply { sampleCount = 2 }) assertEquals( - sqrt((40 * 40 + 42 * 42 + 43 * 43 + 24 * 24 + 24 * 24) / 5.0 - ((40.0 + 42 + 43 + 24 + 24) / 5.0).pow(2)), + sqrt((40 * 1000000L * 40 * 1000000L + 42 * 1000000L * 42 * 1000000L + 43 * 1000000L * 43 * 1000000L + 24 * 1000000L * 24 * 1000000L + 24 * 1000000L * 24 * 1000000L) / 5.0 - ((40.0 * 1000000.0 + 42 * 1000000.0 + 43 * 1000000.0 + 24 * 1000000.0 + 24 * 1000000.0) / 5.0).pow(2)), calculator.standardDeviation, 0.001, "standardDeviation(40, 42, 43, 48/2)" diff --git a/src/dist-check/src/test/kotlin/org/apache/jmeter/gui/action/HtmlReportGeneratorTest.kt b/src/dist-check/src/test/kotlin/org/apache/jmeter/gui/action/HtmlReportGeneratorTest.kt index 3b8104bcdbe..cf274778b57 100644 --- a/src/dist-check/src/test/kotlin/org/apache/jmeter/gui/action/HtmlReportGeneratorTest.kt +++ b/src/dist-check/src/test/kotlin/org/apache/jmeter/gui/action/HtmlReportGeneratorTest.kt @@ -154,4 +154,16 @@ class HtmlReportGeneratorTest : JMeterTestCase() { fail("First result message should contain '$expectedError', but was '$firstMessage'") } } + + @Test + fun ns() { + val mapper = ObjectMapper() + + val expectedRoot = mapper.readTree(File(combine("testfiles", "ns.json"))) + + HtmlReportGenerator(combine("testfiles", "ns.jtl"), combine("testfiles", "ns.properties"), testDirectory.toString()).run() + val actualRoot = mapper.readTree(File(testDirectory, "statistics.json")) + + assertEquals(expectedRoot, actualRoot, "ns") + } } diff --git a/src/dist-check/src/test/resources/org/apache/jmeter/gui/report/HTMLReportExpect.json b/src/dist-check/src/test/resources/org/apache/jmeter/gui/report/HTMLReportExpect.json index 25505fbb288..60d754edf12 100644 --- a/src/dist-check/src/test/resources/org/apache/jmeter/gui/report/HTMLReportExpect.json +++ b/src/dist-check/src/test/resources/org/apache/jmeter/gui/report/HTMLReportExpect.json @@ -36,7 +36,7 @@ "sampleCount" : 252, "errorCount" : 0, "errorPct" : 0.0, - "meanResTime" : 235.90079365079367, + "meanResTime" : 235.9007936507938, "medianResTime":232.0, "minResTime" : 101.0, "maxResTime" : 353.0, diff --git a/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculator.java b/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculator.java index 6136f15da8f..ea8a6e7e85a 100644 --- a/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculator.java +++ b/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculator.java @@ -17,6 +17,8 @@ package org.apache.jorphan.math; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ConcurrentModificationException; import java.util.HashMap; import java.util.Map; @@ -38,9 +40,9 @@ public abstract class StatCalculator> { // We use a TreeMap because we need the entries to be sorted // Running values, updated for each sample - private double sum = 0; + private BigDecimal sum = BigDecimal.ZERO; - private double sumOfSquares = 0; + private BigDecimal sumOfSquares = BigDecimal.ZERO; private double mean = 0; @@ -79,8 +81,8 @@ protected StatCalculator(final T zero, final T min, final T max) { public void clear() { valuesMap.clear(); - sum = 0; - sumOfSquares = 0; + sum = BigDecimal.ZERO; + sumOfSquares = BigDecimal.ZERO; mean = 0; deviation = 0; count = 0; @@ -212,7 +214,7 @@ public long getCount() { } public double getSum() { - return sum; + return sum.doubleValue(); } protected abstract T divide(T val, int n); @@ -227,10 +229,9 @@ public double getSum() { */ void addEachValue(T val, long sampleCount) { count += sampleCount; - double currentVal = val.doubleValue(); - sum += currentVal * sampleCount; + sum = sum.add(BigDecimal.valueOf(val.longValue()).multiply(BigDecimal.valueOf(sampleCount))); // For n same values in sum of square is equal to n*val^2 - sumOfSquares += currentVal * currentVal * sampleCount; + sumOfSquares = sumOfSquares.add(BigDecimal.valueOf(val.longValue()).multiply(BigDecimal.valueOf(val.longValue())).multiply(BigDecimal.valueOf(sampleCount))); updateValueCount(val, sampleCount); calculateDerivedValues(val); } @@ -244,23 +245,23 @@ void addEachValue(T val, long sampleCount) { public void addValue(T val, long sampleCount) { count += sampleCount; double currentVal = val.doubleValue(); - sum += currentVal; + sum = sum.add(BigDecimal.valueOf(val.longValue())); T actualValue = val; if (sampleCount > 1){ // For n values in an aggregate sample the average value = (val/n) // So need to add n * (val/n) * (val/n) = val * val / n - sumOfSquares += currentVal * currentVal / sampleCount; + sumOfSquares = sumOfSquares.add(BigDecimal.valueOf(currentVal).multiply(BigDecimal.valueOf(currentVal)).divide(BigDecimal.valueOf(sampleCount), 16, RoundingMode.HALF_UP)); actualValue = divide(val, sampleCount); } else { // no need to divide by 1 - sumOfSquares += currentVal * currentVal; + sumOfSquares = sumOfSquares.add(BigDecimal.valueOf(currentVal).multiply(BigDecimal.valueOf(currentVal))); } updateValueCount(actualValue, sampleCount); calculateDerivedValues(actualValue); } private void calculateDerivedValues(T actualValue) { - mean = sum / count; - deviation = Math.sqrt((sumOfSquares / count) - (mean * mean)); + mean = sum.divide(BigDecimal.valueOf(count), 16, RoundingMode.HALF_UP).doubleValue(); + deviation = Math.sqrt(sumOfSquares.divide(BigDecimal.valueOf(count), 16, RoundingMode.HALF_UP).subtract(sum.divide(BigDecimal.valueOf(count), 16, RoundingMode.HALF_UP).pow(2)).doubleValue()); if (actualValue.compareTo(max) > 0){ max=actualValue; } diff --git a/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculatorLong.java b/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculatorLong.java index 1166a67f29b..e456c8f7ee9 100644 --- a/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculatorLong.java +++ b/src/jorphan/src/main/java/org/apache/jorphan/math/StatCalculatorLong.java @@ -17,13 +17,15 @@ package org.apache.jorphan.math; +import java.math.BigInteger; + /** * StatCalculator for Long values */ -public class StatCalculatorLong extends StatCalculator { +public class StatCalculatorLong extends StatCalculator { public StatCalculatorLong() { - super(0L, Long.MIN_VALUE, Long.MAX_VALUE); + super(BigInteger.ZERO, BigInteger.valueOf(Long.MIN_VALUE), BigInteger.valueOf(Long.MAX_VALUE)); } /** @@ -32,7 +34,7 @@ public StatCalculatorLong() { * @param val the value to add, which should correspond with a single sample */ public void addValue(long val){ - super.addValue(val); + super.addValue(BigInteger.valueOf(val)); } /** @@ -42,16 +44,16 @@ public void addValue(long val){ * @param sampleCount the number of samples contributing to the aggregate value */ public void addValue(long val, int sampleCount){ - super.addValue(val, sampleCount); + super.addValue(BigInteger.valueOf(val), sampleCount); } @Override - protected Long divide(Long val, int n) { - return val / n; + protected BigInteger divide(BigInteger val, int n) { + return val.divide(BigInteger.valueOf(n)); } @Override - protected Long divide(Long val, long n) { - return val / n; + protected BigInteger divide(BigInteger val, long n) { + return val.divide(BigInteger.valueOf(n)); } } diff --git a/src/jorphan/src/test/java/org/apache/jorphan/math/TestStatCalculator.java b/src/jorphan/src/test/java/org/apache/jorphan/math/TestStatCalculator.java index 19877c25872..3c75eb242dc 100644 --- a/src/jorphan/src/test/java/org/apache/jorphan/math/TestStatCalculator.java +++ b/src/jorphan/src/test/java/org/apache/jorphan/math/TestStatCalculator.java @@ -20,6 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.math.BigInteger; import java.util.Map; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; @@ -107,8 +108,8 @@ public void testLong() { calc.addValue(0L); calc.addValue(2L); calc.addValue(2L); - final Long long0 = 0L; - final Long long2 = 2L; + final BigInteger long0 = BigInteger.valueOf(0L); + final BigInteger long2 = BigInteger.valueOf(2L); assertEquals(long2, calc.getMax()); assertEquals(long0, calc.getMin()); Map map = calc.getDistribution(); @@ -141,7 +142,7 @@ public void testBug52125_1() { // No duplicates when adding calc.addValue(2L); assertEquals(6, calc.getCount()); assertEquals(12.0, calc.getSum(), 0.000000000001); - assertEquals(0.5773502691896255, calc.getStandardDeviation(), 0.000000000000001); + assertEquals(0.5773502691896257, calc.getStandardDeviation(), 0.000000000000001); } @Test @@ -150,10 +151,10 @@ public void testBug52125_2() { // add duplicates calc.addValue(1L); calc.addValue(2L); calc.addValue(3L); - calc.addEachValue(2L, 3); + calc.addEachValue(BigInteger.valueOf(2L), 3); assertEquals(6, calc.getCount()); assertEquals(12.0, calc.getSum(), 0.000000000001); - assertEquals(0.5773502691896255, calc.getStandardDeviation(), 0.000000000000001); + assertEquals(0.5773502691896257, calc.getStandardDeviation(), 0.000000000000001); } @Test @@ -164,7 +165,7 @@ public void testBug52125_2A() { // as above, but with aggregate sample instead calc.addValue(6L, 3); assertEquals(6, calc.getCount()); assertEquals(12.0, calc.getSum(), 0.00000001); - assertEquals(0.5773502691896255, calc.getStandardDeviation(), 0.000000000000001); + assertEquals(0.5773502691896257, calc.getStandardDeviation(), 0.000000000000001); } @Test @@ -179,6 +180,6 @@ public void testBug52125_3() { // add duplicates as per bug calc.addAll(calc2); assertEquals(6, calc.getCount()); assertEquals(12.0, calc.getSum(), 0.000000000001); - assertEquals(0.5773502691896255, calc.getStandardDeviation(), 0.000000000000001); + assertEquals(0.5773502691896257, calc.getStandardDeviation(), 0.000000000000001); } } diff --git a/src/protocol/java/src/test/java/org/apache/jmeter/protocol/java/sampler/JSR223SamplerTest.java b/src/protocol/java/src/test/java/org/apache/jmeter/protocol/java/sampler/JSR223SamplerTest.java index f2478c7e4d6..88f9e9995f1 100644 --- a/src/protocol/java/src/test/java/org/apache/jmeter/protocol/java/sampler/JSR223SamplerTest.java +++ b/src/protocol/java/src/test/java/org/apache/jmeter/protocol/java/sampler/JSR223SamplerTest.java @@ -31,7 +31,7 @@ void sampleWithEndTimeSet() { sampler.setScript("SampleResult.setEndTime(42); 'OK'"); sampler.setScriptLanguage("groovy"); SampleResult sampleResult = sampler.sample(null); - assertEquals(42, sampleResult.getEndTime()); + assertEquals(42000000, sampleResult.getEndTime()); } @Test @@ -41,6 +41,6 @@ void sampleWithoutEndTimeSet() { sampler.setScript("'OK'"); sampler.setScriptLanguage("groovy"); SampleResult sampleResult = sampler.sample(null); - assertEquals(System.currentTimeMillis(), sampleResult.getEndTime(), 1000); + assertEquals(System.currentTimeMillis() * 1000000L, sampleResult.getEndTime(), 1000 * 1000000L); } }