如何在jmeter中跟踪';java请求';有子结果吗?

如何在jmeter中跟踪';java请求';有子结果吗?,jmeter,Jmeter,我将jmeter与Java请求采样器一起使用。这些调用我编写的java类,它返回一个SampleResult对象,该对象包含用例的计时指标。SampleResult是一个树,可以有子SampleResult对象(SampleResult.addSubResult方法)。我似乎无法在jmeter中找到跟踪子结果的好方法,因此我只能很容易地获得父SampleResult的结果 jmeter中是否有一个监听器允许我查看子结果的统计数据/图表(例如查看所有同名子结果的平均时间)。好的,所以我决定编写自己

我将jmeter与Java请求采样器一起使用。这些调用我编写的java类,它返回一个SampleResult对象,该对象包含用例的计时指标。SampleResult是一个树,可以有子SampleResult对象(SampleResult.addSubResult方法)。我似乎无法在jmeter中找到跟踪子结果的好方法,因此我只能很容易地获得父SampleResult的结果


jmeter中是否有一个监听器允许我查看子结果的统计数据/图表(例如查看所有同名子结果的平均时间)。

好的,所以我决定编写自己的jmeter插件,它非常简单。代码完成后,我将与后代共享。只需编写一个扩展AbstractVisualizer的类,将其编译成jar,然后将其放入jmeter lib/ext目录。当您添加可视化工具时,该插件将显示在jmeter的listeners部分。

以下是我的一些插件代码,您可以将其作为编写自己插件的起点。我真的不能发布所有的东西,因为有几十门课。要知道的几件事是:

  • 与所有可视化工具插件一样,我的插件扩展了jmeter类 抽象可视化工具
  • 在eclipse中,您需要以下JAR来complile: jfxrt.jar,ApacheJMeter_core.jar
  • javafx需要Java1.8(jar文件在sdk中提供)
  • 如果编译插件,则需要将其放入jmeter/lib/ext中。 您还需要将bullet 2中的jar放在jmeter/lib中
  • 在我的类中有一个名为“add(SampleResult)”的方法。这 每次java样本出现时都会被jmeter框架调用 完成并将作为参数传递SampleResult。假设你 拥有自己的Java示例类,可以扩展 您的类将有一个名为 返回sampleresult的runTest。相同的返回对象将被删除 传递到插件添加方法中
  • 我的插件将所有示例结果放入缓冲区,并且仅 每5个结果更新一次屏幕
代码如下:

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.testelement.TestStateListener;
import org.apache.jmeter.visualizers.gui.AbstractVisualizer;

public class FxVisualizer extends AbstractVisualizer  implements TestStateListener {


    int currentId = 0;

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private static final int BUFFER_SIZE = 5; 

    @Override
    public String getName() 
    {
        return super.getName();//"George's sub result viewer.";
    }

    @Override
      public String getStaticLabel()
      {
        return "Georges FX Visualizer";
      }



    @Override
    public String getComment() 
    {
        return "George wrote this plugin. There are many plugins like it but this one is mine.";
    }
    static Long initCount = new Long(0);
    public FxVisualizer()
    {
        init();
    }
    private void init()
    { 
        //LoggingUtil.debug("in FxVisualizer init()");
        try
        {

            FxTestListener.setListener(this); 
            this.setLayout(new BorderLayout());
            Border margin = new EmptyBorder(10, 10, 5, 10);
            this.setBorder(margin);
            //this.add(makeTitlePanel(), BorderLayout.NORTH);
            final JFXPanel fxPanel = new JFXPanel();
            add(fxPanel);
            //fxPanel.setScene(getScene()); 

            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    initFX(fxPanel);
                }
           });


        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    } 
    static FxVisualizerScene fxScene;
    private static void initFX(JFXPanel fxPanel) {
        // This method is invoked on the JavaFX thread
        fxScene = new FxVisualizerScene();

        fxPanel.setScene(fxScene.getScene());
    }

    final List <Event> bufferedEvents = new ArrayList<Event>();
    @Override
    public void add(SampleResult result) 
    {


        final List <Event> events = ...;//here you need to take the result.getSubResults() parameter and get all the children events.
        final List<Event> eventsToAdd = new ArrayList<Event>();

        synchronized(bufferedEvents)
        {
            for (Event evt : events)
            {
                bufferedEvents.add(evt);
            }


            if (bufferedEvents.size() >= BUFFER_SIZE)
            {
                eventsToAdd.addAll(bufferedEvents);
                bufferedEvents.clear();
            }
        }





        if (eventsToAdd.size() > 0)
        {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    updatePanel(eventsToAdd);
                }
           });

        }       


    }



    public void updatePanel(List <Event> events )
    {

        for (Event evt: events)
        {
            fxScene.addEvent(evt);
        }


    }

    @Override
    public void clearData() 
    {
        synchronized(bufferedEvents)
        {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    bufferedEvents.clear();
                    fxScene.clearData();
                }
           });
        }
    }

    @Override
    public String getLabelResource() {

        return "Georges Java Sub FX Sample Listener";
    }

    Boolean isRunning = false;

    @Override
    public void testEnded()
    {


        final List<Event> eventsToAdd = new ArrayList<Event>();

        synchronized(bufferedEvents)
        {
            eventsToAdd.addAll(bufferedEvents);
            bufferedEvents.clear();
        }

        if (eventsToAdd.size() > 0)
        {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    updatePanel(eventsToAdd);
                    fxScene.testStopped();
                }
           });

        }       
    }
    Long testCount = new Long(0);
    @Override
    public void testStarted() {

        synchronized(bufferedEvents)
        {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {                     
                        updatePanel(bufferedEvents);
                        bufferedEvents.clear();
                        fxScene.testStarted();
                    }
               });
        }

    }



    @Override
    public void testEnded(String arg0) 
    {
        //LoggingUtil.debug("testEnded 2:" + arg0);
        testEnded();
    }

    int registeredCount = 0;

    @Override
    public void testStarted(String arg0) {
        //LoggingUtil.debug("testStarted 2:" + arg0);
        testStarted();
    }
}
导入java.awt.BorderLayout;
导入java.util.ArrayList;
导入java.util.List;
导入javafx.application.Platform;
导入javafx.embed.swing.JFXPanel;
导入javax.swing.border.border;
导入javax.swing.border.EmptyBorder;
导入org.apache.jmeter.samplers.SampleResult;
导入org.apache.jmeter.testelement.TestStateListener;
导入org.apache.jmeter.visualizers.gui.AbstractVisualizer;
公共类FxVisualizer扩展AbstractVisualizer实现TestStateListener{
int currentId=0;
/**
* 
*/
私有静态最终长serialVersionUID=1L;
专用静态最终整数缓冲区大小=5;
@凌驾
公共字符串getName()
{
返回super.getName();/“George的子结果查看器。”;
}
@凌驾
公共字符串getStaticLabel()
{
返回“Georges FX可视化工具”;
}
@凌驾
公共字符串getComment()
{
return“乔治写了这个插件。有很多类似的插件,但这个是我的。”;
}
静态Long initCount=新长(0);
公共可视化工具()
{
init();
}
私有void init()
{ 
//debug(“在FxVisualizer init()中”);
尝试
{
FxTestListener.setListener(这个);
此.setLayout(新的BorderLayout());
边框边距=新的空订单(10,10,5,10);
本订单(保证金);
//add(makeTitlePanel(),BorderLayout.NORTH);
最终JFXPanel fxPanel=新JFXPanel();
添加(fxPanel);
//fxPanel.setScene(getScene());
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
initFX(fxPanel);
}
});
}
捕获(例外e)
{
e、 printStackTrace();
}
} 
静态FXVisualizerSCeneFXScene;
私有静态void initFX(JFXPanel fxPanel){
//此方法在JavaFX线程上调用
fxsecene=newfxvisualizerscene();
fxPanel.setScene(fxsecene.getScene());
}
最终列表bufferedEvents=new ArrayList();
@凌驾
公共无效添加(SampleResult结果)
{
final List events=…;//这里需要获取result.getSubResults()参数并获取所有子事件。
最终列表eventsToAdd=新的ArrayList();
已同步(缓冲事件)
{
对于(事件evt:事件)
{
bufferedEvents.add(evt);
}
if(bufferedEvents.size()>=缓冲区大小)
{
eventsToAdd.addAll(bufferedEvents);
bufferedEvents.clear();
}
}
如果(eventsToAdd.size()>0)
{
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
更新面板(eventsToAdd);
}
});
}       
}
public void updatePanel(列出事件)
{
对于(事件evt:事件)
{
fxsecene.addEvent(evt);
}
}
@凌驾
public void clearData()
{
已同步(缓冲事件)
{
Platform.runLater(新的Runnable(){
@凌驾
公开募捐{
bufferedEvents.clear();
fxsecene.clearData();
}
});
}
}
@凌驾
公共字符串getLabelResource(){
返回“Georges Java Sub-FX示例侦听器”;
}
布尔值isRunning=false;
@凌驾
公营机构(
{
最终列表eventsToAdd=新的ArrayList();
已同步(缓冲事件)
{
eventsToAdd.addAll(bufferedEvents);
bufferedEvents.clea
CSVSaveService.saveCSVStats(StatGraphVisualizer.getAllTableData(model, FORMATS),writer,` 
                        saveHeaders.isSelected() ? StatGraphVisualizer.getLabels(COLUMNS) : null);
import org.apache.jmeter.visualizers.StatGraphVisualizer;
CSVSaveService.saveCSVStats(StatGraphVisualizer.getAllTableData(model, FORMATS),writer);
public void add(final SampleResult res) {
        final String sampleLabel = res.getSampleLabel(); // useGroupName.isSelected());



**final SampleResult[] theSubResults = res.getSubResults();**
**final String writesampleLabel = theSubResults[0].getSampleLabel(); // (useGroupName.isSelected());
        final String readsampleLabel =  theSubResults[1].getSampleLabel(); // (useGroupName.isSelected());**
JMeterUtils.runSafe(false, new Runnable() {
            @Override
            public void run() {
JMeterUtils.runSafe(false, new Runnable() {
            @Override
            public void run() {
                Calculator row = null;
                **Calculator row1 = null;
                Calculator row2 = null;**
                synchronized (lock) {
                    row =  tableRows.get(sampleLabel);
                    **row1 = tableRows.get(writesampleLabel);
                    row2 = tableRows.get(readsampleLabel);**

if (row == null) {
                        row = new Calculator(sampleLabel);
                        tableRows.put(row.getLabel(), row);
                        model.insertRow(row, model.getRowCount() - 1);
                    }

                    **if (row1 == null) {
                        row1 = new Calculator(writesampleLabel);
                        tableRows.put(row1.getLabel(), row1);
                        model.insertRow(row1, model.getRowCount() - 1);
                    }

                     if (row2 == null) {
                        row2 = new Calculator(readsampleLabel);
                        tableRows.put(row2.getLabel(), row2);
                        model.insertRow(row2, model.getRowCount() - 1);
                    }**

                } // close lock
                /*
                 * Synch is needed because multiple threads can update the counts.
                 */
                synchronized(row) {
                    row.addSample(res);    
                }

                **synchronized(row1) {
                   row1.addSample(theSubResults[0]);      
                }**

                **synchronized(row2) {
                    row2.addSample(theSubResults[1]);
                }**