index.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. 'use strict';
  2. var express = require('express');
  3. var morgan = require('morgan');
  4. var bodyParser = require('body-parser');
  5. var app = express();
  6. var curlify = require('request-as-curl');
  7. var rp = require('request-promise-native');
  8. var timeout = process.env.TIMEOUT;
  9. var hosts = [];
  10. app.use(morgan('combined'));
  11. app.use(bodyParser.json());
  12. function setCORSHeaders(res) {
  13. res.setHeader("Access-Control-Allow-Origin", "*");
  14. res.setHeader("Access-Control-Allow-Methods", "POST");
  15. res.setHeader("Access-Control-Allow-Headers", "accept, content-type");
  16. }
  17. app.all('/', function(req, res) {
  18. setCORSHeaders(res);
  19. console.log(curlify(req, req.body));
  20. res.send('https://grafana.com/plugins/grafana-simple-json-datasource\n');
  21. res.end();
  22. });
  23. var search_result = [];
  24. /*
  25. app.all('/search', function(req, res) {
  26. console.log(curlify(req, req.body));
  27. search_result = [];
  28. var results = hosts.map(
  29. function(host, index) {
  30. var options = {
  31. method: 'POST',
  32. uri: host + '/search',
  33. body: req.body,
  34. timeout: timeout,
  35. json: true
  36. };
  37. return rp(options)
  38. .then(function(parsedBody) {
  39. if (search_result.length == 0) {
  40. search_result = parsedBody;
  41. } else {
  42. var values = parsedBody;
  43. for (var i = 0; i < values.length; i++) {
  44. if (search_result.indexOf(values[i]) === -1) {
  45. search_result.push(values[i]);
  46. }
  47. }
  48. search_result.sort();
  49. }
  50. return search_result;
  51. })
  52. .catch(function(err) {
  53. return err;
  54. });
  55. }
  56. );
  57. Promise.all(results).then(function(value) {
  58. setCORSHeaders(res);
  59. res.json(search_result);
  60. res.end();
  61. }, reason => {
  62. console.log(reason)
  63. res.status(500).send(reason);
  64. });
  65. });
  66. */
  67. app.all('/query', function(req, res) {
  68. console.log(curlify(req, req.body));
  69. var data = req.body;
  70. var from = 'now';
  71. var to = 'now+6';
  72. var interval = '30s';
  73. var intervalMS = 30000;
  74. var maxDataPoints = 50;
  75. var datapoints = [];
  76. var resp = [];
  77. if (data != null && data.range != null && data.range.from != null) {
  78. from = data.range.from;
  79. }
  80. if (data != null && data.range != null && data.range.to != null) {
  81. to = data.range.to;
  82. }
  83. if (data != null && data.interval != null) {
  84. interval = data.interval;
  85. }
  86. if (data != null && data.intervalMS != null) {
  87. intervalMS = data.intervalMS;
  88. }
  89. if (data != null && data.maxDataPoints != null) {
  90. maxDataPoints = data.maxDataPoints;
  91. }
  92. from = getTime(from);
  93. to = getTime(to);
  94. interval = getTimeInterval(interval);
  95. for (var i = 0; i < data.targets.length; i++) {
  96. var target = data.targets[i].target;
  97. target = target.replace(/\s/g, '');
  98. if (target.indexOf('sin') !== -1) {
  99. datapoints = sin(from, to, interval, maxDataPoints, target);
  100. } else if (target.indexOf('const') !== -1) {
  101. datapoints = cons(from, to, interval, maxDataPoints, target);
  102. target = 'const';
  103. } else if (target.indexOf('random') !== -1) {
  104. datapoints = random(from, to, interval, maxDataPoints, target);
  105. } else if (target.indexOf('saws') !== -1) {
  106. datapoints = saws(from, to, interval, maxDataPoints, target);
  107. }
  108. var obj = {
  109. "target": target,
  110. "datapoints": datapoints
  111. };
  112. resp.push(obj);
  113. }
  114. setCORSHeaders(res);
  115. res.json(resp);
  116. res.end();
  117. });
  118. /**
  119. * Funcion que dibuja una sierra
  120. */
  121. function saws(from, to, interval, maxDataPoints, target) {
  122. var datapoints = [];
  123. var min = 0;
  124. var max = 1;
  125. var variable = 0.25;
  126. var value = min;
  127. var values = getValuesOperations(target, 'saws');
  128. if (values == null) {
  129. if (interval == 20000) {
  130. interval = interval * 20;
  131. }
  132. } else {
  133. var numbers = getNumbers(values);
  134. if (numbers.length > 0) {
  135. min = parseFloat(numbers[0]);
  136. value = min;
  137. }
  138. if (numbers.length > 1) {
  139. max = parseFloat(numbers[1]);
  140. }
  141. if (numbers.length >= 2) {
  142. variable = parseFloat(numbers[2]);
  143. }
  144. }
  145. for(var i = 0; i < maxDataPoints; i++) {
  146. datapoints.push([value, from]);
  147. if (value >= max) {
  148. value = min;
  149. datapoints.push([value, from]);
  150. i++;
  151. }
  152. value += variable;
  153. from = from + interval;
  154. }
  155. return datapoints;
  156. }
  157. /**
  158. * Funcion que genera puntos random
  159. */
  160. function random(from, to, interval, maxDataPoints, target) {
  161. var datapoints = [];
  162. var min = 0;
  163. var max = 1;
  164. var values = getValuesOperations(target, 'random');
  165. if (values == null) {
  166. if (interval == 20000) {
  167. interval = interval * 20;
  168. }
  169. } else {
  170. var numbers = getNumbers(values);
  171. if (numbers.length > 0) {
  172. min = parseFloat(numbers[0]);
  173. }
  174. if (numbers.length >= 1) {
  175. max = parseFloat(numbers[1]);
  176. }
  177. }
  178. for(var i = 0; i < maxDataPoints; i++) {
  179. datapoints.push([Math.floor(Math.random()*(max-min+1))+min, from]);
  180. from = from + interval;
  181. }
  182. return datapoints;
  183. }
  184. /**
  185. * Funcion que genera una constante
  186. */
  187. function cons(from, to, interval, maxDataPoints, target) {
  188. var datapoints = [];
  189. var values = getValuesOperations(target, 'const');
  190. for(var i = 0; i < maxDataPoints; i++) {
  191. if (values == null) {
  192. datapoints.push([1, from]);
  193. } else {
  194. datapoints.push([values, from]);
  195. }
  196. from = from + interval;
  197. }
  198. return datapoints;
  199. }
  200. /**
  201. * Funcion que dibuja un seno
  202. */
  203. function sin(from, to, interval, maxDataPoints, target) {
  204. var datapoints = [];
  205. var values = getValuesOperations(target, 'sin');
  206. var variable = values == null ? '' : getVariable(values);
  207. for(var i = 0; i < maxDataPoints; i++) {
  208. if (values == null) {
  209. datapoints.push([Math.sin(from), from]);
  210. } else {
  211. datapoints.push([Math.sin(eval(values.replace(variable, from))), from]);
  212. }
  213. from = from + interval;
  214. }
  215. return datapoints;
  216. }
  217. /**
  218. * Obtiene el conjunto de parametros que se recibieron.
  219. */
  220. function getValuesOperations(target, func) {
  221. var rx = new RegExp(func + "\\((.*)\\)");
  222. var arr = rx.exec(target);
  223. if (arr != null && arr.length > 0) {
  224. return arr[1];
  225. } else {
  226. return null;
  227. }
  228. }
  229. /**
  230. * Obtiene el nombre de la variable que se paso como parametro.
  231. */
  232. function getVariable(parameter) {
  233. var rx = /[a-zA-Z]*/g;
  234. var resp = rx.exec(parameter);
  235. return resp;
  236. }
  237. /**
  238. * Obtiene los valores de los parametros que se reciben.
  239. */
  240. function getNumbers(parameters) {
  241. var arr = parameters.split(',');
  242. if (arr != null && arr.length > 0) {
  243. return arr;
  244. } else {
  245. return null;
  246. }
  247. }
  248. /**
  249. * Obtiene los milisegundos a partir del valor pasado como parametro.
  250. * Se puede sumar o restar valorres en horas
  251. */
  252. function getTime(value) {
  253. if (value.indexOf('now') !== -1) {
  254. var time = new Date().getTime();
  255. if (value.indexOf('+') !== -1) {
  256. var tmp = value.split('+');
  257. if (tmp.length() > 0) {
  258. value = time + (tmp[1] * 3600000);
  259. } else {
  260. value = time;
  261. }
  262. } else if (to.indexOf('-') !== -1) {
  263. var tmp = value.split('-');
  264. if (tmp.length() > 0) {
  265. value = time - (tmp[1] * 3600000);
  266. } else {
  267. value = time;
  268. }
  269. } else {
  270. value = time;
  271. }
  272. } else {
  273. // parseo el valor recibido
  274. value = new Date(value).getTime();
  275. }
  276. return value;
  277. }
  278. /**
  279. * Se obtiene un intervalo de tiempo en milisegungos a partir de segundos o minutos.
  280. */
  281. function getTimeInterval(value) {
  282. if (value.indexOf('s') !== -1) {
  283. value = parseInt(value.replace('s','')) * 1000;
  284. } else if (value.indexOf('m') !== -1) {
  285. value = parseInt(value.replace('m','')) * 1000 * 60;
  286. }
  287. return value;
  288. }
  289. app.listen(8000);
  290. console.log("Server is listening to port 8000");