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 7e64b93b5f.

* 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
This commit is contained in:
ismail simsek 2025-06-18 16:24:07 +02:00 committed by GitHub
parent 74e39dd996
commit 6d9475127c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 63 additions and 98 deletions

View File

@ -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,

View File

@ -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: () => {},

View File

@ -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<PrometheusLanguageProvider> as PrometheusLanguageProvider,
getDebounceTimeInMilliseconds: jest.fn(),
} as Partial<PrometheusLanguageProviderInterface>,
getTagKeys: jest
.fn()
.mockImplementation(() => Promise.resolve([{ text: 'this', value: 'this', label: 'this' }])),

View File

@ -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 };
};

View File

@ -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<MetricsBrowserContextType | undefine
type MetricsBrowserProviderProps = {
timeRange: TimeRange;
languageProvider: PromQlLanguageProvider;
languageProvider: PrometheusLanguageProviderInterface;
onChange: (selector: string) => void;
};

View File

@ -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']);

View File

@ -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>(timeRange);
const lastSeriesLimitRef = useRef(DEFAULT_SERIES_LIMIT);
const isInitializedRef = useRef(false);

View File

@ -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<HistoryItem<PromQuery>>;
placeholder: string;
onRunQuery: (value: string) => void;

View File

@ -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<HistoryItem<PromQuery>>;
}
export class DataProvider {
readonly languageProvider: PromQlLanguageProvider;
readonly languageProvider: PrometheusLanguageProviderInterface;
readonly historyProvider: Array<HistoryItem<PromQuery>>;
readonly getSeriesLabels: typeof this.languageProvider.getSeriesLabels;
readonly getSeriesValues: typeof this.languageProvider.getSeriesValues;

View File

@ -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 =>
({

View File

@ -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(() => {

View File

@ -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'),

View File

@ -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<CancelablePromise<unknown> | null>) => Promise<void>,

View File

@ -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],

View File

@ -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<PromOptions>,
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',

View File

@ -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';

View File

@ -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)!;

View File

@ -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,
}),

View File

@ -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}
/>
<LabelFilters
debounceDuration={datasource.getDebounceTimeInMilliseconds()}
debounceDuration={getDebounceTimeInMilliseconds(datasource.cacheLevel)}
getLabelValuesAutofillSuggestions={getLabelValuesAutocompleteSuggestions}
labelsFilters={query.labels}
onChange={onChangeLabels}

View File

@ -13,7 +13,7 @@ import {
import { TemplateSrv } from '@grafana/runtime';
import { PrometheusDatasource } from '../../datasource';
import PromQlLanguageProvider from '../../language_provider';
import { PrometheusLanguageProviderInterface } from '../../language_provider';
import { EmptyLanguageProviderMock } from '../../language_provider.mock';
import * as queryHints from '../../query_hints';
import { PromApplication, PromOptions } from '../../types';
@ -338,7 +338,7 @@ describe('PromQueryBuilder', () => {
});
function createDatasource(options?: Partial<DataSourceInstanceSettings<PromOptions>>) {
const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider;
const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface;
const datasource = new PrometheusDatasource(
{
url: '',

View File

@ -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<PromQuery> = {}) {
const languageProvider = new EmptyLanguageProviderMock() as unknown as PromQlLanguageProvider;
const languageProvider = new EmptyLanguageProviderMock() as unknown as PrometheusLanguageProviderInterface;
const datasource = new PrometheusDatasource(
{
url: '',

View File

@ -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: '',

View File

@ -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 = {

View File

@ -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 = {

View File

@ -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) {

View File

@ -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]
);

View File

@ -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(
{