mirror of https://github.com/apache/jmeter.git
200 lines
8.2 KiB
XML
200 lines
8.2 KiB
XML
<?xml version="1.0"?>
|
|
<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
|
|
license agreements. See the NOTICE file distributed with this work for additional
|
|
information regarding copyright ownership. The ASF licenses this file to
|
|
You under the Apache License, Version 2.0 (the "License"); you may not use
|
|
this file except in compliance with the License. You may obtain a copy of
|
|
the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
|
|
by applicable law or agreed to in writing, software distributed under the
|
|
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
|
|
OF ANY KIND, either express or implied. See the License for the specific
|
|
language governing permissions and limitations under the License. -->
|
|
|
|
<!DOCTYPE document[
|
|
<!ENTITY hellip "…" >
|
|
]>
|
|
|
|
<document id="$Id$">
|
|
|
|
<properties>
|
|
<title>Developer's guide: Dashboard generator</title>
|
|
</properties>
|
|
|
|
<body>
|
|
|
|
<section name="Dashboard generator">
|
|
<p>
|
|
This document describes the architecture and operation of the
|
|
dashboard generation engine.
|
|
</p>
|
|
<subsection name="1 Overview" anchor="overview">
|
|
<subsection name="1.1 Architecture" anchor="overview_architecture">
|
|
<p>
|
|
The dashboard generation engine is a modular feature based on
|
|
samples operation processes.
|
|
<br />
|
|
The processes can be represented by the following diagram:
|
|
</p>
|
|
<figure image="dashboard.png">Figure 1 - Dashboard generation overview</figure>
|
|
<p>
|
|
In this view, you can see:
|
|
<ul>
|
|
<li>
|
|
A source from where samples are produced (e.g. CSV file).
|
|
</li>
|
|
<li>
|
|
A chain of items, named consumers, that operate
|
|
on the samples that go through the chain
|
|
(e.g. Filtering, sorting, calculation, ...).
|
|
</li>
|
|
<li>
|
|
An execution context, named sample context, where the results
|
|
of consumers calculations are stored.
|
|
</li>
|
|
<li>
|
|
A set of items, named exporters, that use the content of the
|
|
sample context to generate a final result to the user (e.g.
|
|
HTML page generation).
|
|
</li>
|
|
</ul>
|
|
</p>
|
|
</subsection>
|
|
<subsection name="1.2 Operation" anchor="overview_operation">
|
|
<p>
|
|
Before producing samples, the source is associated with a sample
|
|
context that will be used to store the consumers results.
|
|
</p>
|
|
<p>
|
|
Then a chain of consumers is built using JMeter properties
|
|
(prefixed by
|
|
<code>jmeter.reportgenerator</code>
|
|
) in order to enable the user to customize it.
|
|
</p>
|
|
<p>
|
|
When the source emits a sample, it sends it to the first consumer
|
|
of the chain.
|
|
<br />
|
|
The consumer can have different behaviors:
|
|
<ul>
|
|
<li>It can process the sample and send it to the next
|
|
consumers.</li>
|
|
<li>It cannot process the sample, so it stores it and
|
|
continues to receive other samples. When it can process the
|
|
stored samples, it does so and sends the whole to the next
|
|
consumers (e.g. sorting).</li>
|
|
<li>It can choose to discard the sample (e.g.
|
|
filtering).</li>
|
|
</ul>
|
|
When the source stops producing samples, consumers can publish a
|
|
result in the sample context.
|
|
<br />
|
|
The latter is send to the set of exporters in order to create
|
|
results used by final user.
|
|
</p>
|
|
</subsection>
|
|
</subsection>
|
|
|
|
<subsection name="2 Consumers chain details" anchor="consumers_chain">
|
|
<p>
|
|
|
|
</p>
|
|
<figure image="chain.png">Figure 2 - Consumers chain</figure>
|
|
<p>
|
|
The chain begins with a normalizer consumer in charge of
|
|
standardizing the timestamp of each sample because JMeter allows
|
|
different timestamp formats (See
|
|
<code>jmeter.save.saveservice.timestamp_format</code>
|
|
).
|
|
</p>
|
|
<p>
|
|
Then two consumers have to define the start time and end time of
|
|
the load tests.
|
|
</p>
|
|
<p>
|
|
At the same level a filter consumer keeps or
|
|
discards samples depending on the
|
|
<code>jmeter.reportgenerator.sample_filter</code>
|
|
property.
|
|
</p>
|
|
<p> Another filter is plugged after to discard controller
|
|
samples.
|
|
</p>
|
|
<p>
|
|
Depending on the property
|
|
<code>jmeter.reportgenerator.graph.<graph_id>.exclude_controllers</code>
|
|
, the graph consumer matching the <code>graph_id</code> identifier will be
|
|
set at position <code>A</code> or <code>B</code>.
|
|
</p>
|
|
</subsection>
|
|
|
|
<subsection name="3 Limitations and Outlooks" anchor="outlooks">
|
|
<ul>
|
|
<li>
|
|
<p>Till now, there is only one sample source implementation which
|
|
is strongly coupled with the CSV file format, we should allow
|
|
other kinds of source by using a sample source interface.</p>
|
|
</li>
|
|
<li>
|
|
<p>To add customized graph, users must extend the
|
|
<code>AbstractGraphConsumer</code> or use one of the implementations provided
|
|
in the package <code>org.apache.jmeter.report.processor.graph.impl</code>”.
|
|
This could be enhanced by making concrete the base class and give
|
|
public access to additional properties (like selectors). But first
|
|
we have to resolve the issue of shared properties (e.g. over time
|
|
graphs must dispatch the same granularity property to the keys
|
|
selector and time rate aggregator).</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
The chain building is dispatched between the
|
|
<code>org.apache.jmeter.report.dashboard.ReporGenerator.generate</code> method
|
|
and the implementation of the consumers. So the code in charge of
|
|
the building is split and furthermore some consumers can be
|
|
redundant and harm the performance of report generation, not
|
|
load testing.
|
|
</p>
|
|
<p>
|
|
E.g. Each <code>LatencyVSRequestGraphConsumer</code> and
|
|
<code>ResponseTimeVSRequestGraphConsumer</code> instances use an embedded
|
|
consumer that could be shared depending on <code>granularity</code> and
|
|
<code>exclude_controllers</code> properties.
|
|
</p>
|
|
<p>
|
|
So we should enable the consumers to define the chain they
|
|
require and provide a single chain builder that processes these
|
|
chain requirements to instantiate needed consumers on demand. I.e.
|
|
for the same chain requirement declaration, the same consumer
|
|
instances are used. Otherwise if the declaration differs, a new
|
|
branch of consumers is created.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
The graphs (DOM elements) in the generated HTML page should be
|
|
dynamically build in order to match the graphs defined in JMeter
|
|
properties.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Some improvements can be done on the generated html pages:
|
|
<ul>
|
|
<li>Using a single page, and hide graphs depending on the
|
|
navigation menu selection.</li>
|
|
<li>Adding a loading animation when graphs are build or
|
|
refreshed.</li>
|
|
<li>Let the user determine if a graph is zoomable using a JMeter
|
|
property.</li>
|
|
<li>Using the <code>jquery.plot.setData()</code> method to handle series
|
|
activation/deactivation rather than rebuild the graph.</li>
|
|
</ul>
|
|
</p>
|
|
</li>
|
|
</ul>
|
|
</subsection>
|
|
</section>
|
|
|
|
</body>
|
|
</document>
|
|
|