From e0b2ccb061edd01bbdb3f01703389847b3c6bb53 Mon Sep 17 00:00:00 2001 From: Tim Mulqueen Date: Wed, 18 Feb 2026 15:11:13 +0100 Subject: [PATCH] Enable K8 Resources Endpoint again for Testing (#117876) * Add some unit tests and enable sub resource so we can start testing manually on dev * add test to verify auth headers are stripped when being forwarding requests to client * add integration tests * update test packages * polish * fix tests * fix panic * fmt * white space * add feature flag to routing of resources endpoint * fix missing type * update integration tests with correct feature flag * fix test * update other integration tests to use ff --- .../src/types/featureToggles.gen.ts | 5 + pkg/api/datasources_k8s_test.go | 1 + pkg/registry/apis/datasource/register.go | 15 +- pkg/registry/apis/datasource/sub_resource.go | 25 +- .../apis/datasource/sub_resource_test.go | 383 ++++ pkg/services/featuremgmt/registry.go | 8 + pkg/services/featuremgmt/toggles_gen.csv | 103 +- pkg/services/featuremgmt/toggles_gen.go | 4 + pkg/services/featuremgmt/toggles_gen.json | 2007 +++++------------ pkg/tests/apis/datasource/resources_test.go | 284 +++ pkg/tests/apis/datasource/testdata_test.go | 17 +- pkg/tests/apis/helper.go | 4 + pkg/tests/apis/openapi_test.go | 1 + 13 files changed, 1287 insertions(+), 1570 deletions(-) create mode 100644 pkg/tests/apis/datasource/resources_test.go diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 5f85ab1f8e3..bac892babeb 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -339,6 +339,11 @@ export interface FeatureToggles { */ datasourcesRerouteLegacyCRUDAPIs?: boolean; /** + * Handle datasource resource requests to the legacy API routes by querying the new datasource api group endpoints behind the scenes. + * @default false + */ + datasourcesApiServerEnableResourceEndpoint?: boolean; + /** * Runs CloudWatch metrics queries as separate batches * @default false */ diff --git a/pkg/api/datasources_k8s_test.go b/pkg/api/datasources_k8s_test.go index a36a48f3784..06f83a3ff96 100644 --- a/pkg/api/datasources_k8s_test.go +++ b/pkg/api/datasources_k8s_test.go @@ -138,6 +138,7 @@ func TestGetK8sDataSourceByUIDHandler(t *testing.T) { featuremgmt.FlagDatasourcesRerouteLegacyCRUDAPIs, featuremgmt.FlagQueryService, featuremgmt.FlagQueryServiceWithConnections, + featuremgmt.FlagDatasourcesApiServerEnableResourceEndpoint, ), dsConnectionClient: &mockConnectionClient{result: tt.connectionResult, err: tt.connectionErr}, clientConfigProvider: &mockDirectRestConfigProvider{host: "http://localhost", transport: &mockRoundTripper{statusCode: tt.statusCode, responseBody: tt.responseBody}}, diff --git a/pkg/registry/apis/datasource/register.go b/pkg/registry/apis/datasource/register.go index 40d7091408f..77af4d143bf 100644 --- a/pkg/registry/apis/datasource/register.go +++ b/pkg/registry/apis/datasource/register.go @@ -39,8 +39,9 @@ var ( ) type DataSourceAPIBuilderConfig struct { - LoadQueryTypes bool - UseDualWriter bool + LoadQueryTypes bool + UseDualWriter bool + EnableResourceEndpoint bool } // DataSourceAPIBuilder is used just so wire has something unique to return @@ -106,8 +107,9 @@ func RegisterAPIService( accessControl, //nolint:staticcheck // not yet migrated to OpenFeature DataSourceAPIBuilderConfig{ - LoadQueryTypes: features.IsEnabledGlobally(featuremgmt.FlagDatasourceQueryTypes), - UseDualWriter: features.IsEnabledGlobally(featuremgmt.FlagQueryServiceWithConnections), + LoadQueryTypes: features.IsEnabledGlobally(featuremgmt.FlagDatasourceQueryTypes), + UseDualWriter: features.IsEnabledGlobally(featuremgmt.FlagQueryServiceWithConnections), + EnableResourceEndpoint: features.IsEnabledGlobally(featuremgmt.FlagDatasourcesApiServerEnableResourceEndpoint), }, ) if err != nil { @@ -246,7 +248,10 @@ func (b *DataSourceAPIBuilder) UpdateAPIGroupInfo(apiGroupInfo *genericapiserver ds := b.datasourceResourceInfo storage[ds.StoragePath("query")] = &subQueryREST{builder: b} storage[ds.StoragePath("health")] = &subHealthREST{builder: b} - storage[ds.StoragePath("resource")] = &subResourceREST{builder: b} + + if b.cfg.EnableResourceEndpoint { + storage[ds.StoragePath("resource")] = &subResourceREST{builder: b} + } // FIXME: temporarily register both "datasources" and "connections" query paths // This lets us deploy both datasources/{uid}/query and connections/{uid}/query diff --git a/pkg/registry/apis/datasource/sub_resource.go b/pkg/registry/apis/datasource/sub_resource.go index 02caab6995a..1c06aefae32 100644 --- a/pkg/registry/apis/datasource/sub_resource.go +++ b/pkg/registry/apis/datasource/sub_resource.go @@ -2,19 +2,20 @@ package datasource import ( "context" + "errors" "fmt" "io" "net/http" "net/url" "strings" - apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/rest" "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana/pkg/plugins/httpresponsesender" + "github.com/grafana/grafana/pkg/services/datasources" ) type subResourceREST struct { @@ -47,37 +48,30 @@ func (r *subResourceREST) NewConnectOptions() (runtime.Object, bool, string) { return nil, true, "" } -// FIXME: this endpoint has not been tested yet, so it is not enabled by default. -// It is especially important to make sure the `ClearAuthHeadersMiddleware` is active, -// when using this endpoint. -var resourceEnabled = false - func (r *subResourceREST) Connect(ctx context.Context, name string, opts runtime.Object, responder rest.Responder) (http.Handler, error) { - if !resourceEnabled { - return nil, &apierrors.StatusError{ - ErrStatus: metav1.Status{ - Status: metav1.StatusFailure, - Code: http.StatusNotImplemented, - }, - } - } - pluginCtx, err := r.builder.getPluginContext(ctx, name) if err != nil { + backend.Logger.Error("failed to get plugin context for datasource in resource handler", "name", name, "error", err) + if errors.Is(err, datasources.ErrDataSourceNotFound) { + return nil, r.builder.datasourceResourceInfo.NewNotFound(name) + } return nil, err } + ctx = backend.WithGrafanaConfig(ctx, pluginCtx.GrafanaConfig) ctx = contextualMiddlewares(ctx) return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { clonedReq, err := resourceRequest(req) if err != nil { + backend.Logger.Error("failed to create resource request", "error", err) responder.Error(err) return } body, err := io.ReadAll(req.Body) if err != nil { + backend.Logger.Error("failed to read request body", "error", err) responder.Error(err) return } @@ -92,6 +86,7 @@ func (r *subResourceREST) Connect(ctx context.Context, name string, opts runtime }, httpresponsesender.New(w)) if err != nil { + backend.Logger.Error("plugin resource request failed", "error", err) responder.Error(err) } }), nil diff --git a/pkg/registry/apis/datasource/sub_resource_test.go b/pkg/registry/apis/datasource/sub_resource_test.go index bf66d52b6d2..fb115e3c423 100644 --- a/pkg/registry/apis/datasource/sub_resource_test.go +++ b/pkg/registry/apis/datasource/sub_resource_test.go @@ -1,13 +1,95 @@ package datasource import ( + "bytes" + "context" + "errors" "net/http" "net/http/httptest" "testing" + "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/stretchr/testify/require" + "k8s.io/apimachinery/pkg/runtime" + + datasourceV0 "github.com/grafana/grafana/pkg/apis/datasource/v0alpha1" ) +type resourceMockClient struct { + callResourceFunc func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error +} + +func (m *resourceMockClient) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { + return nil, nil +} + +func (m *resourceMockClient) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { + return nil, nil +} + +func (m *resourceMockClient) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + if m.callResourceFunc != nil { + return m.callResourceFunc(ctx, req, sender) + } + return nil +} + +func (m *resourceMockClient) QueryChunkedData(ctx context.Context, req *backend.QueryChunkedDataRequest, w backend.ChunkedDataWriter) error { + return nil +} + +func (m *resourceMockClient) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) { + return nil, nil +} + +type resourceMockDatasourceProvider struct { + instanceSettings *backend.DataSourceInstanceSettings + instanceSettingsErr error +} + +func (m *resourceMockDatasourceProvider) GetDataSource(ctx context.Context, uid string) (*datasourceV0.DataSource, error) { + return nil, nil +} + +func (m *resourceMockDatasourceProvider) ListDataSources(ctx context.Context) (*datasourceV0.DataSourceList, error) { + return nil, nil +} + +func (m *resourceMockDatasourceProvider) CreateDataSource(ctx context.Context, ds *datasourceV0.DataSource) (*datasourceV0.DataSource, error) { + return nil, nil +} + +func (m *resourceMockDatasourceProvider) UpdateDataSource(ctx context.Context, ds *datasourceV0.DataSource) (*datasourceV0.DataSource, error) { + return nil, nil +} + +func (m *resourceMockDatasourceProvider) DeleteDataSource(ctx context.Context, uid string) error { + return nil +} + +func (m *resourceMockDatasourceProvider) GetInstanceSettings(ctx context.Context, uid string) (*backend.DataSourceInstanceSettings, error) { + return m.instanceSettings, m.instanceSettingsErr +} + +type resourceMockContextProvider struct { + pluginCtx backend.PluginContext + pluginCtxErr error +} + +func (m *resourceMockContextProvider) PluginContextForDataSource(ctx context.Context, datasourceSettings *backend.DataSourceInstanceSettings) (backend.PluginContext, error) { + return m.pluginCtx, m.pluginCtxErr +} + +type resourceMockResponder struct { + lastErr error +} + +func (m *resourceMockResponder) Object(statusCode int, obj runtime.Object) {} + +func (m *resourceMockResponder) Error(err error) { + m.lastErr = err +} + func TestResourceRequest(t *testing.T) { testCases := []struct { desc string @@ -69,3 +151,304 @@ func TestResourceRequest(t *testing.T) { }) } } + +func TestSubResourceREST_Connect(t *testing.T) { + t.Run("returns error when GetInstanceSettings fails", func(t *testing.T) { + mockProvider := &resourceMockDatasourceProvider{ + instanceSettingsErr: errors.New("datasource not found"), + } + mockContext := &resourceMockContextProvider{} + + builder := &DataSourceAPIBuilder{ + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + responder := &resourceMockResponder{} + handler, err := r.Connect(context.Background(), "test-ds", nil, responder) + + require.Error(t, err) + require.Nil(t, handler) + require.Contains(t, err.Error(), "datasource not found") + }) + + t.Run("returns error when PluginContextForDataSource fails", func(t *testing.T) { + mockProvider := &resourceMockDatasourceProvider{ + instanceSettings: &backend.DataSourceInstanceSettings{ + UID: "test-ds", + Name: "Test Datasource", + }, + } + mockContext := &resourceMockContextProvider{ + pluginCtxErr: errors.New("failed to create plugin context"), + } + + builder := &DataSourceAPIBuilder{ + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + responder := &resourceMockResponder{} + handler, err := r.Connect(context.Background(), "test-ds", nil, responder) + + require.Error(t, err) + require.Nil(t, handler) + require.Contains(t, err.Error(), "failed to create plugin context") + }) + + t.Run("successfully creates handler and forwards request", func(t *testing.T) { + var capturedRequest *backend.CallResourceRequest + + mockClient := &resourceMockClient{ + callResourceFunc: func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + capturedRequest = req + return sender.Send(&backend.CallResourceResponse{ + Status: http.StatusOK, + Headers: map[string][]string{"Content-Type": {"application/json"}}, + Body: []byte(`{"message": "success"}`), + }) + }, + } + mockProvider := &resourceMockDatasourceProvider{ + instanceSettings: &backend.DataSourceInstanceSettings{ + UID: "test-ds", + Name: "Test Datasource", + }, + } + mockContext := &resourceMockContextProvider{ + pluginCtx: backend.PluginContext{ + DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{ + UID: "test-ds", + Name: "Test Datasource", + }, + }, + } + + builder := &DataSourceAPIBuilder{ + client: mockClient, + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + responder := &resourceMockResponder{} + handler, err := r.Connect(context.Background(), "test-ds", nil, responder) + + require.NoError(t, err) + require.NotNil(t, handler) + + reqBody := []byte(`{"test": "data"}`) + req := httptest.NewRequest(http.MethodPost, "http://localhost/apis/test.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-ds/resource/some/path?key=value", bytes.NewReader(reqBody)) + req.Header.Set("Content-Type", "application/json") + req.Header.Set("X-Custom-Header", "custom-value") + + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, req) + + require.NotNil(t, capturedRequest) + require.Equal(t, http.MethodPost, capturedRequest.Method) + require.Equal(t, "some/path", capturedRequest.Path) + require.Equal(t, "some/path?key=value", capturedRequest.URL) + require.Equal(t, reqBody, capturedRequest.Body) + require.Contains(t, capturedRequest.Headers["Content-Type"], "application/json") + require.Contains(t, capturedRequest.Headers["X-Custom-Header"], "custom-value") + + require.Equal(t, http.StatusOK, recorder.Code) + require.Equal(t, `{"message": "success"}`, recorder.Body.String()) + }) + + t.Run("forwards all HTTP methods correctly", func(t *testing.T) { + methods := []string{ + http.MethodGet, + http.MethodPost, + http.MethodPut, + http.MethodPatch, + http.MethodDelete, + http.MethodHead, + http.MethodOptions, + } + + for _, method := range methods { + t.Run(method, func(t *testing.T) { + var capturedMethod string + + mockClient := &resourceMockClient{ + callResourceFunc: func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + capturedMethod = req.Method + return sender.Send(&backend.CallResourceResponse{ + Status: http.StatusOK, + Body: []byte("ok"), + }) + }, + } + mockProvider := &resourceMockDatasourceProvider{ + instanceSettings: &backend.DataSourceInstanceSettings{UID: "test-ds"}, + } + mockContext := &resourceMockContextProvider{ + pluginCtx: backend.PluginContext{}, + } + + builder := &DataSourceAPIBuilder{ + client: mockClient, + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + handler, err := r.Connect(context.Background(), "test-ds", nil, &resourceMockResponder{}) + require.NoError(t, err) + + req := httptest.NewRequest(method, "http://localhost/apis/test/resource/path", nil) + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, req) + + require.Equal(t, method, capturedMethod) + }) + } + }) + + t.Run("handles CallResource error", func(t *testing.T) { + mockClient := &resourceMockClient{ + callResourceFunc: func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + return errors.New("plugin error") + }, + } + mockProvider := &resourceMockDatasourceProvider{ + instanceSettings: &backend.DataSourceInstanceSettings{UID: "test-ds"}, + } + mockContext := &resourceMockContextProvider{ + pluginCtx: backend.PluginContext{}, + } + + builder := &DataSourceAPIBuilder{ + client: mockClient, + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + responder := &resourceMockResponder{} + handler, err := r.Connect(context.Background(), "test-ds", nil, responder) + require.NoError(t, err) + + req := httptest.NewRequest(http.MethodGet, "http://localhost/apis/test/resource/path", nil) + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, req) + + // The responder should have received the error + require.NotNil(t, responder.lastErr) + require.Contains(t, responder.lastErr.Error(), "plugin error") + }) + + t.Run("forwards request body to plugin", func(t *testing.T) { + var capturedBody []byte + + mockClient := &resourceMockClient{ + callResourceFunc: func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + capturedBody = req.Body + return sender.Send(&backend.CallResourceResponse{ + Status: http.StatusOK, + }) + }, + } + mockProvider := &resourceMockDatasourceProvider{ + instanceSettings: &backend.DataSourceInstanceSettings{UID: "test-ds"}, + } + mockContext := &resourceMockContextProvider{ + pluginCtx: backend.PluginContext{}, + } + + builder := &DataSourceAPIBuilder{ + client: mockClient, + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + handler, err := r.Connect(context.Background(), "test-ds", nil, &resourceMockResponder{}) + require.NoError(t, err) + + requestBody := `{"key": "value", "nested": {"foo": "bar"}}` + req := httptest.NewRequest(http.MethodPost, "http://localhost/apis/test/resource/path", bytes.NewBufferString(requestBody)) + + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, req) + + require.Equal(t, requestBody, string(capturedBody)) + }) + + t.Run("handles empty request body", func(t *testing.T) { + var capturedBody []byte + + mockClient := &resourceMockClient{ + callResourceFunc: func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + capturedBody = req.Body + return sender.Send(&backend.CallResourceResponse{ + Status: http.StatusOK, + }) + }, + } + mockProvider := &resourceMockDatasourceProvider{ + instanceSettings: &backend.DataSourceInstanceSettings{UID: "test-ds"}, + } + mockContext := &resourceMockContextProvider{ + pluginCtx: backend.PluginContext{}, + } + + builder := &DataSourceAPIBuilder{ + client: mockClient, + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + handler, err := r.Connect(context.Background(), "test-ds", nil, &resourceMockResponder{}) + require.NoError(t, err) + + req := httptest.NewRequest(http.MethodGet, "http://localhost/apis/test/resource/path", nil) + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, req) + + require.Empty(t, capturedBody) + }) + + t.Run("preserves query parameters in URL", func(t *testing.T) { + var capturedURL string + var capturedPath string + + mockClient := &resourceMockClient{ + callResourceFunc: func(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + capturedURL = req.URL + capturedPath = req.Path + return sender.Send(&backend.CallResourceResponse{ + Status: http.StatusOK, + }) + }, + } + mockProvider := &resourceMockDatasourceProvider{ + instanceSettings: &backend.DataSourceInstanceSettings{UID: "test-ds"}, + } + mockContext := &resourceMockContextProvider{ + pluginCtx: backend.PluginContext{}, + } + + builder := &DataSourceAPIBuilder{ + client: mockClient, + datasources: mockProvider, + contextProvider: mockContext, + } + r := &subResourceREST{builder: builder} + + handler, err := r.Connect(context.Background(), "test-ds", nil, &resourceMockResponder{}) + require.NoError(t, err) + + req := httptest.NewRequest(http.MethodGet, "http://localhost/apis/test/resource/api/endpoint?foo=bar&baz=qux", nil) + recorder := httptest.NewRecorder() + handler.ServeHTTP(recorder, req) + + require.Equal(t, "api/endpoint", capturedPath) + require.Equal(t, "api/endpoint?foo=bar&baz=qux", capturedURL) + }) +} diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 6a2ad9c59a8..80e46123e35 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -516,6 +516,14 @@ var ( RequiresRestart: false, Expression: "false", }, + { + Name: "datasourcesApiServerEnableResourceEndpoint", + Description: "Handle datasource resource requests to the legacy API routes by querying the new datasource api group endpoints behind the scenes.", + Stage: FeatureStageExperimental, + Owner: grafanaDatasourcesCoreServicesSquad, + RequiresRestart: false, + Expression: "false", + }, { Name: "cloudWatchBatchQueries", Description: "Runs CloudWatch metrics queries as separate batches", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index 4beb3d76a85..daca3056c1d 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -13,7 +13,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2024-10-23,lokiShardSplitting,experimental,@grafana/observability-logs,false,false,true 2023-02-09,lokiQuerySplitting,GA,@grafana/observability-logs,false,false,true 2022-02-09,influxdbBackendMigration,GA,@grafana/partner-datasources,false,false,true -2026-01-19,liveAPIServer,experimental,@grafana/grafana-app-platform-squad,true,true,false +2026-02-18,liveAPIServer,experimental,@grafana/grafana-app-platform-squad,true,true,false 2025-08-29,starsFromAPIServer,experimental,@grafana/grafana-frontend-navigation,false,false,true 2025-08-29,kubernetesStars,experimental,@grafana/grafana-app-platform-squad,false,true,false 2023-11-29,influxqlStreamingParser,experimental,@grafana/partner-datasources,false,false,false @@ -24,7 +24,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2023-06-06,refactorVariablesTimeRange,preview,@grafana/dashboards-squad,false,false,false 2023-05-05,faroDatasourceSelector,preview,@grafana/app-o11y,false,false,true 2023-04-24,enableDatagridEditing,preview,@grafana/dataviz-squad,false,false,false -2026-02-10,faroSessionReplay,experimental,@grafana/session-replay,false,false,true +2026-02-18,faroSessionReplay,experimental,@grafana/session-replay,false,false,true 2023-07-12,logsExploreTableVisualisation,GA,@grafana/observability-logs,false,false,true 2023-07-06,awsDatasourcesTempCredentials,GA,@grafana/aws-datasources,false,false,false 2023-07-13,mlExpressions,experimental,@grafana/alerting-squad,false,false,false @@ -42,11 +42,11 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2023-09-19,lokiRunQueriesInParallel,privatePreview,@grafana/oss-big-tent,false,false,false 2023-09-28,externalServiceAccounts,preview,@grafana/identity-access-team,false,false,false 2023-12-05,kubernetesSnapshots,experimental,@grafana/grafana-app-platform-squad,false,true,false -2025-06-25,kubernetesLibraryPanels,experimental,@grafana/grafana-app-platform-squad,false,true,false +2025-06-26,kubernetesLibraryPanels,experimental,@grafana/grafana-app-platform-squad,false,true,false 2024-06-05,kubernetesDashboards,GA,@grafana/dashboards-squad,false,false,false -2025-07-31,kubernetesShortURLs,experimental,@grafana/grafana-app-platform-squad,false,true,false +2025-08-01,kubernetesShortURLs,experimental,@grafana/grafana-app-platform-squad,false,true,false 2025-08-29,useKubernetesShortURLsAPI,experimental,@grafana/sharing-squad,false,false,true -2025-07-31,kubernetesAlertingRules,experimental,@grafana/alerting-squad,false,true,false +2025-08-01,kubernetesAlertingRules,experimental,@grafana/alerting-squad,false,true,false 2025-08-29,kubernetesCorrelations,experimental,@grafana/datapro,false,true,false 2025-12-09,kubernetesUnifiedStorageQuotas,experimental,@grafana/search-and-storage,false,true,false 2025-10-16,kubernetesLogsDrilldown,experimental,@grafana/observability-logs,false,true,false @@ -56,13 +56,14 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-04-11,dashboardSchemaValidationLogging,experimental,@grafana/grafana-app-platform-squad,false,false,false 2025-07-30,scanRowInvalidDashboardParseFallbackEnabled,experimental,@grafana/search-and-storage,false,false,false 2024-05-23,datasourceQueryTypes,experimental,@grafana/grafana-app-platform-squad,false,true,false -2026-01-22,datasourceDisableIdApi,experimental,@grafana/grafana-datasources-core-services,false,true,false +2026-02-18,datasourceDisableIdApi,experimental,@grafana/grafana-datasources-core-services,false,true,false 2024-04-19,queryService,experimental,@grafana/grafana-datasources-core-services,false,true,false 2025-08-28,queryServiceWithConnections,experimental,@grafana/grafana-datasources-core-services,false,true,false -2026-02-13,useNewAPIsForDatasourceCRUD,experimental,@grafana/grafana-datasources-core-services,false,true,true +2026-02-18,useNewAPIsForDatasourceCRUD,experimental,@grafana/grafana-datasources-core-services,false,true,true 2024-04-19,queryServiceRewrite,experimental,@grafana/grafana-datasources-core-services,false,true,false 2024-04-19,queryServiceFromUI,experimental,@grafana/grafana-datasources-core-services,false,false,true -2026-01-19,datasourcesRerouteLegacyCRUDAPIs,experimental,@grafana/grafana-datasources-core-services,false,false,false +2026-02-18,datasourcesRerouteLegacyCRUDAPIs,experimental,@grafana/grafana-datasources-core-services,false,false,false +2026-02-18,datasourcesApiServerEnableResourceEndpoint,experimental,@grafana/grafana-datasources-core-services,false,false,false 2023-10-20,cloudWatchBatchQueries,GA,@grafana/aws-datasources,false,false,false 2023-10-12,cachingOptimizeSerializationMemoryUsage,experimental,@grafana/grafana-operator-experience-squad,false,false,false 2023-10-30,alertmanagerRemoteSecondary,experimental,@grafana/alerting-squad,false,false,false @@ -81,7 +82,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-12-08,perPanelFiltering,experimental,@grafana/dashboards-squad,false,false,true 2023-11-03,panelFilterVariable,experimental,@grafana/dashboards-squad,false,false,true 2023-11-06,pdfTables,preview,@grafana/grafana-operator-experience-squad,false,false,false -2026-02-16,reportingV2Layouts,experimental,@grafana/grafana-operator-experience-squad,false,false,true +2026-02-18,reportingV2Layouts,experimental,@grafana/grafana-operator-experience-squad,false,false,true 2024-01-02,canvasPanelPanZoom,preview,@grafana/dataviz-squad,false,false,true 2025-07-24,timeComparison,experimental,@grafana/dataviz-squad,false,false,true 2023-12-13,tableSharedCrosshair,experimental,@grafana/dataviz-squad,false,false,true @@ -89,8 +90,8 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2024-01-10,alertingQueryOptimization,GA,@grafana/alerting-squad,false,false,false 2024-01-18,jitterAlertRulesWithinGroups,preview,@grafana/alerting-squad,false,true,false 2025-12-29,auditLoggingAppPlatform,experimental,@grafana/grafana-operator-experience-squad,false,true,false -2025-07-31,secretsManagementAppPlatformUI,experimental,@grafana/grafana-operator-experience-squad,false,false,false -2026-02-04,secretsKeeperUI,experimental,@grafana/grafana-operator-experience-squad,false,false,true +2025-08-01,secretsManagementAppPlatformUI,experimental,@grafana/grafana-operator-experience-squad,false,false,false +2026-02-18,secretsKeeperUI,experimental,@grafana/grafana-operator-experience-squad,false,false,true 2024-01-23,alertingSaveStatePeriodic,privatePreview,@grafana/alerting-squad,false,false,false 2025-01-27,alertingSaveStateCompressed,preview,@grafana/alerting-squad,false,false,false 2024-11-27,scopeApi,experimental,@grafana/grafana-app-platform-squad,false,false,false @@ -111,16 +112,16 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2024-04-16,disableNumericMetricsSortingInExpressions,experimental,@grafana/oss-big-tent,false,true,false 2024-04-22,grafanaManagedRecordingRules,experimental,@grafana/alerting-squad,false,false,false 2022-10-07,queryLibrary,preview,@grafana/sharing-squad,false,false,false -2026-01-19,savedQueriesRBAC,preview,@grafana/sharing-squad,false,false,false +2026-02-18,savedQueriesRBAC,preview,@grafana/sharing-squad,false,false,false 2025-08-29,dashboardLibrary,experimental,@grafana/sharing-squad,false,false,false 2025-11-07,suggestedDashboards,experimental,@grafana/sharing-squad,false,false,false -2026-01-21,dashboardValidatorApp,experimental,@grafana/sharing-squad,false,false,false +2026-02-18,dashboardValidatorApp,experimental,@grafana/sharing-squad,false,false,false 2025-10-28,dashboardTemplates,preview,@grafana/sharing-squad,false,false,false 2024-05-24,alertingListViewV2,privatePreview,@grafana/alerting-squad,false,false,true 2026-01-14,alertingNavigationV2,experimental,@grafana/alerting-squad,false,false,false 2025-12-19,alertingSavedSearches,experimental,@grafana/alerting-squad,false,false,true 2024-05-23,alertingDisableSendAlertsExternal,experimental,@grafana/alerting-squad,false,false,false -2026-02-06,alertingSyncNotifiersApiMigration,experimental,@grafana/alerting-squad,false,false,true +2026-02-18,alertingSyncNotifiersApiMigration,experimental,@grafana/alerting-squad,false,false,true 2024-05-27,preserveDashboardStateWhenNavigating,experimental,@grafana/dashboards-squad,false,false,false 2024-05-29,alertingCentralAlertHistory,experimental,@grafana/alerting-squad,false,false,false 2024-06-05,pluginProxyPreserveTrailingSlash,GA,@grafana/plugins-platform-backend,false,false,false @@ -135,7 +136,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2024-09-11,alertingFilterV2,experimental,@grafana/alerting-squad,false,false,false 2024-08-09,dataplaneAggregator,experimental,@grafana/grafana-app-platform-squad,false,true,false 2024-08-30,newFiltersUI,GA,@grafana/dashboards-squad,false,false,false -2025-07-31,vizActionsAuth,preview,@grafana/dataviz-squad,false,false,true +2025-08-01,vizActionsAuth,preview,@grafana/dataviz-squad,false,false,true 2024-09-27,alertingPrometheusRulesPrimary,experimental,@grafana/alerting-squad,false,false,true 2024-08-29,exploreLogsShardSplitting,experimental,@grafana/observability-logs,false,false,true 2024-08-29,exploreLogsAggregatedMetrics,experimental,@grafana/observability-logs,false,false,true @@ -164,7 +165,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-07-23,alertingAIFeedback,experimental,@grafana/alerting-squad,false,false,false 2025-07-16,alertingAIImproveAlertRules,experimental,@grafana/alerting-squad,false,false,false 2025-07-16,alertingAIGenTemplates,experimental,@grafana/alerting-squad,false,false,false -2025-07-31,alertingEnrichmentPerRule,experimental,@grafana/alerting-squad,false,false,false +2025-08-01,alertingEnrichmentPerRule,experimental,@grafana/alerting-squad,false,false,false 2025-08-29,alertingEnrichmentAssistantInvestigations,experimental,@grafana/alerting-squad,false,false,false 2025-07-16,alertingAIAnalyzeCentralStateHistory,experimental,@grafana/alerting-squad,false,false,false 2024-11-22,alertingNotificationsStepMode,GA,@grafana/alerting-squad,false,false,true @@ -174,7 +175,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2024-12-27,k8SFolderCounts,experimental,@grafana/search-and-storage,false,false,false 2025-01-09,improvedExternalSessionHandlingSAML,GA,@grafana/identity-access-team,false,false,false 2025-05-22,teamHttpHeadersTempo,experimental,@grafana/identity-access-team,false,false,false -2026-02-05,teamHttpHeadersFromAppPlatform,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,teamHttpHeadersFromAppPlatform,experimental,@grafana/identity-access-team,false,false,false 2025-01-20,grafanaAdvisor,privatePreview,@grafana/plugins-platform-backend,false,false,false 2025-01-15,elasticsearchImprovedParsing,experimental,@grafana/partner-datasources,false,false,false 2025-01-21,datasourceConnectionsTab,privatePreview,@grafana/plugins-platform-backend,false,false,true @@ -194,7 +195,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-03-14,infinityRunQueriesInParallel,privatePreview,@grafana/oss-big-tent,false,false,false 2025-03-14,alertingMigrationUI,GA,@grafana/alerting-squad,false,false,true 2025-05-21,alertingImportYAMLUI,GA,@grafana/alerting-squad,false,false,true -2026-01-27,alertingMigrationWizardUI,experimental,@grafana/alerting-squad,false,false,true +2026-02-18,alertingMigrationWizardUI,experimental,@grafana/alerting-squad,false,false,true 2025-04-02,azureMonitorLogsBuilderEditor,preview,@grafana/partner-datasources,false,false,false 2025-03-31,localeFormatPreference,deprecated,@grafana/grafana-frontend-platform,false,false,false 2025-03-21,unifiedStorageGrpcConnectionPool,experimental,@grafana/search-and-storage,false,false,false @@ -204,7 +205,7 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-04-09,unifiedNavbars,GA,@grafana/plugins-platform-backend,false,false,true 2025-04-07,logsPanelControls,preview,@grafana/observability-logs,false,false,true 2025-04-09,metricsFromProfiles,experimental,@grafana/observability-traces-and-profiling,false,false,true -2025-07-31,grafanaAssistantInProfilesDrilldown,GA,@grafana/observability-traces-and-profiling,false,false,true +2025-08-01,grafanaAssistantInProfilesDrilldown,GA,@grafana/observability-traces-and-profiling,false,false,true 2025-07-15,tempoAlerting,experimental,@grafana/observability-traces-and-profiling,false,false,false 2025-04-16,pluginsAutoUpdate,experimental,@grafana/plugins-platform-backend,false,false,false 2025-04-22,alertingListViewV2PreviewToggle,privatePreview,@grafana/alerting-squad,false,false,true @@ -212,14 +213,14 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-04-24,alertingBulkActionsInUI,GA,@grafana/alerting-squad,false,false,true 2025-06-18,kubernetesAuthzApis,deprecated,@grafana/identity-access-team,false,false,false 2025-08-29,kubernetesAuthZHandlerRedirect,deprecated,@grafana/identity-access-team,false,false,false -2026-02-04,kubernetesAuthZResourcePermissionsRedirect,experimental,@grafana/identity-access-team,false,false,false -2026-02-04,kubernetesAuthZRolesRedirect,experimental,@grafana/identity-access-team,false,false,false -2025-07-31,kubernetesAuthzResourcePermissionApis,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,kubernetesAuthZResourcePermissionsRedirect,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,kubernetesAuthZRolesRedirect,experimental,@grafana/identity-access-team,false,false,false +2025-08-01,kubernetesAuthzResourcePermissionApis,experimental,@grafana/identity-access-team,false,false,false 2025-10-13,kubernetesAuthzZanzanaSync,experimental,@grafana/identity-access-team,false,false,false 2026-01-12,kubernetesAuthzCoreRolesApi,experimental,@grafana/identity-access-team,false,false,false 2026-01-15,kubernetesAuthzGlobalRolesApi,experimental,@grafana/identity-access-team,false,false,false 2026-01-12,kubernetesAuthzRolesApi,experimental,@grafana/identity-access-team,false,false,false -2026-01-14,kubernetesAuthzTeamLBACRuleApi,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,kubernetesAuthzTeamLBACRuleApi,experimental,@grafana/identity-access-team,false,false,false 2026-01-12,kubernetesAuthzRoleBindingsApi,experimental,@grafana/identity-access-team,false,false,false 2025-07-25,kubernetesAuthnMutation,experimental,@grafana/identity-access-team,false,false,false 2025-11-25,kubernetesExternalGroupMapping,experimental,@grafana/identity-access-team,false,false,false @@ -227,11 +228,11 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-12-10,recentlyViewedDashboards,experimental,@grafana/grafana-frontend-navigation,false,false,true 2026-01-13,experimentRecentlyViewedDashboards,experimental,@grafana/grafana-frontend-navigation,false,false,true 2025-06-06,alertEnrichment,experimental,@grafana/alerting-squad,false,false,false -2025-07-31,alertEnrichmentMultiStep,experimental,@grafana/alerting-squad,false,false,false -2025-07-31,alertEnrichmentConditional,experimental,@grafana/alerting-squad,false,false,false +2025-08-01,alertEnrichmentMultiStep,experimental,@grafana/alerting-squad,false,false,false +2025-08-01,alertEnrichmentConditional,experimental,@grafana/alerting-squad,false,false,false 2025-06-10,alertingImportAlertmanagerAPI,experimental,@grafana/alerting-squad,false,false,false -2025-07-31,alertingImportAlertmanagerUI,experimental,@grafana/alerting-squad,false,false,false -2026-01-26,alertingDisableDMAinUI,experimental,@grafana/alerting-squad,false,false,false +2025-08-01,alertingImportAlertmanagerUI,experimental,@grafana/alerting-squad,false,false,false +2026-02-18,alertingDisableDMAinUI,experimental,@grafana/alerting-squad,false,false,false 2025-07-15,sharingDashboardImage,GA,@grafana/sharing-squad,false,false,true 2025-06-17,preferLibraryPanelTitle,privatePreview,@grafana/dashboards-squad,false,false,false 2025-06-24,tabularNumbers,GA,@grafana/grafana-frontend-platform,false,false,false @@ -244,33 +245,33 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2025-07-18,unifiedStorageSearchDualReaderEnabled,experimental,@grafana/search-and-storage,false,false,false 2025-07-31,dashboardLevelTimeMacros,experimental,@grafana/dashboards-squad,false,false,true 2025-07-25,alertmanagerRemoteSecondaryWithRemoteState,experimental,@grafana/alerting-squad,false,false,false -2025-07-31,restrictedPluginApis,experimental,@grafana/plugins-platform-backend,false,false,true -2025-07-31,favoriteDatasources,experimental,@grafana/plugins-platform-backend,false,false,true -2025-07-31,newLogContext,experimental,@grafana/observability-logs,false,false,true -2025-07-31,newClickhouseConfigPageDesign,privatePreview,@grafana/partner-datasources,false,false,false -2025-07-31,teamFolders,experimental,@grafana/grafana-frontend-navigation,false,false,false +2025-08-01,restrictedPluginApis,experimental,@grafana/plugins-platform-backend,false,false,true +2025-08-01,favoriteDatasources,experimental,@grafana/plugins-platform-backend,false,false,true +2025-08-01,newLogContext,experimental,@grafana/observability-logs,false,false,true +2025-08-01,newClickhouseConfigPageDesign,privatePreview,@grafana/partner-datasources,false,false,false +2025-08-01,teamFolders,experimental,@grafana/grafana-frontend-navigation,false,false,false 2025-10-22,interactiveLearning,preview,@grafana/pathfinder,false,false,false -2025-07-31,alertingTriage,experimental,@grafana/alerting-squad,false,false,false -2026-02-12,alertingAlertsActivityBanner,experimental,@grafana/alerting-squad,false,false,true -2025-07-31,graphiteBackendMode,privatePreview,@grafana/partner-datasources,false,false,false -2025-07-31,azureResourcePickerUpdates,GA,@grafana/partner-datasources,false,false,true -2025-07-31,prometheusTypeMigration,experimental,@grafana/partner-datasources,false,true,false -2025-07-31,pluginContainers,privatePreview,@grafana/plugins-platform-backend,false,true,false +2025-08-01,alertingTriage,experimental,@grafana/alerting-squad,false,false,false +2026-02-18,alertingAlertsActivityBanner,experimental,@grafana/alerting-squad,false,false,true +2025-08-01,graphiteBackendMode,privatePreview,@grafana/partner-datasources,false,false,false +2025-08-01,azureResourcePickerUpdates,GA,@grafana/partner-datasources,false,false,true +2025-08-01,prometheusTypeMigration,experimental,@grafana/partner-datasources,false,true,false +2025-08-01,pluginContainers,privatePreview,@grafana/plugins-platform-backend,false,true,false 2025-08-29,cdnPluginsLoadFirst,experimental,@grafana/plugins-platform-backend,false,false,false 2025-08-29,cdnPluginsUrls,experimental,@grafana/plugins-platform-backend,false,false,false 2025-10-24,pluginInstallAPISync,experimental,@grafana/plugins-platform-backend,false,false,false 2025-10-20,newGauge,preview,@grafana/dataviz-squad,false,false,true 2025-11-12,newVizSuggestions,preview,@grafana/dataviz-squad,false,false,true -2026-01-28,panelStyleActions,experimental,@grafana/dataviz-squad,false,false,true -2026-02-09,vizPresets,preview,@grafana/dataviz-squad,false,false,true -2025-12-01,externalVizSuggestions,experimental,@grafana/dataviz-squad,false,false,true +2026-02-18,panelStyleActions,experimental,@grafana/dataviz-squad,false,false,true +2026-02-18,vizPresets,preview,@grafana/dataviz-squad,false,false,true +2025-12-02,externalVizSuggestions,experimental,@grafana/dataviz-squad,false,false,true 2025-12-18,heatmapRowsAxisOptions,experimental,@grafana/dataviz-squad,false,false,true 2025-10-17,preventPanelChromeOverflow,preview,@grafana/grafana-frontend-platform,false,false,true 2025-10-31,jaegerEnableGrpcEndpoint,experimental,@grafana/oss-big-tent,false,false,false 2025-10-17,pluginStoreServiceLoading,experimental,@grafana/plugins-platform-backend,false,false,false 2025-11-12,newPanelPadding,preview,@grafana/dashboards-squad,false,false,true 2025-10-20,onlyStoreActionSets,GA,@grafana/identity-access-team,false,false,false -2026-02-06,excludeRedundantManagedPermissions,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,excludeRedundantManagedPermissions,experimental,@grafana/identity-access-team,false,false,false 2025-12-16,pluginInsights,experimental,@grafana/plugins-platform-backend,false,false,true 2025-10-29,panelTimeSettings,experimental,@grafana/dashboards-squad,false,false,false 2025-12-15,elasticsearchRawDSLQuery,experimental,@grafana/partner-datasources,false,false,false @@ -288,13 +289,13 @@ Created,Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly 2026-01-06,secretsManagementAppPlatformAwsKeeper,experimental,@grafana/grafana-operator-experience-squad,false,false,false 2026-01-07,profilesExemplars,experimental,@grafana/observability-traces-and-profiling,false,false,false 2026-01-14,alertingSyncDispatchTimer,experimental,@grafana/alerting-squad,false,true,false -2026-01-15,queryWithAssistant,experimental,@grafana/oss-big-tent,false,false,true -2026-01-13,queryEditorNext,experimental,@grafana/datapro,false,false,true -2026-01-20,kubernetesTeamBindings,experimental,@grafana/identity-access-team,false,false,false -2026-02-04,kubernetesTeamsHandlerRedirect,experimental,@grafana/identity-access-team,false,false,false -2026-02-09,kubernetesTeamSync,experimental,@grafana/identity-access-team,false,false,false -2026-01-27,alertingMultiplePolicies,experimental,@grafana/alerting-squad,false,false,false -2026-02-11,alertingIgnorePendingForNoDataAndError,experimental,@grafana/alerting-squad,false,false,false -2026-02-11,alertingNotificationHistoryRuleViewer,experimental,@grafana/alerting-squad,false,false,false -2026-02-13,alertingNotificationHistoryGlobal,experimental,@grafana/alerting-squad,false,false,false +2026-02-18,queryWithAssistant,experimental,@grafana/oss-big-tent,false,false,true +2026-02-18,queryEditorNext,experimental,@grafana/datapro,false,false,true +2026-02-18,kubernetesTeamBindings,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,kubernetesTeamsHandlerRedirect,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,kubernetesTeamSync,experimental,@grafana/identity-access-team,false,false,false +2026-02-18,alertingMultiplePolicies,experimental,@grafana/alerting-squad,false,false,false +2026-02-18,alertingIgnorePendingForNoDataAndError,experimental,@grafana/alerting-squad,false,false,false +2026-02-18,alertingNotificationHistoryRuleViewer,experimental,@grafana/alerting-squad,false,false,false +2026-02-18,alertingNotificationHistoryGlobal,experimental,@grafana/alerting-squad,false,false,false 2026-02-18,react19,experimental,@grafana/grafana-frontend-platform,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index b6cdc3ac9a2..4cebefe4f1b 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -203,6 +203,10 @@ const ( // Handle datasource CRUD requests to the legacy API routes by querying the new datasource api group endpoints behind the scenes. FlagDatasourcesRerouteLegacyCRUDAPIs = "datasourcesRerouteLegacyCRUDAPIs" + // FlagDatasourcesApiServerEnableResourceEndpoint + // Handle datasource resource requests to the legacy API routes by querying the new datasource api group endpoints behind the scenes. + FlagDatasourcesApiServerEnableResourceEndpoint = "datasourcesApiServerEnableResourceEndpoint" + // FlagCloudWatchBatchQueries // Runs CloudWatch metrics queries as separate batches FlagCloudWatchBatchQueries = "cloudWatchBatchQueries" diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 8a09f0fcf59..0061c9f1027 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -6,11 +6,8 @@ { "metadata": { "name": "aiGeneratedDashboardChanges", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-03-05T12:01:31Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-03-05T12:01:31Z" }, "spec": { "description": "Enable AI powered features for dashboards to auto-summary changes when saving", @@ -23,7 +20,7 @@ { "metadata": { "name": "alertEnrichment", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-06-06T12:16:07Z" }, "spec": { @@ -37,7 +34,7 @@ { "metadata": { "name": "alertEnrichmentConditional", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -52,7 +49,7 @@ { "metadata": { "name": "alertEnrichmentMultiStep", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -67,7 +64,7 @@ { "metadata": { "name": "alertRuleRestore", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-03-05T14:15:26Z" }, "spec": { @@ -80,7 +77,7 @@ { "metadata": { "name": "alertRuleUseFiredAtForStartsAt", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-04-22T11:16:38Z" }, "spec": { @@ -93,7 +90,7 @@ { "metadata": { "name": "alertingAIAnalyzeCentralStateHistory", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-16T16:42:42Z" }, "spec": { @@ -107,7 +104,7 @@ { "metadata": { "name": "alertingAIFeedback", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-23T12:38:09Z" }, "spec": { @@ -121,7 +118,7 @@ { "metadata": { "name": "alertingAIGenAlertRules", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-16T16:42:42Z" }, "spec": { @@ -135,7 +132,7 @@ { "metadata": { "name": "alertingAIGenTemplates", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-16T16:42:42Z" }, "spec": { @@ -149,7 +146,7 @@ { "metadata": { "name": "alertingAIImproveAlertRules", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-16T16:42:42Z" }, "spec": { @@ -163,8 +160,8 @@ { "metadata": { "name": "alertingAlertsActivityBanner", - "resourceVersion": "1770937990162", - "creationTimestamp": "2026-02-12T23:13:10Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Shows a promotional banner for the Alerts Activity feature on the Rule List page", @@ -178,11 +175,8 @@ { "metadata": { "name": "alertingBacktesting", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-12-14T14:44:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2022-12-14T14:44:14Z" }, "spec": { "description": "Rule backtesting API for alerting", @@ -194,7 +188,7 @@ { "metadata": { "name": "alertingBulkActionsInUI", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-04-24T14:49:59Z" }, "spec": { @@ -209,11 +203,8 @@ { "metadata": { "name": "alertingCentralAlertHistory", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-05-29T15:01:38Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-05-29T15:01:38Z" }, "spec": { "description": "Enables the new central alert history.", @@ -225,8 +216,8 @@ { "metadata": { "name": "alertingDisableDMAinUI", - "resourceVersion": "1769428796156", - "creationTimestamp": "2026-01-26T11:59:56Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Disables the DMA feature in the UI", @@ -239,11 +230,8 @@ { "metadata": { "name": "alertingDisableSendAlertsExternal", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-05-23T12:29:19Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-05-23T12:29:19Z" }, "spec": { "description": "Disables the ability to send alerts to an external Alertmanager datasource.", @@ -256,7 +244,7 @@ { "metadata": { "name": "alertingEnrichmentAssistantInvestigations", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", "deletionTimestamp": "2025-09-01T09:33:33Z" }, @@ -271,7 +259,7 @@ { "metadata": { "name": "alertingEnrichmentPerRule", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -286,11 +274,8 @@ { "metadata": { "name": "alertingFilterV2", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-09-11T11:29:26Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-09-11T11:29:26Z" }, "spec": { "description": "Enable the new alerting search experience", @@ -303,23 +288,8 @@ { "metadata": { "name": "alertingIgnorePendingForNoDataAndError", - "resourceVersion": "1770892873705", - "creationTimestamp": "2026-02-12T10:41:13Z" - }, - "spec": { - "description": "Makes NoData and Error alerts fire immediately, without 'pending' stage", - "stage": "experimental", - "codeowner": "@grafana/alerting-squad", - "hideFromDocs": true, - "expression": "false" - } - }, - { - "metadata": { - "name": "alertingIgnorePendingForNoDataAndError", - "resourceVersion": "1770833927064", - "creationTimestamp": "2026-02-11T18:18:47Z", - "deletionTimestamp": "2026-02-12T10:41:13Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Makes NoData and Error alerts fire immediately, without 'pending' stage", @@ -332,7 +302,7 @@ { "metadata": { "name": "alertingImportAlertmanagerAPI", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-06-10T08:32:50Z" }, "spec": { @@ -346,7 +316,7 @@ { "metadata": { "name": "alertingImportAlertmanagerUI", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -361,7 +331,7 @@ { "metadata": { "name": "alertingImportYAMLUI", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-05-21T15:59:41Z" }, "spec": { @@ -375,11 +345,8 @@ { "metadata": { "name": "alertingJiraIntegration", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-02-14T12:22:04Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-02-14T12:22:04Z" }, "spec": { "description": "Enables the new Jira integration for contact points in cloud alert managers.", @@ -393,11 +360,8 @@ { "metadata": { "name": "alertingListViewV2", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-05-24T14:40:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-05-24T14:40:49Z" }, "spec": { "description": "Enables the new alert list view design", @@ -410,11 +374,8 @@ { "metadata": { "name": "alertingListViewV2PreviewToggle", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-22T08:50:34Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-22T08:50:34Z" }, "spec": { "description": "Enables the alerting list view v2 preview toggle", @@ -427,7 +388,7 @@ { "metadata": { "name": "alertingMigrationUI", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-03-14T16:40:05Z" }, "spec": { @@ -441,8 +402,8 @@ { "metadata": { "name": "alertingMigrationWizardUI", - "resourceVersion": "1769514396967", - "creationTimestamp": "2026-01-27T11:46:36Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables the migration wizard UI to migrate alert rules and notification resources from external sources to Grafana Alerting", @@ -455,8 +416,8 @@ { "metadata": { "name": "alertingMultiplePolicies", - "resourceVersion": "1769532687968", - "creationTimestamp": "2026-01-27T16:51:27Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables the ability to create multiple alerting policies", @@ -469,11 +430,8 @@ { "metadata": { "name": "alertingNavigationV2", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-14T10:58:11Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-14T10:58:11Z" }, "spec": { "description": "Enables the new Alerting navigation structure with improved menu grouping", @@ -485,7 +443,7 @@ { "metadata": { "name": "alertingNotificationHistory", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-17T13:26:26Z" }, "spec": { @@ -499,8 +457,8 @@ { "metadata": { "name": "alertingNotificationHistoryGlobal", - "resourceVersion": "1770976040912", - "creationTimestamp": "2026-02-13T09:47:20Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables the notification history global menu item viewer", @@ -513,11 +471,8 @@ { "metadata": { "name": "alertingNotificationHistoryRuleViewer", - "resourceVersion": "1770841844273", - "creationTimestamp": "2026-02-11T20:15:04Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-11 20:30:44.273158713 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables the notification history tab in the rule viewer", @@ -530,7 +485,7 @@ { "metadata": { "name": "alertingNotificationsStepMode", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-11-22T11:07:45Z" }, "spec": { @@ -544,11 +499,8 @@ { "metadata": { "name": "alertingPrometheusRulesPrimary", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-09-27T12:27:16Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-09-27T12:27:16Z" }, "spec": { "description": "Uses Prometheus rules as the primary source of truth for ruler-enabled data sources", @@ -561,11 +513,8 @@ { "metadata": { "name": "alertingProvenanceLockWrites", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-23T18:16:06Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-23T18:16:06Z" }, "spec": { "description": "Enables a feature to avoid issues with concurrent writes to the alerting provenance table in MySQL", @@ -578,7 +527,7 @@ { "metadata": { "name": "alertingQueryAndExpressionsStepMode", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-09-26T06:33:14Z" }, "spec": { @@ -592,7 +541,7 @@ { "metadata": { "name": "alertingQueryOptimization", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-01-10T20:52:58Z" }, "spec": { @@ -605,7 +554,7 @@ { "metadata": { "name": "alertingRulePermanentlyDelete", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-04-03T11:18:25Z" }, "spec": { @@ -620,7 +569,7 @@ { "metadata": { "name": "alertingRuleRecoverDeleted", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-03-27T14:39:26Z" }, "spec": { @@ -634,7 +583,7 @@ { "metadata": { "name": "alertingRuleVersionHistoryRestore", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-02-17T12:25:32Z" }, "spec": { @@ -649,7 +598,7 @@ { "metadata": { "name": "alertingSaveStateCompressed", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-01-27T17:47:33Z" }, "spec": { @@ -662,11 +611,8 @@ { "metadata": { "name": "alertingSaveStatePeriodic", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-01-23T16:03:30Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-01-23T16:03:30Z" }, "spec": { "description": "Writes the state periodically to the database, asynchronous to rule evaluation", @@ -678,11 +624,8 @@ { "metadata": { "name": "alertingSavedSearches", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-19T14:32:27Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-19T14:32:27Z" }, "spec": { "description": "Enables saved searches for alert rules list", @@ -695,11 +638,8 @@ { "metadata": { "name": "alertingSyncDispatchTimer", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-14T09:04:29Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-14T09:04:29Z" }, "spec": { "description": "Use synchronized dispatch timer to minimize duplicate notifications across alertmanager HA pods", @@ -713,8 +653,8 @@ { "metadata": { "name": "alertingSyncNotifiersApiMigration", - "resourceVersion": "0", - "creationTimestamp": "2026-02-06T00:00:00Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Use the new k8s API for fetching integration type schemas", @@ -727,7 +667,7 @@ { "metadata": { "name": "alertingTriage", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -742,7 +682,7 @@ { "metadata": { "name": "alertingUIOptimizeReducer", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-11-18T10:59:00Z" }, "spec": { @@ -756,11 +696,8 @@ { "metadata": { "name": "alertingUIUseBackendFilters", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-13T14:52:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-13T14:52:14Z" }, "spec": { "description": "Enables the UI to use certain backend-side filters", @@ -773,11 +710,8 @@ { "metadata": { "name": "alertingUIUseFullyCompatBackendFilters", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-24T11:42:09Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-24T11:42:09Z" }, "spec": { "description": "Enables the UI to use rules backend-side filters 100% compatible with the frontend filters", @@ -790,7 +724,7 @@ { "metadata": { "name": "alertingUseNewSimplifiedRoutingHashAlgorithm", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", "deletionTimestamp": "2025-09-01T09:33:33Z" }, @@ -806,11 +740,8 @@ { "metadata": { "name": "alertmanagerRemotePrimary", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-10-30T16:27:08Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-10-30T16:27:08Z" }, "spec": { "description": "Enable Grafana to have a remote Alertmanager instance as the primary Alertmanager.", @@ -822,11 +753,8 @@ { "metadata": { "name": "alertmanagerRemoteSecondary", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-10-30T16:27:08Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-10-30T16:27:08Z" }, "spec": { "description": "Enable Grafana to sync configuration and state with a remote Alertmanager.", @@ -838,11 +766,8 @@ { "metadata": { "name": "alertmanagerRemoteSecondaryWithRemoteState", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-25T15:06:59Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-25T15:06:59Z" }, "spec": { "description": "Starts Grafana in remote secondary mode pulling the latest state from the remote Alertmanager to avoid duplicate notifications.", @@ -855,9 +780,8 @@ { "metadata": { "name": "annotationPermissionUpdate", - "resourceVersion": "1764664939750", - "creationTimestamp": "2023-10-31T13:30:13Z", - "deletionTimestamp": "2026-01-31T00:02:02Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-10-31T13:30:13Z" }, "spec": { "description": "Change the way annotation permissions work by scoping them to folders and dashboards.", @@ -869,11 +793,8 @@ { "metadata": { "name": "appPlatformGrpcClientAuth", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-10-14T10:47:18Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-10-14T10:47:18Z" }, "spec": { "description": "Enables the gRPC client to authenticate with the App Platform by using ID \u0026 access tokens", @@ -886,11 +807,8 @@ { "metadata": { "name": "assetSriChecks", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-03-04T10:56:35Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-03-04T10:56:35Z" }, "spec": { "description": "Enables SRI checks for Grafana JavaScript assets", @@ -903,12 +821,8 @@ { "metadata": { "name": "auditLoggingAppPlatform", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-29T15:28:29Z", - "deletionTimestamp": "2026-01-06T09:18:36Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-29T15:28:29Z" }, "spec": { "description": "Enable audit logging with Kubernetes under app platform", @@ -922,11 +836,8 @@ { "metadata": { "name": "authZGRPCServer", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-06-13T09:41:35Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-06-13T09:41:35Z" }, "spec": { "description": "Enables the gRPC server for authorization", @@ -939,7 +850,7 @@ { "metadata": { "name": "awsAsyncQueryCaching", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2023-07-21T15:34:07Z" }, "spec": { @@ -952,7 +863,7 @@ { "metadata": { "name": "awsDatasourcesHttpProxy", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-11-12T18:51:23Z" }, "spec": { @@ -965,7 +876,7 @@ { "metadata": { "name": "awsDatasourcesTempCredentials", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2023-07-06T15:06:11Z" }, "spec": { @@ -978,7 +889,7 @@ { "metadata": { "name": "azureMonitorDisableLogLimit", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-10-24T13:32:09Z" }, "spec": { @@ -991,7 +902,7 @@ { "metadata": { "name": "azureMonitorEnableUserAuth", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-11-27T14:01:54Z" }, "spec": { @@ -1004,7 +915,7 @@ { "metadata": { "name": "azureMonitorLogsBuilderEditor", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-04-02T14:15:25Z" }, "spec": { @@ -1017,7 +928,7 @@ { "metadata": { "name": "azureMonitorPrometheusExemplars", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-06-06T16:53:17Z" }, "spec": { @@ -1030,7 +941,7 @@ { "metadata": { "name": "azureResourcePickerUpdates", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -1045,11 +956,8 @@ { "metadata": { "name": "cachingOptimizeSerializationMemoryUsage", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-10-12T16:56:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-10-12T16:56:49Z" }, "spec": { "description": "If enabled, the caching backend gradually serializes query responses for the cache, comparing against the configured `[caching]max_value_mb` value as it goes. This can can help prevent Grafana from running out of memory while attempting to cache very large query responses.", @@ -1061,11 +969,8 @@ { "metadata": { "name": "canvasPanelNesting", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-05-31T19:03:34Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2022-05-31T19:03:34Z" }, "spec": { "description": "Allow elements nesting", @@ -1078,11 +983,8 @@ { "metadata": { "name": "canvasPanelPanZoom", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-01-02T19:52:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-01-02T19:52:21Z" }, "spec": { "description": "Allow pan and zoom in canvas panel", @@ -1095,7 +997,7 @@ { "metadata": { "name": "cdnPluginsLoadFirst", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", "deletionTimestamp": "2025-09-01T09:33:33Z" }, @@ -1109,7 +1011,7 @@ { "metadata": { "name": "cdnPluginsUrls", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", "deletionTimestamp": "2025-09-01T09:33:33Z" }, @@ -1123,11 +1025,8 @@ { "metadata": { "name": "cloudRBACRoles", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-01-10T13:19:01Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-01-10T13:19:01Z" }, "spec": { "description": "Enabled grafana cloud specific RBAC roles", @@ -1141,11 +1040,8 @@ { "metadata": { "name": "cloudWatchBatchQueries", - "resourceVersion": "1770245027852", - "creationTimestamp": "2023-10-20T19:09:41Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-04 22:43:47.852872 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-10-20T19:09:41Z" }, "spec": { "description": "Runs CloudWatch metrics queries as separate batches", @@ -1157,7 +1053,7 @@ { "metadata": { "name": "cloudWatchCrossAccountQuerying", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2022-11-28T11:39:12Z" }, "spec": { @@ -1170,7 +1066,7 @@ { "metadata": { "name": "cloudWatchNewLabelParsing", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-04-05T15:57:56Z" }, "spec": { @@ -1183,7 +1079,7 @@ { "metadata": { "name": "cloudWatchRoundUpEndTime", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-06-27T15:10:28Z" }, "spec": { @@ -1196,11 +1092,8 @@ { "metadata": { "name": "configurableSchedulerTick", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-07-26T16:44:12Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-07-26T16:44:12Z" }, "spec": { "description": "Enable changing the scheduler base interval via configuration option unified_alerting.scheduler_tick_interval", @@ -1214,11 +1107,8 @@ { "metadata": { "name": "crashDetection", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-11-12T15:07:27Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-11-12T15:07:27Z" }, "spec": { "description": "Enables browser crash detection reporting to Faro.", @@ -1231,11 +1121,8 @@ { "metadata": { "name": "dashboardAdHocAndGroupByWrapper", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-18T18:58:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-18T18:58:21Z" }, "spec": { "description": "Wraps the ad hoc and group by variables in a single wrapper, with all other variables below it", @@ -1248,11 +1135,8 @@ { "metadata": { "name": "dashboardDisableSchemaValidationV1", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-11T16:52:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-11T16:52:46Z" }, "spec": { "description": "Disable schema validation for dashboards/v1", @@ -1264,11 +1148,8 @@ { "metadata": { "name": "dashboardDisableSchemaValidationV2", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-11T16:52:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-11T16:52:46Z" }, "spec": { "description": "Disable schema validation for dashboards/v2", @@ -1280,11 +1161,8 @@ { "metadata": { "name": "dashboardLevelTimeMacros", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-31T09:49:07Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-31T09:49:07Z" }, "spec": { "description": "Supports __from and __to macros that always use the dashboard level time range", @@ -1297,12 +1175,9 @@ { "metadata": { "name": "dashboardLibrary", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-09-01T09:33:33Z" }, "spec": { "description": "Displays datasource provisioned dashboards in dashboard empty page, only when coming from datasource configuration page", @@ -1314,11 +1189,8 @@ { "metadata": { "name": "dashboardNewLayouts", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-10-23T08:55:45Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-10-23T08:55:45Z" }, "spec": { "description": "Enables new dashboard layouts", @@ -1330,7 +1202,7 @@ { "metadata": { "name": "dashboardScene", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2023-11-13T08:51:21Z" }, "spec": { @@ -1341,44 +1213,11 @@ "expression": "true" } }, - { - "metadata": { - "name": "dashboardSceneForViewers", - "resourceVersion": "1764664939750", - "creationTimestamp": "2023-11-02T19:02:25Z", - "deletionTimestamp": "2026-01-29T16:02:04Z" - }, - "spec": { - "description": "Enables dashboard rendering using Scenes for viewer roles", - "stage": "GA", - "codeowner": "@grafana/dashboards-squad", - "frontend": true, - "expression": "true" - } - }, - { - "metadata": { - "name": "dashboardSceneSolo", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-02-11T08:08:47Z", - "deletionTimestamp": "2026-01-29T16:02:04Z" - }, - "spec": { - "description": "Enables rendering dashboards using scenes for solo panels", - "stage": "GA", - "codeowner": "@grafana/dashboards-squad", - "frontend": true, - "expression": "true" - } - }, { "metadata": { "name": "dashboardSchemaValidationLogging", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-11T16:52:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-11T16:52:46Z" }, "spec": { "description": "Log schema validation errors so they can be analyzed later", @@ -1390,11 +1229,8 @@ { "metadata": { "name": "dashboardTemplates", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-28T20:05:32Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-28T20:05:32Z" }, "spec": { "description": "Enables a flow to get started with a new dashboard from a template", @@ -1406,12 +1242,9 @@ { "metadata": { "name": "dashboardUndoRedo", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-09-01T09:33:33Z" }, "spec": { "description": "Enables undo/redo in dynamic dashboards", @@ -1424,8 +1257,8 @@ { "metadata": { "name": "dashboardValidatorApp", - "resourceVersion": "1768995060416", - "creationTimestamp": "2026-01-21T11:31:00Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables dashboard validator app to run compatibility checks between a dashboard and data source", @@ -1437,7 +1270,7 @@ { "metadata": { "name": "dashgpt", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2023-08-30T20:22:05Z" }, "spec": { @@ -1451,11 +1284,8 @@ { "metadata": { "name": "dataplaneAggregator", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-08-09T08:41:07Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-08-09T08:41:07Z" }, "spec": { "description": "Enable grafana dataplane aggregator", @@ -1468,11 +1298,8 @@ { "metadata": { "name": "datasourceAPIServers", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-09-19T08:28:27Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-09-19T08:28:27Z" }, "spec": { "description": "Expose some datasources as apiservers.", @@ -1485,11 +1312,8 @@ { "metadata": { "name": "datasourceConnectionsTab", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-01-21T17:39:48Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-01-21T17:39:48Z" }, "spec": { "description": "Shows defined connections for a data source in the plugins detail page", @@ -1502,11 +1326,8 @@ { "metadata": { "name": "datasourceDisableIdApi", - "resourceVersion": "1769095508888", - "creationTimestamp": "2026-01-22T15:24:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-22 15:25:08.888626 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Does not register datasource apis that use the numeric id", @@ -1516,29 +1337,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "datasourceIdBasedAPIEnabled", - "resourceVersion": "1769095222868", - "creationTimestamp": "2026-01-22T15:20:22Z", - "deletionTimestamp": "2026-01-22T15:23:04Z" - }, - "spec": { - "description": "Registers datasource apis that use the numeric id", - "stage": "experimental", - "codeowner": "@grafana/grafana-datasources-core-services", - "requiresRestart": true, - "expression": "true" - } - }, { "metadata": { "name": "datasourceQueryTypes", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-05-23T16:46:28Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-05-23T16:46:28Z" }, "spec": { "description": "Show query type endpoints in datasource API servers (currently hardcoded for testdata, expressions, and prometheus)", @@ -1548,11 +1351,24 @@ "expression": "false" } }, + { + "metadata": { + "name": "datasourcesApiServerEnableResourceEndpoint", + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" + }, + "spec": { + "description": "Handle datasource resource requests to the legacy API routes by querying the new datasource api group endpoints behind the scenes.", + "stage": "experimental", + "codeowner": "@grafana/grafana-datasources-core-services", + "expression": "false" + } + }, { "metadata": { "name": "datasourcesRerouteLegacyCRUDAPIs", - "resourceVersion": "1768836802577", - "creationTimestamp": "2026-01-19T15:33:22Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Handle datasource CRUD requests to the legacy API routes by querying the new datasource api group endpoints behind the scenes.", @@ -1561,46 +1377,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "disableClassicHTTPHistogram", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-06-18T19:37:44Z", - "deletionTimestamp": "2026-01-20T11:46:10Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Disables classic HTTP Histogram (use with enableNativeHTTPHistogram)", - "stage": "experimental", - "codeowner": "@grafana/grafana-backend-services-squad", - "requiresRestart": true, - "expression": "false" - } - }, - { - "metadata": { - "name": "disableEnvelopeEncryption", - "resourceVersion": "1764664939750", - "creationTimestamp": "2022-05-24T08:34:47Z", - "deletionTimestamp": "2026-01-29T15:12:34Z" - }, - "spec": { - "description": "Disable envelope encryption (emergency only)", - "stage": "GA", - "codeowner": "@grafana/grafana-operator-experience-squad", - "expression": "false" - } - }, { "metadata": { "name": "disableNumericMetricsSortingInExpressions", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-04-16T14:52:47Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-04-16T14:52:47Z" }, "spec": { "description": "In server-side expressions, disable the sorting of numeric-kind metrics by their metric name or labels.", @@ -1613,11 +1394,8 @@ { "metadata": { "name": "disableSSEDataplane", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-04-12T16:24:34Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-04-12T16:24:34Z" }, "spec": { "description": "Disables dataplane specific processing in server side expressions.", @@ -1629,11 +1407,8 @@ { "metadata": { "name": "drilldownRecommendations", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-17T12:52:59Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-17T12:52:59Z" }, "spec": { "description": "Enables showing recently used drilldowns or recommendations given by the datasource in the AdHocFilters and GroupBy variables", @@ -1646,7 +1421,7 @@ { "metadata": { "name": "elasticsearchCrossClusterSearch", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-12-12T22:20:04Z" }, "spec": { @@ -1659,11 +1434,8 @@ { "metadata": { "name": "elasticsearchImprovedParsing", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-01-15T17:05:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-01-15T17:05:54Z" }, "spec": { "description": "Enables less memory intensive Elasticsearch result parsing", @@ -1675,7 +1447,7 @@ { "metadata": { "name": "elasticsearchRawDSLQuery", - "resourceVersion": "1763508396079", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-12-15T19:11:05Z" }, "spec": { @@ -1688,7 +1460,7 @@ { "metadata": { "name": "enableAppChromeExtensions", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-06-30T04:32:08Z" }, "spec": { @@ -1703,7 +1475,7 @@ { "metadata": { "name": "enableDashboardEmptyExtensions", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-10-13T07:03:13Z" }, "spec": { @@ -1718,11 +1490,8 @@ { "metadata": { "name": "enableDatagridEditing", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-04-24T14:46:31Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-04-24T14:46:31Z" }, "spec": { "description": "Enables the edit functionality in the datagrid panel", @@ -1734,11 +1503,8 @@ { "metadata": { "name": "enableExtensionsAdminPage", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-11-05T15:55:10Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-11-05T15:55:10Z" }, "spec": { "description": "Enables the extension admin page regardless of development mode", @@ -1748,32 +1514,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "enableNativeHTTPHistogram", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-10-03T18:23:55Z", - "deletionTimestamp": "2026-01-20T11:37:01Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Enables native HTTP Histograms", - "stage": "experimental", - "codeowner": "@grafana/grafana-backend-services-squad", - "requiresRestart": true, - "expression": "false" - } - }, { "metadata": { "name": "enableSCIM", - "resourceVersion": "1769542829648", - "creationTimestamp": "2024-11-07T14:38:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-27 19:40:29.648759061 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-11-07T14:38:46Z" }, "spec": { "description": "Enables SCIM support for user and group management", @@ -1785,11 +1530,8 @@ { "metadata": { "name": "enableScopesInMetricsExplore", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-11-06T13:11:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-11-06T13:11:33Z" }, "spec": { "description": "Enables the scopes usage in Metrics Explore", @@ -1802,11 +1544,8 @@ { "metadata": { "name": "excludeRedundantManagedPermissions", - "resourceVersion": "1770369876002", - "creationTimestamp": "2026-02-06T09:11:23Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-06 09:24:36.002647042 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Exclude redundant individual dashboard/folder permissions from managed roles at query time", @@ -1819,11 +1558,8 @@ { "metadata": { "name": "experimentRecentlyViewedDashboards", - "resourceVersion": "1770896695157", - "creationTimestamp": "2026-01-13T15:22:20Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-12 11:44:55.157718 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-13T15:22:20Z" }, "spec": { "description": "A/A test for recently viewed dashboards feature", @@ -1837,11 +1573,8 @@ { "metadata": { "name": "exploreLogsAggregatedMetrics", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-08-29T13:55:59Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-08-29T13:55:59Z" }, "spec": { "description": "Used in Logs Drilldown to query by aggregated metrics", @@ -1851,28 +1584,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "exploreLogsLimitedTimeRange", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-08-29T13:55:59Z", - "deletionTimestamp": "2026-01-12T22:43:01Z" - }, - "spec": { - "description": "Used in Logs Drilldown to limit the time range", - "stage": "experimental", - "codeowner": "@grafana/observability-logs", - "frontend": true - } - }, { "metadata": { "name": "exploreLogsShardSplitting", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-08-29T13:55:59Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-08-29T13:55:59Z" }, "spec": { "description": "Deprecated. Replace with lokiShardSplitting. Used in Logs Drilldown to split queries into multiple queries based on the number of shards", @@ -1882,28 +1598,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "exploreMetricsRelatedLogs", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-11-05T16:28:43Z", - "deletionTimestamp": "2026-01-12T17:52:40Z" - }, - "spec": { - "description": "Display Related Logs in Grafana Metrics Drilldown", - "stage": "experimental", - "codeowner": "@grafana/observability-metrics", - "frontend": true - } - }, { "metadata": { "name": "externalServiceAccounts", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-09-28T07:26:37Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-09-28T07:26:37Z" }, "spec": { "description": "Automatic service account and token setup for plugins", @@ -1915,7 +1614,7 @@ { "metadata": { "name": "externalVizSuggestions", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-12-01T23:22:22Z" }, "spec": { @@ -1926,32 +1625,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "extraThemes", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-05-10T13:37:04Z", - "deletionTimestamp": "2025-05-20T08:18:08Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Enables extra themes", - "stage": "experimental", - "codeowner": "@grafana/grafana-frontend-platform", - "frontend": true, - "expression": "false" - } - }, { "metadata": { "name": "faroDatasourceSelector", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-05-05T00:35:10Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-05-05T00:35:10Z" }, "spec": { "description": "Enable the data source selector within the Frontend Apps section of the Frontend Observability", @@ -1964,8 +1642,8 @@ { "metadata": { "name": "faroSessionReplay", - "resourceVersion": "1770723918514", - "creationTimestamp": "2026-02-10T11:45:18Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enable Faro session replay for Grafana", @@ -1978,12 +1656,9 @@ { "metadata": { "name": "favoriteDatasources", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", - "deletionTimestamp": "2025-08-01T11:30:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-08-01T11:30:17Z" }, "spec": { "description": "Enable favorite datasources", @@ -1996,7 +1671,7 @@ { "metadata": { "name": "featureHighlights", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2022-02-03T11:53:23Z" }, "spec": { @@ -2009,11 +1684,8 @@ { "metadata": { "name": "fetchRulesInCompactMode", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-18T09:06:39Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-18T09:06:39Z" }, "spec": { "description": "Add compact=true when fetching rules", @@ -2026,11 +1698,8 @@ { "metadata": { "name": "fetchRulesUsingPost", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-01-29T12:17:44Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-01-29T12:17:44Z" }, "spec": { "description": "Use a POST request to list rules by passing down the namespaces user has access to", @@ -2043,11 +1712,8 @@ { "metadata": { "name": "foldersAppPlatformAPI", - "resourceVersion": "1770896695157", - "creationTimestamp": "2025-07-03T14:15:23Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-12 11:44:55.157718 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-03T14:15:23Z" }, "spec": { "description": "Enables use of app platform API for folders", @@ -2061,11 +1727,8 @@ { "metadata": { "name": "grafanaAPIServerEnsureKubectlAccess", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-12-06T20:21:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-12-06T20:21:21Z" }, "spec": { "description": "Start an additional https handler and write kubectl options", @@ -2079,11 +1742,8 @@ { "metadata": { "name": "grafanaAPIServerWithExperimentalAPIs", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-10-06T18:55:22Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-10-06T18:55:22Z" }, "spec": { "description": "Register experimental APIs with the k8s API server, including all datasources", @@ -2097,11 +1757,8 @@ { "metadata": { "name": "grafanaAdvisor", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-01-20T10:08:00Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-01-20T10:08:00Z" }, "spec": { "description": "Enables Advisor app", @@ -2113,7 +1770,7 @@ { "metadata": { "name": "grafanaAssistantInProfilesDrilldown", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -2128,12 +1785,9 @@ { "metadata": { "name": "grafanaManagedRecordingRules", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-04-22T17:53:16Z", - "deletionTimestamp": "2025-05-19T10:15:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-05-19T10:15:49Z" }, "spec": { "description": "Enables Grafana-managed recording rules.", @@ -2146,7 +1800,7 @@ { "metadata": { "name": "grafanaconThemes", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-02-06T11:08:04Z" }, "spec": { @@ -2161,7 +1815,7 @@ { "metadata": { "name": "graphiteBackendMode", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -2175,11 +1829,8 @@ { "metadata": { "name": "groupAttributeSync", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-09-09T15:29:43Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-09-09T15:29:43Z" }, "spec": { "description": "Enable the groupsync extension for managing Group Attribute Sync feature", @@ -2192,11 +1843,8 @@ { "metadata": { "name": "groupByVariable", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-02-14T17:18:04Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-02-14T17:18:04Z" }, "spec": { "description": "Enable groupBy variable support in scenes dashboards", @@ -2209,11 +1857,8 @@ { "metadata": { "name": "grpcServer", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-09-26T20:25:34Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2022-09-26T20:25:34Z" }, "spec": { "description": "Run the GRPC server", @@ -2225,7 +1870,7 @@ { "metadata": { "name": "heatmapRowsAxisOptions", - "resourceVersion": "1765353244400", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-12-18T22:45:00Z" }, "spec": { @@ -2239,7 +1884,7 @@ { "metadata": { "name": "improvedExternalSessionHandling", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-09-17T10:54:39Z" }, "spec": { @@ -2252,7 +1897,7 @@ { "metadata": { "name": "improvedExternalSessionHandlingSAML", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-01-09T17:02:49Z" }, "spec": { @@ -2262,28 +1907,11 @@ "expression": "true" } }, - { - "metadata": { - "name": "individualCookiePreferences", - "resourceVersion": "1764664939750", - "creationTimestamp": "2023-02-21T10:19:07Z", - "deletionTimestamp": "2026-01-16T06:29:57Z" - }, - "spec": { - "description": "Support overriding cookie preferences per user", - "stage": "experimental", - "codeowner": "@grafana/grafana-backend-group", - "expression": "false" - } - }, { "metadata": { "name": "infinityRunQueriesInParallel", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-03-14T12:54:04Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-03-14T12:54:04Z" }, "spec": { "description": "Enables running Infinity queries in parallel", @@ -2295,7 +1923,7 @@ { "metadata": { "name": "influxdbBackendMigration", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2022-02-09T18:26:16Z", "deletionTimestamp": "2023-01-17T14:11:26Z" }, @@ -2310,11 +1938,8 @@ { "metadata": { "name": "influxdbRunQueriesInParallel", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-02-01T10:58:24Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-02-01T10:58:24Z" }, "spec": { "description": "Enables running InfluxDB Influxql queries in parallel", @@ -2326,11 +1951,8 @@ { "metadata": { "name": "influxqlStreamingParser", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-11-29T17:29:35Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-11-29T17:29:35Z" }, "spec": { "description": "Enable streaming JSON parser for InfluxDB datasource InfluxQL query language", @@ -2342,11 +1964,8 @@ { "metadata": { "name": "interactiveLearning", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-22T08:06:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-22T08:06:21Z" }, "spec": { "description": "Enables the interactive learning app", @@ -2355,28 +1974,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "investigationsBackend", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-12-18T08:31:03Z", - "deletionTimestamp": "2026-01-08T09:28:20Z" - }, - "spec": { - "description": "Enable the investigations backend API", - "stage": "experimental", - "codeowner": "@grafana/grafana-app-platform-squad", - "expression": "false" - } - }, { "metadata": { "name": "jaegerEnableGrpcEndpoint", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-31T18:19:16Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-31T18:19:16Z" }, "spec": { "description": "Enable querying trace data through Jaeger's gRPC endpoint (HTTP)", @@ -2388,11 +1990,8 @@ { "metadata": { "name": "jitterAlertRulesWithinGroups", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-01-18T18:48:11Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-01-18T18:48:11Z" }, "spec": { "description": "Distributes alert rule evaluations more evenly over time, including spreading out rules within the same group. Disables sequential evaluation if enabled.", @@ -2406,7 +2005,7 @@ { "metadata": { "name": "k8SFolderCounts", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-12-27T17:10:44Z" }, "spec": { @@ -2416,28 +2015,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "k8SFolderMove", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-12-27T17:10:44Z", - "deletionTimestamp": "2026-01-15T20:28:21Z" - }, - "spec": { - "description": "Enable folder's api server move", - "stage": "experimental", - "codeowner": "@grafana/search-and-storage", - "expression": "false" - } - }, { "metadata": { "name": "kubernetesAggregator", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-02-12T20:59:35Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-02-12T20:59:35Z" }, "spec": { "description": "Enable grafana's embedded kube-aggregator", @@ -2450,11 +2032,8 @@ { "metadata": { "name": "kubernetesAggregatorCapTokenAuth", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-05-15T18:14:23Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-05-15T18:14:23Z" }, "spec": { "description": "Enable CAP token based authentication in grafana's embedded kube-aggregator", @@ -2467,11 +2046,8 @@ { "metadata": { "name": "kubernetesAlertingHistorian", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-27T16:14:16Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-27T16:14:16Z" }, "spec": { "description": "Adds support for Kubernetes alerting historian APIs", @@ -2484,12 +2060,9 @@ { "metadata": { "name": "kubernetesAlertingRules", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", - "deletionTimestamp": "2025-08-01T11:30:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-08-01T11:30:17Z" }, "spec": { "description": "Adds support for Kubernetes alerting and recording rules", @@ -2502,7 +2075,7 @@ { "metadata": { "name": "kubernetesAnnotations", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-11-06T18:22:20Z" }, "spec": { @@ -2515,12 +2088,9 @@ { "metadata": { "name": "kubernetesAuthZHandlerRedirect", - "resourceVersion": "1770238644779", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-04 20:57:24.779562 +0000 UTC" - } + "deletionTimestamp": "2025-09-01T09:33:33Z" }, "spec": { "description": "Deprecated: Use kubernetesAuthZResourcePermissionsRedirect and kubernetesAuthZRolesRedirect instead", @@ -2533,8 +2103,8 @@ { "metadata": { "name": "kubernetesAuthZResourcePermissionsRedirect", - "resourceVersion": "1770238644779", - "creationTimestamp": "2026-02-04T20:57:24Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Redirects the traffic from the legacy resource permissions endpoints to the new K8s AuthZ endpoints", @@ -2547,8 +2117,8 @@ { "metadata": { "name": "kubernetesAuthZRolesRedirect", - "resourceVersion": "1770238644779", - "creationTimestamp": "2026-02-04T20:57:24Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Redirects the traffic from the legacy roles endpoints to the new K8s AuthZ endpoints", @@ -2561,11 +2131,8 @@ { "metadata": { "name": "kubernetesAuthnMutation", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-25T15:05:32Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-25T15:05:32Z" }, "spec": { "description": "Enables create, delete, and update mutations for resources owned by IAM identity", @@ -2578,11 +2145,8 @@ { "metadata": { "name": "kubernetesAuthzApis", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-06-18T07:43:01Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-06-18T07:43:01Z" }, "spec": { "description": "Deprecated: Use kubernetesAuthzCoreRolesApi, kubernetesAuthzRolesApi, and kubernetesAuthzRoleBindingsApi instead", @@ -2595,11 +2159,8 @@ { "metadata": { "name": "kubernetesAuthzCoreRolesApi", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-12T08:00:51Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-12T08:00:51Z" }, "spec": { "description": "Registers AuthZ Core Roles /apis endpoint", @@ -2612,11 +2173,8 @@ { "metadata": { "name": "kubernetesAuthzGlobalRolesApi", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-15T08:13:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-15T08:13:46Z" }, "spec": { "description": "Registers AuthZ Global Roles /apis endpoint", @@ -2629,12 +2187,9 @@ { "metadata": { "name": "kubernetesAuthzResourcePermissionApis", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", - "deletionTimestamp": "2025-08-01T11:30:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-08-01T11:30:17Z" }, "spec": { "description": "Registers AuthZ resource permission /apis endpoints", @@ -2647,11 +2202,8 @@ { "metadata": { "name": "kubernetesAuthzRoleBindingsApi", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-12T08:00:51Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-12T08:00:51Z" }, "spec": { "description": "Registers AuthZ Role Bindings /apis endpoint", @@ -2664,11 +2216,8 @@ { "metadata": { "name": "kubernetesAuthzRolesApi", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-12T08:00:51Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-12T08:00:51Z" }, "spec": { "description": "Registers AuthZ Roles /apis endpoint", @@ -2681,11 +2230,8 @@ { "metadata": { "name": "kubernetesAuthzTeamLBACRuleApi", - "resourceVersion": "1768589823498", - "creationTimestamp": "2026-01-14T23:12:20Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-16 18:57:03.498879 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Registers AuthZ TeamLBACRule /apis endpoint", @@ -2698,11 +2244,8 @@ { "metadata": { "name": "kubernetesAuthzZanzanaSync", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-13T19:37:13Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-13T19:37:13Z" }, "spec": { "description": "Enable sync of Zanzana authorization store on AuthZ CRD mutations", @@ -2715,12 +2258,9 @@ { "metadata": { "name": "kubernetesCorrelations", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-09-01T09:33:33Z" }, "spec": { "description": "Adds support for Kubernetes correlations", @@ -2733,7 +2273,7 @@ { "metadata": { "name": "kubernetesDashboards", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-06-05T14:34:23Z" }, "spec": { @@ -2743,27 +2283,11 @@ "expression": "true" } }, - { - "metadata": { - "name": "kubernetesDashboardsV2", - "resourceVersion": "1764236054307", - "creationTimestamp": "2025-11-27T14:52:42Z", - "deletionTimestamp": "2025-12-30T08:45:33Z" - }, - "spec": { - "description": "Use the v2 kubernetes API in the frontend for dashboards", - "stage": "experimental", - "codeowner": "@grafana/dashboards-squad" - } - }, { "metadata": { "name": "kubernetesExternalGroupMapping", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-25T13:21:23Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-25T13:21:23Z" }, "spec": { "description": "Routes external group mapping requests from /api to the /apis endpoint", @@ -2773,28 +2297,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "kubernetesFeatureToggles", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-01-18T05:32:44Z", - "deletionTimestamp": "2026-01-07T14:53:58Z" - }, - "spec": { - "description": "Use the kubernetes API for feature toggle management in the frontend", - "stage": "experimental", - "codeowner": "@grafana/grafana-operator-experience-squad", - "frontend": true - } - }, { "metadata": { "name": "kubernetesLibraryPanels", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-06-25T22:21:56Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-06-25T22:21:56Z" }, "spec": { "description": "Routes library panel requests from /api to the /apis endpoint", @@ -2807,11 +2314,8 @@ { "metadata": { "name": "kubernetesLogsDrilldown", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-16T21:31:42Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-16T21:31:42Z" }, "spec": { "description": "Adds support for Kubernetes logs drilldown", @@ -2824,11 +2328,8 @@ { "metadata": { "name": "kubernetesQueryCaching", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-20T16:11:25Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-20T16:11:25Z" }, "spec": { "description": "Adds support for Kubernetes querycaching", @@ -2841,12 +2342,9 @@ { "metadata": { "name": "kubernetesShortURLs", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", - "deletionTimestamp": "2025-08-01T11:30:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-08-01T11:30:17Z" }, "spec": { "description": "Enables k8s short url api and uses it under the hood when handling legacy /api", @@ -2859,11 +2357,8 @@ { "metadata": { "name": "kubernetesSnapshots", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-12-05T22:31:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-12-05T22:31:49Z" }, "spec": { "description": "Routes snapshot requests from /api to the /apis endpoint", @@ -2876,12 +2371,9 @@ { "metadata": { "name": "kubernetesStars", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-09-01T09:33:33Z" }, "spec": { "description": "Routes stars requests from /api to the /apis endpoint", @@ -2894,11 +2386,8 @@ { "metadata": { "name": "kubernetesTeamBindings", - "resourceVersion": "1768904135898", - "creationTimestamp": "2026-01-20T09:57:29Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-20 10:15:35.898172 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables search for team bindings in the app platform API", @@ -2911,8 +2400,8 @@ { "metadata": { "name": "kubernetesTeamSync", - "resourceVersion": "1770656731636", - "creationTimestamp": "2026-02-09T17:05:31Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Use the new APIs for syncing users to teams", @@ -2925,8 +2414,8 @@ { "metadata": { "name": "kubernetesTeamsHandlerRedirect", - "resourceVersion": "1770222039889", - "creationTimestamp": "2026-02-04T16:20:39Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Redirects the request to teams related endpoints to the app platform API", @@ -2939,11 +2428,8 @@ { "metadata": { "name": "kubernetesUnifiedStorageQuotas", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-09T15:40:34Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-09T15:40:34Z" }, "spec": { "description": "Adds support for Kubernetes unified storage quotas", @@ -2956,11 +2442,8 @@ { "metadata": { "name": "liveAPIServer", - "resourceVersion": "1768816234707", - "creationTimestamp": "2026-01-19T09:34:08Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-19 09:50:34.707432 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Registers a live apiserver", @@ -2975,11 +2458,8 @@ { "metadata": { "name": "localeFormatPreference", - "resourceVersion": "1769012601213", - "creationTimestamp": "2025-03-31T13:59:07Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-21 16:23:21.21319 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-03-31T13:59:07Z" }, "spec": { "description": "Specifies the locale so the correct format for numbers and dates can be shown", @@ -2991,11 +2471,8 @@ { "metadata": { "name": "logQLScope", - "resourceVersion": "1768317398145", - "creationTimestamp": "2024-11-11T11:53:24Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-13 15:16:38.145488 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-11-11T11:53:24Z" }, "spec": { "description": "In-development feature that will allow injection of labels into loki queries.", @@ -3005,27 +2482,10 @@ "expression": "false" } }, - { - "metadata": { - "name": "logRequestsInstrumentedAsUnknown", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-06-10T08:56:55Z", - "deletionTimestamp": "2026-01-16T14:10:42Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Logs the path for requests that are instrumented as unknown", - "stage": "experimental", - "codeowner": "@grafana/grafana-backend-group", - "expression": "false" - } - }, { "metadata": { "name": "logsContextDatasourceUi", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2023-01-27T14:12:01Z" }, "spec": { @@ -3036,24 +2496,10 @@ "expression": "true" } }, - { - "metadata": { - "name": "logsExploreTableDefaultVisualization", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-05-02T15:28:15Z", - "deletionTimestamp": "2026-01-12T14:46:47Z" - }, - "spec": { - "description": "Sets the logs table as default visualisation in logs explore", - "stage": "experimental", - "codeowner": "@grafana/observability-logs", - "frontend": true - } - }, { "metadata": { "name": "logsExploreTableVisualisation", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2023-07-12T13:52:42Z" }, "spec": { @@ -3067,7 +2513,7 @@ { "metadata": { "name": "logsPanelControls", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-04-07T14:38:55Z" }, "spec": { @@ -3081,11 +2527,8 @@ { "metadata": { "name": "lokiExperimentalStreaming", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-06-19T10:03:51Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-06-19T10:03:51Z" }, "spec": { "description": "Support new streaming approach for loki (prototype, needs special loki build)", @@ -3097,11 +2540,8 @@ { "metadata": { "name": "lokiLabelNamesQueryApi", - "resourceVersion": "1768317398145", - "creationTimestamp": "2024-12-13T14:31:41Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-13 15:16:38.145488 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-12-13T14:31:41Z" }, "spec": { "description": "Defaults to using the Loki `/labels` API instead of `/series`", @@ -3113,11 +2553,8 @@ { "metadata": { "name": "lokiLogsDataplane", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-07-13T07:58:00Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-07-13T07:58:00Z" }, "spec": { "description": "Changes logs responses from Loki to be compliant with the dataplane specification.", @@ -3129,11 +2566,8 @@ { "metadata": { "name": "lokiQueryLimitsContext", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-21T13:19:55Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-21T13:19:55Z" }, "spec": { "description": "Send X-Loki-Query-Limits-Context header to Loki on first split request", @@ -3146,7 +2580,7 @@ { "metadata": { "name": "lokiQuerySplitting", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2023-02-09T17:27:02Z" }, "spec": { @@ -3160,11 +2594,8 @@ { "metadata": { "name": "lokiRunQueriesInParallel", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-09-19T09:34:01Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-09-19T09:34:01Z" }, "spec": { "description": "Enables running Loki queries in parallel", @@ -3176,11 +2607,8 @@ { "metadata": { "name": "lokiShardSplitting", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-10-23T11:21:03Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-10-23T11:21:03Z" }, "spec": { "description": "Use stream shards to split queries into smaller subqueries", @@ -3193,11 +2621,8 @@ { "metadata": { "name": "managedDualWriter", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-02-19T14:50:39Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-02-19T14:50:39Z" }, "spec": { "description": "Pick the dual write mode from database configs", @@ -3210,11 +2635,8 @@ { "metadata": { "name": "metricsFromProfiles", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-09T10:55:28Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-09T10:55:28Z" }, "spec": { "description": "Enables creating metrics from profiles and storing them as recording rules", @@ -3227,11 +2649,8 @@ { "metadata": { "name": "mlExpressions", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-07-13T17:37:50Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-07-13T17:37:50Z" }, "spec": { "description": "Enable support for Machine Learning in server-side expressions", @@ -3243,11 +2662,8 @@ { "metadata": { "name": "multiPropsVariables", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-09T17:11:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-09T17:11:49Z" }, "spec": { "description": "Enables support for variables whose values can have multiple properties", @@ -3260,11 +2676,8 @@ { "metadata": { "name": "multiTenantTempCredentials", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-02T20:25:50Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-02T20:25:50Z" }, "spec": { "description": "use multi-tenant path for awsTempCredentials", @@ -3274,27 +2687,10 @@ "expression": "false" } }, - { - "metadata": { - "name": "mysqlAnsiQuotes", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-10-12T11:43:35Z", - "deletionTimestamp": "2026-01-27T13:45:10Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Use double quotes to escape keyword in a MySQL query", - "stage": "experimental", - "codeowner": "@grafana/search-and-storage", - "expression": "false" - } - }, { "metadata": { "name": "newClickhouseConfigPageDesign", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -3308,11 +2704,8 @@ { "metadata": { "name": "newDashboardWithFiltersAndGroupBy", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-04-04T11:25:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-04-04T11:25:21Z" }, "spec": { "description": "Enables filters and group by variables on all new dashboards. Variables are added only if default data source supports filtering.", @@ -3325,7 +2718,7 @@ { "metadata": { "name": "newFiltersUI", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-08-30T12:48:13Z" }, "spec": { @@ -3338,11 +2731,8 @@ { "metadata": { "name": "newGauge", - "resourceVersion": "1768490527107", - "creationTimestamp": "2025-10-20T16:33:19Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 15:22:07.107826 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-20T16:33:19Z" }, "spec": { "description": "Enable new gauge visualization", @@ -3355,7 +2745,7 @@ { "metadata": { "name": "newInfluxDSConfigPageDesign", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-06-25T16:39:54Z" }, "spec": { @@ -3368,11 +2758,8 @@ { "metadata": { "name": "newLogContext", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-31T22:56:50Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-31T22:56:50Z" }, "spec": { "description": "New Log Context component", @@ -3385,7 +2772,7 @@ { "metadata": { "name": "newLogsPanel", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-02-04T17:40:17Z" }, "spec": { @@ -3399,7 +2786,7 @@ { "metadata": { "name": "newPanelPadding", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-11-12T15:40:46Z" }, "spec": { @@ -3413,11 +2800,8 @@ { "metadata": { "name": "newShareReportDrawer", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-02-17T19:05:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-02-17T19:05:46Z" }, "spec": { "description": "Enables the report creation drawer in a dashboard", @@ -3430,11 +2814,8 @@ { "metadata": { "name": "newTimeRangeZoomShortcuts", - "resourceVersion": "1769547504177", - "creationTimestamp": "2025-11-20T21:14:27Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-27 20:58:24.177524 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-20T21:14:27Z" }, "spec": { "description": "Enables new keyboard shortcuts for time range zoom operations", @@ -3447,7 +2828,7 @@ { "metadata": { "name": "newVizSuggestions", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-11-12T19:26:29Z" }, "spec": { @@ -3461,11 +2842,8 @@ { "metadata": { "name": "oauthRequireSubClaim", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-03-25T13:22:24Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-03-25T13:22:24Z" }, "spec": { "description": "Require that sub claims is present in oauth tokens.", @@ -3478,7 +2856,7 @@ { "metadata": { "name": "onlyStoreActionSets", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-10-20T15:02:56Z" }, "spec": { @@ -3492,7 +2870,7 @@ { "metadata": { "name": "opentsdbBackendMigration", - "resourceVersion": "1763456634837", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-12-04T08:11:33Z" }, "spec": { @@ -3506,11 +2884,8 @@ { "metadata": { "name": "otelLogsFormatting", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-16T15:42:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-16T15:42:14Z" }, "spec": { "description": "Applies OTel formatting templates to displayed logs", @@ -3523,11 +2898,8 @@ { "metadata": { "name": "panelFilterVariable", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-11-03T12:15:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-11-03T12:15:54Z" }, "spec": { "description": "Enables use of the `systemPanelFilterVar` variable to filter panels in a dashboard", @@ -3541,11 +2913,8 @@ { "metadata": { "name": "panelGroupBy", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-28T13:03:11Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-28T13:03:11Z" }, "spec": { "description": "Enables a group by action per panel", @@ -3558,8 +2927,8 @@ { "metadata": { "name": "panelStyleActions", - "resourceVersion": "1769620237787", - "creationTimestamp": "2026-01-28T17:10:37Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enable style actions (copy/paste) in the panel editor", @@ -3572,11 +2941,8 @@ { "metadata": { "name": "panelTimeSettings", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-29T08:06:23Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-29T08:06:23Z" }, "spec": { "description": "Enables a new panel time settings drawer", @@ -3588,11 +2954,8 @@ { "metadata": { "name": "panelTitleSearch", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-02-15T18:26:03Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2022-02-15T18:26:03Z" }, "spec": { "description": "Search for dashboards using panel title", @@ -3604,11 +2967,8 @@ { "metadata": { "name": "passwordlessMagicLinkAuthentication", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-11-14T13:50:55Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-11-14T13:50:55Z" }, "spec": { "description": "Enable passwordless login via magic link authentication", @@ -3621,11 +2981,8 @@ { "metadata": { "name": "pdfTables", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-11-06T13:39:22Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-11-06T13:39:22Z" }, "spec": { "description": "Enables generating table data as PDF in reporting", @@ -3637,11 +2994,8 @@ { "metadata": { "name": "perPanelFiltering", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-12-08T16:18:04Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-08T16:18:04Z" }, "spec": { "description": "Enables filtering by grouping labels on the panel level through legend or tooltip", @@ -3654,11 +3008,8 @@ { "metadata": { "name": "perPanelNonApplicableDrilldowns", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-21T16:03:27Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-21T16:03:27Z" }, "spec": { "description": "Enables viewing non-applicable drilldowns on a panel level", @@ -3668,28 +3019,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "permissionsFilterRemoveSubquery", - "resourceVersion": "1764664939750", - "creationTimestamp": "2023-08-02T07:39:25Z", - "deletionTimestamp": "2026-01-16T09:04:04Z" - }, - "spec": { - "description": "Alternative permission filter implementation that does not use subqueries for fetching the dashboard folder", - "stage": "experimental", - "codeowner": "@grafana/search-and-storage", - "expression": "false" - } - }, { "metadata": { "name": "playlistsReconciler", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-12-20T03:09:31Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-12-20T03:09:31Z" }, "spec": { "description": "Enables experimental reconciler for playlists", @@ -3702,7 +3036,7 @@ { "metadata": { "name": "pluginContainers", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -3717,7 +3051,7 @@ { "metadata": { "name": "pluginInsights", - "resourceVersion": "1761300628147", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-12-16T10:20:18Z", "deletionTimestamp": "2025-12-18T17:11:33Z" }, @@ -3732,7 +3066,7 @@ { "metadata": { "name": "pluginInstallAPISync", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-10-24T12:09:26Z" }, "spec": { @@ -3745,7 +3079,7 @@ { "metadata": { "name": "pluginProxyPreserveTrailingSlash", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-06-05T11:36:14Z" }, "spec": { @@ -3758,7 +3092,7 @@ { "metadata": { "name": "pluginStoreServiceLoading", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-10-17T20:01:43Z" }, "spec": { @@ -3771,11 +3105,8 @@ { "metadata": { "name": "pluginsAutoUpdate", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-16T11:44:39Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-16T11:44:39Z" }, "spec": { "description": "Enables auto-updating of users installed plugins", @@ -3787,7 +3118,7 @@ { "metadata": { "name": "pluginsSriChecks", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-10-04T12:55:09Z" }, "spec": { @@ -3800,7 +3131,7 @@ { "metadata": { "name": "preferLibraryPanelTitle", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-06-17T11:21:21Z" }, "spec": { @@ -3813,11 +3144,8 @@ { "metadata": { "name": "preserveDashboardStateWhenNavigating", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-05-27T12:28:06Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-05-27T12:28:06Z" }, "spec": { "description": "Enables possibility to preserve dashboard variables and time range when navigating between dashboards", @@ -3830,7 +3158,7 @@ { "metadata": { "name": "preventPanelChromeOverflow", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-10-17T14:40:08Z" }, "spec": { @@ -3844,11 +3172,8 @@ { "metadata": { "name": "profilesExemplars", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-07T12:25:42Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-07T12:25:42Z" }, "spec": { "description": "Enables profiles exemplars support in profiles drilldown", @@ -3860,7 +3185,7 @@ { "metadata": { "name": "prometheusAzureOverrideAudience", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2022-05-30T15:43:32Z", "deletionTimestamp": "2023-07-16T21:30:14Z" }, @@ -3874,11 +3199,8 @@ { "metadata": { "name": "prometheusSpecialCharsInLabelValues", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-12-18T21:31:08Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-12-18T21:31:08Z" }, "spec": { "description": "Adds support for quotes and special characters in label values for Prometheus queries", @@ -3891,7 +3213,7 @@ { "metadata": { "name": "prometheusTypeMigration", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -3906,11 +3228,8 @@ { "metadata": { "name": "provisioning", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-11-22T09:03:50Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-11-22T09:03:50Z" }, "spec": { "description": "Next generation provisioning... and git", @@ -3923,11 +3242,8 @@ { "metadata": { "name": "publicDashboardsEmailSharing", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-01-03T19:45:15Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-01-03T19:45:15Z" }, "spec": { "description": "Enables public dashboard sharing to be restricted to only allowed emails", @@ -3940,7 +3256,7 @@ { "metadata": { "name": "publicDashboardsScene", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-03-22T14:48:21Z" }, "spec": { @@ -3954,7 +3270,7 @@ { "metadata": { "name": "queryCacheRequestDeduplication", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", "deletionTimestamp": "2025-09-01T09:33:33Z" }, @@ -3968,11 +3284,8 @@ { "metadata": { "name": "queryEditorNext", - "resourceVersion": "1768869177305", - "creationTimestamp": "2026-01-13T18:26:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-20 00:32:57.305391 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables next generation query editor experience", @@ -3985,12 +3298,9 @@ { "metadata": { "name": "queryLibrary", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2022-10-07T18:31:45Z", - "deletionTimestamp": "2023-03-20T16:00:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2023-03-20T16:00:14Z" }, "spec": { "description": "Enables Saved queries (query library) feature", @@ -4002,11 +3312,8 @@ { "metadata": { "name": "queryService", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-04-19T09:26:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-04-19T09:26:21Z" }, "spec": { "description": "Register /apis/query.grafana.app/ -- will eventually replace /api/ds/query", @@ -4016,28 +3323,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "queryServiceFromExplore", - "resourceVersion": "1764664939750", - "creationTimestamp": "2025-04-02T10:00:33Z", - "deletionTimestamp": "2025-12-16T16:40:18Z" - }, - "spec": { - "description": "Routes explore requests to the new query service", - "stage": "experimental", - "codeowner": "@grafana/grafana-datasources-core-services", - "frontend": true - } - }, { "metadata": { "name": "queryServiceFromUI", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-04-19T09:26:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-04-19T09:26:21Z" }, "spec": { "description": "Routes requests to the new query service", @@ -4050,11 +3340,8 @@ { "metadata": { "name": "queryServiceRewrite", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-04-19T09:26:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-04-19T09:26:21Z" }, "spec": { "description": "Rewrite requests targeting /ds/query to the query service", @@ -4067,12 +3354,9 @@ { "metadata": { "name": "queryServiceWithConnections", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-28T19:28:26Z", - "deletionTimestamp": "2025-08-29T12:49:57Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-08-29T12:49:57Z" }, "spec": { "description": "Adds datasource connections to the query service", @@ -4085,12 +3369,8 @@ { "metadata": { "name": "queryWithAssistant", - "resourceVersion": "1768832883692", - "creationTimestamp": "2026-01-15T12:40:17Z", - "deletionTimestamp": "2026-01-19T14:25:13Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-19 14:28:03.692934 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables the Query with Assistant button in the query editor", @@ -4116,11 +3396,8 @@ { "metadata": { "name": "recentlyViewedDashboards", - "resourceVersion": "1770896695157", - "creationTimestamp": "2025-12-10T16:28:19Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-12 11:44:55.157718 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-10T16:28:19Z" }, "spec": { "description": "Enables recently viewed dashboards section in the browsing dashboard page", @@ -4133,11 +3410,8 @@ { "metadata": { "name": "refactorVariablesTimeRange", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-06-06T13:12:09Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-06-06T13:12:09Z" }, "spec": { "description": "Refactor time range variables flow to reduce number of API calls made when query variables are chained", @@ -4149,11 +3423,8 @@ { "metadata": { "name": "refreshTokenRequired", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-19T18:21:40Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-19T18:21:40Z" }, "spec": { "description": "Require that refresh tokens are present in oauth tokens.", @@ -4166,11 +3437,8 @@ { "metadata": { "name": "reloadDashboardsOnParamsChange", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-10-25T12:56:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-10-25T12:56:54Z" }, "spec": { "description": "Enables reload of dashboards on scopes, time range and variables changes", @@ -4183,11 +3451,8 @@ { "metadata": { "name": "renderAuthJWT", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-04-03T16:53:38Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-04-03T16:53:38Z" }, "spec": { "description": "Uses JWT-based auth for rendering instead of relying on remote cache", @@ -4199,11 +3464,8 @@ { "metadata": { "name": "rendererDisableAppPluginsPreload", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-02-24T14:43:06Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-02-24T14:43:06Z" }, "spec": { "description": "Disable pre-loading app plugins when the request is coming from the renderer", @@ -4217,11 +3479,8 @@ { "metadata": { "name": "reportingCsvEncodingOptions", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-08T12:56:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-08T12:56:54Z" }, "spec": { "description": "Enables CSV encoding options in the reporting feature", @@ -4230,29 +3489,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "reportingRetries", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-08-31T07:47:47Z", - "deletionTimestamp": "2026-02-04T09:25:59Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Enables rendering retries for the reporting feature", - "stage": "preview", - "codeowner": "@grafana/grafana-operator-experience-squad", - "requiresRestart": true, - "expression": "false" - } - }, { "metadata": { "name": "reportingV2Layouts", - "resourceVersion": "1771254621222", - "creationTimestamp": "2026-02-16T15:10:21Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enable v2 dashboard layout support in reports (auto-grid, tabs, rows)", @@ -4265,11 +3506,8 @@ { "metadata": { "name": "restoreDashboards", - "resourceVersion": "1770896695157", - "creationTimestamp": "2025-05-23T14:35:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-12 11:44:55.157718 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-05-23T14:35:54Z" }, "spec": { "description": "Enables restore deleted dashboards feature", @@ -4281,7 +3519,7 @@ { "metadata": { "name": "restrictedPluginApis", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", "deletionTimestamp": "2025-08-01T11:30:17Z" }, @@ -4297,11 +3535,8 @@ { "metadata": { "name": "rolePickerDrawer", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-09-26T12:51:38Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-09-26T12:51:38Z" }, "spec": { "description": "Enables the new role picker drawer design", @@ -4313,7 +3548,7 @@ { "metadata": { "name": "rudderstackUpgrade", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-11-19T16:48:23Z" }, "spec": { @@ -4327,8 +3562,8 @@ { "metadata": { "name": "savedQueriesRBAC", - "resourceVersion": "1768828040599", - "creationTimestamp": "2026-01-19T13:07:20Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enables Saved queries (query library) RBAC permissions", @@ -4340,11 +3575,8 @@ { "metadata": { "name": "scanRowInvalidDashboardParseFallbackEnabled", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-30T14:18:38Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-30T14:18:38Z" }, "spec": { "description": "Enable fallback parsing behavior when scan row encounters invalid dashboard JSON", @@ -4356,7 +3588,7 @@ { "metadata": { "name": "scopeApi", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-11-27T07:58:25Z" }, "spec": { @@ -4369,11 +3601,8 @@ { "metadata": { "name": "scopeFilters", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-03-05T15:41:19Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-03-05T15:41:19Z" }, "spec": { "description": "Enables the use of scope filters in Grafana", @@ -4386,11 +3615,8 @@ { "metadata": { "name": "scopeSearchAllLevels", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-04-14T07:42:16Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-04-14T07:42:16Z" }, "spec": { "description": "Enable scope search to include all levels of the scope node tree", @@ -4403,8 +3629,8 @@ { "metadata": { "name": "secretsKeeperUI", - "resourceVersion": "1770225479158", - "creationTimestamp": "2026-02-04T17:17:59Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enable the Secrets Keeper management UI for configuring external secret storage", @@ -4414,31 +3640,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "secretsManagementAppPlatform", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-03-19T09:25:14Z", - "deletionTimestamp": "2026-02-11T10:16:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Enable the secrets management API and services under app platform", - "stage": "experimental", - "codeowner": "@grafana/grafana-operator-experience-squad", - "expression": "false" - } - }, { "metadata": { "name": "secretsManagementAppPlatformAwsKeeper", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-06T14:30:04Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-06T14:30:04Z" }, "spec": { "description": "Enables the creation of keepers that manage secrets stored on AWS secrets manager", @@ -4451,12 +3657,9 @@ { "metadata": { "name": "secretsManagementAppPlatformUI", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", - "deletionTimestamp": "2025-08-01T11:30:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-08-01T11:30:17Z" }, "spec": { "description": "Enable the secrets management app platform UI", @@ -4468,7 +3671,7 @@ { "metadata": { "name": "sharingDashboardImage", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-15T21:07:39Z" }, "spec": { @@ -4479,31 +3682,11 @@ "expression": "true" } }, - { - "metadata": { - "name": "showDashboardValidationWarnings", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-10-14T13:51:05Z", - "deletionTimestamp": "2026-02-02T11:38:12Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } - }, - "spec": { - "description": "Show warnings when dashboards do not validate against the schema", - "stage": "experimental", - "codeowner": "@grafana/dashboards-squad", - "expression": "false" - } - }, { "metadata": { "name": "smoothingTransformation", - "resourceVersion": "1768498862515", - "creationTimestamp": "2026-01-05T16:53:45Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-01-05T16:53:45Z" }, "spec": { "description": "Enables the ASAP smoothing transformation for time series data", @@ -4516,11 +3699,8 @@ { "metadata": { "name": "sqlExpressions", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-02-27T21:16:00Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-02-27T21:16:00Z" }, "spec": { "description": "Enables SQL Expressions, which can execute SQL queries against data source results.", @@ -4532,11 +3712,8 @@ { "metadata": { "name": "sqlExpressionsColumnAutoComplete", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-23T21:49:58Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-23T21:49:58Z" }, "spec": { "description": "Enables column autocomplete for SQL Expressions", @@ -4549,11 +3726,8 @@ { "metadata": { "name": "sseGroupByDatasource", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-09-07T20:02:07Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-09-07T20:02:07Z" }, "spec": { "description": "Send query to the same datasource in a single request when using server side expressions. The `cloudWatchBatchQueries` feature toggle should be enabled if this used with CloudWatch.", @@ -4562,30 +3736,12 @@ "expression": "false" } }, - { - "metadata": { - "name": "ssoSettingsLDAP", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-06-18T11:31:27Z", - "deletionTimestamp": "2026-01-31T01:56:50Z" - }, - "spec": { - "description": "Use the new SSO Settings API to configure LDAP", - "stage": "GA", - "codeowner": "@grafana/identity-access-team", - "requiresRestart": true, - "expression": "true" - } - }, { "metadata": { "name": "starsFromAPIServer", - "resourceVersion": "1770896695157", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-12 11:44:55.157718 +0000 UTC" - } + "deletionTimestamp": "2025-09-01T09:33:33Z" }, "spec": { "description": "populate star status from apiserver", @@ -4599,11 +3755,8 @@ { "metadata": { "name": "storage", - "resourceVersion": "1768498862515", - "creationTimestamp": "2022-03-17T17:19:23Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2022-03-17T17:19:23Z" }, "spec": { "description": "Configurable storage for dashboards, datasources, and resources", @@ -4615,11 +3768,8 @@ { "metadata": { "name": "suggestedDashboards", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-07T13:38:59Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-07T13:38:59Z" }, "spec": { "description": "Displays datasource provisioned and community dashboards in dashboard empty page, only when coming from datasource configuration page", @@ -4631,11 +3781,8 @@ { "metadata": { "name": "tableSharedCrosshair", - "resourceVersion": "1768498862515", - "creationTimestamp": "2023-12-13T09:33:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2023-12-13T09:33:14Z" }, "spec": { "description": "Enables shared crosshair in table panel", @@ -4648,7 +3795,7 @@ { "metadata": { "name": "tabularNumbers", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-06-24T11:52:03Z" }, "spec": { @@ -4661,12 +3808,9 @@ { "metadata": { "name": "teamFolders", - "resourceVersion": "1770896695157", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", - "deletionTimestamp": "2025-08-01T11:30:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-12 11:44:55.157718 +0000 UTC" - } + "deletionTimestamp": "2025-08-01T11:30:17Z" }, "spec": { "description": "Enables team folders functionality", @@ -4678,11 +3822,8 @@ { "metadata": { "name": "teamHttpHeadersFromAppPlatform", - "resourceVersion": "1770314407036", - "creationTimestamp": "2026-02-05T17:51:52Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-02-05 18:00:07.036855 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Use the Kubernetes TeamLBACRule API for team HTTP headers on datasource query requests", @@ -4694,11 +3835,8 @@ { "metadata": { "name": "teamHttpHeadersTempo", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-05-22T19:13:31Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-05-22T19:13:31Z" }, "spec": { "description": "Enables LBAC for datasources for Tempo to apply LBAC filtering of traces to the client requests for users in teams", @@ -4710,11 +3848,8 @@ { "metadata": { "name": "tempoAlerting", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-15T13:36:36Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-15T13:36:36Z" }, "spec": { "description": "Enables creating alerts from Tempo data source", @@ -4723,29 +3858,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "tempoSearchBackendMigration", - "resourceVersion": "1764664939750", - "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z" - }, - "spec": { - "description": "Run search queries through the tempo backend", - "stage": "GA", - "codeowner": "@grafana/oss-big-tent", - "requiresRestart": true, - "expression": "false" - } - }, { "metadata": { "name": "timeComparison", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-24T20:07:28Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-24T20:07:28Z" }, "spec": { "description": "Enables time comparison option in supported panels", @@ -4758,11 +3875,8 @@ { "metadata": { "name": "timeRangePan", - "resourceVersion": "1769547328567", - "creationTimestamp": "2025-11-05T01:39:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-27 20:55:28.567609 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-05T01:39:46Z" }, "spec": { "description": "Enables time range panning functionality", @@ -4775,11 +3889,8 @@ { "metadata": { "name": "timeRangeProvider", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-10-22T10:52:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-10-22T10:52:33Z" }, "spec": { "description": "Enables time pickers sync", @@ -4791,11 +3902,8 @@ { "metadata": { "name": "transformationsEmptyPlaceholder", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-17T13:57:05Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-17T13:57:05Z" }, "spec": { "description": "Show transformation quick-start cards in empty transformations state", @@ -4808,11 +3916,8 @@ { "metadata": { "name": "ttlPluginInstanceManager", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-11-18T11:17:23Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-11-18T11:17:23Z" }, "spec": { "description": "Enable TTL plugin instance manager", @@ -4822,27 +3927,10 @@ "expression": "false" } }, - { - "metadata": { - "name": "unifiedHistory", - "resourceVersion": "1762958248290", - "creationTimestamp": "2024-12-13T10:41:18Z", - "deletionTimestamp": "2026-01-08T15:25:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-11-12 14:37:28.29086 +0000 UTC" - } - }, - "spec": { - "description": "Displays the navigation history so the user can navigate back to previous pages", - "stage": "experimental", - "codeowner": "@grafana/grafana-search-navigate-organise", - "frontend": true - } - }, { "metadata": { "name": "unifiedNavbars", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-04-09T12:51:22Z" }, "spec": { @@ -4853,28 +3941,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "unifiedRequestLog", - "resourceVersion": "1764664939750", - "creationTimestamp": "2023-03-31T13:38:09Z", - "deletionTimestamp": "2025-12-19T08:55:47Z" - }, - "spec": { - "description": "Writes error logs to the request logger", - "stage": "GA", - "codeowner": "@grafana/grafana-backend-group", - "expression": "true" - } - }, { "metadata": { "name": "unifiedStorageBigObjectsSupport", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-10-17T10:18:29Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-10-17T10:18:29Z" }, "spec": { "description": "Enables to save big objects in blob storage", @@ -4886,11 +3957,8 @@ { "metadata": { "name": "unifiedStorageGrpcConnectionPool", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-03-21T13:24:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-03-21T13:24:54Z" }, "spec": { "description": "Enables the unified storage grpc connection pool", @@ -4900,28 +3968,11 @@ "expression": "false" } }, - { - "metadata": { - "name": "unifiedStorageSearch", - "resourceVersion": "1764664939750", - "creationTimestamp": "2024-09-30T19:46:14Z", - "deletionTimestamp": "2026-01-12T12:22:48Z" - }, - "spec": { - "description": "Enable unified storage search", - "stage": "experimental", - "codeowner": "@grafana/search-and-storage", - "hideFromDocs": true - } - }, { "metadata": { "name": "unifiedStorageSearchDualReaderEnabled", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-07-18T12:43:56Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-07-18T12:43:56Z" }, "spec": { "description": "Enable dual reader for unified storage search", @@ -4934,11 +3985,8 @@ { "metadata": { "name": "unifiedStorageSearchUI", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-12-19T18:21:48Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-12-19T18:21:48Z" }, "spec": { "description": "Enable unified storage search UI", @@ -4951,11 +3999,8 @@ { "metadata": { "name": "unlimitedLayoutsNesting", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-10T12:15:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-10T12:15:54Z" }, "spec": { "description": "Enables unlimited dashboard panel grouping", @@ -4968,12 +4013,9 @@ { "metadata": { "name": "useKubernetesShortURLsAPI", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", - "deletionTimestamp": "2025-09-01T09:33:33Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-09-01T09:33:33Z" }, "spec": { "description": "Routes short url requests from /api to the /apis endpoint in the frontend. Depends on kubernetesShortURLs", @@ -4986,11 +4028,8 @@ { "metadata": { "name": "useMTPlugins", - "resourceVersion": "1768554119948", - "creationTimestamp": "2025-12-05T07:09:41Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-16 09:01:59.948292 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-12-05T07:09:41Z" }, "spec": { "description": "Enables plugins decoupling from bootdata", @@ -5004,7 +4043,7 @@ { "metadata": { "name": "useMultipleScopeNodesEndpoint", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-08-29T14:46:39Z", "deletionTimestamp": "2025-09-01T09:33:33Z" }, @@ -5020,8 +4059,8 @@ { "metadata": { "name": "useNewAPIsForDatasourceCRUD", - "resourceVersion": "1770975026132", - "creationTimestamp": "2026-02-13T09:30:26Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Use the new datasource API groups for datasource CRUD requests", @@ -5035,7 +4074,7 @@ { "metadata": { "name": "useScopeSingleNodeEndpoint", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T14:32:41Z" }, "spec": { @@ -5050,11 +4089,8 @@ { "metadata": { "name": "useScopesNavigationEndpoint", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-03-31T15:20:00Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-03-31T15:20:00Z" }, "spec": { "description": "Use the scopes navigation endpoint instead of the dashboardbindings endpoint", @@ -5068,7 +4104,7 @@ { "metadata": { "name": "useSessionStorageForRedirection", - "resourceVersion": "1764664939750", + "resourceVersion": "1771410284502", "creationTimestamp": "2024-09-23T09:31:23Z" }, "spec": { @@ -5081,12 +4117,9 @@ { "metadata": { "name": "vizActionsAuth", - "resourceVersion": "1768498862515", + "resourceVersion": "1771410284502", "creationTimestamp": "2025-07-31T22:56:50Z", - "deletionTimestamp": "2025-08-01T11:30:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "deletionTimestamp": "2025-08-01T11:30:17Z" }, "spec": { "description": "Allows authenticated API calls in actions", @@ -5100,8 +4133,8 @@ { "metadata": { "name": "vizPresets", - "resourceVersion": "1770650117614", - "creationTimestamp": "2026-02-09T15:15:17Z" + "resourceVersion": "1771410284502", + "creationTimestamp": "2026-02-18T10:24:44Z" }, "spec": { "description": "Enable visualization presets", @@ -5114,11 +4147,8 @@ { "metadata": { "name": "zanzana", - "resourceVersion": "1768498862515", - "creationTimestamp": "2024-06-19T13:59:47Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2024-06-19T13:59:47Z" }, "spec": { "description": "Use openFGA as authorization engine.", @@ -5131,11 +4161,8 @@ { "metadata": { "name": "zanzanaNoLegacyClient", - "resourceVersion": "1768498862515", - "creationTimestamp": "2025-10-21T14:03:17Z", - "annotations": { - "grafana.app/updatedTimestamp": "2026-01-15 17:41:02.515355 +0000 UTC" - } + "resourceVersion": "1771410284502", + "creationTimestamp": "2025-10-21T14:03:17Z" }, "spec": { "description": "Use openFGA as main authorization engine and disable legacy RBAC clietn.", diff --git a/pkg/tests/apis/datasource/resources_test.go b/pkg/tests/apis/datasource/resources_test.go new file mode 100644 index 00000000000..714d92dd801 --- /dev/null +++ b/pkg/tests/apis/datasource/resources_test.go @@ -0,0 +1,284 @@ +package datasource + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "net/url" + "testing" + + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + + "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/tests/apis" + "github.com/grafana/grafana/pkg/tests/testinfra" + "github.com/grafana/grafana/pkg/util/testutil" +) + +// testdataResponse represents the JSON response from /test/json endpoint for grafana-test-dataosurce +type testdataResponse struct { + Message string `json:"message"` + Request struct { + Method string `json:"method"` + URL url.URL `json:"url"` + Headers map[string][]string `json:"headers"` + Body map[string]any `json:"body"` + } `json:"request"` +} + +func setup(t *testing.T) *apis.K8sTestHelper { + helper := apis.NewK8sTestHelper(t, testinfra.GrafanaOpts{ + DisableAnonymous: true, + EnableFeatureToggles: []string{ + featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // Required to start the datasource api servers + featuremgmt.FlagQueryServiceWithConnections, // enables CRUD endpoints + featuremgmt.FlagDatasourcesApiServerEnableResourceEndpoint, // enables resource endpoint + }, + }) + t.Cleanup(helper.Shutdown) + + ctx := context.Background() + client := helper.Org1.Admin.ResourceClient(t, schema.GroupVersionResource{ + Group: "grafana-testdata-datasource.datasource.grafana.app", + Version: "v0alpha1", + Resource: "datasources", + }).Namespace("default") + + _, err := client.Create(ctx, &unstructured.Unstructured{ + Object: map[string]any{ + "apiVersion": "grafana-testdata-datasource.datasource.grafana.app/v0alpha1", + "kind": "DataSource", + "metadata": map[string]any{ + "name": "test-resource", + }, + "spec": map[string]any{ + "title": "Test Resource Datasource", + }, + }, + }, metav1.CreateOptions{}) + + if err != nil { + t.Fatalf("failed to create datasource: %v", err) + } + + return helper +} + +func TestIntegrationDatasourceResources(t *testing.T) { + testutil.SkipIntegrationTestInShortMode(t) + helper := setup(t) + + t.Run("GET resource endpoint returns testdata response", func(t *testing.T) { + raw := apis.DoRequest[any](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource", + }, nil) + + require.Equal(t, http.StatusOK, raw.Response.StatusCode, "expected OK status, got body: %s", string(raw.Body)) + require.Contains(t, string(raw.Body), "Hello world", "expected testdata greeting response") + }) + + t.Run("GET /test/json returns JSON with request echo", func(t *testing.T) { + helper := setup(t) + + raw := apis.DoRequest[testdataResponse](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource/test/json", + }, &testdataResponse{}) + + require.Equal(t, http.StatusOK, raw.Response.StatusCode) + require.NotNil(t, raw.Result) + require.Equal(t, "Hello world from test datasource!", raw.Result.Message) + require.Equal(t, "GET", raw.Result.Request.Method) + }) + + t.Run("POST with body echoes request body", func(t *testing.T) { + raw := apis.DoRequest[testdataResponse](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodPost, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource/test/json", + Body: []byte(`{"foo": "bar", "count": 42}`), + }, &testdataResponse{}) + + require.Equal(t, http.StatusOK, raw.Response.StatusCode) + require.NotNil(t, raw.Result) + require.Equal(t, "POST", raw.Result.Request.Method) + require.NotNil(t, raw.Result.Request.Body) + require.Equal(t, "bar", raw.Result.Request.Body["foo"]) + require.Equal(t, float64(42), raw.Result.Request.Body["count"]) + }) +} + +func TestIntegrationDatasourceResourceHeaders(t *testing.T) { + testutil.SkipIntegrationTestInShortMode(t) + helper := setup(t) + t.Run("auth headers are stripped before request reaches plugin", func(t *testing.T) { + raw := apis.DoRequest[testdataResponse](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodPost, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource/test/json", + Headers: map[string]string{ + "X-Custom-Header": "custom-value", + }, + ContentType: "application/json", + Accept: "application/json", + Body: []byte(`{"foo": "bar", "count": 42}`), + }, &testdataResponse{}) + + require.Equal(t, http.StatusOK, raw.Response.StatusCode) + require.NotNil(t, raw.Result) + + // ClearAuthHeaders middleware should strip auth headers before request is sent to plugin + authHeaders := raw.Result.Request.Headers["Authorization"] + require.Empty(t, authHeaders, "Authorization header should be stripped before request reaches plugin") + deviceIDHeaders := raw.Result.Request.Headers["X-Grafana-Device-Id"] + require.Empty(t, deviceIDHeaders, "X-Grafana-Device-Id header should be stripped before request reaches plugin") + // Non-auth headers must still be forwarded + customHeaders := raw.Result.Request.Headers["X-Custom-Header"] + require.NotEmpty(t, customHeaders) + require.Equal(t, "custom-value", customHeaders[0]) + }) + + t.Run("query parameters are forwarded to plugin", func(t *testing.T) { + raw := apis.DoRequest[testdataResponse](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource/test/json?param1=value1¶m2=value2", + }, &testdataResponse{}) + + require.Equal(t, http.StatusOK, raw.Response.StatusCode) + require.NotNil(t, raw.Result) + + // parse raw.Body to testdataResponse + testdataResponse := &testdataResponse{} + err := json.Unmarshal(raw.Body, testdataResponse) + require.NoError(t, err, "failed to unmarshal response body: %s", string(raw.Body)) + + require.Contains(t, testdataResponse.Request.URL.RawQuery, "param1=value1", "URL in plugin should contain query parameters") + require.Contains(t, testdataResponse.Request.URL.RawQuery, "param2=value2", "URL in plugin should contain query parameters") + }) +} + +func TestIntegrationDatasourceStreamingResource(t *testing.T) { + testutil.SkipIntegrationTestInShortMode(t) + helper := setup(t) + + t.Run("GET streaming resource returns expected response", func(t *testing.T) { + raw := apis.DoRequest[any](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource/test/stream", + }, nil) + + require.NotNil(t, raw.Response.StatusCode) + require.Equal(t, int(http.StatusOK), raw.Response.StatusCode) + require.Contains(t, string(raw.Body), "Hello world from test datasource!") + }) +} + +func TestIntegrationDatasourceResourceAuthorization(t *testing.T) { + testutil.SkipIntegrationTestInShortMode(t) + helper := setup(t) + + t.Run("resource endpoint returns 404 for non-existent datasource", func(t *testing.T) { + raw := apis.DoRequest[any](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/does-not-exist/resource", + }, nil) + + require.NotNil(t, raw.Status) + require.Equal(t, int32(http.StatusNotFound), raw.Status.Code) + }) + + t.Run("resource endpoint requires authentication", func(t *testing.T) { + // None role should not be able to access resource endpoint for GET + raw := apis.DoRequest[any](helper, apis.RequestParams{ + User: helper.Org1.None, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource", + }, nil) + + require.NotNil(t, raw.Response) + require.Equal(t, http.StatusForbidden, raw.Response.StatusCode) + }) + + t.Run("resource endpoint cross-org access denied", func(t *testing.T) { + // OrgB user should not be able to access Org1's datasource resources + raw := apis.DoRequest[any](helper, apis.RequestParams{ + User: helper.OrgB.Admin, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource", + }, nil) + + require.NotNil(t, raw.Status) + require.Equal(t, int32(http.StatusForbidden), raw.Status.Code) + }) +} + +func TestIntegrationDatasourceResourcesMethods(t *testing.T) { + testutil.SkipIntegrationTestInShortMode(t) + helper := setup(t) + + httpMethods := []string{ + http.MethodGet, + http.MethodPost, + http.MethodPut, + http.MethodPatch, + http.MethodDelete, + } + + for _, method := range httpMethods { + t.Run(fmt.Sprintf("%s method is forwarded correctly", method), func(t *testing.T) { + var body []byte + if method == http.MethodPost || method == http.MethodPut || method == http.MethodPatch { + body = []byte(`{"test": "data"}`) + } + + raw := apis.DoRequest[testdataResponse](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: method, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource/test/json", + Body: body, + }, &testdataResponse{}) + + require.Equal(t, http.StatusOK, raw.Response.StatusCode, + "method %s should return OK, got: %s", method, string(raw.Body)) + require.NotNil(t, raw.Result) + require.Equal(t, method, raw.Result.Request.Method, + "echoed method should match request method") + }) + } +} + +func TestIntegrationDatasourceResourcesScenarios(t *testing.T) { + testutil.SkipIntegrationTestInShortMode(t) + + helper := setup(t) + + t.Run("GET /scenarios returns list of available scenarios", func(t *testing.T) { + raw := apis.DoRequest[[]map[string]any](helper, apis.RequestParams{ + User: helper.Org1.Admin, + Method: http.MethodGet, + Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test-resource/resource/scenarios", + }, &[]map[string]any{}) + + require.Equal(t, http.StatusOK, raw.Response.StatusCode) + require.NotNil(t, raw.Result) + + // Should return a list of scenarios + scenarios := *raw.Result + require.NotEmpty(t, scenarios, "should return at least one scenario") + + for _, scenario := range scenarios { + require.NotEmpty(t, scenario["id"], "scenario should have id") + require.NotEmpty(t, scenario["name"], "scenario should have name") + } + }) +} diff --git a/pkg/tests/apis/datasource/testdata_test.go b/pkg/tests/apis/datasource/testdata_test.go index 1b73f7d2b49..752e1e91d18 100644 --- a/pkg/tests/apis/datasource/testdata_test.go +++ b/pkg/tests/apis/datasource/testdata_test.go @@ -40,8 +40,9 @@ func TestIntegrationTestDatasource(t *testing.T) { helper := apis.NewK8sTestHelper(t, testinfra.GrafanaOpts{ DisableAnonymous: true, EnableFeatureToggles: []string{ - featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // Required to start the datasource api servers - featuremgmt.FlagQueryServiceWithConnections, // enables CRUD endpoints + featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // Required to start the datasource api servers + featuremgmt.FlagQueryServiceWithConnections, // enables CRUD endpoints + featuremgmt.FlagDatasourcesApiServerEnableResourceEndpoint, // enables resource endpoint }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ "datasources.grafana-testdata-datasource.datasource.grafana.app": { @@ -198,11 +199,8 @@ func TestIntegrationTestDatasource(t *testing.T) { Method: "GET", Path: "/apis/grafana-testdata-datasource.datasource.grafana.app/v0alpha1/namespaces/default/datasources/test/resource", }, nil) - // endpoint is disabled currently because it has not been - // sufficiently tested. - // for more info see pkg/registry/apis/datasource/sub_resource.go - require.Equal(t, int32(501), raw.Status.Code) - // require.Equal(t, `Hello world from test datasource!`, string(raw.Body)) + require.Equal(t, http.StatusOK, raw.Response.StatusCode) + require.Contains(t, string(raw.Body), "Hello world from test datasource!") }) t.Run("delete", func(t *testing.T) { @@ -222,8 +220,9 @@ func TestIntegrationTestDatasourceAccess(t *testing.T) { helper := apis.NewK8sTestHelper(t, testinfra.GrafanaOpts{ DisableAnonymous: true, EnableFeatureToggles: []string{ - featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // Required to start the datasource api servers - featuremgmt.FlagQueryServiceWithConnections, // enables CRUD endpoints + featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // Required to start the datasource api servers + featuremgmt.FlagQueryServiceWithConnections, // enables CRUD endpoints + featuremgmt.FlagDatasourcesApiServerEnableResourceEndpoint, // enables resource endpoint }, UnifiedStorageConfig: map[string]setting.UnifiedStorageConfig{ "datasources.grafana-testdata-datasource.datasource.grafana.app": { diff --git a/pkg/tests/apis/helper.go b/pkg/tests/apis/helper.go index b85fb8f1c4d..0f29899b8ff 100644 --- a/pkg/tests/apis/helper.go +++ b/pkg/tests/apis/helper.go @@ -466,6 +466,7 @@ type RequestParams struct { Body []byte ContentType string Accept string + Headers map[string]string } type K8sResponse[T any] struct { @@ -571,6 +572,9 @@ func DoRequest[T any](c *K8sTestHelper, params RequestParams, result *T) K8sResp if params.Accept != "" { req.Header.Set("Accept", params.Accept) } + for k, v := range params.Headers { + req.Header.Set(k, v) + } rsp, err := sharedHTTPClient.Do(req) require.NoError(c.t, err) diff --git a/pkg/tests/apis/openapi_test.go b/pkg/tests/apis/openapi_test.go index 9f1ac0b379d..82892ee069f 100644 --- a/pkg/tests/apis/openapi_test.go +++ b/pkg/tests/apis/openapi_test.go @@ -34,6 +34,7 @@ func TestIntegrationOpenAPIs(t *testing.T) { featuremgmt.FlagKubernetesAlertingRules, featuremgmt.FlagGrafanaAPIServerWithExperimentalAPIs, // library panels in v0 featuremgmt.FlagQueryServiceWithConnections, + featuremgmt.FlagDatasourcesApiServerEnableResourceEndpoint, featuremgmt.FlagKubernetesShortURLs, featuremgmt.FlagKubernetesCorrelations, featuremgmt.FlagKubernetesAlertingHistorian,