如何使jmeter根据访问日志行中的时间戳进行日志重放

时间:2014-02-12 20:47:55

标签: java web-applications jmeter load-testing

我最近开始加载测试我的webapp。

我使用了apache访问日志采样器。我按照本教程。

https://jmeter.apache.org/usermanual/jmeter_accesslog_sampler_step_by_step.pdf

我能够让它发挥作用。但现在问题是我在不到10分钟的时间内重播了所有的请求。

我希望jmeter根据发布get请求的时间戳运行get请求。

我无法在线找到任何此类配置。

我可以编写脚本来卷曲特定时间戳的get请求。但我想用jmeter。

是否可能。

修改

我创建了一个带有以下行的示例csv文件:

0,/myAPP/home
5000,/myAPP/home
5000,/myAPP/home

首先我创建了一个线程组,如图所示: enter image description here

这里我永远选择了循环计数。如果未选中,则只有csv文件中的第一行正在运行。这些行没有运行。

现在我添加了csv数据集配置,如图所示: enter image description here

现在我添加了常量计时器,如图所示: enter image description here

现在我添加了HTTP请求,如图所示: enter image description here 我添加了视图结果树监听器并点击了播放按钮。

当我看到每个样本的视图结果树中的示例开始时,延迟不是根据csv文件中存在的延迟。我做错了什么。

EDIT2 我将常量计时器作为HTTP请求的子项。请在下面的屏幕截图中找到请求的时间。你看错了吗?

enter image description here

EDIT3

我遵循了bean shell timre方法,当延迟大于之前的响应时间时,它工作正常。但是,当前一个响应时间大于延迟时,它无法正常工作。

我修改了csv文件如下(减少延迟到100毫秒)

0,/myAPP/home
100,/myAPP/home
100,/myAPP/home

我删除了常量计时器并添加到bean shell计时器下面。

enter image description here

这是结果表: enter image description here

这些是日志行: enter image description here

2 个答案:

答案 0 :(得分:7)

开箱即用的访问日志采样器不适用于您尝试执行的操作。

您有两种选择:

1 - 在Jmeter之外进行所有处理工作并创建一个包含两个字段的CSV文件:URL和Delay,然后使用CSV数据集配置。

Youtube JMeter CSV教程:
http://www.youtube.com/watch?v=aEJNc3TW-g8

2 - 在JMeter中进行处理。如果您是Java开发人员,则可以编写beanshell脚本来读取文件并解析URL和时间戳并计算延迟。

这是一个例子:
How to read a string from .csv file and split it?

编辑1
使用您的问题和屏幕截图中的数据看起来一切正常。 关于JMeter延迟的一些事情(使用计时器) - JMeter将在请求之后(而不是之前)添加延迟
- Jmeter将在服务器完成响应后启动延迟。

在你的情况下(我四舍五入到最接近的秒):
最初请求时间为12:59:53
+请求花了24.5秒
+ 0秒延迟
=下一个请求应该是在13:00:18,这确实是在下一个请求发生时。

13:00:18的第二次请求 +请求花了1.8秒左右 + 5秒延迟
=下一个请求应该是在13:00:25,这确实是在下一个请求发生时。

我认为你想要的是下一个请求不会影响响应时间。另外,您需要创建$ {delay} - $ {responseTime}

的延迟

编辑2
为了创建一个延迟,它会影响响应时间,你需要使用beanshell计时器而不是常量计时器。

这是代码(把它放在beanshell计时器的脚本部分中):

rtime = Integer.parseInt(String.valueOf(prev.getTime())); // on first run will raise warning
delay = Integer.parseInt(vars.get("delay"));    

Integer sleep = delay - rtime;

log.info( "Sleep for " + sleep.toString() + " milli-seconds" );
return sleep;  

编辑3
如果response_time> desired_delay吗
如果睡眠计算小于零,则不会有任何中断。它只会睡眠零毫秒。

如果现有请求尚未完成,则只有一个线程无法发出额外请求。从技术上讲,当一个线程不足以保持确切的延迟时,应该可以让不同的线程开始发出请求,但这需要内部线程通信,这可能非常快速地变得非常混乱并且需要beanhell脚本。

答案 1 :(得分:0)

我知道这是一个旧线程,但我遇到了同样的需求 - 重新模拟记录的请求, 我所做的是:

  1. 我的 csv 看起来像:{timstamp},{method} 例如:

    2016-06-24T18:25:03.621Z,/myAPP/home

    2016-06-24T18:25:04.621Z,/myAPP/home

  2. 我将差异从现在到 setUp Thread Group 中的第一个时间戳保存为 属性(不是变量,因为变量不在组之间共享)

  3. 我使用这个差异来计算每个请求执行前的延迟

完美运行,多线程并且请求永远不会重复:)

*注意:我只想通过 csv 一次,如果您想多次重复它,则必须重新计算在步骤 2 中初始化的差异

*注意 2:确保你有足够的线程来异步运行所有请求

这种方法将给您带来两个主要的延迟优势:

-使用真实日志数据而不转换为延迟

-当延迟小于响应时间时它可以解决您的问题,因为在这种情况下请求将从另一个线程运行