You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by fs...@apache.org on 2016/02/10 22:10:01 UTC
svn commit: r1729738 - /jmeter/trunk/xdocs/devguide-dashboard.xml
Author: fschumacher
Date: Wed Feb 10 21:10:01 2016
New Revision: 1729738
URL: http://svn.apache.org/viewvc?rev=1729738&view=rev
Log:
Tabpolice.
Modified:
jmeter/trunk/xdocs/devguide-dashboard.xml
Modified: jmeter/trunk/xdocs/devguide-dashboard.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/devguide-dashboard.xml?rev=1729738&r1=1729737&r2=1729738&view=diff
==============================================================================
--- jmeter/trunk/xdocs/devguide-dashboard.xml (original)
+++ jmeter/trunk/xdocs/devguide-dashboard.xml Wed Feb 10 21:10:01 2016
@@ -1,14 +1,14 @@
<?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. -->
+ 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 "…" >
@@ -16,331 +16,331 @@
<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 Template processing" anchor="process_template">
- <subsection name="3.1 Overview" anchor="template_overview">
- <p>
- The default exporter of the generator use the template engine
- <a href="http://freemarker.org/">freemarker</a>
- to produce html pages.
- <br />
- Templated files are located in the template
- directory defined by
- the JMeter property
- "jmeter.reportgenerator.template_dir"
- and have
- the extension ".fmkr".
- </p>
- <p>
- The graph references in the templated
- files use the syntax :
- ${<graph_id>.<value>} where :
- <ul>
- <li>"graph_id"
- is the identifier of the graph matching the jmeter
- properties
- definition</li>
- <li>"value" is the name of the value where data are stored.</li>
- </ul>
- </p>
- <p>
- Each graph produces the following values :
- <ul>
- <li>
- <p>
- <code>maxX</code>
- :
- <br />
- The maximum abscissa of the graph (double).
- </p>
- </li>
- <li>
- <p>
- <code>maxY</code>
- :
- <br />
- The maximum ordinate of the graph (double).
- </p>
- </li>
- <li>
- <p>
- <code>minX</code>
- :
- <br />
- The minimum abscissa of the graph
- (double).
- </p>
- </li>
- <li>
- <p>
- <code>minY</code>
- :
- <br />
- The maximum ordinate
- of the graph (double).
- </p>
- </li>
- <li>
- <p>
- <code>title</code>
- :
- <br />
- The
- title of the graph (string).
- </p>
- </li>
- <li>
- <p>
- <code>values</code>
- :
- <br />
- A json object representing the data of the graph series
- (string).
- </p>
- </li>
- </ul>
- </p>
- <!-- <note> -->
- <!-- Graph can provide some other values, see -->
- <!-- <a href="#default_graphs">Default -->
- <!-- graph section</a> -->
- <!-- to get the list of these values for default graphs. -->
- <!-- </note> -->
- </subsection>
- <subsection name="3.2 Customization" anchor="template_customization">
- <p>You can customize the dashboard generation by modifying the
- files in the
- template directory.
- </p>
- <p>
- If you want to add a graph to the dahsboard,
- you have to
- <a href="#configure_graph">declare it among the JMeter properties</a>
- and use its references in the templated files.
- </p>
- <p>If you want to remove
- a graph from the dashboard, you must remove
- all its references in
- the templated
- files and clear JMeter
- properties.</p>
- </subsection>
- </subsection>
-
- <subsection name="4 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>
+ <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 Template processing" anchor="process_template">
+ <subsection name="3.1 Overview" anchor="template_overview">
+ <p>
+ The default exporter of the generator use the template engine
+ <a href="http://freemarker.org/">freemarker</a>
+ to produce html pages.
+ <br />
+ Templated files are located in the template
+ directory defined by
+ the JMeter property
+ "jmeter.reportgenerator.template_dir"
+ and have
+ the extension ".fmkr".
+ </p>
+ <p>
+ The graph references in the templated
+ files use the syntax :
+ ${<graph_id>.<value>} where :
+ <ul>
+ <li>"graph_id"
+ is the identifier of the graph matching the jmeter
+ properties
+ definition</li>
+ <li>"value" is the name of the value where data are stored.</li>
+ </ul>
+ </p>
+ <p>
+ Each graph produces the following values :
+ <ul>
+ <li>
+ <p>
+ <code>maxX</code>
+ :
+ <br />
+ The maximum abscissa of the graph (double).
+ </p>
+ </li>
+ <li>
+ <p>
+ <code>maxY</code>
+ :
+ <br />
+ The maximum ordinate of the graph (double).
+ </p>
+ </li>
+ <li>
+ <p>
+ <code>minX</code>
+ :
+ <br />
+ The minimum abscissa of the graph
+ (double).
+ </p>
+ </li>
+ <li>
+ <p>
+ <code>minY</code>
+ :
+ <br />
+ The maximum ordinate
+ of the graph (double).
+ </p>
+ </li>
+ <li>
+ <p>
+ <code>title</code>
+ :
+ <br />
+ The
+ title of the graph (string).
+ </p>
+ </li>
+ <li>
+ <p>
+ <code>values</code>
+ :
+ <br />
+ A json object representing the data of the graph series
+ (string).
+ </p>
+ </li>
+ </ul>
+ </p>
+ <!-- <note> -->
+ <!-- Graph can provide some other values, see -->
+ <!-- <a href="#default_graphs">Default -->
+ <!-- graph section</a> -->
+ <!-- to get the list of these values for default graphs. -->
+ <!-- </note> -->
+ </subsection>
+ <subsection name="3.2 Customization" anchor="template_customization">
+ <p>You can customize the dashboard generation by modifying the
+ files in the
+ template directory.
+ </p>
+ <p>
+ If you want to add a graph to the dahsboard,
+ you have to
+ <a href="#configure_graph">declare it among the JMeter properties</a>
+ and use its references in the templated files.
+ </p>
+ <p>If you want to remove
+ a graph from the dashboard, you must remove
+ all its references in
+ the templated
+ files and clear JMeter
+ properties.</p>
+ </subsection>
+ </subsection>
+
+ <subsection name="4 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>
+ </body>
</document>