<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="en">
    <head>
        <META http-equiv="Content-Type" content="text/html; charset=iso-8859-15">
        <title>Apache JMeter
          -
          Issues</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="https://fonts.googleapis.com/css?family=Merriweather:400normal" rel="stylesheet" type="text/css">
        <link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css" rel="stylesheet" type="text/css">
        <link rel="stylesheet" type="text/css" href="./css/new-style.css">
        <link rel="apple-touch-icon-precomposed" href="./images/apple-touch-icon.png">
        <link rel="icon" href="./images/favicon.png">
        <meta name="msapplication-TileColor" content="#ffffff">
        <meta name="msapplication-TileImage" content="./images/mstile-144x144.png">
        <meta name="theme-color" content="#ffffff">
    </head>
    <body role="document">
        <a href="#content" class="hidden">Main content</a>
        <div class="header">
            <!--
            APACHE LOGO
          -->
            <div>
                <a href="https://www.apache.org"><img title="Apache Software Foundation" class="asf-logo logo" src="./images/asf-logo.svg" alt="Logo ASF"></a>
            </div>
            <!--
              PROJECT LOGO
            -->
            <div>
                <a href="https://jmeter.apache.org/"><img class="logo" src="./images/logo.svg" alt="Apache JMeter"></a>
            </div>
            <div class="banner">
                <a href="https://www.apache.org/events/current-event.html"><img src="https://www.apache.org/events/current-event-234x60.png" alt="Current Apache event teaser"></a>
                <div class="clear"></div>
            </div>
        </div>
        <div class="nav">
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">About</div>
                    <ul>
                        <li>
                            <a href="./index.html">Overview</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/licenses/">License</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Download</div>
                    <ul>
                        <li>
                            <a href="./download_jmeter.cgi">Download Releases</a>
                        </li>
                        <li>
                            <a href="./changes.html">Release Notes</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Documentation</div>
                    <ul>
                        <li>
                            <a href="./usermanual/get-started.html">Get Started</a>
                        </li>
                        <li>
                            <a href="./usermanual/index.html">User Manual</a>
                        </li>
                        <li>
                            <a href="./usermanual/best-practices.html">Best Practices</a>
                        </li>
                        <li>
                            <a href="./usermanual/component_reference.html">Component Reference</a>
                        </li>
                        <li>
                            <a href="./usermanual/functions.html">Functions Reference</a>
                        </li>
                        <li>
                            <a href="./usermanual/properties_reference.html">Properties Reference</a>
                        </li>
                        <li>
                            <a href="./changes_history.html">Change History</a>
                        </li>
                        <li>
                            <a href="./api/index.html">Javadocs</a>
                        </li>
                        <li>
                            <a href="https://cwiki.apache.org/confluence/display/JMETER/Home">JMeter Wiki</a>
                        </li>
                        <li>
                            <a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterFAQ">FAQ (Wiki)</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Tutorials</div>
                    <ul>
                        <li>
                            <a href="./usermanual/jmeter_distributed_testing_step_by_step.html">Distributed Testing</a>
                        </li>
                        <li>
                            <a href="./usermanual/jmeter_proxy_step_by_step.html">Recording Tests</a>
                        </li>
                        <li>
                            <a href="./usermanual/junitsampler_tutorial.html">JUnit Sampler</a>
                        </li>
                        <li>
                            <a href="./usermanual/jmeter_accesslog_sampler_step_by_step.html">Access Log Sampler</a>
                        </li>
                        <li>
                            <a href="./usermanual/jmeter_tutorial.html">Extending JMeter</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Community</div>
                    <ul>
                        <li>
                            <a href="./issues.html">Issue Tracking</a>
                        </li>
                        <li>
                            <a href="./security.html">Security</a>
                        </li>
                        <li>
                            <a href="./mail.html">Mailing Lists</a>
                        </li>
                        <li>
                            <a href="./svnindex.html">Source Repositories</a>
                        </li>
                        <li>
                            <a href="./building.html">Building and Contributing</a>
                        </li>
                        <li>
                            <a href="https://projects.apache.org/project.html?jmeter">Project info at Apache</a>
                        </li>
                        <li>
                            <a href="https://cwiki.apache.org/confluence/display/JMETER/JMeterCommitters">Contributors</a>
                        </li>
                    </ul>
                </li>
            </ul>
            <ul class="menu">
                <li onClick="return true">
                    <div class="menu-title">Foundation</div>
                    <ul>
                        <li>
                            <a href="https://www.apache.org/">The Apache Software Foundation (ASF)</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/foundation/getinvolved.html">Get Involved in the ASF</a>
                        </li>
                        <li>
                            <a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy Policy</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
                        </li>
                        <li>
                            <a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
        <div class="main" id="content">
            <div class="social-media">
                <ul class="social-media-links">
                    <li class="twitter">
                        <a href="https://twitter.com/ApacheJMeter" title="Follow us on Twitter"><i class="fa fa-twitter" aria-hidden="true"></i>Twitter</a>
                    </li>
                    <li class="github">
                        <a href="https://github.com/apache/jmeter" title="Fork us on github"><i class="fa fa-github" aria-hidden="true"></i>github</a>
                    </li>
                </ul>
            </div>
            <div class="section">
                <h1>Issue tracker</h1>
                  
                <p>
                        JMeter uses GitHub Issues for issue tracking, i.e. for reporting bugs and requesting enhancements.
    Previously, the issues were tracked in <a href="https://bz.apache.org/bugzilla/describecomponents.cgi">Bugzilla</a>,
    and all the issues, comments, and attachments have been migrated to GitHub on 2022-09-22.
  
                </p>
                
            </div>
            <div class="section">
                <h1>Support Questions</h1>
                  
                <p>
                        Please do not use GitHub Issues for asking questions. It is not a support forum.
    Instead, please <a href="mail2.html">subscribe</a> to the JMeter user mailing list and ask there.
    The user mailing list has a bigger audience, and you are more likely to get an answer quickly.
  
                </p>
                
            </div>
            <div class="section">
                <h1>Known Bugs and enhancements</h1>
                  
                <ul>
                        
                    <li>
                              <a href="https://github.com/apache/jmeter/issues?q=is%3Aopen+sort%3Areactions-%2B1-desc">
        Most voted issues
      </a>
    
                    </li>
                        
                    <li>
                              <a href="https://github.com/apache/jmeter/issues?q=is%3Aopen">
        All open bugs and enhancements
      </a>
    
                    </li>
                        
                    <li>
                              <a href="https://github.com/apache/jmeter/issues?q=is%3Aissue+is%3Aopen+-label%3Aenhancement">
        Open bugs (excluding enhancements)
      </a>
    
                    </li>
                        
                    <li>
                              <a href="https://github.com/apache/jmeter/issues?q=is%3Aopen+label%3Aenhancement">
        Enhancements only
      </a>
    
                    </li>
                      
                </ul>
                
            </div>
            <div class="section">
                <h1>Requesting an enhancement</h1>
                  
                <p>
                        Please check if the same enhancement has already been requested previously.
    If you find a very similar request in the issues list, please refrain from adding "<em>I also need this</em>" comments to the issue.
    "<em>I also need this</em>" comments cause notifications, and the comment itself does not add much to the discussion.
    Instead, prefer adding reactions to the first comment of an existing issue, so the issues could be sorted (see
    <a href="https://github.com/apache/jmeter/issues?q=sort%3Areactions-%2B1-desc">Most voted issues</a>).
  
                </p>
                  
                <p>
    Please make sure that you describe the enhancement in sufficient detail. It might be a good idea to start with a use-case.
  </p>
                  
                <p>
                        There are several options to propose an enhancement request:
    
                    <dl>
                              
                        <dt>GitHub issue</dt>
                              
                        <dd>
                                    
                            <p>
                                          You could <a href="https://github.com/apache/jmeter/issues/new/choose">file an issue on GitHub</a> to start a discussion
          and gather opinions. GitHub issues allow
          <a href="https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax">basic formatting</a>,
          <a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting">advanced formatting</a>,
          <a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files">attaching files</a>,
          <a href="https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#quoting-code">syntax highlight</a>,
          <a href="https://docs.github.com/en/issues/tracking-your-work-with-issues/about-task-lists">task lists</a>,
          reactions,
          <a href="https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/autolinked-references-and-urls#issues-and-pull-requests">references to the other
            issues and the source code</a>.
        
                            </p>
                                    
                            <p>
                                          When you create an issue at GitHub, it suggests one of the templates (e.g. "<em>Bug report</em>",
          "<em>Feedback about the manual</em>", "<em>Feature Request</em>", "<em>Regression</em>"), and it guides which information is required for each case.
          You could read more on <a href="https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue">creating issues</a> in
          GitHub documentation.
        
                            </p>
                                  
                        </dd>
                              
                        <dt>Mailing list discussion</dt>
                              
                        <dd>
                                    
                            <p>
                                          If you are not sure if something is an enhancement, or if you are unsure regarding the possible solutions,
          it might be a good idea to start a discussion on <a href="https://jmeter.apache.org/mail2.html#JMeterDev">JMeter dev mailing list</a>
        
                            </p>
                                  
                        </dd>
                              
                        <dt>GitHub pull request</dt>
                              
                        <dd>
                                    
                            <p>
                                          If you are positive regarding the solution, you could start a discussion by creating a
          <a href="https://github.com/apache/jmeter/pulls">pull request on GitHub</a>.
          Pull requests are not much different from issues, however, sometimes it is easier to discuss with code at hand.
          For instance, if you fix a typo or make other small fixes, there's no need to create "<em>issue and PR</em>" for each change.
          The following <a href="https://github.blog/2015-01-21-how-to-write-the-perfect-pull-request/">GitHub post</a> might be helpful
          for creating your perfect pull request.
        
                            </p>
                                    
                            <div class="clear"></div>
                            <div class="note">
          There's no guarantee that your contribution will be accepted, so it might be wise to discuss your suggestions
          before you invest significant efforts on implementing the changes.
        </div>
                            <div class="clear"></div>
                                    
                            <p>
          If you are providing a code patch, also provide a test case, and documentation on how to use the new feature (ideally as a documentation patch).
        </p>
                                  
                        </dd>
                            
                    </dl>
                      
                </p>
                
            </div>
            <div class="section">
                <h1>Raising an Issue</h1>
                  
                <p>
                        First check that the issue has not already been reported on <a href="https://github.com/apache/jmeter/issues">GitHub issues</a>
    and <a href="https://lists.apache.org/list.html?user@jmeter.apache.org">JMeter user mailing list</a>).
    If reporting a bug, are you sure it really is a bug in JMeter, not just a misunderstanding of how JMeter works?
  
                </p>
                  
                <p>
                        If you face a bug or regression, please create an <a href="https://github.com/apache/jmeter/issues">issue on GitHub</a>.
    In case you can't create an issue, you might send the bug report to <a href="https://jmeter.apache.org/mail2.html#JMeterDev">JMeter dev mailing list</a>.
  
                </p>
                
            </div>
            <div class="section">
                <h1>Required Information for bug reporting</h1>
                
                <p>
Please make sure you provide sufficient information for others to be able to make use of the report effectively.
Use the checklist below to guide you.
</p>
                
                <ul>
                    
                    <li>JMeter version</li>
                    
                    <li>
                        Java version (output from <span class="code">java -version</span>)
                    </li>
                    
                    <li>OS version</li>
                    
                    <li>
                        <span class="code">jmeter.log</span> file (unlikely to contain sensitive information, but check before uploading)
                    </li>
                    
                    <li>
                        JMX file if relevant (redact any sensitive information first), providing a simplified Test Plan (using <a href="./usermanual/component_reference.html#Debug_Sampler">Debug Sampler</a>) will ensure BUG is fixed much more rapidly than without it
                    </li>
                    
                    <li>Try to reproduce the bug without third-party plug-ins. Minimal JMX files should not contain third-party plug-ins, as it makes it harder to test them on a plain JMeter installation.</li>
                    
                    <li>JTL file if relevant (may need to redact sensitive information)</li>
                    
                    <li>For a suspected bug, describe what you did, what happened, and how this differs from what you expected to happen.
Does it happen every time?
</li>
                    
                    <li>If you have error messages, that you wish to report, copy them as text into the issue, as it makes it easier to search for them and re-use the message in our research for the origin of the issue</li>
                    
                    <li>
                        When a bug is market as <span class="code">need info</span>, please provide as soon as possible the required information so that bug can be understood and fixed. Be aware that if
no information is provided after team requires more information and bug is not reproducible, then bug will be closed as <span class="code">invalid</span>. You can always ask to reopen it later once you provide the required information.
                    </li>
                    
                    <li>
                        Prefer using issue templates (e.g. "<em>Bug report</em>", "<em>Feedback about the manual</em>", "<em>Feature Request</em>", "<em>Regression</em>")
                    </li>
                    
                    <li>
                        If you are providing a patch file to fix a bug, please ensure it is in unified diff format.
If using Eclipse, please set the patch root to "<span class="code">Project</span>", not the default "<span class="code">Workspace</span>" which is harder to apply.
                    </li>
                    
                    <li>
                        New source files can be provided as is; please ensure they have the standard Apache License header (as per other JMeter files).
Please do not use <span class="code">@author</span> tags (credit will be given in the changes file).

                    </li>
                    
                    <li>
                        In the case of patches for new features, please also provide documentation patches if at all possible.
Components are documented in <span class="code">xdocs/usermanual/component_reference.xml</span>.
                    </li>
                    
                </ul>
                
                <p>
                    <b>See also the following <a href="https://bz.apache.org/bugwritinghelp.html">Bug writing guidelines</a>,
also the terms and conditions noted on the <a href="https://docs.github.com/en/site-policy/github-terms/github-terms-of-service">GitHub Terms of Service</a></b>
                </p>
                
            </div>
            <div class="share-links">
                      Share this page:
      
                <ul>
                    <li class="fb">
                        <a data-social-url="https://facebook.com/sharer/sharer.php?u=" title="Share on facebook"><i class="fa fa-facebook" aria-hidden="true"></i>share</a>
                    </li>
                    <li class="twitter">
                        <a data-social-url="https://twitter.com/intent/tweet?url=" title="Tweet on twitter"><i class="fa fa-twitter" aria-hidden="true"></i>tweet</a>
                    </li>
                </ul>
            </div>
            <a href="#top" id="topButton">Go to top</a>
        </div>
        <div class="footer">
            <div class="copyright">
            Copyright &copy;
            1999 &ndash;
            2024
            , Apache Software Foundation
          </div>
            <div class="trademarks">Apache, Apache JMeter, JMeter, the Apache
            feather, and the Apache JMeter logo are
            trademarks of the
            Apache Software Foundation.
          </div>
        </div>
        <script>(function(){
            "use strict";
            // enable 'go to top' button functionality
            document.addEventListener('scroll', function() {
                if (document.body.scrollTop > 500 || document.documentElement.scrollTop > 500) {
                    document.getElementById("topButton").style.display = "block";
                } else {
                    document.getElementById("topButton").style.display = "none";
                }
            });
            // fill in the current location into social links on this page.
            var as = document.getElementsByTagName('a');
            var loc = document.location.href;
            if (!loc.toLowerCase().startsWith('http')) {
                return;
            }
            for (var i=0; i<as.length; i++) {
                var href = as[i].getAttribute('data-social-url');
                if (href !== null) {
                    as[i].href = href + encodeURIComponent(loc);
                }
            }
        })();</script>
    </body>
</html>
