Skip to content

Commit

Permalink
operator: limit log output for selected objects
Browse files Browse the repository at this point in the history
From user perspestive it doesn't make much sense to print more than 250 objects into stdout.
Later this value could be configured.

Signed-off-by: f41gh7 <[email protected]>
  • Loading branch information
f41gh7 committed Jan 20, 2025
1 parent 7da9289 commit d16fd0c
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 43 deletions.
10 changes: 5 additions & 5 deletions internal/controller/operator/factory/alertmanager/statefulset.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import (
"strconv"
"strings"

"github.com/go-logr/logr"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -473,7 +472,7 @@ func CreateOrUpdateConfig(ctx context.Context, rclient client.Client, cr *vmv1be
case cr.Spec.ConfigRawYaml != "":
alertmananagerConfig = []byte(cr.Spec.ConfigRawYaml)
}
mergedCfg, err := buildAlertmanagerConfigWithCRDs(ctx, rclient, cr, alertmananagerConfig, l, tlsAssets)
mergedCfg, err := buildAlertmanagerConfigWithCRDs(ctx, rclient, cr, alertmananagerConfig, tlsAssets)
if err != nil {
return fmt.Errorf("cannot build alertmanager config with configSelector, err: %w", err)
}
Expand Down Expand Up @@ -665,16 +664,18 @@ func getSecretContentForAlertmanager(ctx context.Context, rclient client.Client,
return nil, fmt.Errorf("cannot find alertmanager config key: %q at secret: %q", alertmanagerSecretConfigKey, secretName)
}

func buildAlertmanagerConfigWithCRDs(ctx context.Context, rclient client.Client, cr *vmv1beta1.VMAlertmanager, originConfig []byte, l logr.Logger, tlsAssets map[string]string) (*parsedConfig, error) {
func buildAlertmanagerConfigWithCRDs(ctx context.Context, rclient client.Client, cr *vmv1beta1.VMAlertmanager, originConfig []byte, tlsAssets map[string]string) (*parsedConfig, error) {
var amCfgs []*vmv1beta1.VMAlertmanagerConfig
var badCfgs []*vmv1beta1.VMAlertmanagerConfig
var namespacedNames []string
if err := k8stools.VisitObjectsForSelectorsAtNs(ctx, rclient, cr.Spec.ConfigNamespaceSelector, cr.Spec.ConfigSelector, cr.Namespace, cr.Spec.SelectAllByDefault,
func(ams *vmv1beta1.VMAlertmanagerConfigList) {
for i := range ams.Items {
item := ams.Items[i]
if !item.DeletionTimestamp.IsZero() {
continue
}
namespacedNames = append(namespacedNames, fmt.Sprintf("%s/%s", item.Namespace, item.Name))
item.Status.ObservedGeneration = item.Generation
if item.Spec.ParsingError != "" {
item.Status.CurrentSyncError = item.Spec.ParsingError
Expand All @@ -697,8 +698,7 @@ func buildAlertmanagerConfigWithCRDs(ctx context.Context, rclient client.Client,
return nil, err
}
parsedCfg.brokenAMCfgs = append(parsedCfg.brokenAMCfgs, badCfgs...)
l.Info("selected alertmanager configs",
"len", len(amCfgs), "invalid configs", len(parsedCfg.brokenAMCfgs))
logger.SelectedObjects(ctx, "VMAlertmanagerConfigs", len(parsedCfg.amcfgs), len(parsedCfg.brokenAMCfgs), namespacedNames)
badConfigsTotal.Add(float64(len(badCfgs)))
return parsedCfg, nil
}
Expand Down
15 changes: 15 additions & 0 deletions internal/controller/operator/factory/logger/logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package logger

import (
"context"
"fmt"
"strings"

"github.com/go-logr/logr"
"github.com/prometheus/client_golang/prometheus"
Expand Down Expand Up @@ -80,3 +82,16 @@ func WithContext(ctx context.Context) logr.Logger {
func AddToContext(ctx context.Context, origin logr.Logger) context.Context {
return context.WithValue(ctx, contextKey, origin)
}

// SelectedObjects formats and prints into log message selected objects for config reconcile
func SelectedObjects(ctx context.Context, objectName string, selected, broken int, namespacedNames []string) {
if len(namespacedNames) == 0 {
return
}
formattedNames := "too large to display"
if len(namespacedNames) < 250 {
formattedNames = strings.Join(namespacedNames, ",")
}
WithContext(ctx).Info(fmt.Sprintf("selected %s count=%d, invalid rules count=%d, namespaced names %s",
objectName, len(namespacedNames), broken, formattedNames))
}
33 changes: 9 additions & 24 deletions internal/controller/operator/factory/vmagent/collect_scrapes.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"context"
"fmt"
"sort"
"strings"

vmv1beta1 "github.com/VictoriaMetrics/operator/api/operator/v1beta1"
"github.com/VictoriaMetrics/operator/internal/config"
Expand All @@ -31,9 +30,7 @@ func selectScrapeConfig(ctx context.Context, cr *vmv1beta1.VMAgent, rclient clie
return nil, err
}
sort.Sort(&namespacedNameSorter[*vmv1beta1.VMScrapeConfig]{target: scrapeConfigsCombined, sorter: namespacedNames})
if len(namespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected scrapeConfigs count=%d %s", len(namespacedNames), strings.Join(namespacedNames, ",")))
}
logger.SelectedObjects(ctx, "VMScrapeConfigs", len(namespacedNames), 0, namespacedNames)

return scrapeConfigsCombined, nil
}
Expand All @@ -57,9 +54,7 @@ func selectPodScrapes(ctx context.Context, cr *vmv1beta1.VMAgent, rclient client
}

sort.Sort(&namespacedNameSorter[*vmv1beta1.VMPodScrape]{target: podScrapesCombined, sorter: namespacedNames})
if len(namespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected PodScrapes count=%d %s", len(namespacedNames), strings.Join(namespacedNames, ",")))
}
logger.SelectedObjects(ctx, "VMPodScrapes", len(namespacedNames), 0, namespacedNames)

return podScrapesCombined, nil
}
Expand All @@ -82,10 +77,7 @@ func selectVMProbes(ctx context.Context, cr *vmv1beta1.VMAgent, rclient client.C
}

sort.Sort(&namespacedNameSorter[*vmv1beta1.VMProbe]{target: probesCombined, sorter: namespacedNames})
if len(namespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected VMProbes count=%d %s", len(namespacedNames), strings.Join(namespacedNames, ",")))
}

logger.SelectedObjects(ctx, "VMProbes", len(namespacedNames), 0, namespacedNames)
return probesCombined, nil
}

Expand Down Expand Up @@ -115,9 +107,7 @@ func selectVMNodeScrapes(ctx context.Context, cr *vmv1beta1.VMAgent, rclient cli
}

sort.Sort(&namespacedNameSorter[*vmv1beta1.VMNodeScrape]{target: nodesCombined, sorter: namespacedNames})
if len(namespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected VMNodeScrapes count=%d %s", len(namespacedNames), strings.Join(namespacedNames, ",")))
}
logger.SelectedObjects(ctx, "VMNodeScrapes", len(namespacedNames), 0, namespacedNames)

return nodesCombined, nil
}
Expand All @@ -139,16 +129,14 @@ func selectStaticScrapes(ctx context.Context, cr *vmv1beta1.VMAgent, rclient cli
return nil, err
}
sort.Sort(&namespacedNameSorter[*vmv1beta1.VMStaticScrape]{target: staticScrapesCombined, sorter: namespacedNames})
if len(namespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected StaticScrapes count=%d %s", len(namespacedNames), strings.Join(namespacedNames, ",")))
}
logger.SelectedObjects(ctx, "VMStaticScrape", len(namespacedNames), 0, namespacedNames)

return staticScrapesCombined, nil
}

func selectServiceScrapes(ctx context.Context, cr *vmv1beta1.VMAgent, rclient client.Client) ([]*vmv1beta1.VMServiceScrape, error) {
var servScrapesCombined []*vmv1beta1.VMServiceScrape
var serviceScrapeNamespacedNames []string
var namespacedNames []string
if err := k8stools.VisitObjectsForSelectorsAtNs(ctx, rclient, cr.Spec.ServiceScrapeNamespaceSelector, cr.Spec.ServiceScrapeSelector, cr.Namespace, cr.Spec.SelectAllByDefault,
func(list *vmv1beta1.VMServiceScrapeList) {
for i := range list.Items {
Expand All @@ -157,18 +145,15 @@ func selectServiceScrapes(ctx context.Context, cr *vmv1beta1.VMAgent, rclient cl
continue
}
rclient.Scheme().Default(item)
serviceScrapeNamespacedNames = append(serviceScrapeNamespacedNames, fmt.Sprintf("%s/%s", item.Namespace, item.Name))
namespacedNames = append(namespacedNames, fmt.Sprintf("%s/%s", item.Namespace, item.Name))
servScrapesCombined = append(servScrapesCombined, item)
}
}); err != nil {
return nil, err
}

sort.Sort(&namespacedNameSorter[*vmv1beta1.VMServiceScrape]{sorter: serviceScrapeNamespacedNames, target: servScrapesCombined})

if len(serviceScrapeNamespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected ServiceScrapes count=%d %s", len(serviceScrapeNamespacedNames), strings.Join(serviceScrapeNamespacedNames, ",")))
}
sort.Sort(&namespacedNameSorter[*vmv1beta1.VMServiceScrape]{sorter: namespacedNames, target: servScrapesCombined})
logger.SelectedObjects(ctx, "VMServiceScrape", len(namespacedNames), 0, namespacedNames)

return servScrapesCombined, nil
}
Expand Down
6 changes: 1 addition & 5 deletions internal/controller/operator/factory/vmalert/rules.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"hash/fnv"
"sort"
"strconv"
"strings"

vmv1beta1 "github.com/VictoriaMetrics/operator/api/operator/v1beta1"
"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/finalize"
Expand Down Expand Up @@ -232,10 +231,7 @@ func selectRulesContent(ctx context.Context, rclient client.Client, cr *vmv1beta
}
rules[fmt.Sprintf("%s-%s.yaml", pRule.Namespace, pRule.Name)] = content
}
if len(namespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected Rules count=%d, invalid rules count=%d, namespaced names %s",
len(namespacedNames), brokenRulesCnt, strings.Join(namespacedNames, ",")))
}
logger.SelectedObjects(ctx, "VMRules", len(namespacedNames), brokenRulesCnt, namespacedNames)
badConfigsTotal.Add(float64(brokenRulesCnt))
return rules, vmRules, nil
}
Expand Down
3 changes: 3 additions & 0 deletions internal/controller/operator/factory/vmauth/vmauth.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/build"
"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/finalize"
"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/k8stools"
"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/logger"
"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/reconcile"
)

Expand Down Expand Up @@ -358,6 +359,8 @@ func CreateOrUpdateVMAuthConfig(ctx context.Context, rclient client.Client, cr *
if err := reconcile.Secret(ctx, rclient, s, prevSecretMeta); err != nil {
return err
}
logger.SelectedObjects(ctx, "VMUsers", len(sus.namespacedNames), len(sus.brokenVMUsers), sus.namespacedNames)

parentObject := fmt.Sprintf("%s.%s.vmauth", cr.GetName(), cr.GetNamespace())
if childObject != nil {
// fast path
Expand Down
14 changes: 5 additions & 9 deletions internal/controller/operator/factory/vmauth/vmusers_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,10 @@ import (
// implementation should has as less implementation details of vmusers as possible
// potentially it could be re-used later for scrape objects/vmalert rules.
type skipableVMUsers struct {
stopIter bool
users []*vmv1beta1.VMUser
brokenVMUsers []*vmv1beta1.VMUser
stopIter bool
users []*vmv1beta1.VMUser
brokenVMUsers []*vmv1beta1.VMUser
namespacedNames []string
}

// visitAll visits all users objects
Expand Down Expand Up @@ -908,12 +909,7 @@ func selectVMUsers(ctx context.Context, rclient client.Client, cr *vmv1beta1.VMA
}); err != nil {
return nil, err
}

if len(namespacedNames) > 0 {
logger.WithContext(ctx).Info(fmt.Sprintf("selected VMUsers count=%d %s", len(namespacedNames), strings.Join(namespacedNames, ",")))
}

return &skipableVMUsers{users: res}, nil
return &skipableVMUsers{users: res, namespacedNames: namespacedNames}, nil
}

// note, username and password must be filled by operator
Expand Down

0 comments on commit d16fd0c

Please sign in to comment.