diff --git a/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java b/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java index 35f94b26982..d3fecbe2c8a 100644 --- a/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java +++ b/src/core/src/main/java/org/apache/jmeter/threads/JMeterThread.java @@ -722,6 +722,7 @@ private static void setLastSampleOk(JMeterVariables variables, boolean value) { */ private IterationListener initRun(JMeterContext threadContext) { threadVars.putObject(JMeterVariables.VAR_IS_SAME_USER_KEY, isSameUserOnNextIteration); + threadVars.putObject(JMeterVariables.VAR_THREAD_START_TIME_ITERATION, threadVars.getStartThreadTimeIteration()); threadContext.setVariables(threadVars); threadContext.setThreadNum(getThreadNum()); setLastSampleOk(threadVars, true); @@ -1019,6 +1020,8 @@ private void delay(List timers) { void notifyTestListeners() { threadVars.incIteration(); + threadVars.resetStartThreadTimeIteration(); + threadVars.putObject(JMeterVariables.VAR_THREAD_START_TIME_ITERATION, threadVars.getStartThreadTimeIteration()); for (TestIterationListener listener : testIterationStartListeners) { listener.testIterationStart(new LoopIterationEvent(threadGroupLoopController, threadVars.getIteration())); if (listener instanceof TestElement testElement) { diff --git a/src/core/src/main/java/org/apache/jmeter/threads/JMeterVariables.java b/src/core/src/main/java/org/apache/jmeter/threads/JMeterVariables.java index c13f1878f7d..22967f5f92d 100644 --- a/src/core/src/main/java/org/apache/jmeter/threads/JMeterVariables.java +++ b/src/core/src/main/java/org/apache/jmeter/threads/JMeterVariables.java @@ -33,6 +33,7 @@ public class JMeterVariables { private final Map variables = new HashMap<>(); private int iteration = 0; + private long startTimeThreadIteration = System.currentTimeMillis(); // Property names to preload into JMeter variables: private static final String [] PRE_LOAD = { @@ -43,6 +44,7 @@ public class JMeterVariables { }; static final String VAR_IS_SAME_USER_KEY = "__jmv_SAME_USER"; + static final String VAR_THREAD_START_TIME_ITERATION ="__jmv_THREAD_START_TIME_ITERATION"; /** * Constructor, that preloads the variables from the JMeter properties @@ -178,4 +180,12 @@ public Set> entrySet(){ public boolean isSameUserOnNextIteration() { return Boolean.TRUE.equals(variables.get(VAR_IS_SAME_USER_KEY)); } + + public void resetStartThreadTimeIteration() { + startTimeThreadIteration = System.currentTimeMillis(); + } + + public long getStartThreadTimeIteration() { + return startTimeThreadIteration; + } } diff --git a/src/core/src/main/java/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java b/src/core/src/main/java/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java index 194bf5716fc..50f2a54d243 100644 --- a/src/core/src/main/java/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java +++ b/src/core/src/main/java/org/apache/jmeter/threads/UnmodifiableJMeterVariables.java @@ -91,6 +91,16 @@ public String get(String key) { return variables.get(key); } + @Override + public long getStartThreadTimeIteration() { + return variables.getStartThreadTimeIteration(); + } + + @Override + public void resetStartThreadTimeIteration() { + throw new UnsupportedOperationException(); + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/xdocs/usermanual/functions.xml b/xdocs/usermanual/functions.xml index 5e4078ea48c..e997e5d3222 100644 --- a/xdocs/usermanual/functions.xml +++ b/xdocs/usermanual/functions.xml @@ -1765,6 +1765,7 @@ However some variables are defined internally by JMeter. These are listed below.
  • JMeterThread.last_sample_ok - whether or not the last sample was OK - true/false. Note: this is updated after PostProcessors and Assertions have been run.
  • +
  • __jmv_THREAD_START_TIME_ITERATION - contains the epoch unit milliseconds of the thread start iteration. Call function System.currentTimeMillis()
  • START variables (see next section)