/
githubmirror
/
grafana
Обзор
Документация
Войти
/
githubmirror
/
grafana
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
pkg/services/libraryelements/libraryelements.go
105 строк
5 KB
maicon
Library Elements: Speed up folder-tree resolution for GET /api/library-elements on large instances (#127762)
28 июл 2026, 17:16
Не верифицирован
28 июл 2026, 17:16
d46296b
Код
Авторство
О чём код?
package libraryelements import ( "context" "encoding/json" "github.com/grafana/grafana/pkg/api/routing" "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/db" "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/services/accesscontrol" grafanaapiserver "github.com/grafana/grafana/pkg/services/apiserver" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/libraryelements/model" "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/setting" ) func ProvideService(cfg *setting.Cfg, sqlStore db.DB, routeRegister routing.RouteRegister, folderService folder.Service, features featuremgmt.FeatureToggles, ac accesscontrol.AccessControl, dashboardsService dashboards.DashboardService, clientConfigProvider grafanaapiserver.DirectRestConfigProvider, userService user.Service) *LibraryElementService { l := &LibraryElementService{ Cfg: cfg, SQLStore: sqlStore, RouteRegister: routeRegister, folderService: folderService, dashboardsService: dashboardsService, log: log.New("library-elements"), features: features, AccessControl: ac, k8sHandler: newLibraryElementsK8sHandler(cfg, clientConfigProvider, folderService, userService, dashboardsService), } //nolint:staticcheck // not yet migrated to OpenFeature l.treeCache = newFolderTreeCache(folderService, features != nil && features.IsEnabledGlobally(featuremgmt.FlagLibraryElementsFolderTreeViaSearch)) if routeRegister != nil { l.registerAPIEndpoints() } if folderService != nil { ac.RegisterScopeAttributeResolver(LibraryPanelUIDScopeResolver(l, l.folderService)) } return l } // Service is a service for operating on library elements. type Service interface { CreateElement(c context.Context, signedInUser identity.Requester, cmd model.CreateLibraryElementCommand) (model.LibraryElementDTO, error) PatchLibraryElement(c context.Context, signedInUser identity.Requester, cmd model.PatchLibraryElementCommand, uid string) (model.LibraryElementDTO, error) DeleteLibraryElement(c context.Context, signedInUser identity.Requester, uid string) (int64, error) GetElement(c context.Context, signedInUser identity.Requester, cmd model.GetLibraryElementCommand) (model.LibraryElementDTO, error) DeleteLibraryElementsInFolder(c context.Context, signedInUser identity.Requester, folderUID string) error GetAllElements(c context.Context, signedInUser identity.Requester, query model.SearchLibraryElementsQuery) (model.LibraryElementSearchResult, error) } // LibraryElementService is the service for the Library Element feature. type LibraryElementService struct { Cfg *setting.Cfg SQLStore db.DB RouteRegister routing.RouteRegister folderService folder.Service dashboardsService dashboards.DashboardService log log.Logger features featuremgmt.FeatureToggles AccessControl accesscontrol.AccessControl k8sHandler *libraryElementsK8sHandler treeCache *folderTreeCache } var _ Service = (*LibraryElementService)(nil) // GetElement gets an element from a UID. func (l *LibraryElementService) GetElement(c context.Context, signedInUser identity.Requester, cmd model.GetLibraryElementCommand) (model.LibraryElementDTO, error) { return l.getLibraryElementByUid(c, signedInUser, cmd, nil) } // DeleteLibraryElementsInFolder deletes all elements for a specific folder. func (l *LibraryElementService) DeleteLibraryElementsInFolder(c context.Context, signedInUser identity.Requester, folderUID string) error { return l.deleteLibraryElementsInFolderUID(c, signedInUser, folderUID) } // GetAll gets all library elements with support to query filters. func (l *LibraryElementService) GetAllElements(c context.Context, signedInUser identity.Requester, query model.SearchLibraryElementsQuery) (model.LibraryElementSearchResult, error) { return l.getAllLibraryElements(c, signedInUser, query) } func (l *LibraryElementService) addUidToLibraryPanel(model []byte, newUid string) (json.RawMessage, error) { var modelMap map[string]any err := json.Unmarshal(model, &modelMap) if err != nil { return nil, err } if libraryPanel, ok := modelMap["libraryPanel"].(map[string]any); ok { if uid, ok := libraryPanel["uid"]; ok && uid == "" { libraryPanel["uid"] = newUid } } updatedModel, err := json.Marshal(modelMap) if err != nil { return nil, err } return updatedModel, nil }