gfunc.ts 21 KB

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