@spinnaker/kayenta 0.0.0-2025.1-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintrc.js +1 -0
  3. package/.huskyrc +5 -0
  4. package/.lintstagedrc.json +4 -0
  5. package/.prettierignore +4 -0
  6. package/.prettierrc.js +1 -0
  7. package/LICENSE.txt +203 -0
  8. package/README.md +81 -0
  9. package/__mocks__/styleMock.js +1 -0
  10. package/__mocks__/version.json +4 -0
  11. package/babel.config.js +3 -0
  12. package/build.gradle +67 -0
  13. package/build_scripts/checkLicenses.js +79 -0
  14. package/gradle.properties +0 -0
  15. package/jest.config.js +204 -0
  16. package/jest.setup.js +5 -0
  17. package/package.json +166 -0
  18. package/rollup-plugin-angularjs-template-loader.js +82 -0
  19. package/rollup.config.js +30 -0
  20. package/src/index.ts +2 -0
  21. package/src/kayenta/actions/creators.ts +163 -0
  22. package/src/kayenta/actions/index.ts +98 -0
  23. package/src/kayenta/canary.dataSource.bridge.ts +53 -0
  24. package/src/kayenta/canary.dataSource.stub.ts +64 -0
  25. package/src/kayenta/canary.help.ts +136 -0
  26. package/src/kayenta/canary.less +168 -0
  27. package/src/kayenta/canary.settings.ts +26 -0
  28. package/src/kayenta/canary.tsx +67 -0
  29. package/src/kayenta/components/canaryScore.component.less +77 -0
  30. package/src/kayenta/components/canaryScore.component.ts +12 -0
  31. package/src/kayenta/components/canaryScore.tsx +63 -0
  32. package/src/kayenta/components/canaryScores.component.ts +20 -0
  33. package/src/kayenta/components/canaryScores.less +22 -0
  34. package/src/kayenta/components/canaryScores.tsx +163 -0
  35. package/src/kayenta/components/loadStates.tsx +52 -0
  36. package/src/kayenta/domain/ICanaryConfig.ts +57 -0
  37. package/src/kayenta/domain/ICanaryConfigSummary.ts +7 -0
  38. package/src/kayenta/domain/ICanaryConfigUpdateResponse.ts +3 -0
  39. package/src/kayenta/domain/ICanaryExecutionStatusResult.ts +72 -0
  40. package/src/kayenta/domain/ICanaryJudgeResult.ts +51 -0
  41. package/src/kayenta/domain/ICanaryJudgeResultSummary.ts +5 -0
  42. package/src/kayenta/domain/ICanaryScoreThresholds.ts +4 -0
  43. package/src/kayenta/domain/IJudge.ts +5 -0
  44. package/src/kayenta/domain/IKayentaAccount.ts +14 -0
  45. package/src/kayenta/domain/IKayentaStageConfig.ts +58 -0
  46. package/src/kayenta/domain/IMetricSetPair.ts +17 -0
  47. package/src/kayenta/domain/IMetricsServiceMetadata.ts +2 -0
  48. package/src/kayenta/domain/ISetupCanaryStage.ts +11 -0
  49. package/src/kayenta/domain/MetricClassificationLabel.ts +8 -0
  50. package/src/kayenta/domain/ScoreClassificationLabel.ts +7 -0
  51. package/src/kayenta/domain/index.ts +15 -0
  52. package/src/kayenta/edit/changeMetricGroupModal.tsx +107 -0
  53. package/src/kayenta/edit/configDetail.tsx +31 -0
  54. package/src/kayenta/edit/configDetailActionButtons.tsx +24 -0
  55. package/src/kayenta/edit/configDetailHeader.tsx +104 -0
  56. package/src/kayenta/edit/configDetailLoadStates.tsx +36 -0
  57. package/src/kayenta/edit/configDetailLoader.tsx +60 -0
  58. package/src/kayenta/edit/configJson.less +42 -0
  59. package/src/kayenta/edit/configJsonModal.tsx +158 -0
  60. package/src/kayenta/edit/configList.less +7 -0
  61. package/src/kayenta/edit/configList.tsx +57 -0
  62. package/src/kayenta/edit/copyConfigButton.tsx +34 -0
  63. package/src/kayenta/edit/createConfigButton.tsx +34 -0
  64. package/src/kayenta/edit/deleteModal.tsx +87 -0
  65. package/src/kayenta/edit/edit.tsx +24 -0
  66. package/src/kayenta/edit/editMetricEffectSizes.tsx +186 -0
  67. package/src/kayenta/edit/editMetricModal.less +9 -0
  68. package/src/kayenta/edit/editMetricModal.spec.tsx +129 -0
  69. package/src/kayenta/edit/editMetricModal.tsx +294 -0
  70. package/src/kayenta/edit/editMetricValidation.spec.ts +63 -0
  71. package/src/kayenta/edit/editMetricValidation.ts +50 -0
  72. package/src/kayenta/edit/filterTemplateSelector.less +15 -0
  73. package/src/kayenta/edit/filterTemplateSelector.spec.tsx +106 -0
  74. package/src/kayenta/edit/filterTemplateSelector.tsx +194 -0
  75. package/src/kayenta/edit/filterTemplatesValidation.spec.ts +108 -0
  76. package/src/kayenta/edit/filterTemplatesValidation.ts +95 -0
  77. package/src/kayenta/edit/footer.less +30 -0
  78. package/src/kayenta/edit/footer.tsx +12 -0
  79. package/src/kayenta/edit/groupName.tsx +80 -0
  80. package/src/kayenta/edit/groupTabs.tsx +106 -0
  81. package/src/kayenta/edit/groupWeight.tsx +80 -0
  82. package/src/kayenta/edit/groupWeights.tsx +38 -0
  83. package/src/kayenta/edit/inlineTemplateEditor.spec.tsx +42 -0
  84. package/src/kayenta/edit/inlineTemplateEditor.tsx +61 -0
  85. package/src/kayenta/edit/judgeSelect.tsx +82 -0
  86. package/src/kayenta/edit/metricConfigurerDelegator.tsx +30 -0
  87. package/src/kayenta/edit/metricList.less +21 -0
  88. package/src/kayenta/edit/metricList.tsx +215 -0
  89. package/src/kayenta/edit/metricStoreSelector.tsx +66 -0
  90. package/src/kayenta/edit/nameAndDescription.tsx +90 -0
  91. package/src/kayenta/edit/openConfigJsonModalButton.tsx +33 -0
  92. package/src/kayenta/edit/openDeleteModalButton.tsx +50 -0
  93. package/src/kayenta/edit/ownedBy.tsx +34 -0
  94. package/src/kayenta/edit/save.tsx +19 -0
  95. package/src/kayenta/edit/saveConfigButton.tsx +65 -0
  96. package/src/kayenta/edit/saveConfigError.tsx +59 -0
  97. package/src/kayenta/edit/scoring.tsx +35 -0
  98. package/src/kayenta/edit/selectConfig.tsx +10 -0
  99. package/src/kayenta/edit/validationErrors.tsx +39 -0
  100. package/src/kayenta/index.ts +6 -0
  101. package/src/kayenta/layout/addNewButton.tsx +20 -0
  102. package/src/kayenta/layout/centeredDetail.tsx +13 -0
  103. package/src/kayenta/layout/deleteButton.tsx +11 -0
  104. package/src/kayenta/layout/disableable.tsx +87 -0
  105. package/src/kayenta/layout/formList.tsx +26 -0
  106. package/src/kayenta/layout/formRow.tsx +36 -0
  107. package/src/kayenta/layout/formattedDate.tsx +14 -0
  108. package/src/kayenta/layout/index.ts +2 -0
  109. package/src/kayenta/layout/keyValueList.less +20 -0
  110. package/src/kayenta/layout/keyValueList.tsx +114 -0
  111. package/src/kayenta/layout/list.less +9 -0
  112. package/src/kayenta/layout/list.spec.tsx +83 -0
  113. package/src/kayenta/layout/list.tsx +73 -0
  114. package/src/kayenta/layout/listDetail.tsx +33 -0
  115. package/src/kayenta/layout/radioChoice.tsx +29 -0
  116. package/src/kayenta/layout/styleguide.tsx +16 -0
  117. package/src/kayenta/layout/table/index.ts +5 -0
  118. package/src/kayenta/layout/table/nativeTable.tsx +51 -0
  119. package/src/kayenta/layout/table/nativeTableHeader.tsx +26 -0
  120. package/src/kayenta/layout/table/table.tsx +56 -0
  121. package/src/kayenta/layout/table/tableColumn.ts +7 -0
  122. package/src/kayenta/layout/table/tableHeader.tsx +23 -0
  123. package/src/kayenta/layout/tabs.tsx +26 -0
  124. package/src/kayenta/layout/titledSection.less +16 -0
  125. package/src/kayenta/layout/titledSection.tsx +20 -0
  126. package/src/kayenta/layout/titledSubsection.less +11 -0
  127. package/src/kayenta/layout/titledSubsection.tsx +22 -0
  128. package/src/kayenta/manualAnalysis/ManualAnalysisModal.tsx +716 -0
  129. package/src/kayenta/metricStore/atlas/atlasMetricConfigurer.tsx +130 -0
  130. package/src/kayenta/metricStore/atlas/index.ts +8 -0
  131. package/src/kayenta/metricStore/datadog/domain/IDatadogMetricDescriptor.ts +5 -0
  132. package/src/kayenta/metricStore/datadog/index.ts +9 -0
  133. package/src/kayenta/metricStore/datadog/metricConfigurer.tsx +90 -0
  134. package/src/kayenta/metricStore/datadog/metricTypeSelector.spec.tsx +59 -0
  135. package/src/kayenta/metricStore/datadog/metricTypeSelector.tsx +73 -0
  136. package/src/kayenta/metricStore/graphite/domain/IGraphiteMetricDescriptor.ts +5 -0
  137. package/src/kayenta/metricStore/graphite/index.ts +8 -0
  138. package/src/kayenta/metricStore/graphite/metricConfigurer.tsx +54 -0
  139. package/src/kayenta/metricStore/graphite/metricTypeSelector.tsx +80 -0
  140. package/src/kayenta/metricStore/graphite/typeahead.less +3 -0
  141. package/src/kayenta/metricStore/index.ts +8 -0
  142. package/src/kayenta/metricStore/metricStoreConfig.service.ts +12 -0
  143. package/src/kayenta/metricStore/newrelic/domain/INewRelicMetricDescriptor.ts +5 -0
  144. package/src/kayenta/metricStore/newrelic/index.ts +8 -0
  145. package/src/kayenta/metricStore/newrelic/metricConfigurer.tsx +58 -0
  146. package/src/kayenta/metricStore/prometheus/domain/IPrometheusCanaryMetricSetQueryConfig.ts +14 -0
  147. package/src/kayenta/metricStore/prometheus/domain/IPrometheusMetricDescriptor.ts +5 -0
  148. package/src/kayenta/metricStore/prometheus/index.ts +12 -0
  149. package/src/kayenta/metricStore/prometheus/metricConfigurer.tsx +157 -0
  150. package/src/kayenta/metricStore/prometheus/metricTypeSelector.less +5 -0
  151. package/src/kayenta/metricStore/prometheus/metricTypeSelector.spec.tsx +62 -0
  152. package/src/kayenta/metricStore/prometheus/metricTypeSelector.tsx +144 -0
  153. package/src/kayenta/metricStore/prometheus/queryTypeSelectors.spec.ts +61 -0
  154. package/src/kayenta/metricStore/prometheus/queryTypeSelectors.ts +38 -0
  155. package/src/kayenta/metricStore/signalfx/domain/ISignalFxCanaryMetricSetQueryConfig.ts +7 -0
  156. package/src/kayenta/metricStore/signalfx/index.ts +8 -0
  157. package/src/kayenta/metricStore/signalfx/metricConfigurer.less +10 -0
  158. package/src/kayenta/metricStore/signalfx/metricConfigurer.tsx +187 -0
  159. package/src/kayenta/metricStore/stackdriver/domain/IStackdriverCanaryMetricSetQueryConfig.ts +9 -0
  160. package/src/kayenta/metricStore/stackdriver/domain/IStackdriverMetricDescriptor.ts +17 -0
  161. package/src/kayenta/metricStore/stackdriver/index.ts +12 -0
  162. package/src/kayenta/metricStore/stackdriver/metricConfigurer.tsx +144 -0
  163. package/src/kayenta/metricStore/stackdriver/metricTypeSelector.spec.tsx +92 -0
  164. package/src/kayenta/metricStore/stackdriver/metricTypeSelector.tsx +113 -0
  165. package/src/kayenta/middleware/actionInterceptor.ts +29 -0
  166. package/src/kayenta/middleware/asyncDispatch.ts +37 -0
  167. package/src/kayenta/middleware/epics.ts +211 -0
  168. package/src/kayenta/middleware/index.ts +3 -0
  169. package/src/kayenta/navigation/canary.states.stub.ts +28 -0
  170. package/src/kayenta/navigation/canary.states.ts +182 -0
  171. package/src/kayenta/reducers/app.ts +56 -0
  172. package/src/kayenta/reducers/asyncRequest.ts +5 -0
  173. package/src/kayenta/reducers/data.ts +169 -0
  174. package/src/kayenta/reducers/editingTemplate.ts +54 -0
  175. package/src/kayenta/reducers/group.ts +82 -0
  176. package/src/kayenta/reducers/index.ts +245 -0
  177. package/src/kayenta/reducers/prometheusMetricConfig.spec.ts +33 -0
  178. package/src/kayenta/reducers/prometheusMetricConfig.ts +56 -0
  179. package/src/kayenta/reducers/selectedConfig.spec.ts +190 -0
  180. package/src/kayenta/reducers/selectedConfig.ts +566 -0
  181. package/src/kayenta/reducers/selectedRun.ts +101 -0
  182. package/src/kayenta/reducers/signalFxMetricConfig.ts +36 -0
  183. package/src/kayenta/reducers/stackdriverMetricConfig.spec.ts +33 -0
  184. package/src/kayenta/reducers/stackdriverMetricConfig.ts +41 -0
  185. package/src/kayenta/reducers/templates.spec.ts +192 -0
  186. package/src/kayenta/reducers/validators.ts +118 -0
  187. package/src/kayenta/report/detail/allMetricResultsHeader.tsx +32 -0
  188. package/src/kayenta/report/detail/clickableHeader.tsx +21 -0
  189. package/src/kayenta/report/detail/colors.ts +47 -0
  190. package/src/kayenta/report/detail/detail.less +16 -0
  191. package/src/kayenta/report/detail/detail.tsx +48 -0
  192. package/src/kayenta/report/detail/detailLoader.tsx +55 -0
  193. package/src/kayenta/report/detail/graph/graph.tsx +37 -0
  194. package/src/kayenta/report/detail/graph/metricSetPairGraph.service.ts +35 -0
  195. package/src/kayenta/report/detail/graph/semiotic/boxplot.less +45 -0
  196. package/src/kayenta/report/detail/graph/semiotic/boxplot.tsx +283 -0
  197. package/src/kayenta/report/detail/graph/semiotic/chartHeader.tsx +19 -0
  198. package/src/kayenta/report/detail/graph/semiotic/chartLegend.less +26 -0
  199. package/src/kayenta/report/detail/graph/semiotic/chartLegend.tsx +42 -0
  200. package/src/kayenta/report/detail/graph/semiotic/circleIcon.tsx +16 -0
  201. package/src/kayenta/report/detail/graph/semiotic/config.less +5 -0
  202. package/src/kayenta/report/detail/graph/semiotic/config.ts +38 -0
  203. package/src/kayenta/report/detail/graph/semiotic/customAxisTickLabel.tsx +17 -0
  204. package/src/kayenta/report/detail/graph/semiotic/declarations/labella.d.ts +16 -0
  205. package/src/kayenta/report/detail/graph/semiotic/declarations/react-container-dimensions.d.ts +3 -0
  206. package/src/kayenta/report/detail/graph/semiotic/declarations/semiotic.d.ts +160 -0
  207. package/src/kayenta/report/detail/graph/semiotic/differenceArea.less +17 -0
  208. package/src/kayenta/report/detail/graph/semiotic/differenceArea.tsx +186 -0
  209. package/src/kayenta/report/detail/graph/semiotic/histogram.less +22 -0
  210. package/src/kayenta/report/detail/graph/semiotic/histogram.tsx +251 -0
  211. package/src/kayenta/report/detail/graph/semiotic/index.tsx +19 -0
  212. package/src/kayenta/report/detail/graph/semiotic/noValidDataSign.less +5 -0
  213. package/src/kayenta/report/detail/graph/semiotic/noValidDataSign.tsx +10 -0
  214. package/src/kayenta/report/detail/graph/semiotic/secondaryTSXAxis.less +6 -0
  215. package/src/kayenta/report/detail/graph/semiotic/secondaryTSXAxis.tsx +58 -0
  216. package/src/kayenta/report/detail/graph/semiotic/semiotic.service.ts +32 -0
  217. package/src/kayenta/report/detail/graph/semiotic/semioticGraph.less +53 -0
  218. package/src/kayenta/report/detail/graph/semiotic/semioticGraph.tsx +49 -0
  219. package/src/kayenta/report/detail/graph/semiotic/timeSeries.less +42 -0
  220. package/src/kayenta/report/detail/graph/semiotic/timeSeries.tsx +473 -0
  221. package/src/kayenta/report/detail/graph/semiotic/tooltip.tsx +55 -0
  222. package/src/kayenta/report/detail/graph/semiotic/utils.ts +90 -0
  223. package/src/kayenta/report/detail/graphTypeSelector.less +4 -0
  224. package/src/kayenta/report/detail/graphTypeSelector.tsx +50 -0
  225. package/src/kayenta/report/detail/groupScores.tsx +68 -0
  226. package/src/kayenta/report/detail/header.less +70 -0
  227. package/src/kayenta/report/detail/header.tsx +39 -0
  228. package/src/kayenta/report/detail/headerArrow.tsx +13 -0
  229. package/src/kayenta/report/detail/loadStates.tsx +31 -0
  230. package/src/kayenta/report/detail/metricResultActions.less +29 -0
  231. package/src/kayenta/report/detail/metricResultActions.tsx +87 -0
  232. package/src/kayenta/report/detail/metricResultClassification.tsx +22 -0
  233. package/src/kayenta/report/detail/metricResultDetail.tsx +20 -0
  234. package/src/kayenta/report/detail/metricResultDetailLayout.tsx +19 -0
  235. package/src/kayenta/report/detail/metricResultDeviation.tsx +25 -0
  236. package/src/kayenta/report/detail/metricResultStats.less +9 -0
  237. package/src/kayenta/report/detail/metricResultStats.tsx +120 -0
  238. package/src/kayenta/report/detail/metricResults.less +12 -0
  239. package/src/kayenta/report/detail/metricResults.tsx +52 -0
  240. package/src/kayenta/report/detail/metricResultsClassificationFilters.tsx +65 -0
  241. package/src/kayenta/report/detail/metricResultsColumns.tsx +27 -0
  242. package/src/kayenta/report/detail/metricResultsList.less +44 -0
  243. package/src/kayenta/report/detail/metricResultsList.tsx +120 -0
  244. package/src/kayenta/report/detail/metricSetPairLoadStates.tsx +22 -0
  245. package/src/kayenta/report/detail/multipleResultsTable.tsx +81 -0
  246. package/src/kayenta/report/detail/reportException.tsx +57 -0
  247. package/src/kayenta/report/detail/reportExplanation.less +12 -0
  248. package/src/kayenta/report/detail/reportExplanation.tsx +32 -0
  249. package/src/kayenta/report/detail/reportMetadata.tsx +167 -0
  250. package/src/kayenta/report/detail/reportScores.less +47 -0
  251. package/src/kayenta/report/detail/reportScores.tsx +80 -0
  252. package/src/kayenta/report/detail/score.tsx +33 -0
  253. package/src/kayenta/report/detail/sourceLinks.tsx +69 -0
  254. package/src/kayenta/report/list/configLink.tsx +32 -0
  255. package/src/kayenta/report/list/executionList.less +7 -0
  256. package/src/kayenta/report/list/loadStates.tsx +32 -0
  257. package/src/kayenta/report/list/pipelineLink.tsx +15 -0
  258. package/src/kayenta/report/list/reportLink.tsx +33 -0
  259. package/src/kayenta/report/list/table.tsx +309 -0
  260. package/src/kayenta/report/report.tsx +11 -0
  261. package/src/kayenta/selectors/filterTemplatesSelectors.ts +87 -0
  262. package/src/kayenta/selectors/index.ts +62 -0
  263. package/src/kayenta/service/canaryConfig.service.ts +122 -0
  264. package/src/kayenta/service/canaryRun.service.ts +60 -0
  265. package/src/kayenta/service/delegateFactory.ts +24 -0
  266. package/src/kayenta/service/metricsServiceMetadata.service.ts +9 -0
  267. package/src/kayenta/stages/kayentaStage/AnalysisType.spec.tsx +47 -0
  268. package/src/kayenta/stages/kayentaStage/AnalysisType.tsx +49 -0
  269. package/src/kayenta/stages/kayentaStage/CanaryExecutionLabel.tsx +26 -0
  270. package/src/kayenta/stages/kayentaStage/analysisType.component.ts +12 -0
  271. package/src/kayenta/stages/kayentaStage/canaryRunSummaries.component.ts +12 -0
  272. package/src/kayenta/stages/kayentaStage/canaryRunSummaries.less +5 -0
  273. package/src/kayenta/stages/kayentaStage/canaryRunSummaries.tsx +136 -0
  274. package/src/kayenta/stages/kayentaStage/forAnalysisType.component.ts +45 -0
  275. package/src/kayenta/stages/kayentaStage/kayentaStage.controller.ts +789 -0
  276. package/src/kayenta/stages/kayentaStage/kayentaStage.html +528 -0
  277. package/src/kayenta/stages/kayentaStage/kayentaStage.less +5 -0
  278. package/src/kayenta/stages/kayentaStage/kayentaStage.transformer.ts +179 -0
  279. package/src/kayenta/stages/kayentaStage/kayentaStage.ts +221 -0
  280. package/src/kayenta/stages/kayentaStage/kayentaStageConfigSection.component.ts +21 -0
  281. package/src/kayenta/stages/kayentaStage/kayentaStageExecutionDetails.controller.ts +88 -0
  282. package/src/kayenta/stages/kayentaStage/kayentaStageExecutionDetails.html +114 -0
  283. package/src/kayenta/stages/kayentaStage/kayentaStageExecutionDetails.less +6 -0
  284. package/src/kayenta/stages/kayentaStage/stageTypes.ts +5 -0
  285. package/src/kayenta/utils/duration.spec.ts +69 -0
  286. package/src/kayenta/utils/duration.ts +48 -0
  287. package/src/lazy.ts +29 -0
  288. package/src/stub.ts +60 -0
  289. package/tsconfig.json +11 -0
@@ -0,0 +1,130 @@
1
+ import autoBindMethods from 'class-autobind-decorator';
2
+ import { get } from 'lodash';
3
+ import * as React from 'react';
4
+ import * as ReactDOM from 'react-dom';
5
+ import { connect } from 'react-redux';
6
+ import { Action } from 'redux';
7
+
8
+ import { UPDATE_ATLAS_QUERY } from '../../actions/index';
9
+ import { CanarySettings } from '../../canary.settings';
10
+ import { ICanaryMetricConfig } from '../../domain/ICanaryConfig';
11
+ import { ICanaryState } from '../../reducers/index';
12
+
13
+ interface IAtlasMetricConfigurerStateProps {
14
+ editingMetric: ICanaryMetricConfig;
15
+ }
16
+
17
+ interface IAtlasMetricConfigurerDispatchProps {
18
+ updateQuery: (event: any) => void;
19
+ }
20
+
21
+ type IAtlasMetricConfigurerProps = IAtlasMetricConfigurerStateProps & IAtlasMetricConfigurerDispatchProps;
22
+
23
+ interface IAtlasMetricConfigurerState {
24
+ webComponent: Element;
25
+ }
26
+
27
+ export interface IAtlasQuerySelector {
28
+ class: string;
29
+ backends: string;
30
+ query: string;
31
+ hide: string;
32
+ ref: (webComponent: Element) => void;
33
+ }
34
+
35
+ interface IChangeQueryStringEvent extends CustomEvent {
36
+ detail: string;
37
+ }
38
+
39
+ if (CanarySettings.atlasWebComponentsUrl) {
40
+ // make React available to components
41
+ const global = window as any;
42
+ global['React'] = React;
43
+ global['ReactDOM'] = ReactDOM;
44
+
45
+ if (CanarySettings.atlasWebComponentsPolyfillUrl) {
46
+ const polyfillScript = document.createElement('script');
47
+ polyfillScript.src = CanarySettings.atlasWebComponentsPolyfillUrl;
48
+ document.head.appendChild(polyfillScript);
49
+ }
50
+ // download components; they will register when the script executes
51
+ const componentScript = document.createElement('script');
52
+ componentScript.src = CanarySettings.atlasWebComponentsUrl;
53
+ document.head.appendChild(componentScript);
54
+ }
55
+
56
+ // Add <atlas-query-selector> to the elements allowed in TSX, using the IAtlasQuerySelector interface.
57
+ declare global {
58
+ // eslint-disable-next-line @typescript-eslint/no-namespace
59
+ namespace JSX {
60
+ interface IntrinsicElements {
61
+ 'atlas-query-selector': IAtlasQuerySelector;
62
+ }
63
+ }
64
+ }
65
+
66
+ const queryFinder = (metric: ICanaryMetricConfig) => get(metric, 'query.q', '');
67
+
68
+ /*
69
+ * Component for configuring an Atlas metric via the <atlas-query-selector> web component.
70
+ */
71
+ @autoBindMethods
72
+ class AtlasMetricConfigurer extends React.Component<IAtlasMetricConfigurerProps, IAtlasMetricConfigurerState> {
73
+ constructor(props: IAtlasMetricConfigurerProps) {
74
+ super(props);
75
+ this.state = { webComponent: null };
76
+ }
77
+
78
+ private bindComponent(ref: Element) {
79
+ this.setState({ webComponent: ref });
80
+ if (ref) {
81
+ ref.addEventListener('change.queryString', (event: IChangeQueryStringEvent) => {
82
+ this.props.updateQuery(event.detail);
83
+ });
84
+ // This gets passed down to the inner React rendering beyond the web-component wrapper. Simply setting it in
85
+ // the render() method, it will not get passed to the web-component. Given that it doesn't change, why is it
86
+ // necessary? It seems to have something to do with the way React renders the component to the DOM; it triggers
87
+ // the web-component layer early, before the query is ready, and <atlas-query-selector> ignores all changes to
88
+ // the query after it's rendered. Adding a key after it's all set causes the inner React to re-render the
89
+ // component with the correct query.
90
+ ref.setAttribute('key', 'react');
91
+ }
92
+ }
93
+
94
+ public render() {
95
+ const editingMetric = this.props.editingMetric;
96
+ const query = queryFinder(editingMetric);
97
+ // TODO: select correct Atlas backend for app
98
+ const atlasBackend = 'https://atlas-global.prod.netflix.net';
99
+ return (
100
+ <atlas-query-selector
101
+ class="spinnaker-theme"
102
+ backends={atlasBackend}
103
+ hide="add_scope,comparison,timeOffset,lineStyle,des,trend,lineWidth,axis,color,alpha,multi"
104
+ query={query}
105
+ ref={this.bindComponent}
106
+ />
107
+ );
108
+ }
109
+ }
110
+
111
+ function mapStateToProps(state: ICanaryState): IAtlasMetricConfigurerStateProps {
112
+ return {
113
+ editingMetric: state.selectedConfig.editingMetric,
114
+ };
115
+ }
116
+
117
+ function mapDispatchToProps(dispatch: (action: Action & any) => void): IAtlasMetricConfigurerDispatchProps {
118
+ return {
119
+ updateQuery: (query: string): void => {
120
+ dispatch({
121
+ type: UPDATE_ATLAS_QUERY,
122
+ query,
123
+ });
124
+ },
125
+ };
126
+ }
127
+
128
+ export default connect(mapStateToProps, mapDispatchToProps)(AtlasMetricConfigurer);
129
+
130
+ export { queryFinder };
@@ -0,0 +1,8 @@
1
+ import AtlasMetricConfigurer, { queryFinder } from './atlasMetricConfigurer';
2
+ import metricStoreConfigStore from '../metricStoreConfig.service';
3
+
4
+ metricStoreConfigStore.register({
5
+ name: 'atlas',
6
+ metricConfigurer: AtlasMetricConfigurer,
7
+ queryFinder,
8
+ });
@@ -0,0 +1,5 @@
1
+ import { IMetricsServiceMetadata } from 'kayenta/domain/IMetricsServiceMetadata';
2
+
3
+ export interface IDatadogMetricDescriptor extends IMetricsServiceMetadata {
4
+ name: string;
5
+ }
@@ -0,0 +1,9 @@
1
+ import DatadogMetricConfigurer, { queryFinder } from './metricConfigurer';
2
+ import metricStoreConfigStore from '../metricStoreConfig.service';
3
+
4
+ metricStoreConfigStore.register({
5
+ name: 'datadog',
6
+ metricConfigurer: DatadogMetricConfigurer,
7
+ queryFinder,
8
+ useTemplates: true,
9
+ });
@@ -0,0 +1,90 @@
1
+ import * as Creators from 'kayenta/actions/creators';
2
+ import { ICanaryMetricConfig } from 'kayenta/domain';
3
+ import FormRow from 'kayenta/layout/formRow';
4
+ import RadioChoice from 'kayenta/layout/radioChoice';
5
+ import { ICanaryState } from 'kayenta/reducers';
6
+ import { get } from 'lodash';
7
+ import * as React from 'react';
8
+ import { connect } from 'react-redux';
9
+ import { Option } from 'react-select';
10
+ import { Action } from 'redux';
11
+
12
+ import DatadogMetricTypeSelector from './metricTypeSelector';
13
+
14
+ interface IDatadogMetricConfigurerStateProps {
15
+ editingMetric: ICanaryMetricConfig;
16
+ }
17
+
18
+ interface IDatadogMetricConfigurerDispatchProps {
19
+ changeMetricName: (agg: string, name: string) => void;
20
+ }
21
+
22
+ type DatadogMetricConfigurerProps = IDatadogMetricConfigurerStateProps & IDatadogMetricConfigurerDispatchProps;
23
+
24
+ export const queryFinder = (metric: ICanaryMetricConfig) => get(metric, 'query.metricName', ':');
25
+
26
+ export const nameFinder = (metric: ICanaryMetricConfig) => queryFinder(metric).split(':', 2)[1];
27
+ export const aggFinder = (metric: ICanaryMetricConfig) => queryFinder(metric).split(':', 2)[0];
28
+
29
+ /*
30
+ * Component for configuring a Datadog metric.
31
+ * */
32
+ function DatadogMetricConfigurer({ changeMetricName, editingMetric }: DatadogMetricConfigurerProps) {
33
+ return (
34
+ <>
35
+ <FormRow label="Datadog Metric" inputOnly={true}>
36
+ <DatadogMetricTypeSelector
37
+ value={nameFinder(editingMetric)}
38
+ onChange={(option: Option<string>) => changeMetricName(aggFinder(editingMetric), get(option, 'value'))}
39
+ />
40
+ </FormRow>
41
+ <FormRow label="Metric Aggregation">
42
+ <RadioChoice
43
+ value="avg"
44
+ label="Average"
45
+ name="aggregator"
46
+ current={aggFinder(editingMetric)}
47
+ action={() => changeMetricName('avg', nameFinder(editingMetric))}
48
+ />
49
+ <RadioChoice
50
+ value="sum"
51
+ label="Sum"
52
+ name="aggregator"
53
+ current={aggFinder(editingMetric)}
54
+ action={() => changeMetricName('sum', nameFinder(editingMetric))}
55
+ />
56
+ <RadioChoice
57
+ value="max"
58
+ label="Max"
59
+ name="aggregator"
60
+ current={aggFinder(editingMetric)}
61
+ action={() => changeMetricName('max', nameFinder(editingMetric))}
62
+ />
63
+ <RadioChoice
64
+ value="min"
65
+ label="Min"
66
+ name="aggregator"
67
+ current={aggFinder(editingMetric)}
68
+ action={() => changeMetricName('min', nameFinder(editingMetric))}
69
+ />
70
+ </FormRow>
71
+ </>
72
+ );
73
+ }
74
+
75
+ function mapStateToProps(state: ICanaryState): IDatadogMetricConfigurerStateProps {
76
+ return {
77
+ editingMetric: state.selectedConfig.editingMetric,
78
+ };
79
+ }
80
+
81
+ function mapDispatchToProps(dispatch: (action: Action & any) => void): IDatadogMetricConfigurerDispatchProps {
82
+ return {
83
+ changeMetricName: (agg: string, name: string): void => {
84
+ const metricName = agg + ':' + name;
85
+ dispatch(Creators.updateDatadogMetricName({ metricName }));
86
+ },
87
+ };
88
+ }
89
+
90
+ export default connect(mapStateToProps, mapDispatchToProps)(DatadogMetricConfigurer);
@@ -0,0 +1,59 @@
1
+ import { mountWithState, mountWithStore } from 'enzyme-redux';
2
+ import * as Actions from 'kayenta/actions';
3
+ import * as React from 'react';
4
+ import { connect } from 'react-redux';
5
+ import Select, { Option, ReactSelectProps } from 'react-select';
6
+ import { createMockStore } from 'redux-test-utils';
7
+
8
+ import { noop } from '@spinnaker/core';
9
+
10
+ import { DatadogMetricTypeSelector, mapDispatchToProps, mapStateToProps } from './metricTypeSelector';
11
+
12
+ describe('<DatadogMetricTypeSelector />', () => {
13
+ let Component: any;
14
+ let state: any;
15
+
16
+ beforeEach(() => {
17
+ state = {
18
+ data: {
19
+ metricsServiceMetadata: {
20
+ data: [
21
+ {
22
+ name: 'datadog.agent.running',
23
+ },
24
+ {
25
+ name: 'datadog.trace_agent.heartbeat',
26
+ },
27
+ ],
28
+ },
29
+ },
30
+ };
31
+
32
+ Component = connect(mapStateToProps, mapDispatchToProps)(DatadogMetricTypeSelector);
33
+ });
34
+
35
+ it('builds options from input descriptors', () => {
36
+ const component = mountWithState(<Component value="" onChange={noop} />, state);
37
+ const allProps: any = component.find(Select).first().props();
38
+
39
+ expect(allProps.options.map((o: Option) => o.value)).toEqual([
40
+ 'datadog.agent.running',
41
+ 'datadog.trace_agent.heartbeat',
42
+ ]);
43
+ });
44
+
45
+ it('queries for metric descriptors on input change', () => {
46
+ const store = createMockStore(state);
47
+ const component = mountWithStore(<Component value="" onChange={noop} />, store);
48
+
49
+ const allProps: ReactSelectProps = component.find(Select).props();
50
+ allProps.onInputChange('heartbeat');
51
+
52
+ expect(
53
+ store.isActionDispatched({
54
+ type: Actions.UPDATE_DATADOG_METRIC_DESCRIPTOR_FILTER,
55
+ payload: { filter: 'heartbeat' },
56
+ }),
57
+ ).toEqual(true);
58
+ });
59
+ });
@@ -0,0 +1,73 @@
1
+ import * as Creators from 'kayenta/actions/creators';
2
+ import { DISABLE_EDIT_CONFIG, DisableableReactSelect } from 'kayenta/layout/disableable';
3
+ import { ICanaryState } from 'kayenta/reducers';
4
+ import { AsyncRequestState } from 'kayenta/reducers/asyncRequest';
5
+ import * as React from 'react';
6
+ import { connect } from 'react-redux';
7
+ import { Option } from 'react-select';
8
+ import { Dispatch } from 'redux';
9
+
10
+ import { IDatadogMetricDescriptor } from './domain/IDatadogMetricDescriptor';
11
+
12
+ interface IDatadogMetricTypeSelectorDispatchProps {
13
+ load: (filter: string) => void;
14
+ }
15
+
16
+ interface IDatadogMetricTypeSelectorStateProps {
17
+ options: Option[];
18
+ loading: boolean;
19
+ }
20
+
21
+ interface IDatadogMetricTypeSelectorOwnProps {
22
+ value: string;
23
+ onChange: (option: Option) => void;
24
+ }
25
+
26
+ export const DatadogMetricTypeSelector = ({
27
+ loading,
28
+ load,
29
+ options,
30
+ value,
31
+ onChange,
32
+ }: IDatadogMetricTypeSelectorDispatchProps &
33
+ IDatadogMetricTypeSelectorStateProps &
34
+ IDatadogMetricTypeSelectorOwnProps) => {
35
+ if (value && options.every((o) => o.value !== value)) {
36
+ options = options.concat({ label: value, value });
37
+ }
38
+
39
+ return (
40
+ <DisableableReactSelect
41
+ isLoading={loading}
42
+ options={options}
43
+ onChange={onChange}
44
+ value={value}
45
+ placeholder={'Enter at least three characters to search.'}
46
+ onInputChange={(input: string) => {
47
+ load(input);
48
+ return input;
49
+ }}
50
+ disabledStateKeys={[DISABLE_EDIT_CONFIG]}
51
+ />
52
+ );
53
+ };
54
+
55
+ export const mapStateToProps = (state: ICanaryState, ownProps: IDatadogMetricTypeSelectorOwnProps) => {
56
+ const descriptors = state.data.metricsServiceMetadata.data as IDatadogMetricDescriptor[];
57
+ const options: Option[] = descriptors.map((d) => ({ label: d.name, value: d.name }));
58
+ return {
59
+ options,
60
+ loading: state.data.metricsServiceMetadata.load === AsyncRequestState.Requesting,
61
+ ...ownProps,
62
+ };
63
+ };
64
+
65
+ export const mapDispatchToProps = (dispatch: Dispatch<ICanaryState>) => {
66
+ return {
67
+ load: (filter: string) => {
68
+ dispatch(Creators.updateDatadogMetricDescriptorFilter({ filter }));
69
+ },
70
+ };
71
+ };
72
+
73
+ export default connect(mapStateToProps, mapDispatchToProps)(DatadogMetricTypeSelector);
@@ -0,0 +1,5 @@
1
+ import { IMetricsServiceMetadata } from 'kayenta/domain';
2
+
3
+ export interface IGraphiteMetricDescriptor extends IMetricsServiceMetadata {
4
+ name: string;
5
+ }
@@ -0,0 +1,8 @@
1
+ import GraphiteMetricConfigurer, { queryFinder } from './metricConfigurer';
2
+ import metricStoreConfigStore from '../metricStoreConfig.service';
3
+
4
+ metricStoreConfigStore.register({
5
+ name: 'graphite',
6
+ metricConfigurer: GraphiteMetricConfigurer,
7
+ queryFinder,
8
+ });
@@ -0,0 +1,54 @@
1
+ import * as Creators from 'kayenta/actions/creators';
2
+ import { ICanaryMetricConfig } from 'kayenta/domain';
3
+ import FormRow from 'kayenta/layout/formRow';
4
+ import { ICanaryState } from 'kayenta/reducers';
5
+ import { get } from 'lodash';
6
+ import * as React from 'react';
7
+ import { connect } from 'react-redux';
8
+ import { Action } from 'redux';
9
+
10
+ import GraphiteMetricTypeSelector from './metricTypeSelector';
11
+
12
+ interface IGraphiteMetricConfigurerDispatchProps {
13
+ changeMetricName: (name: string) => void;
14
+ }
15
+
16
+ interface IGraphiteMetricConfigurerStateProps {
17
+ editingMetric: ICanaryMetricConfig;
18
+ }
19
+
20
+ type GraphiteMetricConfigurerProps = IGraphiteMetricConfigurerStateProps & IGraphiteMetricConfigurerDispatchProps;
21
+
22
+ export const queryFinder = (metric: ICanaryMetricConfig) => get(metric, 'query.metricName', '');
23
+
24
+ /*
25
+ * Component for configuring a Graphite metric.
26
+ * */
27
+ function GraphiteMetricConfigurer({ changeMetricName, editingMetric }: GraphiteMetricConfigurerProps) {
28
+ return (
29
+ <FormRow label="Graphite Metric" inputOnly={true}>
30
+ <GraphiteMetricTypeSelector
31
+ value={queryFinder(editingMetric)}
32
+ onChange={(option: string[]) => {
33
+ changeMetricName(option[0]);
34
+ }}
35
+ />
36
+ </FormRow>
37
+ );
38
+ }
39
+
40
+ function mapStateToProps(state: ICanaryState): IGraphiteMetricConfigurerStateProps {
41
+ return {
42
+ editingMetric: state.selectedConfig.editingMetric,
43
+ };
44
+ }
45
+
46
+ function mapDispatchToProps(dispatch: (action: Action & any) => void): IGraphiteMetricConfigurerDispatchProps {
47
+ return {
48
+ changeMetricName: (metricName: string): void => {
49
+ dispatch(Creators.updateGraphiteMetricName({ metricName }));
50
+ },
51
+ };
52
+ }
53
+
54
+ export default connect(mapStateToProps, mapDispatchToProps)(GraphiteMetricConfigurer);
@@ -0,0 +1,80 @@
1
+ import * as Creators from 'kayenta/actions/creators';
2
+ import { DISABLE_EDIT_CONFIG, DisableableReactTypeahead } from 'kayenta/layout/disableable';
3
+ import { ICanaryState } from 'kayenta/reducers';
4
+ import { AsyncRequestState } from 'kayenta/reducers/asyncRequest';
5
+ import * as React from 'react';
6
+ import { connect } from 'react-redux';
7
+ import { Dispatch } from 'redux';
8
+
9
+ import { IGraphiteMetricDescriptor } from './domain/IGraphiteMetricDescriptor';
10
+
11
+ import './typeahead.less';
12
+
13
+ interface IGraphiteMetricTypeSelectorDispatchProps {
14
+ load: (filter: string) => void;
15
+ }
16
+
17
+ interface IGraphiteMetricTypeSelectorStateProps {
18
+ options: string[];
19
+ loading: boolean;
20
+ }
21
+
22
+ interface IGraphiteMetricTypeSelectorOwnProps {
23
+ value: string;
24
+ onChange: (option: string[]) => void;
25
+ }
26
+
27
+ export const GraphiteMetricTypeSelector = ({
28
+ loading,
29
+ load,
30
+ options,
31
+ value,
32
+ onChange,
33
+ }: IGraphiteMetricTypeSelectorDispatchProps &
34
+ IGraphiteMetricTypeSelectorStateProps &
35
+ IGraphiteMetricTypeSelectorOwnProps) => {
36
+ options = options.concat(value);
37
+
38
+ return (
39
+ <DisableableReactTypeahead
40
+ options={options}
41
+ isLoading={loading}
42
+ onChange={(option: string[]) => {
43
+ onChange(option);
44
+ load(option[0]);
45
+ }}
46
+ defaultInputValue={value}
47
+ renderMenuItemChildren={(option) => (
48
+ <a style={{ pointerEvents: 'all', textDecoration: 'none', color: '#000000' }}>{option}</a>
49
+ )}
50
+ placeholder={'Enter at least three characters to search.'}
51
+ onInputChange={(input) => {
52
+ onChange([input]);
53
+ load(input);
54
+ return input;
55
+ }}
56
+ disabledStateKeys={[DISABLE_EDIT_CONFIG]}
57
+ />
58
+ );
59
+ };
60
+
61
+ export const mapStateToProps = (state: ICanaryState, ownProps: IGraphiteMetricTypeSelectorOwnProps) => {
62
+ const descriptors = state.data.metricsServiceMetadata.data as IGraphiteMetricDescriptor[];
63
+ const options: string[] = descriptors.map((d) => d.name);
64
+
65
+ return {
66
+ options,
67
+ loading: state.data.metricsServiceMetadata.load === AsyncRequestState.Requesting,
68
+ ...ownProps,
69
+ };
70
+ };
71
+
72
+ export const mapDispatchToProps = (dispatch: Dispatch<ICanaryState>) => {
73
+ return {
74
+ load: (filter: string) => {
75
+ dispatch(Creators.updateGraphiteMetricDescriptorFilter({ filter }));
76
+ },
77
+ };
78
+ };
79
+
80
+ export default connect(mapStateToProps, mapDispatchToProps)(GraphiteMetricTypeSelector);
@@ -0,0 +1,3 @@
1
+ li[id^='rbt-menu-item'] {
2
+ pointer-events: none;
3
+ }
@@ -0,0 +1,8 @@
1
+ import './atlas';
2
+ import './datadog';
3
+ import './graphite';
4
+ import './newrelic';
5
+ import './prometheus';
6
+ import './signalfx';
7
+ import './stackdriver';
8
+ export { default as metricStoreConfigStore } from './metricStoreConfig.service';
@@ -0,0 +1,12 @@
1
+ import { ICanaryMetricConfig } from 'kayenta/domain';
2
+ import { buildDelegateService } from 'kayenta/service/delegateFactory';
3
+ import * as React from 'react';
4
+
5
+ export interface IMetricStoreConfig {
6
+ name: string;
7
+ metricConfigurer: React.ComponentClass;
8
+ queryFinder: (metric: ICanaryMetricConfig) => string;
9
+ useTemplates?: boolean;
10
+ }
11
+
12
+ export default buildDelegateService<IMetricStoreConfig>();
@@ -0,0 +1,5 @@
1
+ import { IMetricsServiceMetadata } from 'kayenta/domain/IMetricsServiceMetadata';
2
+
3
+ export interface INewRelicMetricDescriptor extends IMetricsServiceMetadata {
4
+ name: string;
5
+ }
@@ -0,0 +1,8 @@
1
+ import NewRelicMetricConfigurer, { queryFinder } from './metricConfigurer';
2
+ import metricStoreConfigStore from '../metricStoreConfig.service';
3
+
4
+ metricStoreConfigStore.register({
5
+ name: 'newrelic',
6
+ metricConfigurer: NewRelicMetricConfigurer,
7
+ queryFinder,
8
+ });
@@ -0,0 +1,58 @@
1
+ import * as Creators from 'kayenta/actions/creators';
2
+ import { ICanaryMetricConfig } from 'kayenta/domain';
3
+ import { DISABLE_EDIT_CONFIG, DisableableInput } from 'kayenta/layout/disableable';
4
+ import FormRow from 'kayenta/layout/formRow';
5
+ import { ICanaryState } from 'kayenta/reducers';
6
+ import { get } from 'lodash';
7
+ import * as React from 'react';
8
+ import { connect } from 'react-redux';
9
+ import { Action } from 'redux';
10
+
11
+ interface INewRelicMetricConfigurerStateProps {
12
+ editingMetric: ICanaryMetricConfig;
13
+ }
14
+
15
+ interface INewRelicMetricConfigurerDispatchProps {
16
+ changeSelect: (event: any) => void;
17
+ }
18
+
19
+ type INewRelicMetricConfigurerProps = INewRelicMetricConfigurerStateProps & INewRelicMetricConfigurerDispatchProps;
20
+
21
+ export const queryFinder = (metric: ICanaryMetricConfig) => get(metric, 'query.select', '');
22
+
23
+ /*
24
+ * Component for configuring a New Relic metric
25
+ */
26
+ function NewRelicMetricConfigurer({ changeSelect, editingMetric }: INewRelicMetricConfigurerProps) {
27
+ return (
28
+ <>
29
+ <FormRow label="NRQL Select" inputOnly={true}>
30
+ <DisableableInput
31
+ type="text"
32
+ value={queryFinder(editingMetric)}
33
+ onChange={changeSelect}
34
+ disabledStateKeys={[DISABLE_EDIT_CONFIG]}
35
+ />
36
+ <span className="body-small color-text-caption" style={{ marginTop: '5px' }}>
37
+ Enter the NRQL query only up to, but not including, the WHERE clause
38
+ </span>
39
+ </FormRow>
40
+ </>
41
+ );
42
+ }
43
+
44
+ function mapStateToProps(state: ICanaryState): INewRelicMetricConfigurerStateProps {
45
+ return {
46
+ editingMetric: state.selectedConfig.editingMetric,
47
+ };
48
+ }
49
+
50
+ function mapDispatchToProps(dispatch: (action: Action & any) => void): INewRelicMetricConfigurerDispatchProps {
51
+ return {
52
+ changeSelect: (event: any) => {
53
+ dispatch(Creators.updateNewRelicSelect({ select: event.target.value }));
54
+ },
55
+ };
56
+ }
57
+
58
+ export default connect(mapStateToProps, mapDispatchToProps)(NewRelicMetricConfigurer);
@@ -0,0 +1,14 @@
1
+ import { ICanaryMetricSetQueryConfig } from 'kayenta/domain';
2
+
3
+ export interface IPrometheusCanaryMetricSetQueryConfig extends ICanaryMetricSetQueryConfig {
4
+ resourceType: string;
5
+ metricName: string;
6
+ labelBindings: string[];
7
+ groupByFields: string[];
8
+ queryType: PrometheusQueryType;
9
+ }
10
+
11
+ export enum PrometheusQueryType {
12
+ PROMQL = 'PROMQL',
13
+ DEFAULT = 'DEFAULT',
14
+ }
@@ -0,0 +1,5 @@
1
+ import { IMetricsServiceMetadata } from 'kayenta/domain/IMetricsServiceMetadata';
2
+
3
+ export interface IPrometheusMetricDescriptor extends IMetricsServiceMetadata {
4
+ name: string;
5
+ }
@@ -0,0 +1,12 @@
1
+ import { ICanaryMetricConfig } from 'kayenta/domain/ICanaryConfig';
2
+ import { get } from 'lodash';
3
+
4
+ import PrometheusMetricConfigurer from './metricConfigurer';
5
+ import metricStoreConfigStore from '../metricStoreConfig.service';
6
+
7
+ metricStoreConfigStore.register({
8
+ name: 'prometheus',
9
+ metricConfigurer: PrometheusMetricConfigurer,
10
+ queryFinder: (metric: ICanaryMetricConfig) => get(metric, 'query.metricName', ''),
11
+ useTemplates: true,
12
+ });