Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow show hidden metrics in kube-apiserver #84292

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions cmd/kube-apiserver/app/BUILD
Expand Up @@ -64,6 +64,7 @@ go_library(
"//staging/src/k8s.io/cloud-provider:go_default_library",
"//staging/src/k8s.io/component-base/cli/flag:go_default_library",
"//staging/src/k8s.io/component-base/cli/globalflag:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/prometheus/workqueue:go_default_library",
"//staging/src/k8s.io/component-base/version:go_default_library",
"//staging/src/k8s.io/component-base/version/verflag:go_default_library",
Expand Down
1 change: 1 addition & 0 deletions cmd/kube-apiserver/app/options/BUILD
Expand Up @@ -33,6 +33,7 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//staging/src/k8s.io/component-base/cli/flag:go_default_library",
"//staging/src/k8s.io/component-base/cli/globalflag:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/apiserver/scheme:go_default_library",
"//vendor/github.com/spf13/pflag:go_default_library",
"//vendor/k8s.io/utils/net:go_default_library",
Expand Down
11 changes: 11 additions & 0 deletions cmd/kube-apiserver/app/options/options.go
Expand Up @@ -78,6 +78,8 @@ type ServerRunOptions struct {
ServiceAccountSigningKeyFile string
ServiceAccountIssuer serviceaccount.TokenGenerator
ServiceAccountTokenMaxExpiration time.Duration

ShowHiddenMetricsForVersion string
}

// NewServerRunOptions creates a new ServerRunOptions object with default parameters
Expand Down Expand Up @@ -144,6 +146,15 @@ func (s *ServerRunOptions) Flags() (fss cliflag.NamedFlagSets) {
s.EgressSelector.AddFlags(fss.FlagSet("egress selector"))
s.Admission.AddFlags(fss.FlagSet("admission"))

// TODO(RainbowMango): move it to genericoptions before next flag comes.
mfs := fss.FlagSet("metrics")
mfs.StringVar(&s.ShowHiddenMetricsForVersion, "show-hidden-metrics-for-version", s.ShowHiddenMetricsForVersion,
"The previous version for which you want to show hidden metrics. "+
"Only the previous minor version is meaningful, other values will not be allowed. "+
"The format is <major>.<minor>, e.g.: '1.16'. "+
"The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, "+
"rather than being surprised when they are permanently removed in the release after that.")

// Note: the weird ""+ in below lines seems to be the only way to get gofmt to
// arrange these text blocks sensibly. Grrr.
fs := fss.FlagSet("misc")
Expand Down
2 changes: 2 additions & 0 deletions cmd/kube-apiserver/app/options/validation.go
Expand Up @@ -24,6 +24,7 @@ import (

apiextensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/component-base/metrics"
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
"k8s.io/kubernetes/pkg/api/legacyscheme"
"k8s.io/kubernetes/pkg/features"
Expand Down Expand Up @@ -143,6 +144,7 @@ func (s *ServerRunOptions) Validate() []error {
errs = append(errs, s.InsecureServing.Validate()...)
errs = append(errs, s.APIEnablement.Validate(legacyscheme.Scheme, apiextensionsapiserver.Scheme, aggregatorscheme.Scheme)...)
errs = append(errs, validateTokenRequest(s)...)
errs = append(errs, metrics.ValidateShowHiddenMetricsVersion(s.ShowHiddenMetricsForVersion)...)

return errs
}
5 changes: 5 additions & 0 deletions cmd/kube-apiserver/app/server.go
Expand Up @@ -58,6 +58,7 @@ import (
cloudprovider "k8s.io/cloud-provider"
cliflag "k8s.io/component-base/cli/flag"
"k8s.io/component-base/cli/globalflag"
"k8s.io/component-base/metrics"
_ "k8s.io/component-base/metrics/prometheus/workqueue" // for workqueue metric registration
"k8s.io/component-base/version"
"k8s.io/component-base/version/verflag"
Expand Down Expand Up @@ -299,6 +300,10 @@ func CreateKubeAPIServerConfig(
PerConnectionBandwidthLimitBytesPerSec: s.MaxConnectionBytesPerSec,
})

if len(s.ShowHiddenMetricsForVersion) > 0 {
metrics.SetShowHidden()
}

serviceIPRange, apiServerServiceIP, err := master.ServiceIPRange(s.PrimaryServiceClusterIPRange)
if err != nil {
return nil, nil, nil, nil, err
Expand Down
23 changes: 23 additions & 0 deletions staging/src/k8s.io/component-base/metrics/registry.go
Expand Up @@ -49,6 +49,29 @@ func shouldHide(currentVersion *semver.Version, deprecatedVersion *semver.Versio
return false
}

func validateShowHiddenMetricsVersion(currentVersion semver.Version, targetVersionStr string) error {
if targetVersionStr == "" {
return nil
}

validVersionStr := fmt.Sprintf("%d.%d", currentVersion.Major, currentVersion.Minor-1)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we're ever going to have a v2, but if we did, it would print 2.-1 which is not right :)

Feel free to fix in a follow-up if you want.

if targetVersionStr != validVersionStr {
return fmt.Errorf("--show-hidden-metrics-for-version must be omitted or have the value '%v'. Only the previous minor version is allowed", validVersionStr)
}

return nil
}

// ValidateShowHiddenMetricsVersion checks invalid version for which show hidden metrics.
func ValidateShowHiddenMetricsVersion(v string) []error {
err := validateShowHiddenMetricsVersion(parseVersion(version.Get()), v)
if err != nil {
return []error{err}
}

return nil
}

// SetShowHidden will enable showing hidden metrics. This will no-opt
// after the initial call
func SetShowHidden() {
Expand Down
53 changes: 53 additions & 0 deletions staging/src/k8s.io/component-base/metrics/registry_test.go
Expand Up @@ -264,3 +264,56 @@ func TestShowHiddenMetric(t *testing.T) {
assert.Nil(t, err, "Gather failed %v", err)

}

func TestValidateShowHiddenMetricsVersion(t *testing.T) {
currentVersion := parseVersion(apimachineryversion.Info{
Major: "1",
Minor: "17",
GitVersion: "v1.17.1-alpha-1.12345",
})

var tests = []struct {
desc string
targetVersion string
expectedError bool
}{
{
desc: "invalid version is not allowed",
targetVersion: "1.invalid",
expectedError: true,
},
{
desc: "patch version is not allowed",
targetVersion: "1.16.0",
expectedError: true,
},
{
desc: "old version is not allowed",
targetVersion: "1.15",
expectedError: true,
},
{
desc: "new version is not allowed",
targetVersion: "1.17",
expectedError: true,
},
{
desc: "valid version is allowed",
targetVersion: "1.16",
expectedError: false,
},
}

for _, test := range tests {
tc := test
t.Run(tc.desc, func(t *testing.T) {
err := validateShowHiddenMetricsVersion(currentVersion, tc.targetVersion)

if tc.expectedError {
assert.Errorf(t, err, "Failed to test: %s", tc.desc)
} else {
assert.NoErrorf(t, err, "Failed to test: %s", tc.desc)
}
})
}
}