mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Add MFolderIDsServiceCount to count folderIDs in services pkg (#81237)
This commit is contained in:
parent
0d66ad68f8
commit
7e5544ab21
@ -116,6 +116,9 @@ var (
|
|||||||
|
|
||||||
// MFolderIDsAPICount is a metric counter for folder ids count in the api package
|
// MFolderIDsAPICount is a metric counter for folder ids count in the api package
|
||||||
MFolderIDsAPICount *prometheus.CounterVec
|
MFolderIDsAPICount *prometheus.CounterVec
|
||||||
|
|
||||||
|
// MFolderIDsServicesCount is a metric counter for folder ids count in the services package
|
||||||
|
MFolderIDsServiceCount *prometheus.CounterVec
|
||||||
)
|
)
|
||||||
|
|
||||||
// Timers
|
// Timers
|
||||||
@ -220,6 +223,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
// FolderID API
|
||||||
GetAlerts string = "GetAlerts"
|
GetAlerts string = "GetAlerts"
|
||||||
GetDashboard string = "GetDashboard"
|
GetDashboard string = "GetDashboard"
|
||||||
RestoreDashboardVersion string = "RestoreDashboardVersion"
|
RestoreDashboardVersion string = "RestoreDashboardVersion"
|
||||||
@ -231,12 +235,23 @@ const (
|
|||||||
GetFolderACL string = "getFolderACL"
|
GetFolderACL string = "getFolderACL"
|
||||||
Search string = "Search"
|
Search string = "Search"
|
||||||
GetDashboardACL string = "getDashboardACL"
|
GetDashboardACL string = "getDashboardACL"
|
||||||
|
// FolderID services
|
||||||
|
Folder string = "folder"
|
||||||
|
Dashboard string = "dashboards"
|
||||||
|
LibraryElements string = "libraryelements"
|
||||||
|
LibraryPanels string = "librarypanels"
|
||||||
|
NGAlerts string = "ngalert"
|
||||||
|
Provisioning string = "provisioning"
|
||||||
|
PublicDashboards string = "publicdashboards"
|
||||||
|
AccessControl string = "accesscontrol"
|
||||||
|
Guardian string = "guardian"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
httpStatusCodes := []string{"200", "404", "500", "unknown"}
|
httpStatusCodes := []string{"200", "404", "500", "unknown"}
|
||||||
objectiveMap := map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}
|
objectiveMap := map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}
|
||||||
apiFolderIDMethods := []string{GetAlerts, GetDashboard, RestoreDashboardVersion, GetFolderByID, GetFolderDescendantCounts, SearchFolders, GetFolderPermissionList, UpdateFolderPermissions, GetFolderACL, Search, GetDashboardACL}
|
apiFolderIDMethods := []string{GetAlerts, GetDashboard, RestoreDashboardVersion, GetFolderByID, GetFolderDescendantCounts, SearchFolders, GetFolderPermissionList, UpdateFolderPermissions, GetFolderACL, Search, GetDashboardACL}
|
||||||
|
serviceFolderIDMethods := []string{Folder, Dashboard, LibraryElements, LibraryPanels, NGAlerts, Provisioning, PublicDashboards, AccessControl, Guardian, Search}
|
||||||
|
|
||||||
MInstanceStart = prometheus.NewCounter(prometheus.CounterOpts{
|
MInstanceStart = prometheus.NewCounter(prometheus.CounterOpts{
|
||||||
Name: "instance_start_total",
|
Name: "instance_start_total",
|
||||||
@ -480,6 +495,12 @@ func init() {
|
|||||||
Namespace: ExporterName,
|
Namespace: ExporterName,
|
||||||
}, []string{"method"}, map[string][]string{"method": apiFolderIDMethods})
|
}, []string{"method"}, map[string][]string{"method": apiFolderIDMethods})
|
||||||
|
|
||||||
|
MFolderIDsServiceCount = metricutil.NewCounterVecStartingAtZero(prometheus.CounterOpts{
|
||||||
|
Name: "folder_id_service_count",
|
||||||
|
Help: "counter for folder id usage in service package",
|
||||||
|
Namespace: ExporterName,
|
||||||
|
}, []string{"method"}, map[string][]string{"method": serviceFolderIDMethods})
|
||||||
|
|
||||||
MStatTotalDashboards = prometheus.NewGauge(prometheus.GaugeOpts{
|
MStatTotalDashboards = prometheus.NewGauge(prometheus.GaugeOpts{
|
||||||
Name: "stat_totals_dashboard",
|
Name: "stat_totals_dashboard",
|
||||||
Help: "total amount of dashboards",
|
Help: "total amount of dashboards",
|
||||||
@ -772,5 +793,6 @@ func initMetricVars(reg prometheus.Registerer) {
|
|||||||
MPublicDashboardDatasourceQuerySuccess,
|
MPublicDashboardDatasourceQuerySuccess,
|
||||||
MStatTotalCorrelations,
|
MStatTotalCorrelations,
|
||||||
MFolderIDsAPICount,
|
MFolderIDsAPICount,
|
||||||
|
MFolderIDsServiceCount,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/api/routing"
|
"github.com/grafana/grafana/pkg/api/routing"
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol/resourcepermissions"
|
"github.com/grafana/grafana/pkg/services/accesscontrol/resourcepermissions"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
@ -151,6 +152,7 @@ func ProvideDashboardPermissions(
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.AccessControl).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if dashboard.FolderID > 0 {
|
if dashboard.FolderID > 0 {
|
||||||
query := &dashboards.GetDashboardQuery{ID: dashboard.FolderID, OrgID: orgID}
|
query := &dashboards.GetDashboardQuery{ID: dashboard.FolderID, OrgID: orgID}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/api/routing"
|
"github.com/grafana/grafana/pkg/api/routing"
|
||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboardimport"
|
"github.com/grafana/grafana/pkg/services/dashboardimport"
|
||||||
@ -83,6 +84,7 @@ func (s *ImportDashboardService) ImportDashboard(ctx context.Context, req *dashb
|
|||||||
generatedDash.Del("__inputs")
|
generatedDash.Del("__inputs")
|
||||||
generatedDash.Del("__requires")
|
generatedDash.Del("__requires")
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues("dashboardimport").Inc()
|
||||||
// here we need to get FolderId from FolderUID if it present in the request, if both exist, FolderUID would overwrite FolderID
|
// here we need to get FolderId from FolderUID if it present in the request, if both exist, FolderUID would overwrite FolderID
|
||||||
if req.FolderUid != "" {
|
if req.FolderUid != "" {
|
||||||
folder, err := s.folderService.Get(ctx, &folder.GetFolderQuery{
|
folder, err := s.folderService.Get(ctx, &folder.GetFolderQuery{
|
||||||
@ -137,6 +139,7 @@ func (s *ImportDashboardService) ImportDashboard(ctx context.Context, req *dashb
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues("dashboardimport").Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
err = s.libraryPanelService.ImportLibraryPanelsForDashboard(ctx, req.User, libraryElements, generatedDash.Get("panels").MustArray(), req.FolderId)
|
err = s.libraryPanelService.ImportLibraryPanelsForDashboard(ctx, req.User, libraryElements, generatedDash.Get("panels").MustArray(), req.FolderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -149,6 +152,7 @@ func (s *ImportDashboardService) ImportDashboard(ctx context.Context, req *dashb
|
|||||||
}
|
}
|
||||||
|
|
||||||
revision := savedDashboard.Data.Get("revision").MustInt64(0)
|
revision := savedDashboard.Data.Get("revision").MustInt64(0)
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues("dashboardimport").Inc()
|
||||||
return &dashboardimport.ImportDashboardResponse{
|
return &dashboardimport.ImportDashboardResponse{
|
||||||
UID: savedDashboard.UID,
|
UID: savedDashboard.UID,
|
||||||
PluginId: req.PluginId,
|
PluginId: req.PluginId,
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
)
|
)
|
||||||
@ -168,11 +169,13 @@ func NewDashboardUIDScopeResolver(folderDB folder.FolderStore, ds DashboardServi
|
|||||||
|
|
||||||
func resolveDashboardScope(ctx context.Context, folderDB folder.FolderStore, orgID int64, dashboard *Dashboard, folderSvc folder.Service) ([]string, error) {
|
func resolveDashboardScope(ctx context.Context, folderDB folder.FolderStore, orgID int64, dashboard *Dashboard, folderSvc folder.Service) ([]string, error) {
|
||||||
var folderUID string
|
var folderUID string
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if dashboard.FolderID < 0 {
|
if dashboard.FolderID < 0 {
|
||||||
return []string{ScopeDashboardsProvider.GetResourceScopeUID(dashboard.UID)}, nil
|
return []string{ScopeDashboardsProvider.GetResourceScopeUID(dashboard.UID)}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if dashboard.FolderID == 0 {
|
if dashboard.FolderID == 0 {
|
||||||
folderUID = ac.GeneralFolderUID
|
folderUID = ac.GeneralFolderUID
|
||||||
|
@ -367,6 +367,7 @@ func getExistingDashboardByTitleAndFolder(sess *db.Session, dash *dashboards.Das
|
|||||||
return isParentFolderChanged, dashboards.ErrDashboardFolderWithSameNameAsDashboard
|
return isParentFolderChanged, dashboards.ErrDashboardFolderWithSameNameAsDashboard
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if !dash.IsFolder && (dash.FolderID != existing.FolderID || dash.ID == 0) {
|
if !dash.IsFolder && (dash.FolderID != existing.FolderID || dash.ID == 0) {
|
||||||
isParentFolderChanged = true
|
isParentFolderChanged = true
|
||||||
@ -818,6 +819,7 @@ func (d *dashboardStore) deleteAlertDefinition(dashboardId int64, sess *db.Sessi
|
|||||||
func (d *dashboardStore) GetDashboard(ctx context.Context, query *dashboards.GetDashboardQuery) (*dashboards.Dashboard, error) {
|
func (d *dashboardStore) GetDashboard(ctx context.Context, query *dashboards.GetDashboardQuery) (*dashboards.Dashboard, error) {
|
||||||
var queryResult *dashboards.Dashboard
|
var queryResult *dashboards.Dashboard
|
||||||
err := d.store.WithDbSession(ctx, func(sess *db.Session) error {
|
err := d.store.WithDbSession(ctx, func(sess *db.Session) error {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if query.ID == 0 && len(query.UID) == 0 && (query.Title == nil || (query.FolderID == nil && query.FolderUID == "")) {
|
if query.ID == 0 && len(query.UID) == 0 && (query.Title == nil || (query.FolderID == nil && query.FolderUID == "")) {
|
||||||
return dashboards.ErrDashboardIdentifierNotSet
|
return dashboards.ErrDashboardIdentifierNotSet
|
||||||
@ -837,6 +839,7 @@ func (d *dashboardStore) GetDashboard(ctx context.Context, query *dashboards.Get
|
|||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
dashboard.FolderID = *query.FolderID
|
dashboard.FolderID = *query.FolderID
|
||||||
mustCols = append(mustCols, "folder_id")
|
mustCols = append(mustCols, "folder_id")
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
}
|
}
|
||||||
|
|
||||||
has, err := sess.MustCols(mustCols...).Get(&dashboard)
|
has, err := sess.MustCols(mustCols...).Get(&dashboard)
|
||||||
@ -940,7 +943,7 @@ func (d *dashboardStore) FindDashboards(ctx context.Context, query *dashboards.F
|
|||||||
if len(query.Type) > 0 {
|
if len(query.Type) > 0 {
|
||||||
filters = append(filters, searchstore.TypeFilter{Dialect: d.store.GetDialect(), Type: query.Type})
|
filters = append(filters, searchstore.TypeFilter{Dialect: d.store.GetDialect(), Type: query.Type})
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if len(query.FolderIds) > 0 {
|
if len(query.FolderIds) > 0 {
|
||||||
filters = append(filters, searchstore.FolderFilter{IDs: query.FolderIds})
|
filters = append(filters, searchstore.FolderFilter{IDs: query.FolderIds})
|
||||||
@ -1013,6 +1016,7 @@ func (d *dashboardStore) CountDashboardsInFolder(
|
|||||||
var count int64
|
var count int64
|
||||||
var err error
|
var err error
|
||||||
err = d.store.WithDbSession(ctx, func(sess *db.Session) error {
|
err = d.store.WithDbSession(ctx, func(sess *db.Session) error {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
session := sess.In("folder_id", req.FolderID).In("org_id", req.OrgID).
|
session := sess.In("folder_id", req.FolderID).In("org_id", req.OrgID).
|
||||||
In("is_folder", d.store.GetDialect().BooleanStr(false))
|
In("is_folder", d.store.GetDialect().BooleanStr(false))
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/infra/slugify"
|
"github.com/grafana/grafana/pkg/infra/slugify"
|
||||||
"github.com/grafana/grafana/pkg/models"
|
"github.com/grafana/grafana/pkg/models"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
@ -136,6 +137,7 @@ func (cmd *SaveDashboardCommand) GetDashboardModel() *Dashboard {
|
|||||||
dash.OrgID = cmd.OrgID
|
dash.OrgID = cmd.OrgID
|
||||||
dash.PluginID = cmd.PluginID
|
dash.PluginID = cmd.PluginID
|
||||||
dash.IsFolder = cmd.IsFolder
|
dash.IsFolder = cmd.IsFolder
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
dash.FolderID = cmd.FolderID
|
dash.FolderID = cmd.FolderID
|
||||||
dash.FolderUID = cmd.FolderUID
|
dash.FolderUID = cmd.FolderUID
|
||||||
@ -326,6 +328,7 @@ type CountDashboardsInFolderRequest struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func FromDashboard(dash *Dashboard) *folder.Folder {
|
func FromDashboard(dash *Dashboard) *folder.Folder {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
return &folder.Folder{
|
return &folder.Folder{
|
||||||
ID: dash.ID, // nolint:staticcheck
|
ID: dash.ID, // nolint:staticcheck
|
||||||
UID: dash.UID,
|
UID: dash.UID,
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/backend/gtime"
|
"github.com/grafana/grafana-plugin-sdk-go/backend/gtime"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/alerting"
|
"github.com/grafana/grafana/pkg/services/alerting"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
@ -114,6 +115,7 @@ func (dr *DashboardServiceImpl) BuildSaveDashboardCommand(ctx context.Context, d
|
|||||||
return nil, dashboards.ErrDashboardTitleEmpty
|
return nil, dashboards.ErrDashboardTitleEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if dash.IsFolder && dash.FolderID > 0 {
|
if dash.IsFolder && dash.FolderID > 0 {
|
||||||
return nil, dashboards.ErrDashboardFolderCannotHaveParent
|
return nil, dashboards.ErrDashboardFolderCannotHaveParent
|
||||||
@ -146,9 +148,11 @@ func (dr *DashboardServiceImpl) BuildSaveDashboardCommand(ctx context.Context, d
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
dash.FolderID = folder.ID
|
dash.FolderID = folder.ID
|
||||||
} else if dash.FolderID != 0 { // nolint:staticcheck
|
} else if dash.FolderID != 0 { // nolint:staticcheck
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
folder, err := dr.folderStore.GetFolderByID(ctx, dash.OrgID, dash.FolderID)
|
folder, err := dr.folderStore.GetFolderByID(ctx, dash.OrgID, dash.FolderID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -168,6 +172,7 @@ func (dr *DashboardServiceImpl) BuildSaveDashboardCommand(ctx context.Context, d
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if canSave, err := guardian.CanCreate(dash.FolderID, dash.IsFolder); err != nil || !canSave {
|
if canSave, err := guardian.CanCreate(dash.FolderID, dash.IsFolder); err != nil || !canSave {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -194,6 +199,7 @@ func (dr *DashboardServiceImpl) BuildSaveDashboardCommand(ctx context.Context, d
|
|||||||
}
|
}
|
||||||
|
|
||||||
if dash.ID == 0 {
|
if dash.ID == 0 {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if canCreate, err := guard.CanCreate(dash.FolderID, dash.IsFolder); err != nil || !canCreate {
|
if canCreate, err := guard.CanCreate(dash.FolderID, dash.IsFolder); err != nil || !canCreate {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -215,6 +221,7 @@ func (dr *DashboardServiceImpl) BuildSaveDashboardCommand(ctx context.Context, d
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
cmd := &dashboards.SaveDashboardCommand{
|
cmd := &dashboards.SaveDashboardCommand{
|
||||||
Dashboard: dash.Data,
|
Dashboard: dash.Data,
|
||||||
Message: dto.Message,
|
Message: dto.Message,
|
||||||
@ -260,6 +267,7 @@ func getGuardianForSavePermissionCheck(ctx context.Context, d *dashboards.Dashbo
|
|||||||
|
|
||||||
if newDashboard {
|
if newDashboard {
|
||||||
// if it's a new dashboard/folder check the parent folder permissions
|
// if it's a new dashboard/folder check the parent folder permissions
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
guard, err := guardian.New(ctx, d.FolderID, d.OrgID, user)
|
guard, err := guardian.New(ctx, d.FolderID, d.OrgID, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -473,6 +481,7 @@ func (dr *DashboardServiceImpl) GetDashboardsByPluginID(ctx context.Context, que
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (dr *DashboardServiceImpl) setDefaultPermissions(ctx context.Context, dto *dashboards.SaveDashboardDTO, dash *dashboards.Dashboard, provisioned bool) {
|
func (dr *DashboardServiceImpl) setDefaultPermissions(ctx context.Context, dto *dashboards.SaveDashboardDTO, dash *dashboards.Dashboard, provisioned bool) {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
inFolder := dash.FolderID > 0
|
inFolder := dash.FolderID > 0
|
||||||
var permissions []accesscontrol.SetResourcePermissionCommand
|
var permissions []accesscontrol.SetResourcePermissionCommand
|
||||||
@ -686,6 +695,7 @@ func makeQueryResult(query *dashboards.FindPersistedDashboardsQuery, res []dashb
|
|||||||
for _, item := range res {
|
for _, item := range res {
|
||||||
hit, exists := hits[item.ID]
|
hit, exists := hits[item.ID]
|
||||||
if !exists {
|
if !exists {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
hit = &model.Hit{
|
hit = &model.Hit{
|
||||||
ID: item.ID,
|
ID: item.ID,
|
||||||
UID: item.UID,
|
UID: item.UID,
|
||||||
@ -729,6 +739,7 @@ func (dr DashboardServiceImpl) CountInFolder(ctx context.Context, orgID int64, f
|
|||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Dashboard).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
return dr.dashboardStore.CountDashboardsInFolder(ctx, &dashboards.CountDashboardsInFolderRequest{FolderID: folder.ID, OrgID: orgID})
|
return dr.dashboardStore.CountDashboardsInFolder(ctx, &dashboards.CountDashboardsInFolderRequest{FolderID: folder.ID, OrgID: orgID})
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
)
|
)
|
||||||
@ -26,6 +27,7 @@ func (d *DashboardFolderStoreImpl) GetFolderByTitle(ctx context.Context, orgID i
|
|||||||
|
|
||||||
// there is a unique constraint on org_id, folder_uid, title
|
// there is a unique constraint on org_id, folder_uid, title
|
||||||
// there are no nested folders so the parent folder id is always 0
|
// there are no nested folders so the parent folder id is always 0
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
dashboard := dashboards.Dashboard{OrgID: orgID, FolderID: 0, Title: title}
|
dashboard := dashboards.Dashboard{OrgID: orgID, FolderID: 0, Title: title}
|
||||||
err := d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
err := d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||||
@ -50,6 +52,7 @@ func (d *DashboardFolderStoreImpl) GetFolderByTitle(ctx context.Context, orgID i
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *DashboardFolderStoreImpl) GetFolderByID(ctx context.Context, orgID int64, id int64) (*folder.Folder, error) {
|
func (d *DashboardFolderStoreImpl) GetFolderByID(ctx context.Context, orgID int64, id int64) (*folder.Folder, error) {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
dashboard := dashboards.Dashboard{OrgID: orgID, FolderID: 0, ID: id}
|
dashboard := dashboards.Dashboard{OrgID: orgID, FolderID: 0, ID: id}
|
||||||
err := d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
err := d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||||
@ -74,7 +77,7 @@ func (d *DashboardFolderStoreImpl) GetFolderByUID(ctx context.Context, orgID int
|
|||||||
if uid == "" {
|
if uid == "" {
|
||||||
return nil, dashboards.ErrDashboardIdentifierNotSet
|
return nil, dashboards.ErrDashboardIdentifierNotSet
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
dashboard := dashboards.Dashboard{OrgID: orgID, FolderID: 0, UID: uid}
|
dashboard := dashboards.Dashboard{OrgID: orgID, FolderID: 0, UID: uid}
|
||||||
err := d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
err := d.store.WithTransactionalDbSession(ctx, func(sess *db.Session) error {
|
||||||
|
@ -17,6 +17,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/events"
|
"github.com/grafana/grafana/pkg/events"
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
@ -171,6 +172,7 @@ func (s *Service) Get(ctx context.Context, q *folder.GetFolderQuery) (*folder.Fo
|
|||||||
}
|
}
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
case q.ID != nil:
|
case q.ID != nil:
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
dashFolder, err = s.getFolderByID(ctx, *q.ID, q.OrgID)
|
dashFolder, err = s.getFolderByID(ctx, *q.ID, q.OrgID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -206,7 +208,7 @@ func (s *Service) Get(ctx context.Context, q *folder.GetFolderQuery) (*folder.Fo
|
|||||||
if !s.features.IsEnabled(ctx, featuremgmt.FlagNestedFolders) {
|
if !s.features.IsEnabled(ctx, featuremgmt.FlagNestedFolders) {
|
||||||
return dashFolder, nil
|
return dashFolder, nil
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if q.ID != nil {
|
if q.ID != nil {
|
||||||
q.ID = nil
|
q.ID = nil
|
||||||
@ -219,6 +221,7 @@ func (s *Service) Get(ctx context.Context, q *folder.GetFolderQuery) (*folder.Fo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// always expose the dashboard store sequential ID
|
// always expose the dashboard store sequential ID
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
f.ID = dashFolder.ID
|
f.ID = dashFolder.ID
|
||||||
f.Version = dashFolder.Version
|
f.Version = dashFolder.Version
|
||||||
@ -287,6 +290,7 @@ func (s *Service) GetChildren(ctx context.Context, q *folder.GetChildrenQuery) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// always expose the dashboard store sequential ID
|
// always expose the dashboard store sequential ID
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
f.ID = dashFolder.ID
|
f.ID = dashFolder.ID
|
||||||
}
|
}
|
||||||
@ -336,6 +340,7 @@ func (s *Service) getRootFolders(ctx context.Context, q *folder.GetChildrenQuery
|
|||||||
s.log.Error("failed to fetch folder by UID from dashboard store", "orgID", f.OrgID, "uid", f.UID)
|
s.log.Error("failed to fetch folder by UID from dashboard store", "orgID", f.OrgID, "uid", f.UID)
|
||||||
}
|
}
|
||||||
// always expose the dashboard store sequential ID
|
// always expose the dashboard store sequential ID
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
f.ID = dashFolder.ID
|
f.ID = dashFolder.ID
|
||||||
|
|
||||||
@ -591,6 +596,7 @@ func (s *Service) Update(ctx context.Context, cmd *folder.UpdateFolderCommand) (
|
|||||||
if cmd.NewTitle != nil {
|
if cmd.NewTitle != nil {
|
||||||
namespace, id := cmd.SignedInUser.GetNamespacedID()
|
namespace, id := cmd.SignedInUser.GetNamespacedID()
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
if err := s.bus.Publish(context.Background(), &events.FolderTitleUpdated{
|
if err := s.bus.Publish(context.Background(), &events.FolderTitleUpdated{
|
||||||
Timestamp: foldr.Updated,
|
Timestamp: foldr.Updated,
|
||||||
Title: foldr.Title,
|
Title: foldr.Title,
|
||||||
@ -616,6 +622,7 @@ func (s *Service) Update(ctx context.Context, cmd *folder.UpdateFolderCommand) (
|
|||||||
}
|
}
|
||||||
|
|
||||||
// always expose the dashboard store sequential ID
|
// always expose the dashboard store sequential ID
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
foldr.ID = dashFolder.ID
|
foldr.ID = dashFolder.ID
|
||||||
foldr.Version = dashFolder.Version
|
foldr.Version = dashFolder.Version
|
||||||
@ -788,6 +795,7 @@ func (s *Service) deleteChildrenInFolder(ctx context.Context, orgID int64, folde
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) legacyDelete(ctx context.Context, cmd *folder.DeleteFolderCommand, dashFolder *folder.Folder) error {
|
func (s *Service) legacyDelete(ctx context.Context, cmd *folder.DeleteFolderCommand, dashFolder *folder.Folder) error {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
deleteCmd := dashboards.DeleteDashboardCommand{OrgID: cmd.OrgID, ID: dashFolder.ID, ForceDeleteFolderRules: cmd.ForceDeleteRules}
|
deleteCmd := dashboards.DeleteDashboardCommand{OrgID: cmd.OrgID, ID: dashFolder.ID, ForceDeleteFolderRules: cmd.ForceDeleteRules}
|
||||||
|
|
||||||
@ -1020,6 +1028,7 @@ func (s *Service) buildSaveDashboardCommand(ctx context.Context, dto *dashboards
|
|||||||
}
|
}
|
||||||
|
|
||||||
if dash.ID == 0 {
|
if dash.ID == 0 {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if canCreate, err := guard.CanCreate(dash.FolderID, dash.IsFolder); err != nil || !canCreate {
|
if canCreate, err := guard.CanCreate(dash.FolderID, dash.IsFolder); err != nil || !canCreate {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1047,6 +1056,7 @@ func (s *Service) buildSaveDashboardCommand(ctx context.Context, dto *dashboards
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
cmd := &dashboards.SaveDashboardCommand{
|
cmd := &dashboards.SaveDashboardCommand{
|
||||||
Dashboard: dash.Data,
|
Dashboard: dash.Data,
|
||||||
Message: dto.Message,
|
Message: dto.Message,
|
||||||
@ -1073,6 +1083,7 @@ func getGuardianForSavePermissionCheck(ctx context.Context, d *dashboards.Dashbo
|
|||||||
|
|
||||||
if newDashboard {
|
if newDashboard {
|
||||||
// if it's a new dashboard/folder check the parent folder permissions
|
// if it's a new dashboard/folder check the parent folder permissions
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
guard, err := guardian.New(ctx, d.FolderID, d.OrgID, user)
|
guard, err := guardian.New(ctx, d.FolderID, d.OrgID, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||||
@ -70,6 +71,7 @@ func (ss *sqlStore) Create(ctx context.Context, cmd folder.CreateFolderCommand)
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
foldr, err = ss.Get(ctx, folder.GetFolderQuery{
|
foldr, err = ss.Get(ctx, folder.GetFolderQuery{
|
||||||
ID: &lastInsertedID, // nolint:staticcheck
|
ID: &lastInsertedID, // nolint:staticcheck
|
||||||
})
|
})
|
||||||
@ -170,6 +172,7 @@ func (ss *sqlStore) Get(ctx context.Context, q folder.GetFolderQuery) (*folder.F
|
|||||||
exists, err = sess.SQL("SELECT * FROM folder WHERE uid = ? AND org_id = ?", q.UID, q.OrgID).Get(foldr)
|
exists, err = sess.SQL("SELECT * FROM folder WHERE uid = ? AND org_id = ?", q.UID, q.OrgID).Get(foldr)
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
case q.ID != nil:
|
case q.ID != nil:
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
exists, err = sess.SQL("SELECT * FROM folder WHERE id = ?", q.ID).Get(foldr)
|
exists, err = sess.SQL("SELECT * FROM folder WHERE id = ?", q.ID).Get(foldr)
|
||||||
case q.Title != nil:
|
case q.Title != nil:
|
||||||
s := strings.Builder{}
|
s := strings.Builder{}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/infra/slugify"
|
"github.com/grafana/grafana/pkg/infra/slugify"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
@ -62,6 +63,7 @@ var SharedWithMeFolder = Folder{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *Folder) IsGeneral() bool {
|
func (f *Folder) IsGeneral() bool {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Folder).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
return f.ID == GeneralFolder.ID && f.Title == GeneralFolder.Title
|
return f.ID == GeneralFolder.ID && f.Title == GeneralFolder.Title
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"slices"
|
"slices"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
@ -117,6 +118,7 @@ func MockDashboardGuardian(mock *FakeDashboardGuardian) {
|
|||||||
NewByFolder = func(_ context.Context, f *folder.Folder, orgId int64, user identity.Requester) (DashboardGuardian, error) {
|
NewByFolder = func(_ context.Context, f *folder.Folder, orgId int64, user identity.Requester) (DashboardGuardian, error) {
|
||||||
mock.OrgID = orgId
|
mock.OrgID = orgId
|
||||||
mock.DashUID = f.UID
|
mock.DashUID = f.UID
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Guardian).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
mock.DashID = f.ID
|
mock.DashID = f.ID
|
||||||
mock.User = user
|
mock.User = user
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/api/response"
|
"github.com/grafana/grafana/pkg/api/response"
|
||||||
"github.com/grafana/grafana/pkg/api/routing"
|
"github.com/grafana/grafana/pkg/api/routing"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
@ -62,6 +63,7 @@ func (l *LibraryElementService) createHandler(c *contextmodel.ReqContext) respon
|
|||||||
|
|
||||||
if cmd.FolderUID != nil {
|
if cmd.FolderUID != nil {
|
||||||
if *cmd.FolderUID == "" {
|
if *cmd.FolderUID == "" {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
cmd.FolderID = 0
|
cmd.FolderID = 0
|
||||||
generalFolderUID := ac.GeneralFolderUID
|
generalFolderUID := ac.GeneralFolderUID
|
||||||
@ -71,6 +73,7 @@ func (l *LibraryElementService) createHandler(c *contextmodel.ReqContext) respon
|
|||||||
if err != nil || folder == nil {
|
if err != nil || folder == nil {
|
||||||
return response.ErrOrFallback(http.StatusBadRequest, "failed to get folder", err)
|
return response.ErrOrFallback(http.StatusBadRequest, "failed to get folder", err)
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
cmd.FolderID = folder.ID
|
cmd.FolderID = folder.ID
|
||||||
}
|
}
|
||||||
@ -81,8 +84,10 @@ func (l *LibraryElementService) createHandler(c *contextmodel.ReqContext) respon
|
|||||||
return toLibraryElementError(err, "Failed to create library element")
|
return toLibraryElementError(err, "Failed to create library element")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if element.FolderID != 0 {
|
if element.FolderID != 0 {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
folder, err := l.folderService.Get(c.Req.Context(), &folder.GetFolderQuery{OrgID: c.SignedInUser.GetOrgID(), ID: &element.FolderID, SignedInUser: c.SignedInUser})
|
folder, err := l.folderService.Get(c.Req.Context(), &folder.GetFolderQuery{OrgID: c.SignedInUser.GetOrgID(), ID: &element.FolderID, SignedInUser: c.SignedInUser})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -210,6 +215,7 @@ func (l *LibraryElementService) patchHandler(c *contextmodel.ReqContext) respons
|
|||||||
|
|
||||||
if cmd.FolderUID != nil {
|
if cmd.FolderUID != nil {
|
||||||
if *cmd.FolderUID == "" {
|
if *cmd.FolderUID == "" {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
cmd.FolderID = 0
|
cmd.FolderID = 0
|
||||||
} else {
|
} else {
|
||||||
@ -217,6 +223,7 @@ func (l *LibraryElementService) patchHandler(c *contextmodel.ReqContext) respons
|
|||||||
if err != nil || folder == nil {
|
if err != nil || folder == nil {
|
||||||
return response.Error(http.StatusBadRequest, "failed to get folder", err)
|
return response.Error(http.StatusBadRequest, "failed to get folder", err)
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
cmd.FolderID = folder.ID
|
cmd.FolderID = folder.ID
|
||||||
}
|
}
|
||||||
@ -227,8 +234,10 @@ func (l *LibraryElementService) patchHandler(c *contextmodel.ReqContext) respons
|
|||||||
return toLibraryElementError(err, "Failed to update library element")
|
return toLibraryElementError(err, "Failed to update library element")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if element.FolderID != 0 {
|
if element.FolderID != 0 {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
folder, err := l.folderService.Get(c.Req.Context(), &folder.GetFolderQuery{OrgID: c.SignedInUser.GetOrgID(), ID: &element.FolderID, SignedInUser: c.SignedInUser})
|
folder, err := l.folderService.Get(c.Req.Context(), &folder.GetFolderQuery{OrgID: c.SignedInUser.GetOrgID(), ID: &element.FolderID, SignedInUser: c.SignedInUser})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/api/dtos"
|
"github.com/grafana/grafana/pkg/api/dtos"
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/kinds/librarypanel"
|
"github.com/grafana/grafana/pkg/kinds/librarypanel"
|
||||||
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
ac "github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
@ -146,6 +147,7 @@ func (l *LibraryElementService) createLibraryElement(c context.Context, signedIn
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
element := model.LibraryElement{
|
element := model.LibraryElement{
|
||||||
OrgID: signedInUser.GetOrgID(),
|
OrgID: signedInUser.GetOrgID(),
|
||||||
FolderID: cmd.FolderID, // nolint:staticcheck
|
FolderID: cmd.FolderID, // nolint:staticcheck
|
||||||
@ -176,6 +178,7 @@ func (l *LibraryElementService) createLibraryElement(c context.Context, signedIn
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if err := l.requireEditPermissionsOnFolder(c, signedInUser, cmd.FolderID); err != nil {
|
if err := l.requireEditPermissionsOnFolder(c, signedInUser, cmd.FolderID); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -190,6 +193,7 @@ func (l *LibraryElementService) createLibraryElement(c context.Context, signedIn
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
dto := model.LibraryElementDTO{
|
dto := model.LibraryElementDTO{
|
||||||
ID: element.ID,
|
ID: element.ID,
|
||||||
OrgID: element.OrgID,
|
OrgID: element.OrgID,
|
||||||
@ -229,6 +233,7 @@ func (l *LibraryElementService) deleteLibraryElement(c context.Context, signedIn
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if err := l.requireEditPermissionsOnFolder(c, signedInUser, element.FolderID); err != nil {
|
if err := l.requireEditPermissionsOnFolder(c, signedInUser, element.FolderID); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -280,6 +285,7 @@ func (l *LibraryElementService) getLibraryElements(c context.Context, store db.D
|
|||||||
builder.Write(", ? as folder_name ", cmd.FolderName)
|
builder.Write(", ? as folder_name ", cmd.FolderName)
|
||||||
builder.Write(", '' as folder_uid ")
|
builder.Write(", '' as folder_uid ")
|
||||||
builder.Write(getFromLibraryElementDTOWithMeta(store.GetDialect()))
|
builder.Write(getFromLibraryElementDTOWithMeta(store.GetDialect()))
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
writeParamSelectorSQL(&builder, append(params, Pair{"folder_id", cmd.FolderID})...)
|
writeParamSelectorSQL(&builder, append(params, Pair{"folder_id", cmd.FolderID})...)
|
||||||
builder.Write(" UNION ")
|
builder.Write(" UNION ")
|
||||||
@ -314,6 +320,7 @@ func (l *LibraryElementService) getLibraryElements(c context.Context, store db.D
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
leDtos[i] = model.LibraryElementDTO{
|
leDtos[i] = model.LibraryElementDTO{
|
||||||
ID: libraryElement.ID,
|
ID: libraryElement.ID,
|
||||||
OrgID: libraryElement.OrgID,
|
OrgID: libraryElement.OrgID,
|
||||||
@ -434,6 +441,7 @@ func (l *LibraryElementService) getAllLibraryElements(c context.Context, signedI
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
retDTOs := make([]model.LibraryElementDTO, 0)
|
retDTOs := make([]model.LibraryElementDTO, 0)
|
||||||
for _, element := range elements {
|
for _, element := range elements {
|
||||||
retDTOs = append(retDTOs, model.LibraryElementDTO{
|
retDTOs = append(retDTOs, model.LibraryElementDTO{
|
||||||
@ -526,6 +534,7 @@ func (l *LibraryElementService) handleFolderIDPatches(ctx context.Context, eleme
|
|||||||
if err := l.requireEditPermissionsOnFolder(ctx, user, fromFolderID); err != nil {
|
if err := l.requireEditPermissionsOnFolder(ctx, user, fromFolderID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
elementToPatch.FolderID = toFolderID
|
elementToPatch.FolderID = toFolderID
|
||||||
|
|
||||||
@ -573,6 +582,7 @@ func (l *LibraryElementService) patchLibraryElement(c context.Context, signedInU
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
var libraryElement = model.LibraryElement{
|
var libraryElement = model.LibraryElement{
|
||||||
ID: elementInDB.ID,
|
ID: elementInDB.ID,
|
||||||
OrgID: signedInUser.GetOrgID(),
|
OrgID: signedInUser.GetOrgID(),
|
||||||
@ -596,6 +606,7 @@ func (l *LibraryElementService) patchLibraryElement(c context.Context, signedInU
|
|||||||
if cmd.Model == nil {
|
if cmd.Model == nil {
|
||||||
libraryElement.Model = elementInDB.Model
|
libraryElement.Model = elementInDB.Model
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if err := l.handleFolderIDPatches(c, &libraryElement, elementInDB.FolderID, cmd.FolderID, signedInUser); err != nil {
|
if err := l.handleFolderIDPatches(c, &libraryElement, elementInDB.FolderID, cmd.FolderID, signedInUser); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -612,6 +623,7 @@ func (l *LibraryElementService) patchLibraryElement(c context.Context, signedInU
|
|||||||
return model.ErrLibraryElementNotFound
|
return model.ErrLibraryElementNotFound
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
dto = model.LibraryElementDTO{
|
dto = model.LibraryElementDTO{
|
||||||
ID: libraryElement.ID,
|
ID: libraryElement.ID,
|
||||||
OrgID: libraryElement.OrgID,
|
OrgID: libraryElement.OrgID,
|
||||||
@ -711,6 +723,7 @@ func (l *LibraryElementService) getElementsForDashboardID(c context.Context, das
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
for _, element := range libraryElements {
|
for _, element := range libraryElements {
|
||||||
libraryElementMap[element.UID] = model.LibraryElementDTO{
|
libraryElementMap[element.UID] = model.LibraryElementDTO{
|
||||||
ID: element.ID,
|
ID: element.ID,
|
||||||
@ -761,6 +774,7 @@ func (l *LibraryElementService) connectElementsToDashboardID(c context.Context,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
if err := l.requireViewPermissionsOnFolder(c, signedInUser, element.FolderID); err != nil {
|
if err := l.requireViewPermissionsOnFolder(c, signedInUser, element.FolderID); err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/libraryelements/model"
|
"github.com/grafana/grafana/pkg/services/libraryelements/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -84,6 +85,7 @@ func parseFolderFilter(query model.SearchLibraryElementsQuery) FolderFilter {
|
|||||||
hasFolderFilter := len(strings.TrimSpace(query.FolderFilter)) > 0
|
hasFolderFilter := len(strings.TrimSpace(query.FolderFilter)) > 0
|
||||||
hasFolderFilterUID := len(strings.TrimSpace(query.FolderFilterUIDs)) > 0
|
hasFolderFilterUID := len(strings.TrimSpace(query.FolderFilterUIDs)) > 0
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
result := FolderFilter{
|
result := FolderFilter{
|
||||||
includeGeneralFolder: true,
|
includeGeneralFolder: true,
|
||||||
folderIDs: folderIDs, // nolint:staticcheck
|
folderIDs: folderIDs, // nolint:staticcheck
|
||||||
@ -99,6 +101,7 @@ func parseFolderFilter(query model.SearchLibraryElementsQuery) FolderFilter {
|
|||||||
if hasFolderFilter {
|
if hasFolderFilter {
|
||||||
result.includeGeneralFolder = false
|
result.includeGeneralFolder = false
|
||||||
folderIDs = strings.Split(query.FolderFilter, ",")
|
folderIDs = strings.Split(query.FolderFilter, ",")
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
result.folderIDs = folderIDs
|
result.folderIDs = folderIDs
|
||||||
for _, filter := range folderIDs {
|
for _, filter := range folderIDs {
|
||||||
@ -132,6 +135,7 @@ func parseFolderFilter(query model.SearchLibraryElementsQuery) FolderFilter {
|
|||||||
func (f *FolderFilter) writeFolderFilterSQL(includeGeneral bool, builder *db.SQLBuilder) error {
|
func (f *FolderFilter) writeFolderFilterSQL(includeGeneral bool, builder *db.SQLBuilder) error {
|
||||||
var sql bytes.Buffer
|
var sql bytes.Buffer
|
||||||
params := make([]any, 0)
|
params := make([]any, 0)
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryElements).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
for _, filter := range f.folderIDs {
|
for _, filter := range f.folderIDs {
|
||||||
folderID, err := strconv.ParseInt(filter, 10, 64)
|
folderID, err := strconv.ParseInt(filter, 10, 64)
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
@ -163,6 +164,7 @@ func importLibraryPanelsRecursively(c context.Context, service libraryelements.S
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryPanels).Inc()
|
||||||
var cmd = model.CreateLibraryElementCommand{
|
var cmd = model.CreateLibraryElementCommand{
|
||||||
FolderID: folderID, // nolint:staticcheck
|
FolderID: folderID, // nolint:staticcheck
|
||||||
Name: name,
|
Name: name,
|
||||||
@ -193,6 +195,7 @@ func (lps LibraryPanelService) CountInFolder(ctx context.Context, orgID int64, f
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.LibraryPanels).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
q := sess.Table("library_element").Where("org_id = ?", u.GetOrgID()).
|
q := sess.Table("library_element").Where("org_id = ?", u.GetOrgID()).
|
||||||
Where("folder_id = ?", folder.ID).Where("kind = ?", int64(model.PanelElement))
|
Where("folder_id = ?", folder.ID).Where("kind = ?", int64(model.PanelElement))
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
@ -65,6 +66,7 @@ type migrationFolder struct {
|
|||||||
func (sync *sync) migratedFolder(ctx context.Context, l log.Logger, dashboardUID string, folderID int64) (*migrationFolder, error) {
|
func (sync *sync) migratedFolder(ctx context.Context, l log.Logger, dashboardUID string, folderID int64) (*migrationFolder, error) {
|
||||||
dashFolder, err := sync.getFolder(ctx, folderID)
|
dashFolder, err := sync.getFolder(ctx, folderID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.NGAlerts).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
l.Warn("Failed to find folder for dashboard", "missingFolderId", folderID, "error", err)
|
l.Warn("Failed to find folder for dashboard", "missingFolderId", folderID, "error", err)
|
||||||
}
|
}
|
||||||
@ -86,6 +88,7 @@ func (sync *sync) migratedFolder(ctx context.Context, l log.Logger, dashboardUID
|
|||||||
} else if folderID <= 0 && strings.HasPrefix(migratedFolder.Title, generalAlertingFolderTitle) {
|
} else if folderID <= 0 && strings.HasPrefix(migratedFolder.Title, generalAlertingFolderTitle) {
|
||||||
du.warning = "dashboard alerts moved to general alerting folder during upgrade: general folder not supported"
|
du.warning = "dashboard alerts moved to general alerting folder during upgrade: general folder not supported"
|
||||||
} else if migratedFolder.ID != folderID { // nolint:staticcheck
|
} else if migratedFolder.ID != folderID { // nolint:staticcheck
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.NGAlerts).Inc()
|
||||||
du.warning = "dashboard alerts moved to new folder during upgrade: folder permission changes were needed"
|
du.warning = "dashboard alerts moved to new folder during upgrade: folder permission changes were needed"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -110,10 +113,12 @@ func (sync *sync) getOrCreateMigratedFolder(ctx context.Context, l log.Logger, d
|
|||||||
|
|
||||||
// Check if the dashboard has custom permissions. If it does, we need to create a new folder for it.
|
// Check if the dashboard has custom permissions. If it does, we need to create a new folder for it.
|
||||||
// This folder will be cached for re-use for each dashboard in the folder with the same permissions.
|
// This folder will be cached for re-use for each dashboard in the folder with the same permissions.
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.NGAlerts).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
permissionsToFolder, ok := sync.permissionsMap[parentFolder.ID]
|
permissionsToFolder, ok := sync.permissionsMap[parentFolder.ID]
|
||||||
if !ok {
|
if !ok {
|
||||||
permissionsToFolder = make(map[permissionHash]*folder.Folder)
|
permissionsToFolder = make(map[permissionHash]*folder.Folder)
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.NGAlerts).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
sync.permissionsMap[parentFolder.ID] = permissionsToFolder
|
sync.permissionsMap[parentFolder.ID] = permissionsToFolder
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
legacymodels "github.com/grafana/grafana/pkg/services/alerting/models"
|
legacymodels "github.com/grafana/grafana/pkg/services/alerting/models"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
migmodels "github.com/grafana/grafana/pkg/services/ngalert/migration/models"
|
migmodels "github.com/grafana/grafana/pkg/services/ngalert/migration/models"
|
||||||
@ -53,6 +54,7 @@ func (om *OrgMigration) migrateDashboard(ctx context.Context, dashID int64, aler
|
|||||||
du := migmodels.NewDashboardUpgrade(dashID)
|
du := migmodels.NewDashboardUpgrade(dashID)
|
||||||
du.UID = dashboard.UID
|
du.UID = dashboard.UID
|
||||||
du.Title = dashboard.Title
|
du.Title = dashboard.Title
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.NGAlerts).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
du.FolderID = dashboard.FolderID
|
du.FolderID = dashboard.FolderID
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/auth/identity"
|
"github.com/grafana/grafana/pkg/services/auth/identity"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
"github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
@ -67,6 +68,7 @@ mainloop:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if existing == nil {
|
if existing == nil {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.NGAlerts).Inc()
|
||||||
folders = append(folders, &folder.Folder{
|
folders = append(folders, &folder.Folder{
|
||||||
ID: rand.Int63(), // nolint:staticcheck
|
ID: rand.Int63(), // nolint:staticcheck
|
||||||
UID: r.NamespaceUID,
|
UID: r.NamespaceUID,
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
alert_models "github.com/grafana/grafana/pkg/services/ngalert/models"
|
alert_models "github.com/grafana/grafana/pkg/services/ngalert/models"
|
||||||
@ -96,6 +97,7 @@ func (prov *defaultAlertRuleProvisioner) provisionRule(
|
|||||||
|
|
||||||
func (prov *defaultAlertRuleProvisioner) getOrCreateFolderUID(
|
func (prov *defaultAlertRuleProvisioner) getOrCreateFolderUID(
|
||||||
ctx context.Context, folderName string, orgID int64) (string, error) {
|
ctx context.Context, folderName string, orgID int64) (string, error) {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
cmd := &dashboards.GetDashboardQuery{
|
cmd := &dashboards.GetDashboardQuery{
|
||||||
Title: &folderName,
|
Title: &folderName,
|
||||||
FolderID: util.Pointer(int64(0)), // nolint:staticcheck
|
FolderID: util.Pointer(int64(0)), // nolint:staticcheck
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
|
|
||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/folder"
|
"github.com/grafana/grafana/pkg/services/folder"
|
||||||
@ -247,6 +248,7 @@ func (fr *FileReader) saveDashboard(ctx context.Context, path string, folderID i
|
|||||||
// keeps track of which UIDs and titles we have already provisioned
|
// keeps track of which UIDs and titles we have already provisioned
|
||||||
dash := jsonFile.dashboard
|
dash := jsonFile.dashboard
|
||||||
provisioningMetadata.uid = dash.Dashboard.UID
|
provisioningMetadata.uid = dash.Dashboard.UID
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
provisioningMetadata.identity = dashboardIdentity{title: dash.Dashboard.Title, folderID: dash.Dashboard.FolderID}
|
provisioningMetadata.identity = dashboardIdentity{title: dash.Dashboard.Title, folderID: dash.Dashboard.FolderID}
|
||||||
|
|
||||||
@ -268,6 +270,7 @@ func (fr *FileReader) saveDashboard(ctx context.Context, path string, folderID i
|
|||||||
}
|
}
|
||||||
|
|
||||||
if upToDate {
|
if upToDate {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
fr.log.Debug("provisioned dashboard is up to date", "provisioner", fr.Cfg.Name, "file", path, "folderId", dash.Dashboard.FolderID, "folderUid", dash.Dashboard.FolderUID)
|
fr.log.Debug("provisioned dashboard is up to date", "provisioner", fr.Cfg.Name, "file", path, "folderId", dash.Dashboard.FolderID, "folderUid", dash.Dashboard.FolderUID)
|
||||||
return provisioningMetadata, nil
|
return provisioningMetadata, nil
|
||||||
@ -283,6 +286,7 @@ func (fr *FileReader) saveDashboard(ctx context.Context, path string, folderID i
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !fr.isDatabaseAccessRestricted() {
|
if !fr.isDatabaseAccessRestricted() {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
fr.log.Debug("saving new dashboard", "provisioner", fr.Cfg.Name, "file", path, "folderId", dash.Dashboard.FolderID, "folderUid", dash.Dashboard.FolderUID)
|
fr.log.Debug("saving new dashboard", "provisioner", fr.Cfg.Name, "file", path, "folderId", dash.Dashboard.FolderID, "folderUid", dash.Dashboard.FolderUID)
|
||||||
dp := &dashboards.DashboardProvisioning{
|
dp := &dashboards.DashboardProvisioning{
|
||||||
@ -296,6 +300,7 @@ func (fr *FileReader) saveDashboard(ctx context.Context, path string, folderID i
|
|||||||
return provisioningMetadata, err
|
return provisioningMetadata, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
fr.log.Warn("Not saving new dashboard due to restricted database access", "provisioner", fr.Cfg.Name,
|
fr.log.Warn("Not saving new dashboard due to restricted database access", "provisioner", fr.Cfg.Name,
|
||||||
"file", path, "folderId", dash.Dashboard.FolderID)
|
"file", path, "folderId", dash.Dashboard.FolderID)
|
||||||
@ -324,6 +329,7 @@ func (fr *FileReader) getOrCreateFolder(ctx context.Context, cfg *config, servic
|
|||||||
return 0, "", ErrFolderNameMissing
|
return 0, "", ErrFolderNameMissing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
cmd := &dashboards.GetDashboardQuery{
|
cmd := &dashboards.GetDashboardQuery{
|
||||||
Title: &folderName,
|
Title: &folderName,
|
||||||
FolderID: util.Pointer(int64(0)), // nolint:staticcheck
|
FolderID: util.Pointer(int64(0)), // nolint:staticcheck
|
||||||
@ -352,6 +358,7 @@ func (fr *FileReader) getOrCreateFolder(ctx context.Context, cfg *config, servic
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, "", err
|
return 0, "", err
|
||||||
}
|
}
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
return f.ID, f.UID, nil
|
return f.ID, f.UID, nil
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/provisioning/values"
|
"github.com/grafana/grafana/pkg/services/provisioning/values"
|
||||||
)
|
)
|
||||||
@ -63,6 +64,7 @@ func createDashboardJSON(data *simplejson.Json, lastModified time.Time, cfg *con
|
|||||||
dash.Overwrite = true
|
dash.Overwrite = true
|
||||||
dash.OrgID = cfg.OrgID
|
dash.OrgID = cfg.OrgID
|
||||||
dash.Dashboard.OrgID = cfg.OrgID
|
dash.Dashboard.OrgID = cfg.OrgID
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
dash.Dashboard.FolderID = folderID
|
dash.Dashboard.FolderID = folderID
|
||||||
dash.Dashboard.FolderUID = folderUID
|
dash.Dashboard.FolderUID = folderUID
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
)
|
)
|
||||||
|
|
||||||
type duplicate struct {
|
type duplicate struct {
|
||||||
@ -102,6 +103,7 @@ func (c *duplicateValidator) logWarnings(duplicatesByOrg map[int64]duplicateEntr
|
|||||||
|
|
||||||
for id, usage := range duplicates.Titles {
|
for id, usage := range duplicates.Titles {
|
||||||
if usage.Sum > 1 {
|
if usage.Sum > 1 {
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Provisioning).Inc()
|
||||||
// nolint:staticcheck
|
// nolint:staticcheck
|
||||||
c.logger.Warn("dashboard title is not unique in folder", "orgId", orgID, "title", id.title, "folderID", id.folderID, "times",
|
c.logger.Warn("dashboard title is not unique in folder", "orgId", orgID, "title", id.title, "folderID", id.folderID, "times",
|
||||||
usage.Sum, "providers", keysToSlice(usage.InvolvedReaders))
|
usage.Sum, "providers", keysToSlice(usage.InvolvedReaders))
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
||||||
"github.com/grafana/grafana/pkg/api/dtos"
|
"github.com/grafana/grafana/pkg/api/dtos"
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
"github.com/grafana/grafana/pkg/services/accesscontrol"
|
||||||
"github.com/grafana/grafana/pkg/services/annotations"
|
"github.com/grafana/grafana/pkg/services/annotations"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
@ -74,6 +75,7 @@ func (pd *PublicDashboardServiceImpl) GetPublicDashboardForView(ctx context.Cont
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.PublicDashboards).Inc()
|
||||||
meta := dtos.DashboardMeta{
|
meta := dtos.DashboardMeta{
|
||||||
Slug: dash.Slug,
|
Slug: dash.Slug,
|
||||||
Type: dashboards.DashTypeDB,
|
Type: dashboards.DashTypeDB,
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/db"
|
"github.com/grafana/grafana/pkg/infra/db"
|
||||||
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||||
"github.com/grafana/grafana/pkg/services/dashboards/dashboardaccess"
|
"github.com/grafana/grafana/pkg/services/dashboards/dashboardaccess"
|
||||||
"github.com/grafana/grafana/pkg/services/search/model"
|
"github.com/grafana/grafana/pkg/services/search/model"
|
||||||
@ -79,6 +80,7 @@ func (s *SearchService) SearchHandler(ctx context.Context, query *Query) (model.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metrics.MFolderIDsServiceCount.WithLabelValues(metrics.Search).Inc()
|
||||||
dashboardQuery := dashboards.FindPersistedDashboardsQuery{
|
dashboardQuery := dashboards.FindPersistedDashboardsQuery{
|
||||||
Title: query.Title,
|
Title: query.Title,
|
||||||
SignedInUser: query.SignedInUser,
|
SignedInUser: query.SignedInUser,
|
||||||
|
Loading…
Reference in New Issue
Block a user