@Override
	public void update(final StatisticsSet intervalStatistics, final StatisticsSet cumulativeStatistics) {
		try {
			if (!capture) {
				return;
			}
			samplingCount++;
			long currentPeriod = cumulativeStatistics.getValue(getSampleModel().getPeriodIndex());
			setTpsValue(sampleModel.getTPSExpression().getDoubleValue(intervalStatistics));
			checkTooLowTps(getTpsValues());
			updateStatistics(intervalStatistics, cumulativeStatistics);

			writeIntervalCsvData(intervalStatistics);
			int interval = getSampleModel().getSampleInterval();
			long gap = 1;
			if (samplingCount == 1) {
				lastSamplingPeriod = currentPeriod;
			} else {
				lastSamplingPeriod = lastSamplingPeriod + interval;
				gap = ((currentPeriod - lastSamplingPeriod) / interval);
			}
			// Adjust sampling delay.. run write data multiple times... when it
			// takes longer than 1 sec.

			samplingLifeCycleListener.apply(listener -> {
				listener.onSampling(getReportPath(), intervalStatistics, cumulativeStatistics);
			});
			for (long index = 0, repeatCounts = gap + 1; index < repeatCounts; index++) {
				final boolean lastCall = (samplingCount == 1 && index == 0) || (samplingCount != 1 && index == gap);
				writeIntervalSummaryData(intervalStatistics, lastCall);
				if (interval >= (MIN_SAMPLING_INTERVAL_TO_ACTIVATE_TPS_PER_TEST)) {
					writeIntervalSummaryDataPerTest(intervalStatisticMapPerTest, lastCall);
				}
				samplingLifeCycleFollowupListener.apply(listener -> {
					listener.onSampling(getReportPath(), intervalStatistics, cumulativeStatistics, lastCall);
				});
			}

			lastSamplingPeriod = lastSamplingPeriod + (interval * gap);
		} catch (RuntimeException e) {
			LOGGER.error("Error occurred while updating the statistics : {}", e.getMessage());
			LOGGER.debug("Details : ", e);
			throw e;
		}
	}
The last timestamp when the sampling is done.
ngrinder-core/src/main/java/net/grinder/SingleConsole.java