From 6d9475127c774bb01c5987fe3615f74b3984ceb7 Mon Sep 17 00:00:00 2001 From: ismail simsek Date: Wed, 18 Jun 2025 16:24:07 +0200 Subject: [PATCH] Prometheus: Use PrometheusLanguageProviderInterface instead of legacy PromQlLanguageProvider (#105988) * refactor language provider * update tests * more tests * betterer and api endpoints * copilot updates * betterer * remove default value * prettier * introduce new methods * provide unit tests for labelValues * update metadata fetch * move all cache related stuff in caching.ts * provide interface * provide deprecation messages * unit tests for new interface * separation of concerns * update tests * fix unit test * fix some types * Revert "fix some types" This reverts commit 7e64b93b5faf253bbde62e9b9ce330a63d07aebd. * revert interface usage * betterer * use PrometheusLanguageProviderInterface in everywhere * introduce resource clients and better refactoring * prettier * type fixes * betterer * no empty matcher for series calls * better matchers * import fixes --- .../components/AnnotationQueryEditor.test.tsx | 4 +- .../components/PromQueryEditorByApp.test.tsx | 1 - .../components/VariableQueryEditor.test.tsx | 5 +-- .../MetricsBrowserContext.test.tsx | 4 +- .../metrics-browser/MetricsBrowserContext.tsx | 4 +- .../useMetricsLabelsValues.test.ts | 4 +- .../metrics-browser/useMetricsLabelsValues.ts | 4 +- .../MonacoQueryFieldProps.ts | 4 +- .../data_provider.ts | 6 +-- .../src/components/useMetricsState.test.ts | 6 +-- .../src/components/useMetricsState.ts | 4 +- .../usePromQueryFieldEffects.test.ts | 6 +-- .../components/usePromQueryFieldEffects.ts | 4 +- .../grafana-prometheus/src/datasource.test.ts | 4 +- packages/grafana-prometheus/src/datasource.ts | 42 ++++--------------- packages/grafana-prometheus/src/index.ts | 2 + .../grafana-prometheus/src/language_utils.ts | 19 ++------- .../components/MetricsLabelsSection.test.tsx | 3 +- .../components/MetricsLabelsSection.tsx | 3 +- .../components/PromQueryBuilder.test.tsx | 4 +- .../PromQueryBuilderContainer.test.tsx | 4 +- .../components/PromQueryCodeEditor.test.tsx | 4 +- ...omQueryCodeEditorAutocompleteInfo.test.tsx | 4 +- .../PromQueryEditorSelector.test.tsx | 4 +- .../metrics-modal/MetricsModal.test.tsx | 4 +- .../components/metrics-modal/MetricsModal.tsx | 4 +- .../shared/OperationList.test.tsx | 4 +- 27 files changed, 63 insertions(+), 98 deletions(-) diff --git a/packages/grafana-prometheus/src/components/AnnotationQueryEditor.test.tsx b/packages/grafana-prometheus/src/components/AnnotationQueryEditor.test.tsx index b6f10b7d556..c7dfeca5783 100644 --- a/packages/grafana-prometheus/src/components/AnnotationQueryEditor.test.tsx +++ b/packages/grafana-prometheus/src/components/AnnotationQueryEditor.test.tsx @@ -5,7 +5,7 @@ import { AnnotationQuery } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { PrometheusDatasource } from '../datasource'; -import PromQlLanguageProvider from '../language_provider'; +import { PrometheusLanguageProviderInterface } from '../language_provider'; import { EmptyLanguageProviderMock } from '../language_provider.mock'; import { PromQuery } from '../types'; @@ -47,7 +47,7 @@ describe('AnnotationQueryEditor', () => { }; function createMockDatasource() { - const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider; + const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface; const mockDatasource = { languageProvider, lookupsDisabled: false, diff --git a/packages/grafana-prometheus/src/components/PromQueryEditorByApp.test.tsx b/packages/grafana-prometheus/src/components/PromQueryEditorByApp.test.tsx index ed268f86621..ee2c7613b69 100644 --- a/packages/grafana-prometheus/src/components/PromQueryEditorByApp.test.tsx +++ b/packages/grafana-prometheus/src/components/PromQueryEditorByApp.test.tsx @@ -26,7 +26,6 @@ function setup(app: CoreApp): { onRunQuery: jest.Mock } { const dataSource = { getPrometheusTime: jest.fn((date, roundup) => 123), getQueryHints: jest.fn(() => []), - getDebounceTimeInMilliseconds: jest.fn(() => 300), languageProvider: { start: () => Promise.resolve([]), syntax: () => {}, diff --git a/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx b/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx index 7ff37c8657f..ef295e65b85 100644 --- a/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx +++ b/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx @@ -6,7 +6,7 @@ import { dateTime, TimeRange } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { PrometheusDatasource } from '../datasource'; -import PrometheusLanguageProvider from '../language_provider'; +import { PrometheusLanguageProviderInterface } from '../language_provider'; import { migrateVariableEditorBackToVariableSupport } from '../migrations/variableMigration'; import { selectOptionInTest } from '../test/helpers/selectOptionInTest'; import { PromVariableQuery, PromVariableQueryType, StandardPromVariableQuery } from '../types'; @@ -143,8 +143,7 @@ describe('PromVariableQueryEditor', () => { metricsMetadata: {}, getLabelValues: jest.fn().mockImplementation(() => ['that']), fetchLabelsWithMatch: jest.fn().mockImplementation(() => Promise.resolve({ those: 'those' })), - } as Partial as PrometheusLanguageProvider, - getDebounceTimeInMilliseconds: jest.fn(), + } as Partial, getTagKeys: jest .fn() .mockImplementation(() => Promise.resolve([{ text: 'this', value: 'this', label: 'this' }])), diff --git a/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.test.tsx b/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.test.tsx index 1c57718d2cd..a2c1c0d43ba 100644 --- a/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.test.tsx +++ b/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.test.tsx @@ -4,7 +4,7 @@ import { ReactNode } from 'react'; import { TimeRange } from '@grafana/data'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { getMockTimeRange } from '../../test/__mocks__/datasource'; import { MetricsBrowserProvider, useMetricsBrowser } from './MetricsBrowserContext'; @@ -61,7 +61,7 @@ const setupLanguageProviderMock = () => { job: ['job1', 'job2'], instance: ['instance1', 'instance2'], }), - } as unknown as PromQlLanguageProvider; + } as unknown as PrometheusLanguageProviderInterface; return { mockTimeRange, mockLanguageProvider }; }; diff --git a/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.tsx b/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.tsx index 4ad3266e2a9..5f1db29be6f 100644 --- a/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.tsx +++ b/packages/grafana-prometheus/src/components/metrics-browser/MetricsBrowserContext.tsx @@ -2,7 +2,7 @@ import { createContext, PropsWithChildren, useCallback, useContext, useMemo } fr import { TimeRange } from '@grafana/data'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { buildSelector } from './selectorBuilder'; import { Metric } from './types'; @@ -50,7 +50,7 @@ const MetricsBrowserContext = createContext void; }; diff --git a/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.test.ts b/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.test.ts index 082a86073d2..2cda264a78b 100644 --- a/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.test.ts +++ b/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.test.ts @@ -2,7 +2,7 @@ import { act, renderHook, waitFor } from '@testing-library/react'; import { TimeRange, dateTime } from '@grafana/data'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { getMockTimeRange } from '../../test/__mocks__/datasource'; import * as selectorBuilderModule from './selectorBuilder'; @@ -42,7 +42,7 @@ const setupMocks = () => { fetchSeriesValuesWithMatch: jest.fn(), fetchSeriesLabelsMatch: jest.fn(), fetchLabelsWithMatch: jest.fn(), - } as unknown as PromQlLanguageProvider; + } as unknown as PrometheusLanguageProviderInterface; // Mock standard responses (mockLanguageProvider.fetchLabelValues as jest.Mock).mockResolvedValue(['metric1', 'metric2', 'metric3']); diff --git a/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.ts b/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.ts index ad163361e7e..8b8d2a29c3d 100644 --- a/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.ts +++ b/packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.ts @@ -3,12 +3,12 @@ import { useDebounce } from 'react-use'; import { TimeRange } from '@grafana/data'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { buildSelector } from './selectorBuilder'; import { DEFAULT_SERIES_LIMIT, EMPTY_SELECTOR, LAST_USED_LABELS_KEY, Metric, METRIC_LABEL } from './types'; -export const useMetricsLabelsValues = (timeRange: TimeRange, languageProvider: PromQlLanguageProvider) => { +export const useMetricsLabelsValues = (timeRange: TimeRange, languageProvider: PrometheusLanguageProviderInterface) => { const timeRangeRef = useRef(timeRange); const lastSeriesLimitRef = useRef(DEFAULT_SERIES_LIMIT); const isInitializedRef = useRef(false); diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldProps.ts b/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldProps.ts index ac2995273e5..74dd74912ab 100644 --- a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldProps.ts +++ b/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldProps.ts @@ -2,7 +2,7 @@ import { HistoryItem, TimeRange } from '@grafana/data'; import { PrometheusDatasource } from '../../datasource'; -import type PromQlLanguageProvider from '../../language_provider'; +import { type PrometheusLanguageProviderInterface } from '../../language_provider'; import { PromQuery } from '../../types'; // we need to store this in a separate file, @@ -11,7 +11,7 @@ import { PromQuery } from '../../types'; // props as the sync-component. export type Props = { initialValue: string; - languageProvider: PromQlLanguageProvider; + languageProvider: PrometheusLanguageProviderInterface; history: Array>; placeholder: string; onRunQuery: (value: string) => void; diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts index b1baad9a770..fe43b03958a 100644 --- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts +++ b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts @@ -1,7 +1,7 @@ import { HistoryItem } from '@grafana/data'; import type { Monaco } from '@grafana/ui'; // used in TSDoc `@link` below -import PromQlLanguageProvider from '../../../language_provider'; +import { type PrometheusLanguageProviderInterface } from '../../../language_provider'; import { PromQuery } from '../../../types'; import { isValidLegacyName } from '../../../utf8_support'; @@ -31,12 +31,12 @@ interface Metric { } export interface DataProviderParams { - languageProvider: PromQlLanguageProvider; + languageProvider: PrometheusLanguageProviderInterface; historyProvider: Array>; } export class DataProvider { - readonly languageProvider: PromQlLanguageProvider; + readonly languageProvider: PrometheusLanguageProviderInterface; readonly historyProvider: Array>; readonly getSeriesLabels: typeof this.languageProvider.getSeriesLabels; readonly getSeriesValues: typeof this.languageProvider.getSeriesValues; diff --git a/packages/grafana-prometheus/src/components/useMetricsState.test.ts b/packages/grafana-prometheus/src/components/useMetricsState.test.ts index a483d707ec1..05808e35aea 100644 --- a/packages/grafana-prometheus/src/components/useMetricsState.test.ts +++ b/packages/grafana-prometheus/src/components/useMetricsState.test.ts @@ -1,15 +1,15 @@ import { renderHook } from '@testing-library/react'; import { PrometheusDatasource } from '../datasource'; -import PromQlLanguageProvider from '../language_provider'; +import { PrometheusLanguageProviderInterface } from '../language_provider'; import { useMetricsState } from './useMetricsState'; // Mock implementations -const createMockLanguageProvider = (metrics: string[] = []): PromQlLanguageProvider => +const createMockLanguageProvider = (metrics: string[] = []): PrometheusLanguageProviderInterface => ({ metrics, - }) as unknown as PromQlLanguageProvider; + }) as unknown as PrometheusLanguageProviderInterface; const createMockDatasource = (lookupsDisabled = false): PrometheusDatasource => ({ diff --git a/packages/grafana-prometheus/src/components/useMetricsState.ts b/packages/grafana-prometheus/src/components/useMetricsState.ts index a85e7980f40..86ea0cced30 100644 --- a/packages/grafana-prometheus/src/components/useMetricsState.ts +++ b/packages/grafana-prometheus/src/components/useMetricsState.ts @@ -1,7 +1,7 @@ import { useMemo } from 'react'; import { PrometheusDatasource } from '../datasource'; -import PromQlLanguageProvider from '../language_provider'; +import { PrometheusLanguageProviderInterface } from '../language_provider'; function getChooserText(metricsLookupDisabled: boolean, hasSyntax: boolean, hasMetrics: boolean) { if (metricsLookupDisabled) { @@ -21,7 +21,7 @@ function getChooserText(metricsLookupDisabled: boolean, hasSyntax: boolean, hasM export function useMetricsState( datasource: PrometheusDatasource, - languageProvider: PromQlLanguageProvider, + languageProvider: PrometheusLanguageProviderInterface, syntaxLoaded: boolean ) { return useMemo(() => { diff --git a/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.test.ts b/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.test.ts index 1237d2c79b4..2141f4d51bc 100644 --- a/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.test.ts +++ b/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.test.ts @@ -2,12 +2,12 @@ import { renderHook } from '@testing-library/react'; import { DataFrame, dateTime, TimeRange } from '@grafana/data'; -import PromQlLanguageProvider from '../language_provider'; +import { PrometheusLanguageProviderInterface } from '../language_provider'; import { usePromQueryFieldEffects } from './usePromQueryFieldEffects'; type TestProps = { - languageProvider: PromQlLanguageProvider; + languageProvider: PrometheusLanguageProviderInterface; range: TimeRange | undefined; series: DataFrame[]; }; @@ -39,7 +39,7 @@ describe('usePromQueryFieldEffects', () => { loadLabelKeys: jest.fn(), loadLabelValues: jest.fn(), modifyQuery: jest.fn(), - } as unknown as PromQlLanguageProvider; + } as unknown as PrometheusLanguageProviderInterface; const mockRange: TimeRange = { from: dateTime('2022-01-01T00:00:00Z'), diff --git a/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.ts b/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.ts index b8ec88f413d..b2371e57236 100644 --- a/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.ts +++ b/packages/grafana-prometheus/src/components/usePromQueryFieldEffects.ts @@ -2,13 +2,13 @@ import { MutableRefObject, useEffect, useRef } from 'react'; import { DataFrame, DateTime, TimeRange } from '@grafana/data'; -import PromQlLanguageProvider from '../language_provider'; +import { PrometheusLanguageProviderInterface } from '../language_provider'; import { roundMsToMin } from '../language_utils'; import { CancelablePromise } from './cancelable-promise'; export function usePromQueryFieldEffects( - languageProvider: PromQlLanguageProvider, + languageProvider: PrometheusLanguageProviderInterface, range: TimeRange | undefined, series: DataFrame[] | undefined, refreshMetrics: (languageProviderInitRef: MutableRefObject | null>) => Promise, diff --git a/packages/grafana-prometheus/src/datasource.test.ts b/packages/grafana-prometheus/src/datasource.test.ts index b66f769fa52..93e374c498e 100644 --- a/packages/grafana-prometheus/src/datasource.test.ts +++ b/packages/grafana-prometheus/src/datasource.test.ts @@ -18,7 +18,7 @@ import { config, getBackendSrv, setBackendSrv, TemplateSrv } from '@grafana/runt import { extractRuleMappingFromGroups, PrometheusDatasource } from './datasource'; import { prometheusRegularEscape, prometheusSpecialRegexEscape } from './escaping'; -import PromQlLanguageProvider from './language_provider'; +import { PrometheusLanguageProviderInterface } from './language_provider'; import { createDataRequest, createDefaultPromResponse, @@ -1011,7 +1011,7 @@ describe('PrometheusDatasource2', () => { ds.languageProvider = { histogramMetrics: ['tns_request_duration_seconds_bucket'], - } as PromQlLanguageProvider; + } as PrometheusLanguageProviderInterface; const request = { targets: [targetA, targetB], diff --git a/packages/grafana-prometheus/src/datasource.ts b/packages/grafana-prometheus/src/datasource.ts index 7e4702415c8..9be46cafdfc 100644 --- a/packages/grafana-prometheus/src/datasource.ts +++ b/packages/grafana-prometheus/src/datasource.ts @@ -44,13 +44,13 @@ import { addLabelToQuery } from './add_label_to_query'; import { PrometheusAnnotationSupport } from './annotations'; import { SUGGESTIONS_LIMIT } from './constants'; import { prometheusRegularEscape, prometheusSpecialRegexEscape } from './escaping'; -import PrometheusLanguageProvider, { exportToAbstractQuery, importFromAbstractQuery } from './language_provider'; import { - expandRecordingRules, - getClientCacheDurationInMinutes, - getPrometheusTime, - getRangeSnapInterval, -} from './language_utils'; + exportToAbstractQuery, + importFromAbstractQuery, + PrometheusLanguageProvider, + PrometheusLanguageProviderInterface, +} from './language_provider'; +import { expandRecordingRules, getPrometheusTime, getRangeSnapInterval } from './language_utils'; import { PrometheusMetricFindQuery } from './metric_find_query'; import { getQueryHints } from './query_hints'; import { promQueryModeller } from './querybuilder/shared/modeller_instance'; @@ -95,7 +95,7 @@ export class PrometheusDatasource withCredentials: boolean; interval: string; httpMethod: string; - languageProvider: PrometheusLanguageProvider; + languageProvider: PrometheusLanguageProviderInterface; exemplarTraceIdDestinations: ExemplarTraceIdDestination[] | undefined; lookupsDisabled: boolean; customQueryParameters: URLSearchParams; @@ -112,7 +112,7 @@ export class PrometheusDatasource constructor( instanceSettings: DataSourceInstanceSettings, private readonly templateSrv: TemplateSrv = getTemplateSrv(), - languageProvider?: PrometheusLanguageProvider + languageProvider?: PrometheusLanguageProviderInterface ) { super(instanceSettings); @@ -864,32 +864,6 @@ export class PrometheusDatasource return range.raw.from.includes('now') || range.raw.to.includes('now'); } - getDebounceTimeInMilliseconds(): number { - switch (this.cacheLevel) { - case PrometheusCacheLevel.Medium: - return 600; - case PrometheusCacheLevel.High: - return 1200; - default: - return 350; - } - } - - getDaysToCacheMetadata(): number { - switch (this.cacheLevel) { - case PrometheusCacheLevel.Medium: - return 7; - case PrometheusCacheLevel.High: - return 30; - default: - return 1; - } - } - - getCacheDurationInMinutes(): number { - return getClientCacheDurationInMinutes(this.cacheLevel); - } - getDefaultQuery(app: CoreApp): PromQuery { const defaults = { refId: 'A', diff --git a/packages/grafana-prometheus/src/index.ts b/packages/grafana-prometheus/src/index.ts index d5ddb638944..0b2629eb62a 100644 --- a/packages/grafana-prometheus/src/index.ts +++ b/packages/grafana-prometheus/src/index.ts @@ -82,6 +82,8 @@ export { } from './types'; export { PrometheusVariableSupport } from './variables'; +export type { PrometheusLanguageProviderInterface } from './language_provider'; + // For Metrics Drilldown export { default as PromQlLanguageProvider } from './language_provider'; export { getPrometheusTime } from './language_utils'; diff --git a/packages/grafana-prometheus/src/language_utils.ts b/packages/grafana-prometheus/src/language_utils.ts index be26aa3b217..ebe92f3d08c 100644 --- a/packages/grafana-prometheus/src/language_utils.ts +++ b/packages/grafana-prometheus/src/language_utils.ts @@ -14,6 +14,7 @@ import { } from '@grafana/data'; import { addLabelToQuery } from './add_label_to_query'; +import { getCacheDurationInMinutes } from './caching'; import { SUGGESTIONS_LIMIT, PROMETHEUS_QUERY_BUILDER_MAX_RESULTS } from './constants'; import { PrometheusCacheLevel, PromMetricsMetadata, PromMetricsMetadataItem, RecordingRuleIdentifier } from './types'; @@ -464,16 +465,15 @@ export function getRangeSnapInterval( } // Otherwise round down to the nearest nth minute for the start time const startTime = getPrometheusTime(range.from, false); - // const startTimeQuantizedSeconds = roundSecToLastMin(startTime, getClientCacheDurationInMinutes(cacheLevel)) * 60; - const startTimeQuantizedSeconds = incrRoundDn(startTime, getClientCacheDurationInMinutes(cacheLevel) * 60); + const startTimeQuantizedSeconds = incrRoundDn(startTime, getCacheDurationInMinutes(cacheLevel) * 60); // And round up to the nearest nth minute for the end time const endTime = getPrometheusTime(range.to, true); - const endTimeQuantizedSeconds = roundSecToNextMin(endTime, getClientCacheDurationInMinutes(cacheLevel)) * 60; + const endTimeQuantizedSeconds = roundSecToNextMin(endTime, getCacheDurationInMinutes(cacheLevel)) * 60; // If the interval was too short, we could have rounded both start and end to the same time, if so let's add one step to the end if (startTimeQuantizedSeconds === endTimeQuantizedSeconds) { - const endTimePlusOneStep = endTimeQuantizedSeconds + getClientCacheDurationInMinutes(cacheLevel) * 60; + const endTimePlusOneStep = endTimeQuantizedSeconds + getCacheDurationInMinutes(cacheLevel) * 60; return { start: startTimeQuantizedSeconds.toString(), end: endTimePlusOneStep.toString() }; } @@ -483,17 +483,6 @@ export function getRangeSnapInterval( return { start, end }; } -export function getClientCacheDurationInMinutes(cacheLevel: PrometheusCacheLevel) { - switch (cacheLevel) { - case PrometheusCacheLevel.Medium: - return 10; - case PrometheusCacheLevel.High: - return 60; - default: - return 1; - } -} - export function getPrometheusTime(date: string | DateTime, roundUp: boolean) { if (typeof date === 'string') { date = dateMath.parse(date, roundUp)!; diff --git a/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.test.tsx index 50c6ecac011..3b80e9ef901 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.test.tsx @@ -23,7 +23,6 @@ const createMockDatasource = () => { getVariables: jest.fn().mockReturnValue(['$var1', '$var2']), interpolateString: jest.fn((str) => str), hasLabelsMatchAPISupport: jest.fn().mockReturnValue(true), - getDebounceTimeInMilliseconds: jest.fn().mockReturnValue(300), lookupsDisabled: false, languageProvider: { fetchLabels: jest.fn().mockResolvedValue({}), @@ -126,7 +125,7 @@ describe('MetricsLabelsSection', () => { // Check that LabelFilters was called with correct props expect(LabelFilters).toHaveBeenCalledWith( expect.objectContaining({ - debounceDuration: 300, + debounceDuration: 350, labelsFilters: defaultQuery.labels, variableEditor: undefined, }), diff --git a/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.tsx b/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.tsx index e3cda329060..bcf6428aec8 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/MetricsLabelsSection.tsx @@ -3,6 +3,7 @@ import { useCallback } from 'react'; import { SelectableValue, TimeRange } from '@grafana/data'; +import { getDebounceTimeInMilliseconds } from '../../caching'; import { PrometheusDatasource } from '../../datasource'; import { truncateResult } from '../../language_utils'; import { PromMetricsMetadata } from '../../types'; @@ -210,7 +211,7 @@ export function MetricsLabelsSection({ variableEditor={variableEditor} /> { }); function createDatasource(options?: Partial>) { - const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider; + const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface; const datasource = new PrometheusDatasource( { url: '', diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderContainer.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderContainer.test.tsx index 630eedad938..b325da19d45 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderContainer.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderContainer.test.tsx @@ -5,7 +5,7 @@ import userEvent from '@testing-library/user-event'; import { DataSourceInstanceSettings, DataSourcePluginMeta } from '@grafana/data'; import { PrometheusDatasource } from '../../datasource'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { EmptyLanguageProviderMock } from '../../language_provider.mock'; import { PromQuery } from '../../types'; import { getOperationParamId } from '../shared/param_utils'; @@ -40,7 +40,7 @@ describe('PromQueryBuilderContainer', () => { }); function setup(queryOverrides: Partial = {}) { - const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider; + const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface; const datasource = new PrometheusDatasource( { url: '', diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditor.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditor.test.tsx index 5aa9ba645dc..d2e830947ad 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditor.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditor.test.tsx @@ -4,7 +4,7 @@ import { render, screen } from '@testing-library/react'; import { DataSourceInstanceSettings, DataSourcePluginMeta } from '@grafana/data'; import { PrometheusDatasource } from '../../datasource'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { EmptyLanguageProviderMock } from '../../language_provider.mock'; import { EXPLAIN_LABEL_FILTER_CONTENT } from './PromQueryBuilderExplained'; @@ -16,7 +16,7 @@ jest.mock('../../components/monaco-query-field/MonacoQueryFieldWrapper', () => { }); function createDatasource() { - const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider; + const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface; const datasource = new PrometheusDatasource( { url: '', diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx index 3a2d762db70..5a76b9bd2f4 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx @@ -8,7 +8,7 @@ import { config } from '@grafana/runtime'; import { CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT } from '../../components/monaco-query-field/monaco-completion-provider/data_provider'; import { PromQueryEditorProps } from '../../components/types'; import { PrometheusDatasource } from '../../datasource'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { EmptyLanguageProviderMock } from '../../language_provider.mock'; import { PromQuery } from '../../types'; import { QueryEditorMode } from '../shared/types'; @@ -78,7 +78,7 @@ const getDefaultDatasource = (jsonDataOverrides = {}) => readOnly: false, }, undefined, - new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider + new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface ); const defaultProps = { diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx index 6cfbf555999..09c565bdd8a 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx @@ -7,7 +7,7 @@ import { CoreApp, PluginMeta, PluginType } from '@grafana/data'; import { PromQueryEditorProps } from '../../components/types'; import { PrometheusDatasource } from '../../datasource'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { EmptyLanguageProviderMock } from '../../language_provider.mock'; import { PromQuery } from '../../types'; import { QueryEditorMode } from '../shared/types'; @@ -72,7 +72,7 @@ const getDefaultDatasource = (jsonDataOverrides = {}) => readOnly: false, }, undefined, - new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider + new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface ); const defaultProps = { diff --git a/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.test.tsx index 5f9928fa450..e28488c9777 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.test.tsx @@ -5,7 +5,7 @@ import userEvent from '@testing-library/user-event'; import { DataSourceInstanceSettings, DataSourcePluginMeta } from '@grafana/data'; import { PrometheusDatasource } from '../../../datasource'; -import PromQlLanguageProvider from '../../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../../language_provider'; import { EmptyLanguageProviderMock } from '../../../language_provider.mock'; import { PromOptions } from '../../../types'; import { PromVisualQuery } from '../../types'; @@ -243,7 +243,7 @@ const listOfMetrics: string[] = [ ]; function createDatasource(withLabels?: boolean) { - const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider; + const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface; // display different results if their are labels selected in the PromVisualQuery if (withLabels) { diff --git a/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.tsx b/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.tsx index 5070dd338e1..da19c46ddc5 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/metrics-modal/MetricsModal.tsx @@ -19,6 +19,8 @@ import { useTheme2, } from '@grafana/ui'; +import { getDebounceTimeInMilliseconds } from '../../../caching'; + import { AdditionalSettings } from './AdditionalSettings'; import { FeedbackLink } from './FeedbackLink'; import { ResultsTable } from './ResultsTable'; @@ -106,7 +108,7 @@ export const MetricsModal = (props: MetricsModalProps) => { isLoading: false, }) ); - }, datasource.getDebounceTimeInMilliseconds()), + }, getDebounceTimeInMilliseconds(datasource.cacheLevel)), [datasource, query] ); diff --git a/packages/grafana-prometheus/src/querybuilder/shared/OperationList.test.tsx b/packages/grafana-prometheus/src/querybuilder/shared/OperationList.test.tsx index d8cf257fd87..484e829e72f 100644 --- a/packages/grafana-prometheus/src/querybuilder/shared/OperationList.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/shared/OperationList.test.tsx @@ -5,7 +5,7 @@ import userEvent from '@testing-library/user-event'; import { DataSourceApi, DataSourceInstanceSettings } from '@grafana/data'; import { PrometheusDatasource } from '../../datasource'; -import PromQlLanguageProvider from '../../language_provider'; +import { PrometheusLanguageProviderInterface } from '../../language_provider'; import { EmptyLanguageProviderMock } from '../../language_provider.mock'; import { getMockTimeRange } from '../../test/__mocks__/datasource'; import { PromOptions } from '../../types'; @@ -65,7 +65,7 @@ describe('OperationList', () => { }); function setup(query: PromVisualQuery = defaultQuery) { - const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider; + const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface; const props = { datasource: new PrometheusDatasource( {