fix scope issues

This commit is contained in:
ismail simsek
2025-05-28 12:09:54 +02:00
parent d9434c4354
commit 4ec2eff949
4 changed files with 39 additions and 55 deletions
@@ -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
});
});
@@ -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<PromMetricsMetadata> => {
this._metricsMetadata = await this._queryMetadata();
// Until we remove old API we need to have backward compatibility
this.metricsMetadata = this._metricsMetadata;
return this._metricsMetadata;
};
@@ -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', () => {
@@ -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<BackendSrvRequest>) => Promise<any>,
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<string[]> => {
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<string[]> => {
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[] }> => {