【问题标题】:JMeter - how to log the full request for a failed response?JMeter - 如何记录失败响应的完整请求?
【发布时间】:2010-12-03 16:40:22
【问题描述】:

我正在使用 JMeter 命令行对我们的网站 api 进行压力测试。现在,这是我返回的示例结果:

Creating summariser <summary>
Created the tree successfully using street_advisor.jmx
Starting the test @ Sat Oct 03 15:22:59 PDT 2009 (1254608579848)
Waiting for possible shutdown message on port 4445
summary +     1 in   0.0s =   37.0/s Avg:    27 Min:    27 Max:    27 Err:     1 (100.00%)
<snip a few more lines>
<then i break it>

所以我遇到了一个错误。

目前,所有错误都会写入一个文件。当我检查该文件时,它说它是 404。呃.. 好的。无论如何我可以看到 确切 JMeter 尝试了什么请求?

这是我的配置文件的 sn-p...

<ResultCollector guiclass="SimpleDataWriter" testclass="ResultCollector" testname="Error Writer" enabled="true">
          <boolProp name="ResultCollector.error_logging">true</boolProp>
          <objProp>
            <name>saveConfig</name>
            <value class="SampleSaveConfiguration">
              <time>true</time>
              <latency>true</latency>
              <timestamp>false</timestamp>
              <success>true</success>
              <label>true</label>
              <code>true</code>
              <message>true</message>
              <threadName>false</threadName>
              <dataType>true</dataType>
              <encoding>false</encoding>
              <assertions>true</assertions>
              <subresults>true</subresults>
              <responseData>false</responseData>
              <samplerData>false</samplerData>
              <xml>true</xml>
              <fieldNames>false</fieldNames>
              <responseHeaders>true</responseHeaders>
              <requestHeaders>true</requestHeaders>
              <responseDataOnError>false</responseDataOnError>
              <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage>
              <assertionsResultsToSave>0</assertionsResultsToSave>
              <bytes>true</bytes>
            </value>
          </objProp>
          <stringProp name="filename">./error.jtl</stringProp>
        </ResultCollector>

现在,在有人说“检查网络服务器日志文件”之前,我知道我可以做到这一点,是的,我找到了 404 .. 但我希望看看是否可以不访问它们.. 特别是如果它们在另一台服务器上和/或我无法访问它们。 请帮忙!

【问题讨论】:

    标签: jmeter


    【解决方案1】:

    View Results Tree 组件显示所有示例响应的树,允许您查看任何示例的请求和响应。

    负载测试时(始终处于非 GUI 模式),填写“文件名”字段并选择仅保存错误响应:

    正如您在上面看到的,我们单击配置以选择除 CSV 之外的所有字段。

    您还可以使用Save Responses to a file 将整个响应保存到文件中:

    【讨论】:

    • 正确,但我是通过命令行执行此操作的......所以我无法访问 GUI。但是我没有在我的问题中具体说明(脸红)。另外,我不知道如何通过命令行来做,所以我最终还是按照你的建议做:)
    • 如果您使用命令行,您可以配置测试以将数据发送到输出文件 (jtl),然后使用此工具处理该文件:jmeter-plugins.org/wiki/JMeterPluginsCMD 以导出为 PNG 或 CSV。
    • 如果我正确阅读了问题,是在寻找记录的请求而不是响应...?
    • @arcseldon 不错!记录完整的请求和响应。
    • @rodrigoap - 稍微调整了你的答案,both the request and response..
    【解决方案2】:

    我发现此线程正在搜索在采样器失败时记录响应的解决方案,因此接受的解决方案对我不利。在涉及数十万个样本的高负载下,我偶尔会出现样本失败,因此树侦听器对我来说完全不切实际(它的大小将达到几 GB),所以这就是我想出的(这应该对OP的场景):

    添加[JSR223 Assertion][1](应该在所有其他断言之后)并将以下代码放入其中:

    if (Boolean.valueOf(vars.get("DEBUG"))) {
      for (a: SampleResult.getAssertionResults()) {
        if (a.isError() || a.isFailure()) {
          log.error(Thread.currentThread().getName()+": "+SampleLabel+": Assertion failed for response: " + new String((byte[]) ResponseData));
        }
      }
    }
    

    这将导致整个响应被记录到 jmeter 日志文件中,这在我的情况下很好,因为我知道响应非常小,但是对于大响应,可以进行更智能的处理。

    【讨论】:

    • 我添加了使用名为“DEBUG”的 UDV 控制日志的功能,因此更容易将断言留给常规工作负载,并仅在必要时启用。
    • @haridsv 不错的决定!但是是否可以保存导致响应失败的requestData?
    • @ShurupuS 根据BeanShell Assertion 上的组件引用,RequestHeaders 可作为 BeanShell 代码的变量,因此理论上是可能的。
    • @haridsv 你能帮我解决这个问题吗?
    • 在上述解决方案中,什么是“DEBUG”变量。我们需要在哪里以及为什么需要定义“DEBUG”变量
    【解决方案3】:

    有一个“将响应保存到文件”监听器,只有在发生错误时才能保存到文件。

    【讨论】:

      【解决方案4】:

      这是我记录失败请求的完整请求(请求 URL + 请求正文)的方式。

      1. 在线程组内添加监听器
      try{
        var message = "";
        var currentUrl = sampler.getUrl();
        message +=  ". URL = " +currentUrl;
        var requestBody = sampler.getArguments().getArgument(0).getValue();
        message += " --data " + sampler.getArguments();
      
        if(!sampleResult.isSuccessful()){
            log.error(message);
        }
      
      }catch(err){
        //do nothing. this could be a debug sampler. no need to log the error
      }
      

      对于线程组内的每个采样器,侦听器将在采样器之后执行此代码。

      【讨论】:

      • 你添加了这段代码的监听器是什么类型的?
      • 我使用了一个 JSR223 监听器。更多信息在这里:pushbeta.com/2019/10/18/…
      猜你喜欢
      • 2022-11-25
      • 2020-11-24
      • 2020-10-26
      • 2011-12-18
      • 2018-12-06
      • 2021-01-12
      • 2019-01-10
      • 1970-01-01
      相关资源
      最近更新 更多