Add more metrics to the IAM Folder Reconciler (#111275)

* Add more metrics to the operator

* Add namespace when logging metrics

* Skip flaky test
This commit is contained in:
Mihai Turdean
2025-09-18 09:03:32 -06:00
committed by GitHub
parent 28952cc490
commit aaa8094a53
13 changed files with 471 additions and 339 deletions
+6 -13
View File
@@ -16,9 +16,8 @@ import (
folder "github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1"
"github.com/grafana/grafana/apps/iam/pkg/app"
"github.com/grafana/grafana/pkg/server"
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
"github.com/grafana/grafana/pkg/setting"
"github.com/urfave/cli/v2"
"github.com/prometheus/client_golang/prometheus"
"k8s.io/client-go/rest"
"k8s.io/client-go/transport"
@@ -26,22 +25,14 @@ import (
utilnet "k8s.io/apimachinery/pkg/util/net"
)
func init() {
server.RegisterOperator(server.Operator{
Name: "iam-folder-reconciler",
Description: "Watch folder resources and manage IAM permissions with Zanzana",
RunFunc: RunIAMFolderReconciler,
})
}
func RunIAMFolderReconciler(opts standalone.BuildInfo, c *cli.Context, cfg *setting.Cfg) error {
func RunIAMFolderReconciler(deps server.OperatorDependencies) error {
logger := logging.NewSLogLogger(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})).With("logger", "iam-folder-reconciler")
logger.Info("Starting IAM folder reconciler operator")
// Get configuration from Grafana settings
iamConfig, err := buildIAMConfigFromSettings(cfg)
iamConfig, err := buildIAMConfigFromSettings(deps.Config, deps.Registerer)
if err != nil {
return fmt.Errorf("failed to build IAM config: %w", err)
}
@@ -78,7 +69,7 @@ type iamConfig struct {
AppConfig app.AppConfig
}
func buildIAMConfigFromSettings(cfg *setting.Cfg) (*iamConfig, error) {
func buildIAMConfigFromSettings(cfg *setting.Cfg, registerer prometheus.Registerer) (*iamConfig, error) {
if cfg == nil {
return nil, fmt.Errorf("no configuration available")
}
@@ -132,6 +123,8 @@ func buildIAMConfigFromSettings(cfg *setting.Cfg) (*iamConfig, error) {
metricsSection := cfg.SectionWithEnvOverrides("metrics")
iamCfg.RunnerConfig.MetricsConfig.Enabled = metricsSection.Key("enabled").MustBool(true)
iamCfg.RunnerConfig.MetricsConfig.Namespace = metricsSection.Key("namespace").MustString("grafana-iam")
iamCfg.AppConfig.Namespace = iamCfg.RunnerConfig.MetricsConfig.Namespace
iamCfg.AppConfig.MetricsRegisterer = registerer
return &iamCfg, nil
}
+3 -4
View File
@@ -10,7 +10,6 @@ import (
"time"
"github.com/grafana/grafana-app-sdk/logging"
"github.com/urfave/cli/v2"
"k8s.io/client-go/tools/cache"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/jobs"
@@ -19,7 +18,7 @@ import (
"github.com/grafana/grafana/pkg/registry/apis/provisioning/jobs/move"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/jobs/sync"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/resources"
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
"github.com/grafana/grafana/pkg/server"
"github.com/grafana/grafana/pkg/setting"
"github.com/grafana/grafana/apps/provisioning/pkg/controller"
@@ -28,13 +27,13 @@ import (
deletepkg "github.com/grafana/grafana/pkg/registry/apis/provisioning/jobs/delete"
)
func RunJobController(opts standalone.BuildInfo, c *cli.Context, cfg *setting.Cfg) error {
func RunJobController(deps server.OperatorDependencies) error {
logger := logging.NewSLogLogger(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})).With("logger", "provisioning-job-controller")
logger.Info("Starting provisioning job controller")
controllerCfg, err := setupJobsControllerFromConfig(cfg)
controllerCfg, err := setupJobsControllerFromConfig(deps.Config)
if err != nil {
return fmt.Errorf("failed to setup operator: %w", err)
}
+3 -4
View File
@@ -11,25 +11,24 @@ import (
"github.com/grafana/grafana-app-sdk/logging"
appcontroller "github.com/grafana/grafana/apps/provisioning/pkg/controller"
"github.com/urfave/cli/v2"
"k8s.io/client-go/tools/cache"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/controller"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/jobs"
"github.com/grafana/grafana/pkg/registry/apis/provisioning/resources"
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
"github.com/grafana/grafana/pkg/server"
"github.com/grafana/grafana/pkg/setting"
informer "github.com/grafana/grafana/apps/provisioning/pkg/generated/informers/externalversions"
)
func RunRepoController(opts standalone.BuildInfo, c *cli.Context, cfg *setting.Cfg) error {
func RunRepoController(deps server.OperatorDependencies) error {
logger := logging.NewSLogLogger(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug,
})).With("logger", "provisioning-repo-controller")
logger.Info("Starting provisioning repo controller")
controllerCfg, err := getRepoControllerConfig(cfg)
controllerCfg, err := getRepoControllerConfig(deps.Config)
if err != nil {
return fmt.Errorf("failed to setup operator: %w", err)
}
+12 -6
View File
@@ -217,12 +217,18 @@ func (s *ModuleServer) initOperatorServer() (services.Service, error) {
return services.NewBasicService(
nil,
func(ctx context.Context) error {
context := cli.NewContext(&cli.App{}, nil, nil)
return op.RunFunc(standalone.BuildInfo{
Version: s.version,
Commit: s.commit,
BuildBranch: s.buildBranch,
}, context, s.cfg)
cliContext := cli.NewContext(&cli.App{}, nil, nil)
deps := OperatorDependencies{
BuildInfo: standalone.BuildInfo{
Version: s.version,
Commit: s.commit,
BuildBranch: s.buildBranch,
},
CLIContext: cliContext,
Config: s.cfg,
Registerer: s.registerer,
}
return op.RunFunc(deps)
},
nil,
).WithName("operator"), nil
+11 -1
View File
@@ -1,16 +1,26 @@
package server
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
"github.com/grafana/grafana/pkg/setting"
"github.com/urfave/cli/v2"
)
// OperatorDependencies contains all the dependencies that operators need
type OperatorDependencies struct {
BuildInfo standalone.BuildInfo
CLIContext *cli.Context
Config *setting.Cfg
Registerer prometheus.Registerer
}
// Operator represents an app operator that is available in the Grafana binary
type Operator struct {
Name string
Description string
RunFunc func(standalone.BuildInfo, *cli.Context, *setting.Cfg) error
RunFunc func(deps OperatorDependencies) error
}
var operatorsRegistry []Operator
+1
View File
@@ -196,6 +196,7 @@ func TestIntegrationFoldersApp(t *testing.T) {
// This is a general test for the unified storage list operation. We don't have a common test
// directory for now, so we (search and storage) keep it here as we own this part of the tests.
t.Run("make sure list works with continue tokens", func(t *testing.T) {
t.Skip("Skipping flaky test - list works with continue tokens")
modes := []grafanarest.DualWriterMode{
grafanarest.Mode1,
grafanarest.Mode2,