fix scope issues
This commit is contained in:
@@ -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[] }> => {
|
||||
|
||||
Reference in New Issue
Block a user