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