gfunc.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. define([
  2. 'underscore'
  3. ],
  4. function (_) {
  5. 'use strict';
  6. var index = [];
  7. var categories = {
  8. Combine: [],
  9. Transform: [],
  10. Calculate: [],
  11. Filter: [],
  12. Special: []
  13. };
  14. function addFuncDef(funcDef) {
  15. funcDef.params = funcDef.params || [];
  16. funcDef.defaultParams = funcDef.defaultParams || [];
  17. if (funcDef.category) {
  18. funcDef.category.push(funcDef);
  19. }
  20. index[funcDef.name] = funcDef;
  21. index[funcDef.shortName || funcDef.name] = funcDef;
  22. }
  23. addFuncDef({
  24. name: 'scaleToSeconds',
  25. category: categories.Transform,
  26. params: [ { name: 'seconds', type: 'int' } ],
  27. defaultParams: [1],
  28. });
  29. addFuncDef({
  30. name: "holtWintersForecast",
  31. category: categories.Calculate,
  32. });
  33. addFuncDef({
  34. name: "holtWintersConfidenceBands",
  35. category: categories.Calculate,
  36. params: [ { name: "delta", type: 'int' } ],
  37. defaultParams: [3]
  38. });
  39. addFuncDef({
  40. name: "holtWintersAberration",
  41. category: categories.Calculate,
  42. params: [ { name: "delta", type: 'int' } ],
  43. defaultParams: [3]
  44. });
  45. addFuncDef({
  46. name: 'sumSeries',
  47. shortName: 'sum',
  48. category: categories.Combine,
  49. });
  50. addFuncDef({
  51. name: 'averageSeries',
  52. shortName: 'avg',
  53. category: categories.Combine,
  54. });
  55. addFuncDef({
  56. name: 'percentileOfSeries',
  57. category: categories.Combine,
  58. params: [ { name: "n", type: "int" }, { name: "interpolate", type: "select", options: ["true", "false"] } ],
  59. defaultParams: [95, "false"]
  60. });
  61. addFuncDef({
  62. name: 'sumSeriesWithWildcards',
  63. category: categories.Combine,
  64. params: [ { name: "node", type: "int" } ],
  65. defaultParams: [3]
  66. });
  67. addFuncDef({
  68. name: 'averageSeriesWithWildcards',
  69. category: categories.Combine,
  70. params: [ { name: "node", type: "int" } ],
  71. defaultParams: [3]
  72. });
  73. addFuncDef({
  74. name: "alias",
  75. category: categories.Special,
  76. params: [ { name: "alias", type: 'string' } ],
  77. defaultParams: ['alias']
  78. });
  79. addFuncDef({
  80. name: "aliasSub",
  81. category: categories.Special,
  82. params: [ { name: "search", type: 'string' }, { name: "replace", type: 'string' } ],
  83. defaultParams: ['', '']
  84. });
  85. addFuncDef({
  86. name: "stacked",
  87. category: categories.Special,
  88. params: [ { name: "stack", type: 'string' } ],
  89. defaultParams: ['stacked']
  90. });
  91. addFuncDef({
  92. name: "groupByNode",
  93. category: categories.Special,
  94. params: [
  95. {
  96. name: "node",
  97. type: "int",
  98. options: [1,2,3,4,5,6,7,8,9,10,12]
  99. },
  100. {
  101. name: "function",
  102. type: "string",
  103. options: ['sum', 'avg']
  104. }
  105. ],
  106. defaultParams: [3, "sum"]
  107. });
  108. addFuncDef({
  109. name: 'aliasByNode',
  110. category: categories.Special,
  111. params: [ { name: "node", type: "int", options: [0,1,2,3,4,5,6,7,8,9,10,12] } ],
  112. defaultParams: [3]
  113. });
  114. addFuncDef({
  115. name: 'sortByName',
  116. category: categories.Special
  117. });
  118. addFuncDef({
  119. name: 'aliasByMetric',
  120. category: categories.Special,
  121. });
  122. addFuncDef({
  123. name: 'randomWalk',
  124. category: categories.Special,
  125. params: [ { name: "name", type: "string", } ],
  126. defaultParams: ['randomWalk']
  127. });
  128. addFuncDef({
  129. name: 'countSeries',
  130. category: categories.Special
  131. });
  132. addFuncDef({
  133. name: 'constantLine',
  134. category: categories.Special,
  135. params: [ { name: "value", type: "int", } ],
  136. defaultParams: [10]
  137. });
  138. addFuncDef({
  139. name: 'cactiStyle',
  140. category: categories.Special,
  141. });
  142. addFuncDef({
  143. name: 'scale',
  144. category: categories.Transform,
  145. params: [ { name: "factor", type: "int", } ],
  146. defaultParams: [1]
  147. });
  148. addFuncDef({
  149. name: 'offset',
  150. category: categories.Transform,
  151. params: [ { name: "amount", type: "int", } ],
  152. defaultParams: [10]
  153. });
  154. addFuncDef({
  155. name: 'integral',
  156. category: categories.Transform,
  157. });
  158. addFuncDef({
  159. name: 'derivative',
  160. category: categories.Transform,
  161. });
  162. addFuncDef({
  163. name: 'nonNegativeDerivative',
  164. category: categories.Transform,
  165. params: [ { name: "max value or 0", type: "int", } ],
  166. defaultParams: [0]
  167. });
  168. addFuncDef({
  169. name: 'timeShift',
  170. category: categories.Transform,
  171. params: [ { name: "amount", type: "select", options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'] }],
  172. defaultParams: ['1d']
  173. });
  174. addFuncDef({
  175. name: 'summarize',
  176. category: categories.Transform,
  177. params: [ { name: "interval", type: "string" }, { name: "func", type: "select", options: ['sum', 'avg', 'min', 'max', 'last'] }],
  178. defaultParams: ['1h', 'sum']
  179. });
  180. addFuncDef({
  181. name: 'absolute',
  182. category: categories.Transform,
  183. });
  184. addFuncDef({
  185. name: 'averageAbove',
  186. category: categories.Filter,
  187. params: [ { name: "n", type: "int", } ],
  188. defaultParams: [25]
  189. });
  190. addFuncDef({
  191. name: 'averageBelow',
  192. category: categories.Filter,
  193. params: [ { name: "n", type: "int", } ],
  194. defaultParams: [25]
  195. });
  196. addFuncDef({
  197. name: 'currentAbove',
  198. category: categories.Filter,
  199. params: [ { name: "n", type: "int", } ],
  200. defaultParams: [25]
  201. });
  202. addFuncDef({
  203. name: 'currentBelow',
  204. category: categories.Filter,
  205. params: [ { name: "n", type: "int", } ],
  206. defaultParams: [25]
  207. });
  208. addFuncDef({
  209. name: "exclude",
  210. category: categories.Filter,
  211. params: [ { name: "exclude", type: 'string' } ],
  212. defaultParams: ['exclude']
  213. });
  214. addFuncDef({
  215. name: 'highestCurrent',
  216. category: categories.Filter,
  217. params: [ { name: "count", type: "int" } ],
  218. defaultParams: [5]
  219. });
  220. addFuncDef({
  221. name: 'highestMax',
  222. category: categories.Filter,
  223. params: [ { name: "count", type: "int" } ],
  224. defaultParams: [5]
  225. });
  226. addFuncDef({
  227. name: 'lowestCurrent',
  228. category: categories.Filter,
  229. params: [ { name: "count", type: "int" } ],
  230. defaultParams: [5]
  231. });
  232. addFuncDef({
  233. name: 'movingAverage',
  234. category: categories.Filter,
  235. params: [ { name: "window size", type: "int" } ],
  236. defaultParams: [10]
  237. });
  238. addFuncDef({
  239. name: 'highestAverage',
  240. category: categories.Filter,
  241. params: [ { name: "count", type: "int" } ],
  242. defaultParams: [5]
  243. });
  244. addFuncDef({
  245. name: 'lowestAverage',
  246. category: categories.Filter,
  247. params: [ { name: "count", type: "int" } ],
  248. defaultParams: [5]
  249. });
  250. _.each(categories, function(funcList, catName) {
  251. categories[catName] = _.sortBy(funcList, 'name');
  252. });
  253. function FuncInstance(funcDef) {
  254. this.def = funcDef;
  255. this.params = funcDef.defaultParams.slice(0);
  256. this.updateText();
  257. }
  258. FuncInstance.prototype.render = function(metricExp) {
  259. var str = this.def.name + '(';
  260. var parameters = _.map(this.params, function(value) {
  261. return _.isString(value) ? "'" + value + "'" : value;
  262. });
  263. if (metricExp !== undefined) {
  264. parameters.unshift(metricExp);
  265. }
  266. return str + parameters.join(',') + ')';
  267. };
  268. FuncInstance.prototype.updateParam = function(strValue, index) {
  269. var oldValue = this.params[index];
  270. if (this.def.params[index].type === 'int') {
  271. this.params[index] = parseInt(strValue, 10);
  272. }
  273. else {
  274. this.params[index] = strValue;
  275. }
  276. this.updateText();
  277. return oldValue !== this.params[index];
  278. };
  279. FuncInstance.prototype.updateText = function () {
  280. if (this.params.length === 0) {
  281. this.text = this.def.name + '()';
  282. return;
  283. }
  284. var text = this.def.name + '(';
  285. _.each(this.def.params, function(param, index) {
  286. text += this.params[index] + ', ';
  287. }, this);
  288. text = text.substring(0, text.length - 2);
  289. text += ')';
  290. this.text = text;
  291. };
  292. return {
  293. createFuncInstance: function(funcDef) {
  294. if (_.isString(funcDef)) {
  295. if (!index[funcDef]) {
  296. throw { message: 'Method not found ' + name };
  297. }
  298. funcDef = index[funcDef];
  299. }
  300. return new FuncInstance(funcDef);
  301. },
  302. getFuncDef: function(name) {
  303. return index[name];
  304. },
  305. getCategories: function() {
  306. return categories;
  307. }
  308. };
  309. });