diff --git a/changelogs/unreleased/282-niladrih b/changelogs/unreleased/282-niladrih new file mode 100644 index 00000000..d727b795 --- /dev/null +++ b/changelogs/unreleased/282-niladrih @@ -0,0 +1 @@ +Add support for warning log de-duplication diff --git a/cmd/provisioner-localpv/app/start.go b/cmd/provisioner-localpv/app/start.go index 04a0427b..b9a251b7 100644 --- a/cmd/provisioner-localpv/app/start.go +++ b/cmd/provisioner-localpv/app/start.go @@ -12,8 +12,11 @@ import ( "github.com/openebs/maya/pkg/version" "github.com/pkg/errors" "github.com/spf13/cobra" + "k8s.io/client-go/rest" "k8s.io/klog/v2" pvController "sigs.k8s.io/sig-storage-lib-external-provisioner/v9/controller" + + "github.com/openebs/dynamic-localpv-provisioner/pkg/logger" ) var ( @@ -23,6 +26,7 @@ var ( // localpv provisioner LeaderElectionKey = "LEADER_ELECTION_ENABLED" usage = cmdName + dedupeWarnings bool ) // StartProvisioner will start a new dynamic Host Path PV provisioner @@ -39,6 +43,8 @@ func StartProvisioner() (*cobra.Command, error) { }, } + cmd.PersistentFlags().BoolVar(&dedupeWarnings, "dedupe-warnings", false, "De-duplicate warning messages") + return cmd, nil } @@ -46,6 +52,15 @@ func StartProvisioner() (*cobra.Command, error) { func Start(cmd *cobra.Command) error { klog.Infof("Starting Provisioner...") + // De-duplicate warning messages, to avoid flooding logs. + if dedupeWarnings { + rest.SetDefaultWarningHandler( + rest.NewWarningWriter(logger.KlogWarner{}, rest.WarningWriterOptions{ + Deduplicate: true, + Color: false, + }), + ) + } // Dynamic Provisioner can run successfully if it can establish // connection to the Kubernetes Cluster. mKube helps with // establishing the connection either via InCluster or diff --git a/cmd/provisioner-localpv/main.go b/cmd/provisioner-localpv/main.go index e817fe45..f4b681f0 100644 --- a/cmd/provisioner-localpv/main.go +++ b/cmd/provisioner-localpv/main.go @@ -67,6 +67,7 @@ func run() error { // Merge all flags from the Cobra Command to the global FlagSet // and Parse them + pflag.CommandLine.AddFlagSet(cmd.PersistentFlags()) pflag.CommandLine.AddFlagSet(cmd.Flags()) pflag.Parse() diff --git a/deploy/helm/charts/templates/deployment.yaml b/deploy/helm/charts/templates/deployment.yaml index c631cf0b..de53bda0 100644 --- a/deploy/helm/charts/templates/deployment.yaml +++ b/deploy/helm/charts/templates/deployment.yaml @@ -50,6 +50,16 @@ spec: - name: {{ template "localpv.fullname" . }} image: "{{ with .Values.localpv.image.registry | default .Values.global.imageRegistry | trimSuffix "/" }}{{ . }}/{{ end }}{{ .Values.localpv.image.repository }}:{{ .Values.localpv.image.tag }}" imagePullPolicy: {{ .Values.localpv.image.pullPolicy }} + {{- $args := list }} + {{- if .Values.localpv.logging.dedupeWarnings }} + {{- $args = append $args "--dedupe-warnings" }} + {{- end }} + {{- if gt (len $args) 0 }} + args: + {{- range $args }} + - {{ . | quote }} + {{- end }} + {{- end }} resources: {{ toYaml .Values.localpv.resources | indent 10 }} env: diff --git a/deploy/helm/charts/values.yaml b/deploy/helm/charts/values.yaml index 17ee6e8e..c513bb27 100644 --- a/deploy/helm/charts/values.yaml +++ b/deploy/helm/charts/values.yaml @@ -40,6 +40,9 @@ localpv: ## Labels to be added to localpv provisioner deployment pods podLabels: name: openebs-localpv-provisioner + logging: + # Disable duplicate warning messages + dedupeWarnings: false healthCheck: initialDelaySeconds: 30 periodSeconds: 60 diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go index 0a6dd8b8..0f86f2ee 100644 --- a/pkg/logger/logger.go +++ b/pkg/logger/logger.go @@ -35,6 +35,7 @@ var ( loggerKillSwitch = make(chan struct{}) ) +// KlogWriter writes to Klog's Info stream. type KlogWriter struct{} func (k KlogWriter) Write(data []byte) (n int, err error) { @@ -42,6 +43,14 @@ func (k KlogWriter) Write(data []byte) (n int, err error) { return len(data), nil } +// KlogWarner writes to Klog's Warning stream. +type KlogWarner struct{} + +func (w KlogWarner) Write(data []byte) (n int, err error) { + klog.Warning(string(data)) + return len(data), nil +} + // This needs to be set correctly to the default log flush duration // in case it is not equal to KLOG_FLUSH_INTERVAL. // This sets the default flush interval for logs