gfunc.ts 22 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. import _ from 'lodash';
  2. import {isVersionGtOrEq} from 'app/core/utils/version';
  3. var index = [];
  4. var categories = {
  5. Combine: [],
  6. Transform: [],
  7. Calculate: [],
  8. Filter: [],
  9. Special: [],
  10. };
  11. function addFuncDef(funcDef) {
  12. funcDef.params = funcDef.params || [];
  13. funcDef.defaultParams = funcDef.defaultParams || [];
  14. if (funcDef.category) {
  15. funcDef.category.push(funcDef);
  16. }
  17. index[funcDef.name] = funcDef;
  18. index[funcDef.shortName || funcDef.name] = funcDef;
  19. }
  20. var optionalSeriesRefArgs = [
  21. { name: 'other', type: 'value_or_series', optional: true },
  22. { name: 'other', type: 'value_or_series', optional: true },
  23. { name: 'other', type: 'value_or_series', optional: true },
  24. { name: 'other', type: 'value_or_series', optional: true },
  25. { name: 'other', type: 'value_or_series', optional: true },
  26. ];
  27. addFuncDef({
  28. name: 'scaleToSeconds',
  29. category: categories.Transform,
  30. params: [{ name: 'seconds', type: 'int' }],
  31. defaultParams: [1],
  32. });
  33. addFuncDef({
  34. name: 'perSecond',
  35. category: categories.Transform,
  36. params: [{ name: 'max value', type: 'int', optional: true }],
  37. defaultParams: [],
  38. });
  39. addFuncDef({
  40. name: 'holtWintersForecast',
  41. category: categories.Calculate,
  42. });
  43. addFuncDef({
  44. name: 'holtWintersConfidenceBands',
  45. category: categories.Calculate,
  46. params: [{ name: 'delta', type: 'int' }],
  47. defaultParams: [3],
  48. });
  49. addFuncDef({
  50. name: 'holtWintersAberration',
  51. category: categories.Calculate,
  52. params: [{ name: 'delta', type: 'int' }],
  53. defaultParams: [3],
  54. });
  55. addFuncDef({
  56. name: 'nPercentile',
  57. category: categories.Calculate,
  58. params: [{ name: 'Nth percentile', type: 'int' }],
  59. defaultParams: [95],
  60. });
  61. addFuncDef({
  62. name: 'diffSeries',
  63. params: optionalSeriesRefArgs,
  64. defaultParams: ['#A'],
  65. category: categories.Calculate,
  66. });
  67. addFuncDef({
  68. name: 'stddevSeries',
  69. params: optionalSeriesRefArgs,
  70. defaultParams: [''],
  71. category: categories.Calculate,
  72. });
  73. addFuncDef({
  74. name: 'divideSeries',
  75. params: optionalSeriesRefArgs,
  76. defaultParams: ['#A'],
  77. category: categories.Calculate,
  78. });
  79. addFuncDef({
  80. name: 'multiplySeries',
  81. params: optionalSeriesRefArgs,
  82. defaultParams: ['#A'],
  83. category: categories.Calculate,
  84. });
  85. addFuncDef({
  86. name: 'asPercent',
  87. params: optionalSeriesRefArgs,
  88. defaultParams: ['#A'],
  89. category: categories.Calculate,
  90. });
  91. addFuncDef({
  92. name: 'group',
  93. params: optionalSeriesRefArgs,
  94. defaultParams: ['#A', '#B'],
  95. category: categories.Combine,
  96. });
  97. addFuncDef({
  98. name: 'sumSeries',
  99. shortName: 'sum',
  100. category: categories.Combine,
  101. params: optionalSeriesRefArgs,
  102. defaultParams: [''],
  103. });
  104. addFuncDef({
  105. name: 'averageSeries',
  106. shortName: 'avg',
  107. category: categories.Combine,
  108. params: optionalSeriesRefArgs,
  109. defaultParams: [''],
  110. });
  111. addFuncDef({
  112. name: 'rangeOfSeries',
  113. category: categories.Combine,
  114. });
  115. addFuncDef({
  116. name: 'percentileOfSeries',
  117. category: categories.Combine,
  118. params: [{ name: 'n', type: 'int' }, { name: 'interpolate', type: 'boolean', options: ['true', 'false'] }],
  119. defaultParams: [95, 'false'],
  120. });
  121. addFuncDef({
  122. name: 'sumSeriesWithWildcards',
  123. category: categories.Combine,
  124. params: [
  125. { name: 'node', type: 'int' },
  126. { name: 'node', type: 'int', optional: true },
  127. { name: 'node', type: 'int', optional: true },
  128. { name: 'node', type: 'int', optional: true },
  129. ],
  130. defaultParams: [3],
  131. });
  132. addFuncDef({
  133. name: 'maxSeries',
  134. shortName: 'max',
  135. category: categories.Combine,
  136. });
  137. addFuncDef({
  138. name: 'minSeries',
  139. shortName: 'min',
  140. category: categories.Combine,
  141. });
  142. addFuncDef({
  143. name: 'averageSeriesWithWildcards',
  144. category: categories.Combine,
  145. params: [{ name: 'node', type: 'int' }, { name: 'node', type: 'int', optional: true }],
  146. defaultParams: [3],
  147. });
  148. addFuncDef({
  149. name: 'alias',
  150. category: categories.Special,
  151. params: [{ name: 'alias', type: 'string' }],
  152. defaultParams: ['alias'],
  153. });
  154. addFuncDef({
  155. name: 'aliasSub',
  156. category: categories.Special,
  157. params: [{ name: 'search', type: 'string' }, { name: 'replace', type: 'string' }],
  158. defaultParams: ['', '\\1'],
  159. });
  160. addFuncDef({
  161. name: 'stacked',
  162. category: categories.Special,
  163. params: [{ name: 'stack', type: 'string' }],
  164. defaultParams: ['stacked'],
  165. });
  166. addFuncDef({
  167. name: 'consolidateBy',
  168. category: categories.Special,
  169. params: [
  170. {
  171. name: 'function',
  172. type: 'string',
  173. options: ['sum', 'average', 'min', 'max'],
  174. },
  175. ],
  176. defaultParams: ['max'],
  177. });
  178. addFuncDef({
  179. name: 'cumulative',
  180. category: categories.Special,
  181. params: [],
  182. defaultParams: [],
  183. });
  184. addFuncDef({
  185. name: 'groupByNode',
  186. category: categories.Special,
  187. params: [
  188. {
  189. name: 'node',
  190. type: 'int',
  191. options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12],
  192. },
  193. {
  194. name: 'function',
  195. type: 'string',
  196. options: ['sum', 'avg', 'maxSeries'],
  197. },
  198. ],
  199. defaultParams: [3, 'sum'],
  200. });
  201. addFuncDef({
  202. name: 'aliasByNode',
  203. category: categories.Special,
  204. params: [
  205. { name: 'node', type: 'int', options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12] },
  206. { name: 'node', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  207. { name: 'node', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  208. { name: 'node', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  209. ],
  210. defaultParams: [3],
  211. });
  212. addFuncDef({
  213. name: 'substr',
  214. category: categories.Special,
  215. params: [
  216. { name: 'start', type: 'int', options: [-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12] },
  217. { name: 'stop', type: 'int', options: [-6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12] },
  218. ],
  219. defaultParams: [0, 0],
  220. });
  221. addFuncDef({
  222. name: 'sortByName',
  223. category: categories.Special,
  224. params: [{ name: 'natural', type: 'boolean', options: ['true', 'false'], optional: true }],
  225. defaultParams: ['false'],
  226. });
  227. addFuncDef({
  228. name: 'sortByMaxima',
  229. category: categories.Special,
  230. });
  231. addFuncDef({
  232. name: 'sortByMinima',
  233. category: categories.Special,
  234. });
  235. addFuncDef({
  236. name: 'sortByTotal',
  237. category: categories.Special,
  238. });
  239. addFuncDef({
  240. name: 'aliasByMetric',
  241. category: categories.Special,
  242. });
  243. addFuncDef({
  244. name: 'randomWalk',
  245. fake: true,
  246. category: categories.Special,
  247. params: [{ name: 'name', type: 'string' }],
  248. defaultParams: ['randomWalk'],
  249. });
  250. addFuncDef({
  251. name: 'countSeries',
  252. category: categories.Special,
  253. });
  254. addFuncDef({
  255. name: 'constantLine',
  256. category: categories.Special,
  257. params: [{ name: 'value', type: 'int' }],
  258. defaultParams: [10],
  259. });
  260. addFuncDef({
  261. name: 'cactiStyle',
  262. category: categories.Special,
  263. });
  264. addFuncDef({
  265. name: 'keepLastValue',
  266. category: categories.Special,
  267. params: [{ name: 'n', type: 'int' }],
  268. defaultParams: [100],
  269. });
  270. addFuncDef({
  271. name: 'changed',
  272. category: categories.Special,
  273. params: [],
  274. defaultParams: [],
  275. });
  276. addFuncDef({
  277. name: 'scale',
  278. category: categories.Transform,
  279. params: [{ name: 'factor', type: 'int' }],
  280. defaultParams: [1],
  281. });
  282. addFuncDef({
  283. name: 'offset',
  284. category: categories.Transform,
  285. params: [{ name: 'amount', type: 'int' }],
  286. defaultParams: [10],
  287. });
  288. addFuncDef({
  289. name: 'transformNull',
  290. category: categories.Transform,
  291. params: [{ name: 'amount', type: 'int' }],
  292. defaultParams: [0],
  293. });
  294. addFuncDef({
  295. name: 'integral',
  296. category: categories.Transform,
  297. });
  298. addFuncDef({
  299. name: 'derivative',
  300. category: categories.Transform,
  301. });
  302. addFuncDef({
  303. name: 'nonNegativeDerivative',
  304. category: categories.Transform,
  305. params: [{ name: 'max value or 0', type: 'int', optional: true }],
  306. defaultParams: [''],
  307. });
  308. addFuncDef({
  309. name: 'timeShift',
  310. category: categories.Transform,
  311. params: [{ name: 'amount', type: 'select', options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'] }],
  312. defaultParams: ['1d'],
  313. });
  314. addFuncDef({
  315. name: 'timeStack',
  316. category: categories.Transform,
  317. params: [
  318. { name: 'timeShiftUnit', type: 'select', options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'] },
  319. { name: 'timeShiftStart', type: 'int' },
  320. { name: 'timeShiftEnd', type: 'int' },
  321. ],
  322. defaultParams: ['1d', 0, 7],
  323. });
  324. addFuncDef({
  325. name: 'summarize',
  326. category: categories.Transform,
  327. params: [
  328. { name: 'interval', type: 'string' },
  329. { name: 'func', type: 'select', options: ['sum', 'avg', 'min', 'max', 'last'] },
  330. { name: 'alignToFrom', type: 'boolean', optional: true, options: ['false', 'true'] },
  331. ],
  332. defaultParams: ['1h', 'sum', 'false'],
  333. });
  334. addFuncDef({
  335. name: 'smartSummarize',
  336. category: categories.Transform,
  337. params: [
  338. { name: 'interval', type: 'string' },
  339. { name: 'func', type: 'select', options: ['sum', 'avg', 'min', 'max', 'last'] },
  340. ],
  341. defaultParams: ['1h', 'sum'],
  342. });
  343. addFuncDef({
  344. name: 'absolute',
  345. category: categories.Transform,
  346. });
  347. addFuncDef({
  348. name: 'hitcount',
  349. category: categories.Transform,
  350. params: [{ name: 'interval', type: 'string' }],
  351. defaultParams: ['10s'],
  352. });
  353. addFuncDef({
  354. name: 'log',
  355. category: categories.Transform,
  356. params: [{ name: 'base', type: 'int' }],
  357. defaultParams: ['10'],
  358. });
  359. addFuncDef({
  360. name: 'averageAbove',
  361. category: categories.Filter,
  362. params: [{ name: 'n', type: 'int' }],
  363. defaultParams: [25],
  364. });
  365. addFuncDef({
  366. name: 'averageBelow',
  367. category: categories.Filter,
  368. params: [{ name: 'n', type: 'int' }],
  369. defaultParams: [25],
  370. });
  371. addFuncDef({
  372. name: 'currentAbove',
  373. category: categories.Filter,
  374. params: [{ name: 'n', type: 'int' }],
  375. defaultParams: [25],
  376. });
  377. addFuncDef({
  378. name: 'currentBelow',
  379. category: categories.Filter,
  380. params: [{ name: 'n', type: 'int' }],
  381. defaultParams: [25],
  382. });
  383. addFuncDef({
  384. name: 'maximumAbove',
  385. category: categories.Filter,
  386. params: [{ name: 'value', type: 'int' }],
  387. defaultParams: [0],
  388. });
  389. addFuncDef({
  390. name: 'maximumBelow',
  391. category: categories.Filter,
  392. params: [{ name: 'value', type: 'int' }],
  393. defaultParams: [0],
  394. });
  395. addFuncDef({
  396. name: 'minimumAbove',
  397. category: categories.Filter,
  398. params: [{ name: 'value', type: 'int' }],
  399. defaultParams: [0],
  400. });
  401. addFuncDef({
  402. name: 'minimumBelow',
  403. category: categories.Filter,
  404. params: [{ name: 'value', type: 'int' }],
  405. defaultParams: [0],
  406. });
  407. addFuncDef({
  408. name: 'limit',
  409. category: categories.Filter,
  410. params: [{ name: 'n', type: 'int' }],
  411. defaultParams: [5],
  412. });
  413. addFuncDef({
  414. name: 'mostDeviant',
  415. category: categories.Filter,
  416. params: [{ name: 'n', type: 'int' }],
  417. defaultParams: [10],
  418. });
  419. addFuncDef({
  420. name: 'exclude',
  421. category: categories.Filter,
  422. params: [{ name: 'exclude', type: 'string' }],
  423. defaultParams: ['exclude'],
  424. });
  425. addFuncDef({
  426. name: 'highestCurrent',
  427. category: categories.Filter,
  428. params: [{ name: 'count', type: 'int' }],
  429. defaultParams: [5],
  430. });
  431. addFuncDef({
  432. name: 'highestMax',
  433. category: categories.Filter,
  434. params: [{ name: 'count', type: 'int' }],
  435. defaultParams: [5],
  436. });
  437. addFuncDef({
  438. name: 'lowestCurrent',
  439. category: categories.Filter,
  440. params: [{ name: 'count', type: 'int' }],
  441. defaultParams: [5],
  442. });
  443. addFuncDef({
  444. name: 'movingAverage',
  445. category: categories.Filter,
  446. params: [
  447. { name: 'windowSize', type: 'int_or_interval', options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] },
  448. ],
  449. defaultParams: [10],
  450. });
  451. addFuncDef({
  452. name: 'movingMedian',
  453. category: categories.Filter,
  454. params: [
  455. { name: 'windowSize', type: 'int_or_interval', options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] },
  456. ],
  457. defaultParams: ['5'],
  458. });
  459. addFuncDef({
  460. name: 'stdev',
  461. category: categories.Filter,
  462. params: [{ name: 'n', type: 'int' }, { name: 'tolerance', type: 'int' }],
  463. defaultParams: [5, 0.1],
  464. });
  465. addFuncDef({
  466. name: 'highestAverage',
  467. category: categories.Filter,
  468. params: [{ name: 'count', type: 'int' }],
  469. defaultParams: [5],
  470. });
  471. addFuncDef({
  472. name: 'lowestAverage',
  473. category: categories.Filter,
  474. params: [{ name: 'count', type: 'int' }],
  475. defaultParams: [5],
  476. });
  477. addFuncDef({
  478. name: 'removeAbovePercentile',
  479. category: categories.Filter,
  480. params: [{ name: 'n', type: 'int' }],
  481. defaultParams: [5],
  482. });
  483. addFuncDef({
  484. name: 'removeAboveValue',
  485. category: categories.Filter,
  486. params: [{ name: 'n', type: 'int' }],
  487. defaultParams: [5],
  488. });
  489. addFuncDef({
  490. name: 'removeBelowPercentile',
  491. category: categories.Filter,
  492. params: [{ name: 'n', type: 'int' }],
  493. defaultParams: [5],
  494. });
  495. addFuncDef({
  496. name: 'removeBelowValue',
  497. category: categories.Filter,
  498. params: [{ name: 'n', type: 'int' }],
  499. defaultParams: [5],
  500. });
  501. addFuncDef({
  502. name: 'useSeriesAbove',
  503. category: categories.Filter,
  504. params: [{ name: 'value', type: 'int' }, { name: 'search', type: 'string' }, { name: 'replace', type: 'string' }],
  505. defaultParams: [0, 'search', 'replace'],
  506. });
  507. ////////////////////
  508. // Graphite 1.0.x //
  509. ////////////////////
  510. addFuncDef({
  511. name: 'aggregateLine',
  512. category: categories.Combine,
  513. params: [{ name: 'func', type: 'select', options: ['sum', 'avg', 'min', 'max', 'last'] }],
  514. defaultParams: ['avg'],
  515. version: '1.0',
  516. });
  517. addFuncDef({
  518. name: 'averageOutsidePercentile',
  519. category: categories.Filter,
  520. params: [{ name: 'n', type: 'int' }],
  521. defaultParams: [95],
  522. version: '1.0',
  523. });
  524. addFuncDef({
  525. name: 'delay',
  526. category: categories.Transform,
  527. params: [{ name: 'steps', type: 'int' }],
  528. defaultParams: [1],
  529. version: '1.0',
  530. });
  531. addFuncDef({
  532. name: 'exponentialMovingAverage',
  533. category: categories.Calculate,
  534. params: [
  535. { name: 'windowSize', type: 'int_or_interval', options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] },
  536. ],
  537. defaultParams: [10],
  538. version: '1.0',
  539. });
  540. addFuncDef({
  541. name: 'fallbackSeries',
  542. category: categories.Special,
  543. params: [{ name: 'fallback', type: 'string' }],
  544. defaultParams: ['constantLine(0)'],
  545. version: '1.0',
  546. });
  547. addFuncDef({
  548. name: 'grep',
  549. category: categories.Filter,
  550. params: [{ name: 'grep', type: 'string' }],
  551. defaultParams: ['grep'],
  552. version: '1.0',
  553. });
  554. addFuncDef({
  555. name: 'groupByNodes',
  556. category: categories.Special,
  557. params: [
  558. {
  559. name: 'function',
  560. type: 'string',
  561. options: ['sum', 'avg', 'maxSeries'],
  562. },
  563. { name: 'node', type: 'int', options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12] },
  564. { name: 'node', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  565. { name: 'node', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  566. { name: 'node', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  567. ],
  568. defaultParams: ['sum', 3],
  569. version: '1.0',
  570. });
  571. addFuncDef({
  572. name: 'integralByInterval',
  573. category: categories.Transform,
  574. params: [{ name: 'intervalUnit', type: 'select', options: ['1h', '6h', '12h', '1d', '2d', '7d', '14d', '30d'] }],
  575. defaultParams: ['1d'],
  576. version: '1.0',
  577. });
  578. addFuncDef({
  579. name: 'interpolate',
  580. category: categories.Transform,
  581. params: [{ name: 'limit', type: 'int', optional: true }],
  582. defaultParams: [],
  583. version: '1.0',
  584. });
  585. addFuncDef({
  586. name: 'invert',
  587. category: categories.Transform,
  588. version: '1.0',
  589. });
  590. addFuncDef({
  591. name: 'isNonNull',
  592. category: categories.Combine,
  593. version: '1.0',
  594. });
  595. addFuncDef({
  596. name: 'linearRegression',
  597. category: categories.Calculate,
  598. params: [
  599. {
  600. name: 'startSourceAt',
  601. type: 'select',
  602. options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'],
  603. optional: true,
  604. },
  605. {
  606. name: 'endSourceAt',
  607. type: 'select',
  608. options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'],
  609. optional: true,
  610. },
  611. ],
  612. defaultParams: [],
  613. version: '1.0',
  614. });
  615. addFuncDef({
  616. name: 'mapSeries',
  617. shortName: 'map',
  618. params: [{ name: 'node', type: 'int' }],
  619. defaultParams: [3],
  620. category: categories.Combine,
  621. version: '1.0',
  622. });
  623. addFuncDef({
  624. name: 'movingMin',
  625. category: categories.Calculate,
  626. params: [
  627. { name: 'windowSize', type: 'int_or_interval', options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] },
  628. ],
  629. defaultParams: [10],
  630. version: '1.0',
  631. });
  632. addFuncDef({
  633. name: 'movingMax',
  634. category: categories.Calculate,
  635. params: [
  636. { name: 'windowSize', type: 'int_or_interval', options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] },
  637. ],
  638. defaultParams: [10],
  639. version: '1.0',
  640. });
  641. addFuncDef({
  642. name: 'movingSum',
  643. category: categories.Calculate,
  644. params: [
  645. { name: 'windowSize', type: 'int_or_interval', options: ['5', '7', '10', '5min', '10min', '30min', '1hour'] },
  646. ],
  647. defaultParams: [10],
  648. version: '1.0',
  649. });
  650. addFuncDef({
  651. name: 'multiplySeriesWithWildcards',
  652. category: categories.Calculate,
  653. params: [
  654. { name: 'position', type: 'int', options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12] },
  655. { name: 'position', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  656. { name: 'position', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  657. { name: 'position', type: 'int', options: [0, -1, -2, -3, -4, -5, -6, -7], optional: true },
  658. ],
  659. defaultParams: [2],
  660. version: '1.0',
  661. });
  662. addFuncDef({
  663. name: 'offsetToZero',
  664. category: categories.Transform,
  665. version: '1.0',
  666. });
  667. addFuncDef({
  668. name: 'pow',
  669. category: categories.Transform,
  670. params: [{ name: 'factor', type: 'int' }],
  671. defaultParams: [10],
  672. version: '1.0',
  673. });
  674. addFuncDef({
  675. name: 'powSeries',
  676. category: categories.Transform,
  677. params: optionalSeriesRefArgs,
  678. defaultParams: [''],
  679. version: '1.0',
  680. });
  681. addFuncDef({
  682. name: 'reduceSeries',
  683. shortName: 'reduce',
  684. params: [
  685. { name: 'function', type: 'string', options: ['asPercent', 'diffSeries', 'divideSeries'] },
  686. { name: 'reduceNode', type: 'int', options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] },
  687. { name: 'reduceMatchers', type: 'string' },
  688. { name: 'reduceMatchers', type: 'string' },
  689. ],
  690. defaultParams: ['asPercent', 2, 'used_bytes', 'total_bytes'],
  691. category: categories.Combine,
  692. version: '1.0',
  693. });
  694. addFuncDef({
  695. name: 'removeBetweenPercentile',
  696. category: categories.Filter,
  697. params: [{ name: 'n', type: 'int' }],
  698. defaultParams: [95],
  699. version: '1.0',
  700. });
  701. addFuncDef({
  702. name: 'removeEmptySeries',
  703. category: categories.Filter,
  704. version: '1.0',
  705. });
  706. addFuncDef({
  707. name: 'squareRoot',
  708. category: categories.Transform,
  709. version: '1.0',
  710. });
  711. addFuncDef({
  712. name: 'timeSlice',
  713. category: categories.Transform,
  714. params: [
  715. { name: 'startSliceAt', type: 'select', options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'] },
  716. {
  717. name: 'endSliceAt',
  718. type: 'select',
  719. options: ['-1h', '-6h', '-12h', '-1d', '-2d', '-7d', '-14d', '-30d'],
  720. optional: true,
  721. },
  722. ],
  723. defaultParams: ['-1h'],
  724. version: '1.0',
  725. });
  726. addFuncDef({
  727. name: 'weightedAverage',
  728. category: categories.Filter,
  729. params: [
  730. { name: 'other', type: 'value_or_series', optional: true },
  731. { name: 'node', type: 'int', options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12] },
  732. ],
  733. defaultParams: ['#A', 4],
  734. version: '1.0',
  735. });
  736. addFuncDef({
  737. name: 'seriesByTag',
  738. category: categories.Special,
  739. params: [
  740. { name: 'tagExpression', type: 'string' },
  741. { name: 'tagExpression', type: 'string', optional: true },
  742. { name: 'tagExpression', type: 'string', optional: true },
  743. { name: 'tagExpression', type: 'string', optional: true },
  744. ],
  745. version: '1.1',
  746. });
  747. addFuncDef({
  748. name: 'groupByTags',
  749. category: categories.Special,
  750. params: [
  751. {
  752. name: 'function',
  753. type: 'string',
  754. options: ['sum', 'avg', 'maxSeries'],
  755. },
  756. { name: 'tag', type: 'string' },
  757. { name: 'tag', type: 'string', optional: true },
  758. { name: 'tag', type: 'string', optional: true },
  759. { name: 'tag', type: 'string', optional: true },
  760. ],
  761. defaultParams: ['sum', 'tag'],
  762. version: '1.1',
  763. });
  764. addFuncDef({
  765. name: 'aliasByTags',
  766. category: categories.Special,
  767. params: [
  768. { name: 'tag', type: 'string' },
  769. { name: 'tag', type: 'string', optional: true },
  770. { name: 'tag', type: 'string', optional: true },
  771. { name: 'tag', type: 'string', optional: true },
  772. ],
  773. defaultParams: ['tag'],
  774. version: '1.1',
  775. });
  776. _.each(categories, function(funcList, catName) {
  777. categories[catName] = _.sortBy(funcList, 'name');
  778. });
  779. function FuncInstance(funcDef, options?) {
  780. this.def = funcDef;
  781. this.params = [];
  782. if (options && options.withDefaultParams) {
  783. this.params = funcDef.defaultParams.slice(0);
  784. }
  785. this.updateText();
  786. }
  787. function isNumeric(obj) {
  788. return !isNaN(parseFloat(obj)) && isFinite(obj);
  789. }
  790. FuncInstance.prototype.render = function(metricExp) {
  791. var str = this.def.name + '(';
  792. var parameters = _.map(
  793. this.params,
  794. function(value, index) {
  795. var paramType = this.def.params[index].type;
  796. if (paramType === 'int' || paramType === 'value_or_series' || paramType === 'boolean') {
  797. return value;
  798. } else if (paramType === 'int_or_interval' && isNumeric(value)) {
  799. return value;
  800. }
  801. return "'" + value + "'";
  802. }.bind(this),
  803. );
  804. if (metricExp) {
  805. parameters.unshift(metricExp);
  806. }
  807. return str + parameters.join(', ') + ')';
  808. };
  809. FuncInstance.prototype._hasMultipleParamsInString = function(strValue, index) {
  810. if (strValue.indexOf(',') === -1) {
  811. return false;
  812. }
  813. return this.def.params[index + 1] && this.def.params[index + 1].optional;
  814. };
  815. FuncInstance.prototype.updateParam = function(strValue, index) {
  816. // handle optional parameters
  817. // if string contains ',' and next param is optional, split and update both
  818. if (this._hasMultipleParamsInString(strValue, index)) {
  819. _.each(
  820. strValue.split(','),
  821. function(partVal, idx) {
  822. this.updateParam(partVal.trim(), index + idx);
  823. }.bind(this),
  824. );
  825. return;
  826. }
  827. if (strValue === '' && this.def.params[index].optional) {
  828. this.params.splice(index, 1);
  829. } else {
  830. this.params[index] = strValue;
  831. }
  832. this.updateText();
  833. };
  834. FuncInstance.prototype.updateText = function() {
  835. if (this.params.length === 0) {
  836. this.text = this.def.name + '()';
  837. return;
  838. }
  839. var text = this.def.name + '(';
  840. text += this.params.join(', ');
  841. text += ')';
  842. this.text = text;
  843. };
  844. function isVersionRelatedFunction(func, graphiteVersion) {
  845. return isVersionGtOrEq(graphiteVersion, func.version) || !func.version;
  846. }
  847. export default {
  848. createFuncInstance: function(funcDef, options?) {
  849. if (_.isString(funcDef)) {
  850. if (!index[funcDef]) {
  851. throw { message: 'Method not found ' + name };
  852. }
  853. funcDef = index[funcDef];
  854. }
  855. return new FuncInstance(funcDef, options);
  856. },
  857. getFuncDef: function(name) {
  858. return index[name];
  859. },
  860. getCategories: function(graphiteVersion) {
  861. var filteredCategories: any = {};
  862. _.each(categories, function(functions, category) {
  863. var filteredFuncs = _.filter(functions, function(func) {
  864. return isVersionRelatedFunction(func, graphiteVersion);
  865. });
  866. if (filteredFuncs.length) {
  867. filteredCategories[category] = filteredFuncs;
  868. }
  869. });
  870. return filteredCategories;
  871. },
  872. };