gfunc.ts 24 KB

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