@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.
- package/.editorconfig +9 -0
- package/.eslintrc.js +1 -0
- package/.huskyrc +5 -0
- package/.lintstagedrc.json +4 -0
- package/.prettierignore +4 -0
- package/.prettierrc.js +1 -0
- package/LICENSE.txt +203 -0
- package/README.md +81 -0
- package/__mocks__/styleMock.js +1 -0
- package/__mocks__/version.json +4 -0
- package/babel.config.js +3 -0
- package/build.gradle +67 -0
- package/build_scripts/checkLicenses.js +79 -0
- package/gradle.properties +0 -0
- package/jest.config.js +204 -0
- package/jest.setup.js +5 -0
- package/package.json +166 -0
- package/rollup-plugin-angularjs-template-loader.js +82 -0
- package/rollup.config.js +30 -0
- package/src/index.ts +2 -0
- package/src/kayenta/actions/creators.ts +163 -0
- package/src/kayenta/actions/index.ts +98 -0
- package/src/kayenta/canary.dataSource.bridge.ts +53 -0
- package/src/kayenta/canary.dataSource.stub.ts +64 -0
- package/src/kayenta/canary.help.ts +136 -0
- package/src/kayenta/canary.less +168 -0
- package/src/kayenta/canary.settings.ts +26 -0
- package/src/kayenta/canary.tsx +67 -0
- package/src/kayenta/components/canaryScore.component.less +77 -0
- package/src/kayenta/components/canaryScore.component.ts +12 -0
- package/src/kayenta/components/canaryScore.tsx +63 -0
- package/src/kayenta/components/canaryScores.component.ts +20 -0
- package/src/kayenta/components/canaryScores.less +22 -0
- package/src/kayenta/components/canaryScores.tsx +163 -0
- package/src/kayenta/components/loadStates.tsx +52 -0
- package/src/kayenta/domain/ICanaryConfig.ts +57 -0
- package/src/kayenta/domain/ICanaryConfigSummary.ts +7 -0
- package/src/kayenta/domain/ICanaryConfigUpdateResponse.ts +3 -0
- package/src/kayenta/domain/ICanaryExecutionStatusResult.ts +72 -0
- package/src/kayenta/domain/ICanaryJudgeResult.ts +51 -0
- package/src/kayenta/domain/ICanaryJudgeResultSummary.ts +5 -0
- package/src/kayenta/domain/ICanaryScoreThresholds.ts +4 -0
- package/src/kayenta/domain/IJudge.ts +5 -0
- package/src/kayenta/domain/IKayentaAccount.ts +14 -0
- package/src/kayenta/domain/IKayentaStageConfig.ts +58 -0
- package/src/kayenta/domain/IMetricSetPair.ts +17 -0
- package/src/kayenta/domain/IMetricsServiceMetadata.ts +2 -0
- package/src/kayenta/domain/ISetupCanaryStage.ts +11 -0
- package/src/kayenta/domain/MetricClassificationLabel.ts +8 -0
- package/src/kayenta/domain/ScoreClassificationLabel.ts +7 -0
- package/src/kayenta/domain/index.ts +15 -0
- package/src/kayenta/edit/changeMetricGroupModal.tsx +107 -0
- package/src/kayenta/edit/configDetail.tsx +31 -0
- package/src/kayenta/edit/configDetailActionButtons.tsx +24 -0
- package/src/kayenta/edit/configDetailHeader.tsx +104 -0
- package/src/kayenta/edit/configDetailLoadStates.tsx +36 -0
- package/src/kayenta/edit/configDetailLoader.tsx +60 -0
- package/src/kayenta/edit/configJson.less +42 -0
- package/src/kayenta/edit/configJsonModal.tsx +158 -0
- package/src/kayenta/edit/configList.less +7 -0
- package/src/kayenta/edit/configList.tsx +57 -0
- package/src/kayenta/edit/copyConfigButton.tsx +34 -0
- package/src/kayenta/edit/createConfigButton.tsx +34 -0
- package/src/kayenta/edit/deleteModal.tsx +87 -0
- package/src/kayenta/edit/edit.tsx +24 -0
- package/src/kayenta/edit/editMetricEffectSizes.tsx +186 -0
- package/src/kayenta/edit/editMetricModal.less +9 -0
- package/src/kayenta/edit/editMetricModal.spec.tsx +129 -0
- package/src/kayenta/edit/editMetricModal.tsx +294 -0
- package/src/kayenta/edit/editMetricValidation.spec.ts +63 -0
- package/src/kayenta/edit/editMetricValidation.ts +50 -0
- package/src/kayenta/edit/filterTemplateSelector.less +15 -0
- package/src/kayenta/edit/filterTemplateSelector.spec.tsx +106 -0
- package/src/kayenta/edit/filterTemplateSelector.tsx +194 -0
- package/src/kayenta/edit/filterTemplatesValidation.spec.ts +108 -0
- package/src/kayenta/edit/filterTemplatesValidation.ts +95 -0
- package/src/kayenta/edit/footer.less +30 -0
- package/src/kayenta/edit/footer.tsx +12 -0
- package/src/kayenta/edit/groupName.tsx +80 -0
- package/src/kayenta/edit/groupTabs.tsx +106 -0
- package/src/kayenta/edit/groupWeight.tsx +80 -0
- package/src/kayenta/edit/groupWeights.tsx +38 -0
- package/src/kayenta/edit/inlineTemplateEditor.spec.tsx +42 -0
- package/src/kayenta/edit/inlineTemplateEditor.tsx +61 -0
- package/src/kayenta/edit/judgeSelect.tsx +82 -0
- package/src/kayenta/edit/metricConfigurerDelegator.tsx +30 -0
- package/src/kayenta/edit/metricList.less +21 -0
- package/src/kayenta/edit/metricList.tsx +215 -0
- package/src/kayenta/edit/metricStoreSelector.tsx +66 -0
- package/src/kayenta/edit/nameAndDescription.tsx +90 -0
- package/src/kayenta/edit/openConfigJsonModalButton.tsx +33 -0
- package/src/kayenta/edit/openDeleteModalButton.tsx +50 -0
- package/src/kayenta/edit/ownedBy.tsx +34 -0
- package/src/kayenta/edit/save.tsx +19 -0
- package/src/kayenta/edit/saveConfigButton.tsx +65 -0
- package/src/kayenta/edit/saveConfigError.tsx +59 -0
- package/src/kayenta/edit/scoring.tsx +35 -0
- package/src/kayenta/edit/selectConfig.tsx +10 -0
- package/src/kayenta/edit/validationErrors.tsx +39 -0
- package/src/kayenta/index.ts +6 -0
- package/src/kayenta/layout/addNewButton.tsx +20 -0
- package/src/kayenta/layout/centeredDetail.tsx +13 -0
- package/src/kayenta/layout/deleteButton.tsx +11 -0
- package/src/kayenta/layout/disableable.tsx +87 -0
- package/src/kayenta/layout/formList.tsx +26 -0
- package/src/kayenta/layout/formRow.tsx +36 -0
- package/src/kayenta/layout/formattedDate.tsx +14 -0
- package/src/kayenta/layout/index.ts +2 -0
- package/src/kayenta/layout/keyValueList.less +20 -0
- package/src/kayenta/layout/keyValueList.tsx +114 -0
- package/src/kayenta/layout/list.less +9 -0
- package/src/kayenta/layout/list.spec.tsx +83 -0
- package/src/kayenta/layout/list.tsx +73 -0
- package/src/kayenta/layout/listDetail.tsx +33 -0
- package/src/kayenta/layout/radioChoice.tsx +29 -0
- package/src/kayenta/layout/styleguide.tsx +16 -0
- package/src/kayenta/layout/table/index.ts +5 -0
- package/src/kayenta/layout/table/nativeTable.tsx +51 -0
- package/src/kayenta/layout/table/nativeTableHeader.tsx +26 -0
- package/src/kayenta/layout/table/table.tsx +56 -0
- package/src/kayenta/layout/table/tableColumn.ts +7 -0
- package/src/kayenta/layout/table/tableHeader.tsx +23 -0
- package/src/kayenta/layout/tabs.tsx +26 -0
- package/src/kayenta/layout/titledSection.less +16 -0
- package/src/kayenta/layout/titledSection.tsx +20 -0
- package/src/kayenta/layout/titledSubsection.less +11 -0
- package/src/kayenta/layout/titledSubsection.tsx +22 -0
- package/src/kayenta/manualAnalysis/ManualAnalysisModal.tsx +716 -0
- package/src/kayenta/metricStore/atlas/atlasMetricConfigurer.tsx +130 -0
- package/src/kayenta/metricStore/atlas/index.ts +8 -0
- package/src/kayenta/metricStore/datadog/domain/IDatadogMetricDescriptor.ts +5 -0
- package/src/kayenta/metricStore/datadog/index.ts +9 -0
- package/src/kayenta/metricStore/datadog/metricConfigurer.tsx +90 -0
- package/src/kayenta/metricStore/datadog/metricTypeSelector.spec.tsx +59 -0
- package/src/kayenta/metricStore/datadog/metricTypeSelector.tsx +73 -0
- package/src/kayenta/metricStore/graphite/domain/IGraphiteMetricDescriptor.ts +5 -0
- package/src/kayenta/metricStore/graphite/index.ts +8 -0
- package/src/kayenta/metricStore/graphite/metricConfigurer.tsx +54 -0
- package/src/kayenta/metricStore/graphite/metricTypeSelector.tsx +80 -0
- package/src/kayenta/metricStore/graphite/typeahead.less +3 -0
- package/src/kayenta/metricStore/index.ts +8 -0
- package/src/kayenta/metricStore/metricStoreConfig.service.ts +12 -0
- package/src/kayenta/metricStore/newrelic/domain/INewRelicMetricDescriptor.ts +5 -0
- package/src/kayenta/metricStore/newrelic/index.ts +8 -0
- package/src/kayenta/metricStore/newrelic/metricConfigurer.tsx +58 -0
- package/src/kayenta/metricStore/prometheus/domain/IPrometheusCanaryMetricSetQueryConfig.ts +14 -0
- package/src/kayenta/metricStore/prometheus/domain/IPrometheusMetricDescriptor.ts +5 -0
- package/src/kayenta/metricStore/prometheus/index.ts +12 -0
- package/src/kayenta/metricStore/prometheus/metricConfigurer.tsx +157 -0
- package/src/kayenta/metricStore/prometheus/metricTypeSelector.less +5 -0
- package/src/kayenta/metricStore/prometheus/metricTypeSelector.spec.tsx +62 -0
- package/src/kayenta/metricStore/prometheus/metricTypeSelector.tsx +144 -0
- package/src/kayenta/metricStore/prometheus/queryTypeSelectors.spec.ts +61 -0
- package/src/kayenta/metricStore/prometheus/queryTypeSelectors.ts +38 -0
- package/src/kayenta/metricStore/signalfx/domain/ISignalFxCanaryMetricSetQueryConfig.ts +7 -0
- package/src/kayenta/metricStore/signalfx/index.ts +8 -0
- package/src/kayenta/metricStore/signalfx/metricConfigurer.less +10 -0
- package/src/kayenta/metricStore/signalfx/metricConfigurer.tsx +187 -0
- package/src/kayenta/metricStore/stackdriver/domain/IStackdriverCanaryMetricSetQueryConfig.ts +9 -0
- package/src/kayenta/metricStore/stackdriver/domain/IStackdriverMetricDescriptor.ts +17 -0
- package/src/kayenta/metricStore/stackdriver/index.ts +12 -0
- package/src/kayenta/metricStore/stackdriver/metricConfigurer.tsx +144 -0
- package/src/kayenta/metricStore/stackdriver/metricTypeSelector.spec.tsx +92 -0
- package/src/kayenta/metricStore/stackdriver/metricTypeSelector.tsx +113 -0
- package/src/kayenta/middleware/actionInterceptor.ts +29 -0
- package/src/kayenta/middleware/asyncDispatch.ts +37 -0
- package/src/kayenta/middleware/epics.ts +211 -0
- package/src/kayenta/middleware/index.ts +3 -0
- package/src/kayenta/navigation/canary.states.stub.ts +28 -0
- package/src/kayenta/navigation/canary.states.ts +182 -0
- package/src/kayenta/reducers/app.ts +56 -0
- package/src/kayenta/reducers/asyncRequest.ts +5 -0
- package/src/kayenta/reducers/data.ts +169 -0
- package/src/kayenta/reducers/editingTemplate.ts +54 -0
- package/src/kayenta/reducers/group.ts +82 -0
- package/src/kayenta/reducers/index.ts +245 -0
- package/src/kayenta/reducers/prometheusMetricConfig.spec.ts +33 -0
- package/src/kayenta/reducers/prometheusMetricConfig.ts +56 -0
- package/src/kayenta/reducers/selectedConfig.spec.ts +190 -0
- package/src/kayenta/reducers/selectedConfig.ts +566 -0
- package/src/kayenta/reducers/selectedRun.ts +101 -0
- package/src/kayenta/reducers/signalFxMetricConfig.ts +36 -0
- package/src/kayenta/reducers/stackdriverMetricConfig.spec.ts +33 -0
- package/src/kayenta/reducers/stackdriverMetricConfig.ts +41 -0
- package/src/kayenta/reducers/templates.spec.ts +192 -0
- package/src/kayenta/reducers/validators.ts +118 -0
- package/src/kayenta/report/detail/allMetricResultsHeader.tsx +32 -0
- package/src/kayenta/report/detail/clickableHeader.tsx +21 -0
- package/src/kayenta/report/detail/colors.ts +47 -0
- package/src/kayenta/report/detail/detail.less +16 -0
- package/src/kayenta/report/detail/detail.tsx +48 -0
- package/src/kayenta/report/detail/detailLoader.tsx +55 -0
- package/src/kayenta/report/detail/graph/graph.tsx +37 -0
- package/src/kayenta/report/detail/graph/metricSetPairGraph.service.ts +35 -0
- package/src/kayenta/report/detail/graph/semiotic/boxplot.less +45 -0
- package/src/kayenta/report/detail/graph/semiotic/boxplot.tsx +283 -0
- package/src/kayenta/report/detail/graph/semiotic/chartHeader.tsx +19 -0
- package/src/kayenta/report/detail/graph/semiotic/chartLegend.less +26 -0
- package/src/kayenta/report/detail/graph/semiotic/chartLegend.tsx +42 -0
- package/src/kayenta/report/detail/graph/semiotic/circleIcon.tsx +16 -0
- package/src/kayenta/report/detail/graph/semiotic/config.less +5 -0
- package/src/kayenta/report/detail/graph/semiotic/config.ts +38 -0
- package/src/kayenta/report/detail/graph/semiotic/customAxisTickLabel.tsx +17 -0
- package/src/kayenta/report/detail/graph/semiotic/declarations/labella.d.ts +16 -0
- package/src/kayenta/report/detail/graph/semiotic/declarations/react-container-dimensions.d.ts +3 -0
- package/src/kayenta/report/detail/graph/semiotic/declarations/semiotic.d.ts +160 -0
- package/src/kayenta/report/detail/graph/semiotic/differenceArea.less +17 -0
- package/src/kayenta/report/detail/graph/semiotic/differenceArea.tsx +186 -0
- package/src/kayenta/report/detail/graph/semiotic/histogram.less +22 -0
- package/src/kayenta/report/detail/graph/semiotic/histogram.tsx +251 -0
- package/src/kayenta/report/detail/graph/semiotic/index.tsx +19 -0
- package/src/kayenta/report/detail/graph/semiotic/noValidDataSign.less +5 -0
- package/src/kayenta/report/detail/graph/semiotic/noValidDataSign.tsx +10 -0
- package/src/kayenta/report/detail/graph/semiotic/secondaryTSXAxis.less +6 -0
- package/src/kayenta/report/detail/graph/semiotic/secondaryTSXAxis.tsx +58 -0
- package/src/kayenta/report/detail/graph/semiotic/semiotic.service.ts +32 -0
- package/src/kayenta/report/detail/graph/semiotic/semioticGraph.less +53 -0
- package/src/kayenta/report/detail/graph/semiotic/semioticGraph.tsx +49 -0
- package/src/kayenta/report/detail/graph/semiotic/timeSeries.less +42 -0
- package/src/kayenta/report/detail/graph/semiotic/timeSeries.tsx +473 -0
- package/src/kayenta/report/detail/graph/semiotic/tooltip.tsx +55 -0
- package/src/kayenta/report/detail/graph/semiotic/utils.ts +90 -0
- package/src/kayenta/report/detail/graphTypeSelector.less +4 -0
- package/src/kayenta/report/detail/graphTypeSelector.tsx +50 -0
- package/src/kayenta/report/detail/groupScores.tsx +68 -0
- package/src/kayenta/report/detail/header.less +70 -0
- package/src/kayenta/report/detail/header.tsx +39 -0
- package/src/kayenta/report/detail/headerArrow.tsx +13 -0
- package/src/kayenta/report/detail/loadStates.tsx +31 -0
- package/src/kayenta/report/detail/metricResultActions.less +29 -0
- package/src/kayenta/report/detail/metricResultActions.tsx +87 -0
- package/src/kayenta/report/detail/metricResultClassification.tsx +22 -0
- package/src/kayenta/report/detail/metricResultDetail.tsx +20 -0
- package/src/kayenta/report/detail/metricResultDetailLayout.tsx +19 -0
- package/src/kayenta/report/detail/metricResultDeviation.tsx +25 -0
- package/src/kayenta/report/detail/metricResultStats.less +9 -0
- package/src/kayenta/report/detail/metricResultStats.tsx +120 -0
- package/src/kayenta/report/detail/metricResults.less +12 -0
- package/src/kayenta/report/detail/metricResults.tsx +52 -0
- package/src/kayenta/report/detail/metricResultsClassificationFilters.tsx +65 -0
- package/src/kayenta/report/detail/metricResultsColumns.tsx +27 -0
- package/src/kayenta/report/detail/metricResultsList.less +44 -0
- package/src/kayenta/report/detail/metricResultsList.tsx +120 -0
- package/src/kayenta/report/detail/metricSetPairLoadStates.tsx +22 -0
- package/src/kayenta/report/detail/multipleResultsTable.tsx +81 -0
- package/src/kayenta/report/detail/reportException.tsx +57 -0
- package/src/kayenta/report/detail/reportExplanation.less +12 -0
- package/src/kayenta/report/detail/reportExplanation.tsx +32 -0
- package/src/kayenta/report/detail/reportMetadata.tsx +167 -0
- package/src/kayenta/report/detail/reportScores.less +47 -0
- package/src/kayenta/report/detail/reportScores.tsx +80 -0
- package/src/kayenta/report/detail/score.tsx +33 -0
- package/src/kayenta/report/detail/sourceLinks.tsx +69 -0
- package/src/kayenta/report/list/configLink.tsx +32 -0
- package/src/kayenta/report/list/executionList.less +7 -0
- package/src/kayenta/report/list/loadStates.tsx +32 -0
- package/src/kayenta/report/list/pipelineLink.tsx +15 -0
- package/src/kayenta/report/list/reportLink.tsx +33 -0
- package/src/kayenta/report/list/table.tsx +309 -0
- package/src/kayenta/report/report.tsx +11 -0
- package/src/kayenta/selectors/filterTemplatesSelectors.ts +87 -0
- package/src/kayenta/selectors/index.ts +62 -0
- package/src/kayenta/service/canaryConfig.service.ts +122 -0
- package/src/kayenta/service/canaryRun.service.ts +60 -0
- package/src/kayenta/service/delegateFactory.ts +24 -0
- package/src/kayenta/service/metricsServiceMetadata.service.ts +9 -0
- package/src/kayenta/stages/kayentaStage/AnalysisType.spec.tsx +47 -0
- package/src/kayenta/stages/kayentaStage/AnalysisType.tsx +49 -0
- package/src/kayenta/stages/kayentaStage/CanaryExecutionLabel.tsx +26 -0
- package/src/kayenta/stages/kayentaStage/analysisType.component.ts +12 -0
- package/src/kayenta/stages/kayentaStage/canaryRunSummaries.component.ts +12 -0
- package/src/kayenta/stages/kayentaStage/canaryRunSummaries.less +5 -0
- package/src/kayenta/stages/kayentaStage/canaryRunSummaries.tsx +136 -0
- package/src/kayenta/stages/kayentaStage/forAnalysisType.component.ts +45 -0
- package/src/kayenta/stages/kayentaStage/kayentaStage.controller.ts +789 -0
- package/src/kayenta/stages/kayentaStage/kayentaStage.html +528 -0
- package/src/kayenta/stages/kayentaStage/kayentaStage.less +5 -0
- package/src/kayenta/stages/kayentaStage/kayentaStage.transformer.ts +179 -0
- package/src/kayenta/stages/kayentaStage/kayentaStage.ts +221 -0
- package/src/kayenta/stages/kayentaStage/kayentaStageConfigSection.component.ts +21 -0
- package/src/kayenta/stages/kayentaStage/kayentaStageExecutionDetails.controller.ts +88 -0
- package/src/kayenta/stages/kayentaStage/kayentaStageExecutionDetails.html +114 -0
- package/src/kayenta/stages/kayentaStage/kayentaStageExecutionDetails.less +6 -0
- package/src/kayenta/stages/kayentaStage/stageTypes.ts +5 -0
- package/src/kayenta/utils/duration.spec.ts +69 -0
- package/src/kayenta/utils/duration.ts +48 -0
- package/src/lazy.ts +29 -0
- package/src/stub.ts +60 -0
- 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,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,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,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,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,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
|
+
});
|