|
@@ -1,6 +1,7 @@
|
|
|
|
|
|
// 输入输出参数格式化
|
|
|
input = INPUT;
|
|
|
+output = {};
|
|
|
try {
|
|
|
input = decodeURIComponent(input);
|
|
|
} catch (e) { }
|
|
@@ -9,71 +10,109 @@ try {
|
|
|
} catch (e) { }
|
|
|
try {
|
|
|
input = JSON.parse(input);
|
|
|
- input = JSON.parse(input);
|
|
|
+ input = JSON.parse(input); // 解析可能存在的重复编码
|
|
|
} catch (e) { }
|
|
|
-output = {};
|
|
|
|
|
|
-// 环境参数
|
|
|
+// 环境配置参数,配置定义在 etcd:/matrix/data/api/cfg.json
|
|
|
cfg = {};
|
|
|
try {
|
|
|
- cfg = JSON.parse(etcd.get("/api/test.json"));
|
|
|
+ cfg = JSON.parse(etcd.get("/api/cfg.json"));
|
|
|
} catch (e) { }
|
|
|
|
|
|
-// 默认参数
|
|
|
-var defaultinput = function() {
|
|
|
- var tsms = new Date().getTime() - 3600 * 1000;
|
|
|
- var tss = parseInt(tsms / 1000);
|
|
|
- var tse = tss + 3600;
|
|
|
- return {
|
|
|
- sid: "",
|
|
|
- kpi: "cpu_busy",
|
|
|
- starttime: tss,
|
|
|
- endtime: tse
|
|
|
- };
|
|
|
-}();
|
|
|
-
|
|
|
// 函数定义
|
|
|
-function f() {
|
|
|
-
|
|
|
+// 从 ODB 获取数据
|
|
|
+function getData(type, tms, tme) {
|
|
|
+ var data = [];
|
|
|
+ // TODO:从 ODB 获取数据
|
|
|
+ if (cfg.env == "test") {
|
|
|
+ // 测试生成假数据
|
|
|
+ for (var t = tms; t <= tme; t += 60 * 1000) {
|
|
|
+ data.push({
|
|
|
+ type: type,
|
|
|
+ time: new Date(t),
|
|
|
+ RV: parseInt(Math.random() * 500 + 1000), // 交易量
|
|
|
+ RS: Math.random() * 5 + 95, // 系统成功率
|
|
|
+ RD: parseInt(Math.random() * 500 + 100), // 平均响应时间
|
|
|
+ RR: Math.random() * 5 + 95, // 交易响应率
|
|
|
+ FV: parseInt(Math.random() * 10), // 失败笔数
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return data;
|
|
|
+}
|
|
|
+
|
|
|
+// 格式化数据
|
|
|
+function formatData(data) {
|
|
|
+ if (data.length == 0) {
|
|
|
+ // 无数据返回 {}
|
|
|
+ return {};
|
|
|
+ }
|
|
|
+ for (var i = 0; i < data.length; i++) {
|
|
|
+ data[i].time = data[i].time.toJSON().replace(/[TZ]/mg, " ").substring(0, 16); // 时间格式:yyyy-MM-dd HH:mm
|
|
|
+ data[i].RV = "" + parseInt(data[i].RV); // 交易量,1分钟统计周期内,总交易笔数
|
|
|
+ data[i].RS = "" + parseInt(data[i].RS * 100) / 100; // 系统成功率,四舍五入保留2位小数,系统成功率<=100
|
|
|
+ data[i].RD = "" + parseInt(data[i].RD); // 平均响应时间,单位ms,四舍五入取整数
|
|
|
+ data[i].RR = "" + parseInt(data[i].RR * 100) / 100; // 交易响应率,四舍五入保留2位小数,交易响应率<=100
|
|
|
+ data[i].FV = "" + parseInt(data[i].FV); // 失败笔数,1分钟统计周期内,失败交易笔数
|
|
|
+ }
|
|
|
+ if (data.length == 1) {
|
|
|
+ // 单条数据直接返回对象
|
|
|
+ data = data[0];
|
|
|
+ }
|
|
|
+ return data
|
|
|
+}
|
|
|
+
|
|
|
+// 解析时间字符串 格式为 yyyyMMddHHmm
|
|
|
+function parseTime(ymdhm) {
|
|
|
+ try {
|
|
|
+ if (!/^\d{12}$/.test(ymdhm)) {
|
|
|
+ throw ("format error");
|
|
|
+ }
|
|
|
+ var d = new Date(
|
|
|
+ parseInt(ymdhm.substring(0, 4)),
|
|
|
+ parseInt(ymdhm.substring(4, 6)) - 1,
|
|
|
+ parseInt(ymdhm.substring(6, 8)),
|
|
|
+ parseInt(ymdhm.substring(8, 10)),
|
|
|
+ parseInt(ymdhm.substring(10, 12))
|
|
|
+ );
|
|
|
+ d.setMinutes(d.getMinutes() - d.getTimezoneOffset());
|
|
|
+ return d;
|
|
|
+ } catch (e) {
|
|
|
+ throw ("时间格式错误,正确格式是 yyyyMMddHHmm");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 主执行阶段
|
|
|
try {
|
|
|
- var kpi = input.kpi;
|
|
|
- if (!kpi) {
|
|
|
- kpi = defaultinput.kpi;
|
|
|
+ // 参数检查
|
|
|
+ var type = input.type;
|
|
|
+ if (!type) {
|
|
|
+ throw ("必须指定参数 type,如:HVPS,BEPS,IBPS,FXPS");
|
|
|
}
|
|
|
- if (kpi != "cpu_busy") {
|
|
|
- throw("测试环境只有 cpu_busy 数据");
|
|
|
- }
|
|
|
- var starttime = input.starttime;
|
|
|
+ var starttime = input.time;
|
|
|
if (!starttime) {
|
|
|
- starttime = defaultinput.starttime;
|
|
|
+ throw ("必须指定参数 time,格式为 yyyyMMddHHmm");
|
|
|
}
|
|
|
- var endtime = input.endtime;
|
|
|
+ var endtime = input.endtime; // 可选参数,指定结束时间,可以获取一段时间的数据
|
|
|
if (!endtime) {
|
|
|
- endtime = defaultinput.endtime;
|
|
|
- }
|
|
|
- starttime = parseInt(starttime / 10) * 10;
|
|
|
- var data = [];
|
|
|
- var d = 30 + parseInt(Math.random() * 50 - 25);
|
|
|
- for(var t=starttime; t<=endtime; t+=10) {
|
|
|
- d += parseInt(Math.random() * 10 - 5);
|
|
|
- if (d < 5) {
|
|
|
- d = 5;
|
|
|
- }
|
|
|
- if (d > 95) {
|
|
|
- d = 95;
|
|
|
- }
|
|
|
- data.push([t, kpi, d]);
|
|
|
+ endtime = input.time;
|
|
|
}
|
|
|
+ // 参数解析
|
|
|
+ var tms = parseTime("" + starttime).getTime();
|
|
|
+ var tme = parseTime("" + endtime).getTime();
|
|
|
+ // 数据获取
|
|
|
+ var data = getData(type, tms, tme);
|
|
|
+ // 数据格式化
|
|
|
+ data = formatData(data);
|
|
|
+ // 数据输出
|
|
|
output.data = data;
|
|
|
} catch (e) {
|
|
|
+ // 错误信息输出处理,抛出 ok 表示正常结束
|
|
|
if (e != "ok") {
|
|
|
if (typeof (e) == "object") {
|
|
|
output.error = e;
|
|
|
} else if (typeof (e) == "string") {
|
|
|
- output.error = "读数错误:" + e;
|
|
|
+ output.error = "错误:" + e;
|
|
|
} else {
|
|
|
output.error = JSON.stringify(e);
|
|
|
}
|