如何将时间戳变量传递给 jmeter 的 JDBC 请求
How do you pass in timestamp variable into JDBC request for jmeter
我正在学习使用 jmeter(第一次)对我们的地理空间 postgres (postgis) 数据库进行一些性能测试。我想使用 JDBC 请求采样器 sql 查询来不断访问数据库,但是我需要更改查询中的时间戳,问题是它们不是普通参数,它们在字符串中在函数调用中。
SELECT int_temp_f,
observed_utc,
encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
"ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
NULL,
0,
'latest',
'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',
TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;
如何使用jmeter变量替换字符串中的用户定义?
'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',
我想做这样的事情:
'observed >= ''${start_timestamp}'' AND observed < ''${end_timestamp}'' ',
这可能吗?
最终我想将时间戳更新为始终 'today'。但是在研究了如何在正常的 SQL 替换情况下执行时间戳变量之后,我认为我可以接受现在只需将时间戳替换为用户定义的变量。
您确实可以在 JDBC 查询中使用 jmeter 变量。
SELECT int_temp_f,
observed_utc,
encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
"ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
NULL,
0,
'latest',
'observed >= ''${StartDate}'' AND observed < ''${EndDateHour}'' ',
TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;
这里的技巧是获取有效的时间戳。正如 RaGe 上面指出的那样,beanShell 就是答案。
您可以像这样创建一个简单的用户分配变量:
${__BeanShell(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))}
或者在我的例子中,我需要对时间戳做一些额外的修改,所以我创建了一个 beanshell 预处理器。 有几个解释。
这是我输入的内容:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.Calendar;
int backhour = -5
int forehour = 1
int foremin = 5
Date date = new Date();
date.setDate(date.getDate());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); // needs to be 2015-06-09 15:00:00Z
Calendar c = Calendar.getInstance(); // get Java Calendar instance
c.setTime(date); // set Calendar time to now
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.add(Calendar.HOUR, backhour); // add -X hours
df.setTimeZone(TimeZone.getTimeZone("UTC")); // set the dateformat to use UTC
String startDate = df.format(c.getTime()); //create string of calendar object
vars.put("StartDate",startDate); // set the jmeter var to StartDate
//set the next var 1 hour ahead
c.add(Calendar.HOUR, forehour); // add 1 hour
String endDateHour = df.format(c.getTime()); //create string of calendar object
vars.put("EndDateHour",endDateHour); // set the jmeter var to EndDate
c.add(Calendar.HOUR, -forehour); // minus the hour so we can resuse c
您可以使用 JMeter 的 __time() function right inside your SQL query, it returns current date in the form controllable by a SimpleDataFormat 模式。
我正在学习使用 jmeter(第一次)对我们的地理空间 postgres (postgis) 数据库进行一些性能测试。我想使用 JDBC 请求采样器 sql 查询来不断访问数据库,但是我需要更改查询中的时间戳,问题是它们不是普通参数,它们在字符串中在函数调用中。
SELECT int_temp_f,
observed_utc,
encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
"ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
NULL,
0,
'latest',
'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',
TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;
如何使用jmeter变量替换字符串中的用户定义?
'observed >= ''2015-06-08 14:00:00Z'' AND observed < ''2015-06-09 15:00:00Z'' ',
我想做这样的事情:
'observed >= ''${start_timestamp}'' AND observed < ''${end_timestamp}'' ',
这可能吗?
最终我想将时间戳更新为始终 'today'。但是在研究了如何在正常的 SQL 替换情况下执行时间戳变量之后,我认为我可以接受现在只需将时间戳替换为用户定义的变量。
您确实可以在 JDBC 查询中使用 jmeter 变量。
SELECT int_temp_f,
observed_utc,
encode(ST_AsBinary(ST_Force_2D("geometry_4326"),'NDR'),'hex') AS geom,
"ogc_featureid"
FROM fn_surfaceobs_temperature(ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326),
NULL,
0,
'latest',
'observed >= ''${StartDate}'' AND observed < ''${EndDateHour}'' ',
TRUE)
WHERE (geometry_4326 && ST_GeomFromText('POLYGON((-180 -90,-180 90,180 90,180 -90,-180 -90))',4326))
ORDER BY COALESCE(priority,0) DESC, observed DESC;
这里的技巧是获取有效的时间戳。正如 RaGe 上面指出的那样,beanShell 就是答案。
您可以像这样创建一个简单的用户分配变量:
${__BeanShell(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))}
或者在我的例子中,我需要对时间戳做一些额外的修改,所以我创建了一个 beanshell 预处理器。 有几个解释。
这是我输入的内容:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.Calendar;
int backhour = -5
int forehour = 1
int foremin = 5
Date date = new Date();
date.setDate(date.getDate());
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssZ"); // needs to be 2015-06-09 15:00:00Z
Calendar c = Calendar.getInstance(); // get Java Calendar instance
c.setTime(date); // set Calendar time to now
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.add(Calendar.HOUR, backhour); // add -X hours
df.setTimeZone(TimeZone.getTimeZone("UTC")); // set the dateformat to use UTC
String startDate = df.format(c.getTime()); //create string of calendar object
vars.put("StartDate",startDate); // set the jmeter var to StartDate
//set the next var 1 hour ahead
c.add(Calendar.HOUR, forehour); // add 1 hour
String endDateHour = df.format(c.getTime()); //create string of calendar object
vars.put("EndDateHour",endDateHour); // set the jmeter var to EndDate
c.add(Calendar.HOUR, -forehour); // minus the hour so we can resuse c
您可以使用 JMeter 的 __time() function right inside your SQL query, it returns current date in the form controllable by a SimpleDataFormat 模式。