From 26b1cc5dcf47248e55da58c7927aa7a97dcd7d6d Mon Sep 17 00:00:00 2001 From: Erik Sundell Date: Mon, 19 Nov 2018 11:34:40 +0100 Subject: [PATCH] stackdriver: join resource and metric labels. split them in values and keys --- .../stackdriver/StackdriverMetricFindQuery.ts | 35 ++++++++++++++----- .../components/VariableQueryEditor.test.tsx | 4 +-- .../components/VariableQueryEditor.tsx | 34 +++++++----------- .../plugins/datasource/stackdriver/types.ts | 4 +-- 4 files changed, 43 insertions(+), 34 deletions(-) diff --git a/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts b/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts index 226bdf7ee22..2dea8c0405a 100644 --- a/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts +++ b/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts @@ -1,4 +1,3 @@ -import has from 'lodash/has'; import isString from 'lodash/isString'; import { alignmentPeriods } from './constants'; import { MetricFindQueryTypes } from './types'; @@ -12,9 +11,10 @@ export default class StackdriverMetricFindQuery { switch (query.selectedQueryType) { case MetricFindQueryTypes.MetricTypes: return this.handleMetricTypesQuery(query); - case MetricFindQueryTypes.MetricLabels: - case MetricFindQueryTypes.ResourceLabels: - return this.handleLabelQuery(query); + case MetricFindQueryTypes.LabelKeys: + return this.handleLabelKeysQuery(query); + case MetricFindQueryTypes.LabelValues: + return this.handleLabelValuesQuery(query); case MetricFindQueryTypes.ResourceTypes: return this.handleResourceTypeQuery(query); case MetricFindQueryTypes.Aligners: @@ -44,16 +44,33 @@ export default class StackdriverMetricFindQuery { })); } - async handleLabelQuery({ selectedQueryType, selectedMetricType, labelKey }) { + async handleLabelKeysQuery({ selectedQueryType, selectedMetricType, labelKey }) { if (!selectedMetricType) { return []; } - const refId = 'handleLabelsQueryType'; + const refId = 'handleLabelKeysQuery'; const response = await this.datasource.getLabels(selectedMetricType, refId); - if (!has(response, `meta.${selectedQueryType}.${labelKey}`)) { + const labelKeys = response.meta + ? [...Object.keys(response.meta.resourceLabels), ...Object.keys(response.meta.metricLabels)] + : []; + return labelKeys.map(this.toFindQueryResult); + } + + async handleLabelValuesQuery({ selectedQueryType, selectedMetricType, labelKey }) { + if (!selectedMetricType) { return []; } - return response.meta[selectedQueryType][labelKey].map(this.toFindQueryResult); + const refId = 'handleLabelValuesQuery'; + const response = await this.datasource.getLabels(selectedMetricType, refId); + + let values = []; + if (response.meta && response.meta.metricLabels && response.meta.metricLabels.hasOwnProperty(labelKey)) { + values = response.meta.metricLabels[labelKey]; + } else if (response.meta && response.meta.resourceLabels && response.meta.resourceLabels.hasOwnProperty(labelKey)) { + values = response.meta.resourceLabels[labelKey]; + } + + return values.map(this.toFindQueryResult); } async handleResourceTypeQuery({ selectedMetricType }) { @@ -62,7 +79,7 @@ export default class StackdriverMetricFindQuery { } const refId = 'handleResourceTypeQueryQueryType'; const response = await this.datasource.getLabels(selectedMetricType, refId); - return response.meta.resourceTypes.map(this.toFindQueryResult); + return response.meta.resourceTypes ? response.meta.resourceTypes.map(this.toFindQueryResult) : []; } async handleAlignersQuery({ selectedMetricType }) { diff --git a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx index d3b1aa54656..5143348f0fe 100644 --- a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx +++ b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx @@ -34,9 +34,9 @@ describe('VariableQueryEditor', () => { describe('and an existing variable is edited', () => { it('should trigger new query using the saved query type', done => { - props.query = { selectedQueryType: MetricFindQueryTypes.MetricLabels }; + props.query = { selectedQueryType: MetricFindQueryTypes.LabelKeys }; props.onChange = (query, definition) => { - expect(definition).toBe('Stackdriver - Metric Labels'); + expect(definition).toBe('Stackdriver - Labels Keys'); done(); }; renderer.create().toJSON(); diff --git a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx index dae612fcc64..4ce5910e191 100644 --- a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx +++ b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx @@ -8,8 +8,8 @@ import { MetricFindQueryTypes, VariableQueryData } from '../types'; export class StackdriverVariableQueryEditor extends PureComponent { queryTypes: Array<{ value: string; name: string }> = [ { value: MetricFindQueryTypes.MetricTypes, name: 'Metric Types' }, - { value: MetricFindQueryTypes.MetricLabels, name: 'Metric Labels' }, - { value: MetricFindQueryTypes.ResourceLabels, name: 'Resource Labels' }, + { value: MetricFindQueryTypes.LabelKeys, name: 'Label Keys' }, + { value: MetricFindQueryTypes.LabelValues, name: 'Label Values' }, { value: MetricFindQueryTypes.ResourceTypes, name: 'Resource Types' }, { value: MetricFindQueryTypes.Aggregations, name: 'Aggregations' }, { value: MetricFindQueryTypes.Aligners, name: 'Aligners' }, @@ -57,7 +57,7 @@ export class StackdriverVariableQueryEditor extends PureComponent l === this.state.labelKey) ? this.state.labelKey : labels[0]; result = { labels, labelKey }; } @@ -127,8 +123,8 @@ export class StackdriverVariableQueryEditor extends PureComponent ); - case MetricFindQueryTypes.MetricLabels: - case MetricFindQueryTypes.ResourceLabels: + case MetricFindQueryTypes.LabelKeys: + case MetricFindQueryTypes.LabelValues: case MetricFindQueryTypes.ResourceTypes: return ( @@ -144,16 +140,12 @@ export class StackdriverVariableQueryEditor extends PureComponent this.onMetricTypeChange(e)} label="Metric Types" /> - {queryType !== MetricFindQueryTypes.ResourceTypes && ( + {queryType === MetricFindQueryTypes.LabelValues && ( ({ value: l, name: l }))} onValueChange={e => this.onLabelKeyChange(e)} - label={ - this.state.selectedQueryType === MetricFindQueryTypes.ResourceLabels - ? 'Resource Label Key' - : 'Metric Label Key' - } + label="Label Keys" /> )} diff --git a/public/app/plugins/datasource/stackdriver/types.ts b/public/app/plugins/datasource/stackdriver/types.ts index 80d416cbe5a..f88bd427b28 100644 --- a/public/app/plugins/datasource/stackdriver/types.ts +++ b/public/app/plugins/datasource/stackdriver/types.ts @@ -1,7 +1,7 @@ export enum MetricFindQueryTypes { MetricTypes = 'metricTypes', - MetricLabels = 'metricLabels', - ResourceLabels = 'resourceLabels', + LabelKeys = 'labelKeys', + LabelValues = 'labelValues', ResourceTypes = 'resourceTypes', Aggregations = 'aggregations', Aligners = 'aligners',