add feature toggle

pull/106137/head
ismail simsek 2 months ago
parent 114f35396c
commit 5c93ac324f
No known key found for this signature in database
  1. 4
      packages/grafana-data/src/types/featureToggles.gen.ts
  2. 3
      packages/grafana-prometheus/src/datasource.ts
  3. 35
      packages/grafana-prometheus/src/language_provider.test.ts
  4. 7
      pkg/services/featuremgmt/registry.go
  5. 1
      pkg/services/featuremgmt/toggles_gen.csv
  6. 4
      pkg/services/featuremgmt/toggles_gen.go
  7. 27
      pkg/services/featuremgmt/toggles_gen.json

@ -761,6 +761,10 @@ export interface FeatureToggles {
*/
prometheusSpecialCharsInLabelValues?: boolean;
/**
* Uses new resource api which has automatic feature detection and performance improvements
*/
prometheusResourceClient?: boolean;
/**
* Enables the extension admin page regardless of development mode
*/
enableExtensionsAdminPage?: boolean;

@ -126,7 +126,8 @@ export class PrometheusDatasource
this.exemplarTraceIdDestinations = instanceSettings.jsonData.exemplarTraceIdDestinations;
this.hasIncrementalQuery = instanceSettings.jsonData.incrementalQuerying ?? false;
this.ruleMappings = {};
this.languageProvider = languageProvider ?? new PrometheusLanguageProvider(this);
this.languageProvider =
languageProvider ?? new PrometheusLanguageProvider(this, config.featureToggles.prometheusResourceClient);
this.lookupsDisabled = instanceSettings.jsonData.disableMetricsLookup ?? false;
this.customQueryParameters = new URLSearchParams(instanceSettings.jsonData.customQueryParameters);
this.datasourceConfigurationPrometheusFlavor = instanceSettings.jsonData.prometheusType;

@ -757,14 +757,13 @@ describe('PrometheusLanguageProvider with feature toggle', () => {
it('should use resource client start when feature toggle is enabled', async () => {
const provider = new PrometheusLanguageProvider(defaultDatasource, true);
const mockMetadata = { metric1: { type: 'counter', help: 'help text' } };
// Mock the resource client's start method
const resourceClientStartSpy = jest.spyOn(provider['_resourceClient'], 'start');
const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata')
.mockResolvedValue(mockMetadata);
const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(mockMetadata);
await provider.start();
expect(resourceClientStartSpy).toHaveBeenCalled();
expect(queryMetadataSpy).toHaveBeenCalled();
expect(provider.retrieveMetricsMetadata()).toEqual(mockMetadata);
@ -773,17 +772,14 @@ describe('PrometheusLanguageProvider with feature toggle', () => {
it('should use legacy API path when feature toggle is disabled', async () => {
const provider = new PrometheusLanguageProvider(defaultDatasource, false);
const metrics = ['metric1', 'metric2'];
// Mock the legacy methods
const fetchLabelValuesSpy = jest.spyOn(provider, 'fetchLabelValues')
.mockResolvedValue(metrics);
const loadMetricsMetadataSpy = jest.spyOn(provider, 'loadMetricsMetadata')
.mockResolvedValue();
const fetchLabelsSpy = jest.spyOn(provider, 'fetchLabels')
.mockResolvedValue(['label1', 'label2']);
const fetchLabelValuesSpy = jest.spyOn(provider, 'fetchLabelValues').mockResolvedValue(metrics);
const loadMetricsMetadataSpy = jest.spyOn(provider, 'loadMetricsMetadata').mockResolvedValue();
const fetchLabelsSpy = jest.spyOn(provider, 'fetchLabels').mockResolvedValue(['label1', 'label2']);
await provider.start();
expect(fetchLabelValuesSpy).toHaveBeenCalledWith(expect.any(Object), '__name__');
expect(loadMetricsMetadataSpy).toHaveBeenCalled();
expect(fetchLabelsSpy).toHaveBeenCalled();
@ -796,8 +792,7 @@ describe('PrometheusLanguageProvider with feature toggle', () => {
it('should fetch and store metadata', async () => {
const provider = new PrometheusLanguageProvider(defaultDatasource, true);
const mockMetadata = { metric1: { type: 'counter', help: 'help text' } };
const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata')
.mockResolvedValue(mockMetadata);
const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(mockMetadata);
const result = await provider.queryMetricsMetadata();
@ -813,7 +808,8 @@ describe('PrometheusLanguageProvider with feature toggle', () => {
it('should delegate to resource client queryLabelKeys', async () => {
const provider = new PrometheusLanguageProvider(defaultDatasource, true);
const resourceClientSpy = jest.spyOn(provider['_resourceClient'], 'queryLabelKeys')
const resourceClientSpy = jest
.spyOn(provider['_resourceClient'], 'queryLabelKeys')
.mockResolvedValue(['label1', 'label2']);
const result = await provider.queryLabelKeys(timeRange, '{job="grafana"}');
@ -824,7 +820,8 @@ describe('PrometheusLanguageProvider with feature toggle', () => {
it('should delegate to resource client queryLabelValues', async () => {
const provider = new PrometheusLanguageProvider(defaultDatasource, true);
const resourceClientSpy = jest.spyOn(provider['_resourceClient'], 'queryLabelValues')
const resourceClientSpy = jest
.spyOn(provider['_resourceClient'], 'queryLabelValues')
.mockResolvedValue(['value1', 'value2']);
const result = await provider.queryLabelValues(timeRange, 'job', '{job="grafana"}');
@ -842,7 +839,7 @@ describe('PrometheusLanguageProvider with feature toggle', () => {
metrics: ['metric1', 'metric2'],
labelKeys: ['label1', 'label2'],
};
// Mock the resource client properties
Object.defineProperty(provider, '_resourceClient', {
value: mockResourceClient,

@ -1303,6 +1303,13 @@ var (
Stage: FeatureStageExperimental,
Owner: grafanaOSSBigTent,
},
{
Name: "prometheusResourceClient",
Description: "Uses new resource api which has automatic feature detection and performance improvements",
FrontendOnly: true,
Stage: FeatureStageExperimental,
Owner: grafanaOSSBigTent,
},
{
Name: "enableExtensionsAdminPage",
Description: "Enables the extension admin page regardless of development mode",

@ -170,6 +170,7 @@ playlistsReconciler,experimental,@grafana/grafana-app-platform-squad,false,true,
passwordlessMagicLinkAuthentication,experimental,@grafana/identity-access-team,false,false,false
exploreMetricsRelatedLogs,experimental,@grafana/observability-metrics,false,false,true
prometheusSpecialCharsInLabelValues,experimental,@grafana/oss-big-tent,false,false,true
prometheusResourceClient,experimental,@grafana/oss-big-tent,false,false,true
enableExtensionsAdminPage,experimental,@grafana/plugins-platform-backend,false,true,false
enableSCIM,experimental,@grafana/identity-access-team,false,false,false
crashDetection,experimental,@grafana/observability-traces-and-profiling,false,false,true

1 Name Stage Owner requiresDevMode RequiresRestart FrontendOnly
170 passwordlessMagicLinkAuthentication experimental @grafana/identity-access-team false false false
171 exploreMetricsRelatedLogs experimental @grafana/observability-metrics false false true
172 prometheusSpecialCharsInLabelValues experimental @grafana/oss-big-tent false false true
173 prometheusResourceClient experimental @grafana/oss-big-tent false false true
174 enableExtensionsAdminPage experimental @grafana/plugins-platform-backend false true false
175 enableSCIM experimental @grafana/identity-access-team false false false
176 crashDetection experimental @grafana/observability-traces-and-profiling false false true

@ -691,6 +691,10 @@ const (
// Adds support for quotes and special characters in label values for Prometheus queries
FlagPrometheusSpecialCharsInLabelValues = "prometheusSpecialCharsInLabelValues"
// FlagPrometheusResourceClient
// Uses new resource api which has automatic feature detection and performance improvements
FlagPrometheusResourceClient = "prometheusResourceClient"
// FlagEnableExtensionsAdminPage
// Enables the extension admin page regardless of development mode
FlagEnableExtensionsAdminPage = "enableExtensionsAdminPage"

@ -2640,6 +2640,33 @@
"frontend": true
}
},
{
"metadata": {
"name": "prometheusLanguageProviderResourceClient",
"resourceVersion": "1748422985998",
"creationTimestamp": "2025-05-28T09:03:05Z",
"deletionTimestamp": "2025-05-28T09:04:52Z"
},
"spec": {
"description": "Uses new resource api which has automatic feature detection and performance improvements",
"stage": "experimental",
"codeowner": "@grafana/oss-big-tent",
"frontend": true
}
},
{
"metadata": {
"name": "prometheusResourceClient",
"resourceVersion": "1748423092714",
"creationTimestamp": "2025-05-28T09:04:52Z"
},
"spec": {
"description": "Uses new resource api which has automatic feature detection and performance improvements",
"stage": "experimental",
"codeowner": "@grafana/oss-big-tent",
"frontend": true
}
},
{
"metadata": {
"name": "prometheusRunQueriesInParallel",

Loading…
Cancel
Save