perf.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // 输入输出参数格式化
  2. input = INPUT;
  3. output = {};
  4. try {
  5. input = decodeURIComponent(input);
  6. } catch (e) { }
  7. try {
  8. input = base64.decode(input);
  9. } catch (e) { }
  10. try {
  11. input = JSON.parse(input);
  12. input = JSON.parse(input); // 解析可能存在的重复编码
  13. } catch (e) { }
  14. // 环境配置参数,配置定义在 etcd:/matrix/data/api/cfg.json
  15. cfg = {};
  16. try {
  17. cfg = JSON.parse(etcd.get("/api/cfg.json"));
  18. } catch (e) { }
  19. // 函数定义
  20. // 从 ODB 获取数据
  21. function getData(type, tms, tme) {
  22. var data = [];
  23. // TODO:从 ODB 获取数据
  24. if (cfg.env == "test") {
  25. // 测试生成假数据
  26. for (var t = tms; t <= tme; t += 60 * 1000) {
  27. data.push({
  28. type: type,
  29. time: new Date(t),
  30. RV: parseInt(Math.random() * 500 + 1000), // 交易量
  31. RS: Math.random() * 5 + 95, // 系统成功率
  32. RD: parseInt(Math.random() * 500 + 100), // 平均响应时间
  33. RR: Math.random() * 5 + 95, // 交易响应率
  34. FV: parseInt(Math.random() * 10), // 失败笔数
  35. });
  36. }
  37. }
  38. return data;
  39. }
  40. // 格式化数据
  41. function formatData(data) {
  42. if (data.length == 0) {
  43. // 无数据返回 {}
  44. return {};
  45. }
  46. for (var i = 0; i < data.length; i++) {
  47. data[i].time = data[i].time.toJSON().replace(/[TZ]/mg, " ").substring(0, 16); // 时间格式:yyyy-MM-dd HH:mm
  48. data[i].RV = "" + parseInt(data[i].RV); // 交易量,1分钟统计周期内,总交易笔数
  49. data[i].RS = "" + parseInt(data[i].RS * 100) / 100; // 系统成功率,四舍五入保留2位小数,系统成功率<=100
  50. data[i].RD = "" + parseInt(data[i].RD); // 平均响应时间,单位ms,四舍五入取整数
  51. data[i].RR = "" + parseInt(data[i].RR * 100) / 100; // 交易响应率,四舍五入保留2位小数,交易响应率<=100
  52. data[i].FV = "" + parseInt(data[i].FV); // 失败笔数,1分钟统计周期内,失败交易笔数
  53. }
  54. if (data.length == 1) {
  55. // 单条数据直接返回对象
  56. data = data[0];
  57. }
  58. return data
  59. }
  60. // 解析时间字符串 格式为 yyyyMMddHHmm
  61. function parseTime(ymdhm) {
  62. try {
  63. if (!/^\d{12}$/.test(ymdhm)) {
  64. throw ("format error");
  65. }
  66. var d = new Date(
  67. parseInt(ymdhm.substring(0, 4)),
  68. parseInt(ymdhm.substring(4, 6)) - 1,
  69. parseInt(ymdhm.substring(6, 8)),
  70. parseInt(ymdhm.substring(8, 10)),
  71. parseInt(ymdhm.substring(10, 12))
  72. );
  73. d.setMinutes(d.getMinutes() - d.getTimezoneOffset());
  74. return d;
  75. } catch (e) {
  76. throw ("时间格式错误,正确格式是 yyyyMMddHHmm");
  77. }
  78. }
  79. // 主执行阶段
  80. try {
  81. // 输入参数检查验证
  82. var type = input.type;
  83. if (!type) {
  84. throw ("必须指定参数 type,如:HVPS,BEPS,IBPS,FXPS");
  85. }
  86. var starttime = input.time;
  87. if (!starttime) {
  88. throw ("必须指定参数 time,格式为 yyyyMMddHHmm");
  89. }
  90. var endtime = input.endtime; // 可选参数,指定结束时间,可以获取一段时间的数据
  91. if (!endtime) {
  92. endtime = input.time;
  93. }
  94. // 参数解析
  95. var tms = parseTime("" + starttime).getTime();
  96. var tme = parseTime("" + endtime).getTime();
  97. // 数据获取
  98. var data = getData(type, tms, tme);
  99. // 数据格式化
  100. data = formatData(data);
  101. // 数据输出
  102. output.data = data;
  103. } catch (e) {
  104. // 错误信息输出处理,抛出 ok 表示正常结束
  105. if (e != "ok") {
  106. if (typeof (e) == "object") {
  107. output.error = e;
  108. } else if (typeof (e) == "string") {
  109. output.error = "错误:" + e;
  110. } else {
  111. output.error = JSON.stringify(e);
  112. }
  113. log.error(output.error);
  114. STATUS = "error";
  115. }
  116. }
  117. // 返回输出信息
  118. OUTPUT = output;