From 4ec2eff949032982d8b59c450f90b2730cd5c307 Mon Sep 17 00:00:00 2001 From: ismail simsek Date: Wed, 28 May 2025 12:07:15 +0200 Subject: [PATCH] fix scope issues --- .../src/language_provider.test.ts | 3 +- .../src/language_provider.ts | 39 +++++++------------ .../src/resource_clients.test.ts | 27 +++++++------ .../src/resource_clients.ts | 25 ++++++------ 4 files changed, 39 insertions(+), 55 deletions(-) diff --git a/packages/grafana-prometheus/src/language_provider.test.ts b/packages/grafana-prometheus/src/language_provider.test.ts index df14a811b81..d7217a68aaa 100644 --- a/packages/grafana-prometheus/src/language_provider.test.ts +++ b/packages/grafana-prometheus/src/language_provider.test.ts @@ -767,7 +767,7 @@ describe('PrometheusLanguageProvider with feature toggle', () => { expect(resourceClientStartSpy).toHaveBeenCalled(); expect(queryMetadataSpy).toHaveBeenCalled(); expect(provider.retrieveMetricsMetadata()).toEqual(mockMetadata); - expect(provider.metricsMetadata).toEqual(mockMetadata); + expect(provider.metricsMetadata).toEqual(mockMetadata); // Check backward compatibility }); }); @@ -782,7 +782,6 @@ describe('PrometheusLanguageProvider with feature toggle', () => { expect(queryMetadataSpy).toHaveBeenCalled(); expect(result).toEqual(mockMetadata); expect(provider.retrieveMetricsMetadata()).toEqual(mockMetadata); - expect(provider.metricsMetadata).toEqual(mockMetadata); // Check backward compatibility }); }); diff --git a/packages/grafana-prometheus/src/language_provider.ts b/packages/grafana-prometheus/src/language_provider.ts index 846283e056e..5e104566c9f 100644 --- a/packages/grafana-prometheus/src/language_provider.ts +++ b/packages/grafana-prometheus/src/language_provider.ts @@ -530,28 +530,13 @@ export class PrometheusLanguageProvider extends PromQlLanguageProvider implement private _metricsMetadata?: PromMetricsMetadata; private _resourceClient: ResourceApiClient; - constructor(datasource: PrometheusDatasource) { + constructor(public datasource: PrometheusDatasource) { super(datasource); - this.datasource = datasource; - - const { cacheLevel, getAdjustedInterval, getTimeRangeParams, interpolateString } = this.datasource; if (this.datasource.hasLabelsMatchAPISupport()) { - this._resourceClient = new LabelsApiClient( - this.request, - cacheLevel, - getAdjustedInterval, - getTimeRangeParams, - interpolateString - ); + this._resourceClient = new LabelsApiClient(this.request, this.datasource); } else { - this._resourceClient = new SeriesApiClient( - this.request, - cacheLevel, - getAdjustedInterval, - getTimeRangeParams, - interpolateString - ); + this._resourceClient = new SeriesApiClient(this.request, this.datasource); } } @@ -565,12 +550,20 @@ export class PrometheusLanguageProvider extends PromQlLanguageProvider implement if (this.datasource.lookupsDisabled) { return []; } - await Promise.all([this._resourceClient.start(timeRange), this.queryMetricsMetadata()]); + return this._backwardCompatibleStart(timeRange); + }; - // Until we remove old API we need to have backward compatibility + /** + * This private method exists to make sure the old class will be functional until we remove it. + * When we remove old class (PromQlLanguageProvider) we should remove this method too. + */ + private _backwardCompatibleStart = async (timeRange: TimeRange) => { + this.metricsMetadata = this.retrieveMetricsMetadata(); this.metrics = this.retrieveMetrics(); - return Promise.resolve([]); + this.histogramMetrics = this.retrieveHistogramMetrics(); + this.labelKeys = this.retrieveLabelKeys(); + return []; }; /** @@ -611,10 +604,6 @@ export class PrometheusLanguageProvider extends PromQlLanguageProvider implement public queryMetricsMetadata = async (): Promise => { this._metricsMetadata = await this._queryMetadata(); - - // Until we remove old API we need to have backward compatibility - this.metricsMetadata = this._metricsMetadata; - return this._metricsMetadata; }; diff --git a/packages/grafana-prometheus/src/resource_clients.test.ts b/packages/grafana-prometheus/src/resource_clients.test.ts index 471e274c388..98f74424527 100644 --- a/packages/grafana-prometheus/src/resource_clients.test.ts +++ b/packages/grafana-prometheus/src/resource_clients.test.ts @@ -1,5 +1,6 @@ import { dateTime, TimeRange } from '@grafana/data'; +import { PrometheusDatasource } from './datasource'; import { LabelsApiClient, processSeries, SeriesApiClient } from './resource_clients'; import { PrometheusCacheLevel } from './types'; @@ -29,13 +30,12 @@ describe('LabelsApiClient', () => { beforeEach(() => { jest.clearAllMocks(); - client = new LabelsApiClient( - mockRequest, - PrometheusCacheLevel.Low, - mockGetAdjustedInterval, - mockGetTimeRangeParams, - mockInterpolateString - ); + client = new LabelsApiClient(mockRequest, { + cacheLevel: PrometheusCacheLevel.Low, + getAdjustedInterval: mockGetAdjustedInterval, + getTimeRangeParams: mockGetTimeRangeParams, + interpolateString: mockInterpolateString, + } as unknown as PrometheusDatasource); }); describe('start', () => { @@ -139,13 +139,12 @@ describe('SeriesApiClient', () => { beforeEach(() => { jest.clearAllMocks(); - client = new SeriesApiClient( - mockRequest, - PrometheusCacheLevel.Low, - mockGetAdjustedInterval, - mockGetTimeRangeParams, - mockInterpolateString - ); + client = new SeriesApiClient(mockRequest, { + cacheLevel: PrometheusCacheLevel.Low, + getAdjustedInterval: mockGetAdjustedInterval, + getTimeRangeParams: mockGetTimeRangeParams, + interpolateString: mockInterpolateString, + } as unknown as PrometheusDatasource); }); describe('start', () => { diff --git a/packages/grafana-prometheus/src/resource_clients.ts b/packages/grafana-prometheus/src/resource_clients.ts index b1e59a6b253..827e159edb9 100644 --- a/packages/grafana-prometheus/src/resource_clients.ts +++ b/packages/grafana-prometheus/src/resource_clients.ts @@ -1,11 +1,11 @@ -import { ScopedVars, TimeRange } from '@grafana/data'; +import { TimeRange } from '@grafana/data'; import { BackendSrvRequest } from '@grafana/runtime'; import { getDefaultCacheHeaders } from './caching'; import { DEFAULT_SERIES_LIMIT } from './components/metrics-browser/types'; +import { PrometheusDatasource } from './datasource'; import { removeQuotesIfExist } from './language_provider'; import { getRangeSnapInterval, processHistogramMetrics } from './language_utils'; -import { PrometheusCacheLevel } from './types'; import { escapeForUtf8Support } from './utf8_support'; export interface ResourceApiClient { @@ -27,10 +27,7 @@ const METRIC_LABEL = '__name__'; abstract class BaseResourceClient { constructor( protected readonly request: (url: string, params?: any, options?: Partial) => Promise, - protected readonly cacheLevel: PrometheusCacheLevel, - protected readonly getAdjustedInterval: (timeRange: TimeRange) => { start: string; end: string }, - protected readonly getTimeRangeParams: (timeRange: TimeRange) => { start: string; end: string }, - protected readonly interpolateString: (string: string, scopedVars?: ScopedVars) => string + protected readonly datasource: PrometheusDatasource ) {} } @@ -46,7 +43,7 @@ export class LabelsApiClient extends BaseResourceClient implements ResourceApiCl }; public queryMetrics = async (timeRange: TimeRange): Promise<{ metrics: string[]; histogramMetrics: string[] }> => { - this.metrics = await this.queryLabelKeys(timeRange, METRIC_LABEL); + this.metrics = await this.queryLabelValues(timeRange, METRIC_LABEL); this.histogramMetrics = processHistogramMetrics(this.metrics); return { metrics: this.metrics, histogramMetrics: this.histogramMetrics }; }; @@ -66,10 +63,10 @@ export class LabelsApiClient extends BaseResourceClient implements ResourceApiCl limit: string = DEFAULT_SERIES_LIMIT ): Promise => { let url = '/api/v1/labels'; - const timeParams = getRangeSnapInterval(this.cacheLevel, timeRange); + const timeParams = getRangeSnapInterval(this.datasource.cacheLevel, timeRange); const searchParams = { limit, ...timeParams, ...(match ? { 'match[]': match } : {}) }; - const res = await this.request(url, searchParams, getDefaultCacheHeaders(this.cacheLevel)); + const res = await this.request(url, searchParams, getDefaultCacheHeaders(this.datasource.cacheLevel)); if (Array.isArray(res)) { this.labelKeys = res.slice().sort(); return this.labelKeys.slice(); @@ -93,12 +90,12 @@ export class LabelsApiClient extends BaseResourceClient implements ResourceApiCl match?: string, limit: string = DEFAULT_SERIES_LIMIT ): Promise => { - const timeParams = this.getAdjustedInterval(timeRange); + const timeParams = this.datasource.getAdjustedInterval(timeRange); const searchParams = { limit, ...timeParams, ...(match ? { 'match[]': match } : {}) }; - const interpolatedName = this.interpolateString(labelKey); + const interpolatedName = this.datasource.interpolateString(labelKey); const interpolatedAndEscapedName = escapeForUtf8Support(removeQuotesIfExist(interpolatedName)); const url = `/api/v1/label/${interpolatedAndEscapedName}/values`; - const value = await this.request(url, searchParams, getDefaultCacheHeaders(this.cacheLevel)); + const value = await this.request(url, searchParams, getDefaultCacheHeaders(this.datasource.cacheLevel)); return value ?? []; }; } @@ -121,9 +118,9 @@ export class SeriesApiClient extends BaseResourceClient implements ResourceApiCl * @param {string} limit - Maximum number of series to return */ private _fetchAllSeries = async (timeRange: TimeRange, match: string, limit: string = DEFAULT_SERIES_LIMIT) => { - const timeParams = this.getTimeRangeParams(timeRange); + const timeParams = this.datasource.getTimeRangeParams(timeRange); const searchParams = { ...timeParams, 'match[]': match, limit }; - return await this.request('/api/v1/series', searchParams, getDefaultCacheHeaders(this.cacheLevel)); + return await this.request('/api/v1/series', searchParams, getDefaultCacheHeaders(this.datasource.cacheLevel)); }; public queryMetrics = async (timeRange: TimeRange): Promise<{ metrics: string[]; histogramMetrics: string[] }> => {