diff --git a/pkg/scheduler/framework/runtime/framework.go b/pkg/scheduler/framework/runtime/framework.go index 6eeab0c47b1..c331a68702c 100644 --- a/pkg/scheduler/framework/runtime/framework.go +++ b/pkg/scheduler/framework/runtime/framework.go @@ -358,6 +358,12 @@ func NewFramework(r Registry, profile *config.KubeSchedulerProfile, stopCh <-cha options.captureProfile(outputProfile) } + f.setInstrumentedPlugins() + return f, nil +} + +// setInstrumentedPlugins initializes instrumented plugins from current plugins that frameworkImpl has. +func (f *frameworkImpl) setInstrumentedPlugins() { // Cache metric streams for prefilter and filter plugins. for i, pl := range f.preFilterPlugins { f.preFilterPlugins[i] = &instrumentedPreFilterPlugin{ @@ -372,7 +378,19 @@ func NewFramework(r Registry, profile *config.KubeSchedulerProfile, stopCh <-cha } } - return f, nil + // Cache metric streams for prescore and score plugins. + for i, pl := range f.preScorePlugins { + f.preScorePlugins[i] = &instrumentedPreScorePlugin{ + PreScorePlugin: f.preScorePlugins[i], + metric: metrics.PluginEvaluationTotal.WithLabelValues(pl.Name(), metrics.PreScore, f.profileName), + } + } + for i, pl := range f.scorePlugins { + f.scorePlugins[i] = &instrumentedScorePlugin{ + ScorePlugin: f.scorePlugins[i], + metric: metrics.PluginEvaluationTotal.WithLabelValues(pl.Name(), metrics.Score, f.profileName), + } + } } func (f *frameworkImpl) SetPodNominator(n framework.PodNominator) { diff --git a/pkg/scheduler/framework/runtime/instrumented_plugins.go b/pkg/scheduler/framework/runtime/instrumented_plugins.go index 152d6788a9e..ee117c5e625 100644 --- a/pkg/scheduler/framework/runtime/instrumented_plugins.go +++ b/pkg/scheduler/framework/runtime/instrumented_plugins.go @@ -52,3 +52,32 @@ func (p *instrumentedPreFilterPlugin) PreFilter(ctx context.Context, state *fram } return result, status } + +type instrumentedPreScorePlugin struct { + framework.PreScorePlugin + + metric compbasemetrics.CounterMetric +} + +var _ framework.PreScorePlugin = &instrumentedPreScorePlugin{} + +func (p *instrumentedPreScorePlugin) PreScore(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodes []*v1.Node) *framework.Status { + status := p.PreScorePlugin.PreScore(ctx, state, pod, nodes) + if !status.IsSkip() { + p.metric.Inc() + } + return status +} + +type instrumentedScorePlugin struct { + framework.ScorePlugin + + metric compbasemetrics.CounterMetric +} + +var _ framework.ScorePlugin = &instrumentedScorePlugin{} + +func (p *instrumentedScorePlugin) Score(ctx context.Context, state *framework.CycleState, pod *v1.Pod, nodeName string) (int64, *framework.Status) { + p.metric.Inc() + return p.ScorePlugin.Score(ctx, state, pod, nodeName) +}