diff --git a/public/app/features/explore/QueryRows.tsx b/public/app/features/explore/QueryRows.tsx index 4b5a16ef781..c5b29238c78 100644 --- a/public/app/features/explore/QueryRows.tsx +++ b/public/app/features/explore/QueryRows.tsx @@ -20,8 +20,8 @@ export default class QueryRows extends PureComponent { const { className = '', exploreEvents, exploreId, queryKeys } = this.props; return (
- {queryKeys.map((key, index) => { - return ; + {queryKeys.map((_, index) => { + return ; })}
); diff --git a/public/app/features/explore/state/reducers.ts b/public/app/features/explore/state/reducers.ts index e3bf248952c..aa3d194eba8 100644 --- a/public/app/features/explore/state/reducers.ts +++ b/public/app/features/explore/state/reducers.ts @@ -302,7 +302,6 @@ export const itemReducer = (state: ExploreItemState = makeExploreItemState(), ac latency: 0, queryResponse: createEmptyQueryResponse(), loading: false, - queryKeys: [], supportedModes, mode: mode ?? newMode, originPanelId: state.urlState && state.urlState.originPanelId, diff --git a/public/app/plugins/datasource/prometheus/components/PromQueryField.test.tsx b/public/app/plugins/datasource/prometheus/components/PromQueryField.test.tsx index 876ed0005fd..5effcdc6c8f 100644 --- a/public/app/plugins/datasource/prometheus/components/PromQueryField.test.tsx +++ b/public/app/plugins/datasource/prometheus/components/PromQueryField.test.tsx @@ -1,4 +1,67 @@ -import { groupMetricsByPrefix, RECORDING_RULES_GROUP } from './PromQueryField'; +import { mount } from 'enzyme'; +// @ts-ignore +import RCCascader from 'rc-cascader'; +import React from 'react'; +import PromQlLanguageProvider, { DEFAULT_LOOKUP_METRICS_THRESHOLD } from '../language_provider'; +import PromQueryField, { groupMetricsByPrefix, RECORDING_RULES_GROUP } from './PromQueryField'; + +describe('PromQueryField', () => { + beforeAll(() => { + // @ts-ignore + window.getSelection = () => {}; + }); + + it('refreshes metrics when the data source changes', async () => { + const metrics = ['foo', 'bar']; + const languageProvider = ({ + histogramMetrics: [] as any, + metrics, + metricsMetadata: {}, + lookupsDisabled: false, + lookupMetricsThreshold: DEFAULT_LOOKUP_METRICS_THRESHOLD, + start: () => { + return Promise.resolve([]); + }, + } as unknown) as PromQlLanguageProvider; + + const queryField = mount( + {}} + onChange={() => {}} + history={[]} + /> + ); + await Promise.resolve(); + + const cascader = queryField.find(RCCascader); + cascader.simulate('click'); + const cascaderNode: HTMLElement = cascader.instance().getPopupDOMNode(); + + for (const item of Array.from(cascaderNode.getElementsByTagName('li'))) { + expect(metrics.includes(item.innerHTML)).toBe(true); + } + + const changedMetrics = ['baz', 'moo']; + queryField.setProps({ + datasource: { + languageProvider: { + ...languageProvider, + metrics: changedMetrics, + }, + }, + }); + await Promise.resolve(); + + for (const item of Array.from(cascaderNode.getElementsByTagName('li'))) { + expect(changedMetrics.includes(item.innerHTML)).toBe(true); + } + }); +}); describe('groupMetricsByPrefix()', () => { it('returns an empty group for no metrics', () => { diff --git a/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx b/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx index efa1326d6ae..01d2f4404e6 100644 --- a/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx +++ b/public/app/plugins/datasource/prometheus/components/PromQueryField.tsx @@ -20,7 +20,6 @@ import { CancelablePromise, makePromiseCancelable } from 'app/core/utils/Cancela import { ExploreQueryFieldProps, QueryHint, isDataFrame, toLegacyResponseData, HistoryItem } from '@grafana/data'; import { DOMUtil, SuggestionsState } from '@grafana/ui'; import { PrometheusDatasource } from '../datasource'; -import PromQlLanguageProvider from '../language_provider'; const HISTOGRAM_GROUP = '__histograms__'; const PRISM_SYNTAX = 'promql'; @@ -121,16 +120,11 @@ interface PromQueryFieldState { class PromQueryField extends React.PureComponent { plugins: Plugin[]; - languageProvider: PromQlLanguageProvider; languageProviderInitializationPromise: CancelablePromise; constructor(props: PromQueryFieldProps, context: React.Context) { super(props, context); - if (props.datasource.languageProvider) { - this.languageProvider = props.datasource.languageProvider; - } - this.plugins = [ BracesPlugin(), SlatePrism({ @@ -147,9 +141,8 @@ class PromQueryField extends React.PureComponent) => { - this.languageProviderInitializationPromise = cancelablePromise; + refreshMetrics = () => { + const { + datasource: { languageProvider }, + } = this.props; + + Prism.languages[PRISM_SYNTAX] = languageProvider.syntax; + this.languageProviderInitializationPromise = makePromiseCancelable(languageProvider.start()); this.languageProviderInitializationPromise.promise .then(remaining => { remaining.map((task: Promise) => task.then(this.onUpdateLanguage).catch(() => {})); @@ -246,7 +251,8 @@ class PromQueryField extends React.PureComponent => { - if (!this.languageProvider) { + const { + datasource: { languageProvider }, + } = this.props; + + if (!languageProvider) { return { suggestions: [] }; } const { history } = this.props; const { prefix, text, value, wrapperClasses, labelKey } = typeahead; - const result = await this.languageProvider.provideCompletionItems( + const result = await languageProvider.provideCompletionItems( { text, value, prefix, wrapperClasses, labelKey }, { history } ); @@ -293,9 +303,13 @@ class PromQueryField extends React.PureComponent 0);