From c23a7bdcf83f380c9690b50d66d3ead10fc31632 Mon Sep 17 00:00:00 2001 From: Erik Sundell Date: Mon, 24 Oct 2022 20:45:02 +0200 Subject: [PATCH] refactoring dimension values frontend req (#57475) --- .../app/plugins/datasource/cloudwatch/api.ts | 22 ++++++++++++------- .../completion/CompletionItemProvider.ts | 13 +++++------ .../components/Dimensions/FilterItem.tsx | 8 ++++++- .../MetricStatEditor/MetricStatEditor.tsx | 4 ++-- .../components/SQLBuilderEditor/SQLFilter.tsx | 4 ++-- .../plugins/datasource/cloudwatch/types.ts | 7 ++++++ .../datasource/cloudwatch/variables.test.ts | 14 ++++++------ .../datasource/cloudwatch/variables.ts | 8 ++++++- 8 files changed, 52 insertions(+), 28 deletions(-) diff --git a/public/app/plugins/datasource/cloudwatch/api.ts b/public/app/plugins/datasource/cloudwatch/api.ts index d809ee53ef7..ba647c986fa 100644 --- a/public/app/plugins/datasource/cloudwatch/api.ts +++ b/public/app/plugins/datasource/cloudwatch/api.ts @@ -5,7 +5,13 @@ import { getBackendSrv } from '@grafana/runtime'; import { TemplateSrv } from 'app/features/templating/template_srv'; import { CloudWatchRequest } from './query-runner/CloudWatchRequest'; -import { CloudWatchJsonData, DescribeLogGroupsRequest, GetDimensionKeysRequest, MultiFilters } from './types'; +import { + CloudWatchJsonData, + DescribeLogGroupsRequest, + GetDimensionKeysRequest, + GetDimensionValuesRequest, + MultiFilters, +} from './types'; export interface SelectableResourceValue extends SelectableValue { text: string; @@ -83,13 +89,13 @@ export class CloudWatchAPI extends CloudWatchRequest { }).then((dimensionKeys) => dimensionKeys.map(toOption)); } - async getDimensionValues( - region: string, - namespace: string | undefined, - metricName: string | undefined, - dimensionKey: string, - dimensionFilters: {} - ) { + async getDimensionValues({ + dimensionKey, + region, + namespace, + dimensionFilters = {}, + metricName = '', + }: GetDimensionValuesRequest) { if (!namespace || !metricName) { return []; } diff --git a/public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/CompletionItemProvider.ts b/public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/CompletionItemProvider.ts index 5cc03c47279..0443725cd78 100644 --- a/public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/CompletionItemProvider.ts +++ b/public/app/plugins/datasource/cloudwatch/cloudwatch-sql/completion/CompletionItemProvider.ts @@ -199,13 +199,12 @@ export class SQLCompletionItemProvider extends CompletionItemProvider { const metricNameToken = getMetricNameToken(currentToken); const labelKey = currentToken?.getPreviousNonWhiteSpaceToken()?.getPreviousNonWhiteSpaceToken(); if (namespaceToken?.value && labelKey?.value && metricNameToken?.value) { - const values = await this.api.getDimensionValues( - this.templateSrv.replace(this.region), - this.templateSrv.replace(namespaceToken.value.replace(/\"/g, '')), - this.templateSrv.replace(metricNameToken.value), - this.templateSrv.replace(labelKey.value), - {} - ); + const values = await this.api.getDimensionValues({ + region: this.region, + namespace: namespaceToken.value.replace(/\"/g, ''), + metricName: metricNameToken.value, + dimensionKey: labelKey.value, + }); values.map((o) => addSuggestion(`'${o.value}'`, { insertText: `'${o.value}' `, command: TRIGGER_SUGGEST }) ); diff --git a/public/app/plugins/datasource/cloudwatch/components/Dimensions/FilterItem.tsx b/public/app/plugins/datasource/cloudwatch/components/Dimensions/FilterItem.tsx index 9e1a0c11df6..6fa2a829cd3 100644 --- a/public/app/plugins/datasource/cloudwatch/components/Dimensions/FilterItem.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/Dimensions/FilterItem.tsx @@ -52,7 +52,13 @@ export const FilterItem: FunctionComponent = ({ } return datasource.api - .getDimensionValues(region, namespace, metricName, filter.key, dimensionsExcludingCurrentKey) + .getDimensionValues({ + dimensionKey: filter.key, + dimensionFilters: dimensionsExcludingCurrentKey, + region, + namespace, + metricName, + }) .then((result: Array>) => { if (result.length && !disableExpressions && !result.some((o) => o.value === wildcardOption.value)) { result.unshift(wildcardOption); diff --git a/public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/MetricStatEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/MetricStatEditor.tsx index 0e11495ff27..96a11b7762b 100644 --- a/public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/MetricStatEditor.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/MetricStatEditor/MetricStatEditor.tsx @@ -28,10 +28,10 @@ export function MetricStatEditor({ onChange, onRunQuery, }: React.PropsWithChildren) { - const { region, namespace, metricName, dimensions } = metricStat; + const { region, namespace } = metricStat; const namespaces = useNamespaces(datasource); const metrics = useMetrics(datasource, region, namespace); - const dimensionKeys = useDimensionKeys(datasource, { region, namespace, metricName, dimensionFilters: dimensions }); + const dimensionKeys = useDimensionKeys(datasource, { ...metricStat, dimensionFilters: metricStat.dimensions }); const onMetricStatChange = (metricStat: MetricStat) => { onChange(metricStat); diff --git a/public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLFilter.tsx b/public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLFilter.tsx index a9b0b04baea..c5856f3632b 100644 --- a/public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLFilter.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/SQLBuilderEditor/SQLFilter.tsx @@ -105,12 +105,12 @@ const FilterItem: React.FC = (props) => { const dimensionKeys = useDimensionKeys(datasource, { region: query.region, namespace, metricName }); const loadDimensionValues = async () => { - if (!filter.property?.name) { + if (!filter.property?.name || !namespace) { return []; } return datasource.api - .getDimensionValues(query.region, namespace, metricName, filter.property.name, {}) + .getDimensionValues({ region: query.region, namespace, metricName, dimensionKey: filter.property.name }) .then((result: Array>) => { return appendTemplateVariables(datasource, result); }); diff --git a/public/app/plugins/datasource/cloudwatch/types.ts b/public/app/plugins/datasource/cloudwatch/types.ts index b84678baf0e..76ef27024cc 100644 --- a/public/app/plugins/datasource/cloudwatch/types.ts +++ b/public/app/plugins/datasource/cloudwatch/types.ts @@ -460,3 +460,10 @@ export interface GetDimensionKeysRequest extends ResourceRequest { namespace?: string; dimensionFilters?: Dimensions; } + +export interface GetDimensionValuesRequest extends ResourceRequest { + dimensionKey: string; + namespace: string; + metricName?: string; + dimensionFilters?: Dimensions; +} diff --git a/public/app/plugins/datasource/cloudwatch/variables.test.ts b/public/app/plugins/datasource/cloudwatch/variables.test.ts index c7b5563e8ce..36c1708bd1f 100644 --- a/public/app/plugins/datasource/cloudwatch/variables.test.ts +++ b/public/app/plugins/datasource/cloudwatch/variables.test.ts @@ -76,13 +76,13 @@ describe('variables', () => { }); it('should run if values are set', async () => { const result = await variables.execute(query); - expect(getDimensionValues).toBeCalledWith( - query.region, - query.namespace, - query.metricName, - query.dimensionKey, - query.dimensionFilters - ); + expect(getDimensionValues).toBeCalledWith({ + region: query.region, + namespace: query.namespace, + metricName: query.metricName, + dimensionKey: query.dimensionKey, + dimensionFilters: query.dimensionFilters, + }); expect(result).toEqual([{ text: 'e', value: 'e', expandable: true }]); }); }); diff --git a/public/app/plugins/datasource/cloudwatch/variables.ts b/public/app/plugins/datasource/cloudwatch/variables.ts index eff700a70e3..4cb38573e25 100644 --- a/public/app/plugins/datasource/cloudwatch/variables.ts +++ b/public/app/plugins/datasource/cloudwatch/variables.ts @@ -105,7 +105,13 @@ export class CloudWatchVariableSupport extends CustomVariableSupport ({ text: s.label, value: s.value,