diff --git a/cmd/options/options.go b/cmd/options/options.go index acc8327d7..6c6472c55 100644 --- a/cmd/options/options.go +++ b/cmd/options/options.go @@ -83,6 +83,9 @@ type NodeProblemDetectorOptions struct { // NodeName is the node name used to communicate with Kubernetes ApiServer. NodeName string + + // K8sExporterHeartbeatPeriod is the period at which the k8s exporter does forcibly sync with apiserver. + K8sExporterHeartbeatPeriod time.Duration } func NewNodeProblemDetectorOptions() *NodeProblemDetectorOptions { @@ -120,6 +123,8 @@ func (npdo *NodeProblemDetectorOptions) AddFlags(fs *pflag.FlagSet) { fs.StringVar(&npdo.PrometheusServerAddress, "prometheus-address", "127.0.0.1", "The address to bind the Prometheus scrape endpoint.") + fs.DurationVar(&npdo.K8sExporterHeartbeatPeriod, "k8s-exporter-heartbeat-period", 1*time.Minute, "The period at which k8s-exporter does forcibly sync with apiserver.") + for _, exporterName := range exporters.GetExporterNames() { exporterHandler := exporters.GetExporterHandlerOrDie(exporterName) exporterHandler.Options.SetFlags(fs) diff --git a/pkg/exporters/k8sexporter/condition/manager.go b/pkg/exporters/k8sexporter/condition/manager.go index 7ed0bc216..bf74f5424 100644 --- a/pkg/exporters/k8sexporter/condition/manager.go +++ b/pkg/exporters/k8sexporter/condition/manager.go @@ -36,8 +36,6 @@ const ( updatePeriod = 1 * time.Second // resyncPeriod is the period at which condition manager does resync, only updates when needed. resyncPeriod = 10 * time.Second - // heartbeatPeriod is the period at which condition manager does forcibly sync with apiserver. - heartbeatPeriod = 1 * time.Minute ) // ConditionManager synchronizes node conditions with the apiserver with problem client. @@ -75,15 +73,18 @@ type conditionManager struct { client problemclient.Client updates map[string]types.Condition conditions map[string]types.Condition + // heartbeatPeriod is the period at which condition manager does forcibly sync with apiserver. + heartbeatPeriod time.Duration } // NewConditionManager creates a condition manager. -func NewConditionManager(client problemclient.Client, clock clock.Clock) ConditionManager { +func NewConditionManager(client problemclient.Client, clock clock.Clock, heartbeatPeriod time.Duration) ConditionManager { return &conditionManager{ - client: client, - clock: clock, - updates: make(map[string]types.Condition), - conditions: make(map[string]types.Condition), + client: client, + clock: clock, + updates: make(map[string]types.Condition), + conditions: make(map[string]types.Condition), + heartbeatPeriod: heartbeatPeriod, } } @@ -145,7 +146,7 @@ func (c *conditionManager) needResync() bool { // needHeartbeat checks whether a forcible heartbeat is needed. func (c *conditionManager) needHeartbeat() bool { - return c.clock.Now().Sub(c.latestTry) >= heartbeatPeriod + return c.clock.Now().Sub(c.latestTry) >= c.heartbeatPeriod } // sync synchronizes node conditions with the apiserver. diff --git a/pkg/exporters/k8sexporter/condition/manager_test.go b/pkg/exporters/k8sexporter/condition/manager_test.go index f0066ed9e..effcb81bd 100644 --- a/pkg/exporters/k8sexporter/condition/manager_test.go +++ b/pkg/exporters/k8sexporter/condition/manager_test.go @@ -31,10 +31,12 @@ import ( "k8s.io/apimachinery/pkg/util/clock" ) +const heartbeatPeriod = 1 * time.Minute + func newTestManager() (*conditionManager, *problemclient.FakeProblemClient, *clock.FakeClock) { fakeClient := problemclient.NewFakeProblemClient() fakeClock := clock.NewFakeClock(time.Now()) - manager := NewConditionManager(fakeClient, fakeClock) + manager := NewConditionManager(fakeClient, fakeClock, heartbeatPeriod) return manager.(*conditionManager), fakeClient, fakeClock } diff --git a/pkg/exporters/k8sexporter/k8s_exporter.go b/pkg/exporters/k8sexporter/k8s_exporter.go index 47900ddcb..ba6ae3932 100644 --- a/pkg/exporters/k8sexporter/k8s_exporter.go +++ b/pkg/exporters/k8sexporter/k8s_exporter.go @@ -58,7 +58,7 @@ func NewExporterOrDie(npdo *options.NodeProblemDetectorOptions) types.Exporter { ke := k8sExporter{ client: c, - conditionManager: condition.NewConditionManager(c, clock.RealClock{}), + conditionManager: condition.NewConditionManager(c, clock.RealClock{}, npdo.K8sExporterHeartbeatPeriod), } ke.startHTTPReporting(npdo)