Freemarker csv 按升序排序和 json 列表

Freemarker csv sorting in asc order and json listing

最近我玩了 lazerycode jmeter 分析插件,但无论我如何尝试通过 freemarker 生成数据我都未能达到我的目标,因为对于 csv ftl 我无法按 asc 顺序或 json ftl 我需要在复制列表后删除逗号以使其在 highcharts 中工作,因此我的问题是:

  1. 对于 CSV 数据,如何按升序对列表进行排序,尤其是 samples.minTimestamp:

    <#ftl/>
    <#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.statistics.Samples>" -->
    <#-- @ftlvariable name="key" type="java.lang.String" -->
    <#-- @ftlvariable name="samples" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
    minTimestamp,maxTimestamp,uri,count,average,standarddeviation,errors
    <#list self?keys as key>
    <#assign samples=self(key)/>
    ${samples.minTimestamp},${samples.maxTimestamp},"${key}",${samples.successCount},${samples.average},${samples.standardDeviation},${samples.errorsCount} </br>
    </#list>
    
  2. 对于这个 JSON 列表,我如何只列出这个块“},”一次(在 "stdDeviation" 之后),因为我需要删除“,”之后括号,否则我的图表不会呈现,我不想手动去删除每个文件上的逗号:

    <#ftl/>
    <#-- @ftlvariable name="key" type="java.lang.String" -->
    <#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.parser.AggregatedResponses>" -->
    <#-- @ftlvariable name="requests" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
    <#-- @ftlvariable name="aggregatedResponses" type="com.lazerycode.jmeter.analyzer.parser.AggregatedResponses" -->
    <#-- @ftlvariable name="Q_QUANTILES" type="java.lang.Integer" -->
    <#-- @ftlvariable name="K_99_PERCENT" type="java.lang.Integer" -->
    <#-- @ftlvariable name="K_99_PONT_9_PERCENT" type="java.lang.Integer" -->
    <#-- @ftlvariable name="PERCENT_100" type="java.lang.Integer" -->
    <#if !self?keys?has_content>
      "empty": {}
    <#else>
    {
      <#list self?keys as key>
        <#assign aggregatedResponses=self(key)/>
        <#assign requests=aggregatedResponses.duration/>
        <#assign total=requests.successCount + requests.errorsCount/>
        <#assign quantiles=requests.getQuantiles(Q_QUANTILES)/>
        <#if (requests.successCount > 0) >
      "${key}":{
              "y":[0,${quantiles.getQuantile(10*10)?string},${quantiles.getQuantile(20*10)?string},${quantiles.getQuantile(30*10)?string},${quantiles.getQuantile(40*10)?string},${quantiles.getQuantile(50*10)?string},${quantiles.getQuantile(60*10)?string},${quantiles.getQuantile(70*10)?string},${quantiles.getQuantile(80*10)?string},${quantiles.getQuantile(90*10)?string},${quantiles.getQuantile(K_99_PERCENT)?string},${quantiles.getQuantile(K_99_PONT_9_PERCENT)?string},${quantiles.getQuantile(Q_QUANTILES)?string}],
              "requestStartTime": [${aggregatedResponses.start}],
              "requestEndTime": [${aggregatedResponses.end}],
              "duration": [${requests.duration}],                                               
              "numberOfRequests": [${requests.successCount}],
              "requestsPerSec": [${requests.successPerSecond}],
              "min": [${requests.min}],
              "average": [${requests.average}],
              "max": [${requests.max}],
              "total": [${total}],
              "stdDeviation": [${requests.standardDeviation}]        
            },
        </#if>
      </#list>  
    }     
    </#if>
    

谢谢。

<#if key_has_next>,</#if>

这将帮助您为除最后一项之外的所有项目设置“,”。 因此,您的代码将如下所示

<#ftl/>
<#-- @ftlvariable name="key" type="java.lang.String" -->
<#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.parser.AggregatedResponses>" -->
<#-- @ftlvariable name="requests" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
<#-- @ftlvariable name="aggregatedResponses" type="com.lazerycode.jmeter.analyzer.parser.AggregatedResponses" -->
<#-- @ftlvariable name="Q_QUANTILES" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PONT_9_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="PERCENT_100" type="java.lang.Integer" -->
<#if !self?keys?has_content>
  "empty": {}
<#else>
{
  <#list self?keys as key>
    <#assign aggregatedResponses=self(key)/>
    <#assign requests=aggregatedResponses.duration/>
    <#assign total=requests.successCount + requests.errorsCount/>
    <#assign quantiles=requests.getQuantiles(Q_QUANTILES)/>
    <#if (requests.successCount > 0) >
  "${key}":{
          "y":[0,${quantiles.getQuantile(10*10)?string},${quantiles.getQuantile(20*10)?string},${quantiles.getQuantile(30*10)?string},${quantiles.getQuantile(40*10)?string},${quantiles.getQuantile(50*10)?string},${quantiles.getQuantile(60*10)?string},${quantiles.getQuantile(70*10)?string},${quantiles.getQuantile(80*10)?string},${quantiles.getQuantile(90*10)?string},${quantiles.getQuantile(K_99_PERCENT)?string},${quantiles.getQuantile(K_99_PONT_9_PERCENT)?string},${quantiles.getQuantile(Q_QUANTILES)?string}],
          "requestStartTime": [${aggregatedResponses.start}],
          "requestEndTime": [${aggregatedResponses.end}],
          "duration": [${requests.duration}],                                               
          "numberOfRequests": [${requests.successCount}],
          "requestsPerSec": [${requests.successPerSecond}],
          "min": [${requests.min}],
          "average": [${requests.average}],
          "max": [${requests.max}],
          "total": [${total}],
          "stdDeviation": [${requests.standardDeviation}]        
        }<#if key_has_next>,</#if>
    </#if>
  </#list>  
}     
</#if>

我的问题的解决方案是在同事的帮助下在内部解决的,因此我将它们张贴在这里:

  1. CSV数据排序:

    <#ftl/>
    <#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.statistics.Samples>" -->
    <#-- @ftlvariable name="key" type="java.lang.String" -->
    <#-- @ftlvariable name="samples" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
    <#assign sorted>
    <#list self?keys as key>
    <#assign samples=self(key)/>
    ${samples.minTimestamp},${samples.maxTimestamp},"${key}",${samples.successCount},${samples.average},${samples.standardDeviation},${samples.errorsCount}
    </#list>
    </#assign>
    minTimestamp,maxTimestamp,uri,count,average,standarddeviation,errors
    <#list sorted?split("\n")?sort as line>
    ${line}
    </#list>
    
  2. 对于JSON除最后一项“,”之外的所有元素的列表:

    -----
              "stdDeviation": [${requests.standardDeviation}]        
        }<#if (key_index+1) < self?keys?size>,</#if>
    </#if>
    </#list>  
    }     
    </#if>