Merge pull request #81531 from logicalhan/kas-migration

migrate kube-apiserver metrics to stability framework
This commit is contained in:
Kubernetes Prow Robot 2019-08-28 01:37:33 -07:00 committed by GitHub
commit f24aa47cea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 423 additions and 262 deletions

View File

@ -20,9 +20,8 @@ go_library(
importpath = "k8s.io/kubernetes/cmd/kube-apiserver", importpath = "k8s.io/kubernetes/cmd/kube-apiserver",
deps = [ deps = [
"//cmd/kube-apiserver/app:go_default_library", "//cmd/kube-apiserver/app:go_default_library",
"//pkg/util/prometheusclientgo:go_default_library",
"//pkg/version/prometheus:go_default_library",
"//staging/src/k8s.io/component-base/logs:go_default_library", "//staging/src/k8s.io/component-base/logs:go_default_library",
"//staging/src/k8s.io/component-base/metrics/prometheus/clientgo:go_default_library",
], ],
) )

View File

@ -24,9 +24,8 @@ import (
"time" "time"
"k8s.io/component-base/logs" "k8s.io/component-base/logs"
_ "k8s.io/component-base/metrics/prometheus/clientgo" // load all the prometheus client-go plugins
"k8s.io/kubernetes/cmd/kube-apiserver/app" "k8s.io/kubernetes/cmd/kube-apiserver/app"
_ "k8s.io/kubernetes/pkg/util/prometheusclientgo" // load all the prometheus client-go plugins
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
) )
func main() { func main() {

View File

@ -30,8 +30,6 @@ go_library(
"//pkg/registry/rbac/rest:go_default_library", "//pkg/registry/rbac/rest:go_default_library",
"//pkg/serviceaccount:go_default_library", "//pkg/serviceaccount:go_default_library",
"//pkg/util/flag:go_default_library", "//pkg/util/flag:go_default_library",
"//pkg/util/workqueue/prometheus:go_default_library",
"//pkg/version:go_default_library",
"//pkg/version/verflag:go_default_library", "//pkg/version/verflag:go_default_library",
"//plugin/pkg/auth/authenticator/token/bootstrap:go_default_library", "//plugin/pkg/auth/authenticator/token/bootstrap:go_default_library",
"//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library", "//staging/src/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library",
@ -67,6 +65,8 @@ go_library(
"//staging/src/k8s.io/cloud-provider:go_default_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/flag:go_default_library",
"//staging/src/k8s.io/component-base/cli/globalflag:go_default_library", "//staging/src/k8s.io/component-base/cli/globalflag: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/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1beta1:go_default_library",

View File

@ -58,6 +58,8 @@ import (
cloudprovider "k8s.io/cloud-provider" cloudprovider "k8s.io/cloud-provider"
cliflag "k8s.io/component-base/cli/flag" cliflag "k8s.io/component-base/cli/flag"
"k8s.io/component-base/cli/globalflag" "k8s.io/component-base/cli/globalflag"
_ "k8s.io/component-base/metrics/prometheus/workqueue" // for workqueue metric registration
"k8s.io/component-base/version"
"k8s.io/klog" "k8s.io/klog"
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver" aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme" aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
@ -80,8 +82,6 @@ import (
rbacrest "k8s.io/kubernetes/pkg/registry/rbac/rest" rbacrest "k8s.io/kubernetes/pkg/registry/rbac/rest"
"k8s.io/kubernetes/pkg/serviceaccount" "k8s.io/kubernetes/pkg/serviceaccount"
utilflag "k8s.io/kubernetes/pkg/util/flag" utilflag "k8s.io/kubernetes/pkg/util/flag"
_ "k8s.io/kubernetes/pkg/util/workqueue/prometheus" // for workqueue metric registration
"k8s.io/kubernetes/pkg/version"
"k8s.io/kubernetes/pkg/version/verflag" "k8s.io/kubernetes/pkg/version/verflag"
"k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap" "k8s.io/kubernetes/plugin/pkg/auth/authenticator/token/bootstrap"
) )

View File

@ -25,7 +25,8 @@ go_library(
"//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/golang.org/x/crypto/ssh:go_default_library", "//vendor/golang.org/x/crypto/ssh:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
], ],

View File

@ -36,33 +36,44 @@ import (
"sync" "sync"
"time" "time"
"github.com/prometheus/client_golang/prometheus"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
utilnet "k8s.io/apimachinery/pkg/util/net" utilnet "k8s.io/apimachinery/pkg/util/net"
"k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/util/wait"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
"k8s.io/klog" "k8s.io/klog"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
tunnelOpenCounter = prometheus.NewCounter( tunnelOpenCounter = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Name: "ssh_tunnel_open_count", Name: "ssh_tunnel_open_count",
Help: "Counter of ssh tunnel total open attempts", Help: "Counter of ssh tunnel total open attempts",
StabilityLevel: metrics.ALPHA,
}, },
) )
tunnelOpenFailCounter = prometheus.NewCounter( tunnelOpenFailCounter = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Name: "ssh_tunnel_open_fail_count", Name: "ssh_tunnel_open_fail_count",
Help: "Counter of ssh tunnel failed open attempts", Help: "Counter of ssh tunnel failed open attempts",
StabilityLevel: metrics.ALPHA,
}, },
) )
) )
func init() { func init() {
prometheus.MustRegister(tunnelOpenCounter) legacyregistry.MustRegister(tunnelOpenCounter)
prometheus.MustRegister(tunnelOpenFailCounter) legacyregistry.MustRegister(tunnelOpenFailCounter)
} }
// TODO: Unit tests for this code, we can spin up a test SSH server with instructions here: // TODO: Unit tests for this code, we can spin up a test SSH server with instructions here:

View File

@ -233,6 +233,8 @@
- k8s.io/utils - k8s.io/utils
- k8s.io/apiserver/pkg/util/feature - k8s.io/apiserver/pkg/util/feature
- k8s.io/component-base/featuregate - k8s.io/component-base/featuregate
- k8s.io/component-base/metrics
- k8s.io/component-base/metrics/legacyregistry
- baseImportPath: "./vendor/k8s.io/node-api/" - baseImportPath: "./vendor/k8s.io/node-api/"
allowedImports: allowedImports:

View File

@ -30,6 +30,8 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library",
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
"//staging/src/k8s.io/client-go/rest:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/k8s.io/utils/trace:go_default_library", "//vendor/k8s.io/utils/trace:go_default_library",
], ],

View File

@ -26,6 +26,8 @@ import (
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
) )
var ( var (
@ -36,19 +38,19 @@ var (
type converterMetricFactory struct { type converterMetricFactory struct {
// A map from a converter name to it's metric. Allows the converterMetric to be created // A map from a converter name to it's metric. Allows the converterMetric to be created
// again with the same metric for a specific converter (e.g. 'webhook'). // again with the same metric for a specific converter (e.g. 'webhook').
durations map[string]*prometheus.HistogramVec durations map[string]*metrics.HistogramVec
factoryLock sync.Mutex factoryLock sync.Mutex
} }
func newConverterMertricFactory() *converterMetricFactory { func newConverterMertricFactory() *converterMetricFactory {
return &converterMetricFactory{durations: map[string]*prometheus.HistogramVec{}, factoryLock: sync.Mutex{}} return &converterMetricFactory{durations: map[string]*metrics.HistogramVec{}, factoryLock: sync.Mutex{}}
} }
var _ crConverterInterface = &converterMetric{} var _ crConverterInterface = &converterMetric{}
type converterMetric struct { type converterMetric struct {
delegate crConverterInterface delegate crConverterInterface
latencies *prometheus.HistogramVec latencies *metrics.HistogramVec
crdName string crdName string
} }
@ -57,14 +59,15 @@ func (c *converterMetricFactory) addMetrics(converterName string, crdName string
defer c.factoryLock.Unlock() defer c.factoryLock.Unlock()
metric, exists := c.durations[converterName] metric, exists := c.durations[converterName]
if !exists { if !exists {
metric = prometheus.NewHistogramVec( metric = metrics.NewHistogramVec(
prometheus.HistogramOpts{ &metrics.HistogramOpts{
Name: fmt.Sprintf("apiserver_crd_%s_conversion_duration_seconds", converterName), Name: fmt.Sprintf("apiserver_crd_%s_conversion_duration_seconds", converterName),
Help: fmt.Sprintf("CRD %s conversion duration in seconds", converterName), Help: fmt.Sprintf("CRD %s conversion duration in seconds", converterName),
Buckets: latencyBuckets, Buckets: latencyBuckets,
StabilityLevel: metrics.ALPHA,
}, },
[]string{"crd_name", "from_version", "to_version", "succeeded"}) []string{"crd_name", "from_version", "to_version", "succeeded"})
err := prometheus.Register(metric) err := legacyregistry.Register(metric)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -8,7 +8,8 @@ go_library(
visibility = ["//visibility:public"], visibility = ["//visibility:public"],
deps = [ deps = [
"//staging/src/k8s.io/apiserver/pkg/admission:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
], ],
) )

View File

@ -22,9 +22,9 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/prometheus/client_golang/prometheus"
"k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/admission"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
) )
const ( const (
@ -154,33 +154,35 @@ func (m *AdmissionMetrics) ObserveWebhook(elapsed time.Duration, rejected bool,
} }
type metricSet struct { type metricSet struct {
latencies *prometheus.HistogramVec latencies *metrics.HistogramVec
latenciesSummary *prometheus.SummaryVec latenciesSummary *metrics.SummaryVec
} }
func newMetricSet(name string, labels []string, helpTemplate string, hasSummary bool) *metricSet { func newMetricSet(name string, labels []string, helpTemplate string, hasSummary bool) *metricSet {
var summary *prometheus.SummaryVec var summary *metrics.SummaryVec
if hasSummary { if hasSummary {
summary = prometheus.NewSummaryVec( summary = metrics.NewSummaryVec(
prometheus.SummaryOpts{ &metrics.SummaryOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: fmt.Sprintf("%s_admission_duration_seconds_summary", name), Name: fmt.Sprintf("%s_admission_duration_seconds_summary", name),
Help: fmt.Sprintf(helpTemplate, "latency summary in seconds"), Help: fmt.Sprintf(helpTemplate, "latency summary in seconds"),
MaxAge: latencySummaryMaxAge, MaxAge: latencySummaryMaxAge,
StabilityLevel: metrics.ALPHA,
}, },
labels, labels,
) )
} }
return &metricSet{ return &metricSet{
latencies: prometheus.NewHistogramVec( latencies: metrics.NewHistogramVec(
prometheus.HistogramOpts{ &metrics.HistogramOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: fmt.Sprintf("%s_admission_duration_seconds", name), Name: fmt.Sprintf("%s_admission_duration_seconds", name),
Help: fmt.Sprintf(helpTemplate, "latency histogram in seconds"), Help: fmt.Sprintf(helpTemplate, "latency histogram in seconds"),
Buckets: latencyBuckets, Buckets: latencyBuckets,
StabilityLevel: metrics.ALPHA,
}, },
labels, labels,
), ),
@ -191,9 +193,9 @@ func newMetricSet(name string, labels []string, helpTemplate string, hasSummary
// MustRegister registers all the prometheus metrics in the metricSet. // MustRegister registers all the prometheus metrics in the metricSet.
func (m *metricSet) mustRegister() { func (m *metricSet) mustRegister() {
prometheus.MustRegister(m.latencies) legacyregistry.MustRegister(m.latencies)
if m.latenciesSummary != nil { if m.latenciesSummary != nil {
prometheus.MustRegister(m.latenciesSummary) legacyregistry.MustRegister(m.latenciesSummary)
} }
} }

View File

@ -34,8 +34,9 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library", "//staging/src/k8s.io/apiserver/pkg/apis/audit/v1beta1:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/github.com/pborman/uuid:go_default_library", "//vendor/github.com/pborman/uuid:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
], ],
) )

View File

@ -19,8 +19,9 @@ package audit
import ( import (
"fmt" "fmt"
"github.com/prometheus/client_golang/prometheus"
auditinternal "k8s.io/apiserver/pkg/apis/audit" auditinternal "k8s.io/apiserver/pkg/apis/audit"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
"k8s.io/klog" "k8s.io/klog"
) )
@ -28,46 +29,58 @@ const (
subsystem = "apiserver_audit" subsystem = "apiserver_audit"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
eventCounter = prometheus.NewCounter( eventCounter = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Subsystem: subsystem, Subsystem: subsystem,
Name: "event_total", Name: "event_total",
Help: "Counter of audit events generated and sent to the audit backend.", Help: "Counter of audit events generated and sent to the audit backend.",
StabilityLevel: metrics.ALPHA,
}) })
errorCounter = prometheus.NewCounterVec( errorCounter = metrics.NewCounterVec(
prometheus.CounterOpts{ &metrics.CounterOpts{
Subsystem: subsystem, Subsystem: subsystem,
Name: "error_total", Name: "error_total",
Help: "Counter of audit events that failed to be audited properly. " + Help: "Counter of audit events that failed to be audited properly. " +
"Plugin identifies the plugin affected by the error.", "Plugin identifies the plugin affected by the error.",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"plugin"}, []string{"plugin"},
) )
levelCounter = prometheus.NewCounterVec( levelCounter = metrics.NewCounterVec(
prometheus.CounterOpts{ &metrics.CounterOpts{
Subsystem: subsystem, Subsystem: subsystem,
Name: "level_total", Name: "level_total",
Help: "Counter of policy levels for audit events (1 per request).", Help: "Counter of policy levels for audit events (1 per request).",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"level"}, []string{"level"},
) )
ApiserverAuditDroppedCounter = prometheus.NewCounter( ApiserverAuditDroppedCounter = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Subsystem: subsystem, Subsystem: subsystem,
Name: "requests_rejected_total", Name: "requests_rejected_total",
Help: "Counter of apiserver requests rejected due to an error " + Help: "Counter of apiserver requests rejected due to an error " +
"in audit logging backend.", "in audit logging backend.",
StabilityLevel: metrics.ALPHA,
}, },
) )
) )
func init() { func init() {
prometheus.MustRegister(eventCounter) legacyregistry.MustRegister(eventCounter)
prometheus.MustRegister(errorCounter) legacyregistry.MustRegister(errorCounter)
prometheus.MustRegister(levelCounter) legacyregistry.MustRegister(levelCounter)
prometheus.MustRegister(ApiserverAuditDroppedCounter) legacyregistry.MustRegister(ApiserverAuditDroppedCounter)
} }
// ObserveEvent updates the relevant prometheus metrics for the generated audit event. // ObserveEvent updates the relevant prometheus metrics for the generated audit event.

View File

@ -36,7 +36,8 @@ go_library(
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/authenticator:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
], ],
) )

View File

@ -23,16 +23,24 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/prometheus/client_golang/prometheus"
utilerrors "k8s.io/apimachinery/pkg/util/errors" utilerrors "k8s.io/apimachinery/pkg/util/errors"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/apiserver/pkg/authentication/authenticator" "k8s.io/apiserver/pkg/authentication/authenticator"
"k8s.io/apiserver/pkg/authentication/user" "k8s.io/apiserver/pkg/authentication/user"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
) )
var clientCertificateExpirationHistogram = prometheus.NewHistogram( /*
prometheus.HistogramOpts{ * By default, the following metric is defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var clientCertificateExpirationHistogram = metrics.NewHistogram(
&metrics.HistogramOpts{
Namespace: "apiserver", Namespace: "apiserver",
Subsystem: "client", Subsystem: "client",
Name: "certificate_expiration_seconds", Name: "certificate_expiration_seconds",
@ -53,11 +61,12 @@ var clientCertificateExpirationHistogram = prometheus.NewHistogram(
(6 * 30 * 24 * time.Hour).Seconds(), (6 * 30 * 24 * time.Hour).Seconds(),
(12 * 30 * 24 * time.Hour).Seconds(), (12 * 30 * 24 * time.Hour).Seconds(),
}, },
StabilityLevel: metrics.ALPHA,
}, },
) )
func init() { func init() {
prometheus.MustRegister(clientCertificateExpirationHistogram) legacyregistry.MustRegister(clientCertificateExpirationHistogram)
} }
// UserConversion defines an interface for extracting user info from a client certificate chain // UserConversion defines an interface for extracting user info from a client certificate chain

View File

@ -68,7 +68,8 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
], ],
) )

View File

@ -21,29 +21,38 @@ import (
"net/http" "net/http"
"strings" "strings"
"github.com/prometheus/client_golang/prometheus"
"k8s.io/klog"
apierrors "k8s.io/apimachinery/pkg/api/errors" apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/apiserver/pkg/authentication/authenticator" "k8s.io/apiserver/pkg/authentication/authenticator"
"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters" "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
genericapirequest "k8s.io/apiserver/pkg/endpoints/request" genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
"k8s.io/klog"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
authenticatedUserCounter = prometheus.NewCounterVec( authenticatedUserCounter = metrics.NewCounterVec(
prometheus.CounterOpts{ &metrics.CounterOpts{
Name: "authenticated_user_requests", Name: "authenticated_user_requests",
Help: "Counter of authenticated requests broken out by username.", Help: "Counter of authenticated requests broken out by username.",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"username"}, []string{"username"},
) )
) )
func init() { func init() {
prometheus.MustRegister(authenticatedUserCounter) legacyregistry.MustRegister(authenticatedUserCounter)
} }
// WithAuthentication creates an http handler that tries to authenticate the given request as a user, and then // WithAuthentication creates an http handler that tries to authenticate the given request as a user, and then

View File

@ -25,6 +25,8 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
], ],

View File

@ -27,6 +27,9 @@ import (
"sync" "sync"
"time" "time"
restful "github.com/emicklei/go-restful"
"github.com/prometheus/client_golang/prometheus"
"k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/apis/meta/v1/validation"
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
utilnet "k8s.io/apimachinery/pkg/util/net" utilnet "k8s.io/apimachinery/pkg/util/net"
@ -34,15 +37,14 @@ import (
"k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/endpoints/request"
"k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/features"
utilfeature "k8s.io/apiserver/pkg/util/feature" utilfeature "k8s.io/apiserver/pkg/util/feature"
compbasemetrics "k8s.io/component-base/metrics"
restful "github.com/emicklei/go-restful" "k8s.io/component-base/metrics/legacyregistry"
"github.com/prometheus/client_golang/prometheus"
) )
// resettableCollector is the interface implemented by prometheus.MetricVec // resettableCollector is the interface implemented by prometheus.MetricVec
// that can be used by Prometheus to collect metrics and reset their values. // that can be used by Prometheus to collect metrics and reset their values.
type resettableCollector interface { type resettableCollector interface {
prometheus.Collector compbasemetrics.Registerable
Reset() Reset()
} }
@ -50,13 +52,22 @@ const (
APIServerComponent string = "apiserver" APIServerComponent string = "apiserver"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
// TODO(a-robinson): Add unit tests for the handling of these metrics once // TODO(a-robinson): Add unit tests for the handling of these metrics once
// the upstream library supports it. // the upstream library supports it.
requestCounter = prometheus.NewCounterVec( requestCounter = compbasemetrics.NewCounterVec(
prometheus.CounterOpts{ &compbasemetrics.CounterOpts{
Name: "apiserver_request_total", Name: "apiserver_request_total",
Help: "Counter of apiserver requests broken out for each verb, dry run value, group, version, resource, scope, component, client, and HTTP response contentType and code.", Help: "Counter of apiserver requests broken out for each verb, dry run value, group, version, resource, scope, component, client, and HTTP response contentType and code.",
StabilityLevel: compbasemetrics.ALPHA,
}, },
// The label_name contentType doesn't follow the label_name convention defined here: // The label_name contentType doesn't follow the label_name convention defined here:
// https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/instrumentation.md // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-instrumentation/instrumentation.md
@ -64,22 +75,24 @@ var (
// should be all lowercase and separated by underscores. // should be all lowercase and separated by underscores.
[]string{"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component", "client", "contentType", "code"}, []string{"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component", "client", "contentType", "code"},
) )
deprecatedRequestCounter = prometheus.NewCounterVec( deprecatedRequestCounter = compbasemetrics.NewCounterVec(
prometheus.CounterOpts{ &compbasemetrics.CounterOpts{
Name: "apiserver_request_count", Name: "apiserver_request_count",
Help: "(Deprecated) Counter of apiserver requests broken out for each verb, group, version, resource, scope, component, client, and HTTP response contentType and code.", Help: "(Deprecated) Counter of apiserver requests broken out for each verb, group, version, resource, scope, component, client, and HTTP response contentType and code.",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"verb", "group", "version", "resource", "subresource", "scope", "component", "client", "contentType", "code"}, []string{"verb", "group", "version", "resource", "subresource", "scope", "component", "client", "contentType", "code"},
) )
longRunningRequestGauge = prometheus.NewGaugeVec( longRunningRequestGauge = compbasemetrics.NewGaugeVec(
prometheus.GaugeOpts{ &compbasemetrics.GaugeOpts{
Name: "apiserver_longrunning_gauge", Name: "apiserver_longrunning_gauge",
Help: "Gauge of all active long-running apiserver requests broken out by verb, group, version, resource, scope and component. Not all requests are tracked this way.", Help: "Gauge of all active long-running apiserver requests broken out by verb, group, version, resource, scope and component. Not all requests are tracked this way.",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"verb", "group", "version", "resource", "subresource", "scope", "component"}, []string{"verb", "group", "version", "resource", "subresource", "scope", "component"},
) )
requestLatencies = prometheus.NewHistogramVec( requestLatencies = compbasemetrics.NewHistogramVec(
prometheus.HistogramOpts{ &compbasemetrics.HistogramOpts{
Name: "apiserver_request_duration_seconds", Name: "apiserver_request_duration_seconds",
Help: "Response latency distribution in seconds for each verb, dry run value, group, version, resource, subresource, scope and component.", Help: "Response latency distribution in seconds for each verb, dry run value, group, version, resource, subresource, scope and component.",
// This metric is used for verifying api call latencies SLO, // This metric is used for verifying api call latencies SLO,
@ -87,81 +100,91 @@ var (
// Thus we customize buckets significantly, to empower both usecases. // Thus we customize buckets significantly, to empower both usecases.
Buckets: []float64{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, Buckets: []float64{0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60}, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40, 50, 60},
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component"}, []string{"verb", "dry_run", "group", "version", "resource", "subresource", "scope", "component"},
) )
deprecatedRequestLatencies = prometheus.NewHistogramVec( deprecatedRequestLatencies = compbasemetrics.NewHistogramVec(
prometheus.HistogramOpts{ &compbasemetrics.HistogramOpts{
Name: "apiserver_request_latencies", Name: "apiserver_request_latencies",
Help: "(Deprecated) Response latency distribution in microseconds for each verb, group, version, resource, subresource, scope and component.", Help: "(Deprecated) Response latency distribution in microseconds for each verb, group, version, resource, subresource, scope and component.",
// Use buckets ranging from 125 ms to 8 seconds. // Use buckets ranging from 125 ms to 8 seconds.
Buckets: prometheus.ExponentialBuckets(125000, 2.0, 7), Buckets: prometheus.ExponentialBuckets(125000, 2.0, 7),
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"verb", "group", "version", "resource", "subresource", "scope", "component"}, []string{"verb", "group", "version", "resource", "subresource", "scope", "component"},
) )
deprecatedRequestLatenciesSummary = prometheus.NewSummaryVec( deprecatedRequestLatenciesSummary = compbasemetrics.NewSummaryVec(
prometheus.SummaryOpts{ &compbasemetrics.SummaryOpts{
Name: "apiserver_request_latencies_summary", Name: "apiserver_request_latencies_summary",
Help: "(Deprecated) Response latency summary in microseconds for each verb, group, version, resource, subresource, scope and component.", Help: "(Deprecated) Response latency summary in microseconds for each verb, group, version, resource, subresource, scope and component.",
// Make the sliding window of 5h. // Make the sliding window of 5h.
// TODO: The value for this should be based on our SLI definition (medium term). // TODO: The value for this should be based on our SLI definition (medium term).
MaxAge: 5 * time.Hour, MaxAge: 5 * time.Hour,
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"verb", "group", "version", "resource", "subresource", "scope", "component"}, []string{"verb", "group", "version", "resource", "subresource", "scope", "component"},
) )
responseSizes = prometheus.NewHistogramVec( responseSizes = compbasemetrics.NewHistogramVec(
prometheus.HistogramOpts{ &compbasemetrics.HistogramOpts{
Name: "apiserver_response_sizes", Name: "apiserver_response_sizes",
Help: "Response size distribution in bytes for each group, version, verb, resource, subresource, scope and component.", Help: "Response size distribution in bytes for each group, version, verb, resource, subresource, scope and component.",
// Use buckets ranging from 1000 bytes (1KB) to 10^9 bytes (1GB). // Use buckets ranging from 1000 bytes (1KB) to 10^9 bytes (1GB).
Buckets: prometheus.ExponentialBuckets(1000, 10.0, 7), Buckets: prometheus.ExponentialBuckets(1000, 10.0, 7),
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"verb", "group", "version", "resource", "subresource", "scope", "component"}, []string{"verb", "group", "version", "resource", "subresource", "scope", "component"},
) )
// DroppedRequests is a number of requests dropped with 'Try again later' response" // DroppedRequests is a number of requests dropped with 'Try again later' response"
DroppedRequests = prometheus.NewCounterVec( DroppedRequests = compbasemetrics.NewCounterVec(
prometheus.CounterOpts{ &compbasemetrics.CounterOpts{
Name: "apiserver_dropped_requests_total", Name: "apiserver_dropped_requests_total",
Help: "Number of requests dropped with 'Try again later' response", Help: "Number of requests dropped with 'Try again later' response",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"requestKind"}, []string{"requestKind"},
) )
DeprecatedDroppedRequests = prometheus.NewCounterVec( DeprecatedDroppedRequests = compbasemetrics.NewCounterVec(
prometheus.CounterOpts{ &compbasemetrics.CounterOpts{
Name: "apiserver_dropped_requests", Name: "apiserver_dropped_requests",
Help: "(Deprecated) Number of requests dropped with 'Try again later' response", Help: "(Deprecated) Number of requests dropped with 'Try again later' response",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"requestKind"}, []string{"requestKind"},
) )
// RegisteredWatchers is a number of currently registered watchers splitted by resource. // RegisteredWatchers is a number of currently registered watchers splitted by resource.
RegisteredWatchers = prometheus.NewGaugeVec( RegisteredWatchers = compbasemetrics.NewGaugeVec(
prometheus.GaugeOpts{ &compbasemetrics.GaugeOpts{
Name: "apiserver_registered_watchers", Name: "apiserver_registered_watchers",
Help: "Number of currently registered watchers for a given resources", Help: "Number of currently registered watchers for a given resources",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"group", "version", "kind"}, []string{"group", "version", "kind"},
) )
WatchEvents = prometheus.NewCounterVec( WatchEvents = compbasemetrics.NewCounterVec(
prometheus.CounterOpts{ &compbasemetrics.CounterOpts{
Name: "apiserver_watch_events_total", Name: "apiserver_watch_events_total",
Help: "Number of events sent in watch clients", Help: "Number of events sent in watch clients",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"group", "version", "kind"}, []string{"group", "version", "kind"},
) )
WatchEventsSizes = prometheus.NewHistogramVec( WatchEventsSizes = compbasemetrics.NewHistogramVec(
prometheus.HistogramOpts{ &compbasemetrics.HistogramOpts{
Name: "apiserver_watch_events_sizes", Name: "apiserver_watch_events_sizes",
Help: "Watch event size distribution in bytes", Help: "Watch event size distribution in bytes",
Buckets: prometheus.ExponentialBuckets(1024, 2.0, 8), // 1K, 2K, 4K, 8K, ..., 128K. Buckets: prometheus.ExponentialBuckets(1024, 2.0, 8), // 1K, 2K, 4K, 8K, ..., 128K.
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"group", "version", "kind"}, []string{"group", "version", "kind"},
) )
// Because of volatality of the base metric this is pre-aggregated one. Instead of reporing current usage all the time // Because of volatality of the base metric this is pre-aggregated one. Instead of reporing current usage all the time
// it reports maximal usage during the last second. // it reports maximal usage during the last second.
currentInflightRequests = prometheus.NewGaugeVec( currentInflightRequests = compbasemetrics.NewGaugeVec(
prometheus.GaugeOpts{ &compbasemetrics.GaugeOpts{
Name: "apiserver_current_inflight_requests", Name: "apiserver_current_inflight_requests",
Help: "Maximal number of currently used inflight request limit of this apiserver per request kind in last second.", Help: "Maximal number of currently used inflight request limit of this apiserver per request kind in last second.",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"requestKind"}, []string{"requestKind"},
) )
@ -197,7 +220,7 @@ var registerMetrics sync.Once
func Register() { func Register() {
registerMetrics.Do(func() { registerMetrics.Do(func() {
for _, metric := range metrics { for _, metric := range metrics {
prometheus.MustRegister(metric) legacyregistry.MustRegister(metric)
} }
}) })
} }
@ -241,7 +264,7 @@ func RecordLongRunning(req *http.Request, requestInfo *request.RequestInfo, comp
if requestInfo == nil { if requestInfo == nil {
requestInfo = &request.RequestInfo{Verb: req.Method, Path: req.URL.Path} requestInfo = &request.RequestInfo{Verb: req.Method, Path: req.URL.Path}
} }
var g prometheus.Gauge var g compbasemetrics.GaugeMetric
scope := CleanScope(requestInfo) scope := CleanScope(requestInfo)
// We don't use verb from <requestInfo>, as for the healthy path // We don't use verb from <requestInfo>, as for the healthy path
// MonitorRequest is called from InstrumentRouteFunc which is registered // MonitorRequest is called from InstrumentRouteFunc which is registered

View File

@ -26,9 +26,9 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library", "//staging/src/k8s.io/apiserver/pkg/server/mux:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library",
"//vendor/github.com/go-openapi/spec:go_default_library", "//vendor/github.com/go-openapi/spec:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/kube-openapi/pkg/builder:go_default_library", "//vendor/k8s.io/kube-openapi/pkg/builder:go_default_library",
"//vendor/k8s.io/kube-openapi/pkg/common:go_default_library", "//vendor/k8s.io/kube-openapi/pkg/common:go_default_library",

View File

@ -23,8 +23,7 @@ import (
apimetrics "k8s.io/apiserver/pkg/endpoints/metrics" apimetrics "k8s.io/apiserver/pkg/endpoints/metrics"
"k8s.io/apiserver/pkg/server/mux" "k8s.io/apiserver/pkg/server/mux"
etcd3metrics "k8s.io/apiserver/pkg/storage/etcd3/metrics" etcd3metrics "k8s.io/apiserver/pkg/storage/etcd3/metrics"
"k8s.io/component-base/metrics/legacyregistry"
"github.com/prometheus/client_golang/prometheus"
) )
// DefaultMetrics installs the default prometheus metrics handler // DefaultMetrics installs the default prometheus metrics handler
@ -33,7 +32,7 @@ type DefaultMetrics struct{}
// Install adds the DefaultMetrics handler // Install adds the DefaultMetrics handler
func (m DefaultMetrics) Install(c *mux.PathRecorderMux) { func (m DefaultMetrics) Install(c *mux.PathRecorderMux) {
register() register()
c.Handle("/metrics", prometheus.Handler()) c.Handle("/metrics", legacyregistry.Handler())
} }
// MetricsWithReset install the prometheus metrics handler extended with support for the DELETE method // MetricsWithReset install the prometheus metrics handler extended with support for the DELETE method
@ -43,7 +42,7 @@ type MetricsWithReset struct{}
// Install adds the MetricsWithReset handler // Install adds the MetricsWithReset handler
func (m MetricsWithReset) Install(c *mux.PathRecorderMux) { func (m MetricsWithReset) Install(c *mux.PathRecorderMux) {
register() register()
defaultMetricsHandler := prometheus.Handler().ServeHTTP defaultMetricsHandler := legacyregistry.Handler().ServeHTTP
c.HandleFunc("/metrics", func(w http.ResponseWriter, req *http.Request) { c.HandleFunc("/metrics", func(w http.ResponseWriter, req *http.Request) {
if req.Method == "DELETE" { if req.Method == "DELETE" {
apimetrics.Reset() apimetrics.Reset()

View File

@ -27,7 +27,8 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//staging/src/k8s.io/client-go/tools/cache:go_default_library", "//staging/src/k8s.io/client-go/tools/cache:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
"//vendor/k8s.io/utils/trace:go_default_library", "//vendor/k8s.io/utils/trace:go_default_library",
], ],

View File

@ -24,8 +24,6 @@ import (
"sync" "sync"
"time" "time"
"k8s.io/klog"
"k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@ -41,16 +39,26 @@ import (
"k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage"
utilfeature "k8s.io/apiserver/pkg/util/feature" utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
"k8s.io/klog"
utiltrace "k8s.io/utils/trace" utiltrace "k8s.io/utils/trace"
"github.com/prometheus/client_golang/prometheus"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
initCounter = prometheus.NewCounterVec( initCounter = metrics.NewCounterVec(
prometheus.CounterOpts{ &metrics.CounterOpts{
Name: "apiserver_init_events_total", Name: "apiserver_init_events_total",
Help: "Counter of init events processed in watchcache broken by resource type", Help: "Counter of init events processed in watchcache broken by resource type",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"resource"}, []string{"resource"},
) )
@ -64,7 +72,7 @@ const (
) )
func init() { func init() {
prometheus.MustRegister(initCounter) legacyregistry.MustRegister(initCounter)
} }
// Config contains the configuration for a given Cache. // Config contains the configuration for a given Cache.

View File

@ -10,7 +10,10 @@ go_library(
srcs = ["metrics.go"], srcs = ["metrics.go"],
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics", importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/etcd3/metrics",
importpath = "k8s.io/apiserver/pkg/storage/etcd3/metrics", importpath = "k8s.io/apiserver/pkg/storage/etcd3/metrics",
deps = ["//vendor/github.com/prometheus/client_golang/prometheus:go_default_library"], deps = [
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
],
) )
filegroup( filegroup(

View File

@ -20,29 +20,41 @@ import (
"sync" "sync"
"time" "time"
"github.com/prometheus/client_golang/prometheus" compbasemetrics "k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
etcdRequestLatency = prometheus.NewHistogramVec( etcdRequestLatency = compbasemetrics.NewHistogramVec(
prometheus.HistogramOpts{ &compbasemetrics.HistogramOpts{
Name: "etcd_request_duration_seconds", Name: "etcd_request_duration_seconds",
Help: "Etcd request latency in seconds for each operation and object type.", Help: "Etcd request latency in seconds for each operation and object type.",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"operation", "type"}, []string{"operation", "type"},
) )
objectCounts = prometheus.NewGaugeVec( objectCounts = compbasemetrics.NewGaugeVec(
prometheus.GaugeOpts{ &compbasemetrics.GaugeOpts{
Name: "etcd_object_counts", Name: "etcd_object_counts",
Help: "Number of stored objects at the time of last check split by kind.", Help: "Number of stored objects at the time of last check split by kind.",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"resource"}, []string{"resource"},
) )
deprecatedEtcdRequestLatenciesSummary = prometheus.NewSummaryVec( deprecatedEtcdRequestLatenciesSummary = compbasemetrics.NewSummaryVec(
prometheus.SummaryOpts{ &compbasemetrics.SummaryOpts{
Name: "etcd_request_latencies_summary", Name: "etcd_request_latencies_summary",
Help: "(Deprecated) Etcd request latency summary in microseconds for each operation and object type.", Help: "(Deprecated) Etcd request latency summary in microseconds for each operation and object type.",
StabilityLevel: compbasemetrics.ALPHA,
}, },
[]string{"operation", "type"}, []string{"operation", "type"},
) )
@ -54,11 +66,11 @@ var registerMetrics sync.Once
func Register() { func Register() {
// Register the metrics. // Register the metrics.
registerMetrics.Do(func() { registerMetrics.Do(func() {
prometheus.MustRegister(etcdRequestLatency) legacyregistry.MustRegister(etcdRequestLatency)
prometheus.MustRegister(objectCounts) legacyregistry.MustRegister(objectCounts)
// TODO(danielqsj): Remove the following metrics, they are deprecated // TODO(danielqsj): Remove the following metrics, they are deprecated
prometheus.MustRegister(deprecatedEtcdRequestLatenciesSummary) legacyregistry.MustRegister(deprecatedEtcdRequestLatenciesSummary)
}) })
} }

View File

@ -39,6 +39,7 @@ go_library(
"//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/etcd3:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/storagebackend:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/value:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/github.com/coreos/etcd/clientv3:go_default_library", "//vendor/github.com/coreos/etcd/clientv3:go_default_library",
"//vendor/github.com/coreos/etcd/pkg/transport:go_default_library", "//vendor/github.com/coreos/etcd/pkg/transport:go_default_library",
"//vendor/github.com/grpc-ecosystem/go-grpc-prometheus:go_default_library", "//vendor/github.com/grpc-ecosystem/go-grpc-prometheus:go_default_library",

View File

@ -34,6 +34,7 @@ import (
"k8s.io/apiserver/pkg/storage/etcd3" "k8s.io/apiserver/pkg/storage/etcd3"
"k8s.io/apiserver/pkg/storage/storagebackend" "k8s.io/apiserver/pkg/storage/storagebackend"
"k8s.io/apiserver/pkg/storage/value" "k8s.io/apiserver/pkg/storage/value"
"k8s.io/component-base/metrics/legacyregistry"
) )
// The short keepalive timeout and interval have been chosen to aggressively // The short keepalive timeout and interval have been chosen to aggressively
@ -46,6 +47,14 @@ const keepaliveTimeout = 10 * time.Second
// on heavily loaded arm64 CPUs (issue #64649) // on heavily loaded arm64 CPUs (issue #64649)
const dialTimeout = 20 * time.Second const dialTimeout = 20 * time.Second
func init() {
// grpcprom auto-registers (via an init function) their client metrics, since we are opting out of
// using the global prometheus registry and using our own wrapped global registry,
// we need to explicitly register these metrics to our global registry here.
// For reference: https://github.com/kubernetes/kubernetes/pull/81387
legacyregistry.RawMustRegister(grpcprom.DefaultClientMetrics)
}
func newETCD3HealthCheck(c storagebackend.Config) (func() error, error) { func newETCD3HealthCheck(c storagebackend.Config) (func() error, error) {
// constructing the etcd v3 client blocks and times out if etcd is not available. // constructing the etcd v3 client blocks and times out if etcd is not available.
// retry in a loop in the background until we successfully create the client, storing the client or error encountered // retry in a loop in the background until we successfully create the client, storing the client or error encountered

View File

@ -30,6 +30,8 @@ go_library(
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value", importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/storage/value",
importpath = "k8s.io/apiserver/pkg/storage/value", importpath = "k8s.io/apiserver/pkg/storage/value",
deps = [ deps = [
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/google.golang.org/grpc/status:go_default_library", "//vendor/google.golang.org/grpc/status:go_default_library",
], ],

View File

@ -20,9 +20,11 @@ import (
"sync" "sync"
"time" "time"
"github.com/prometheus/client_golang/prometheus"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
"github.com/prometheus/client_golang/prometheus" "k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
) )
const ( const (
@ -30,9 +32,17 @@ const (
subsystem = "storage" subsystem = "storage"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
transformerLatencies = prometheus.NewHistogramVec( transformerLatencies = metrics.NewHistogramVec(
prometheus.HistogramOpts{ &metrics.HistogramOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "transformation_duration_seconds", Name: "transformation_duration_seconds",
@ -40,11 +50,12 @@ var (
// In-process transformations (ex. AES CBC) complete on the order of 20 microseconds. However, when // In-process transformations (ex. AES CBC) complete on the order of 20 microseconds. However, when
// external KMS is involved latencies may climb into milliseconds. // external KMS is involved latencies may climb into milliseconds.
Buckets: prometheus.ExponentialBuckets(5e-6, 2, 14), Buckets: prometheus.ExponentialBuckets(5e-6, 2, 14),
StabilityLevel: metrics.ALPHA,
}, },
[]string{"transformation_type"}, []string{"transformation_type"},
) )
deprecatedTransformerLatencies = prometheus.NewHistogramVec( deprecatedTransformerLatencies = metrics.NewHistogramVec(
prometheus.HistogramOpts{ &metrics.HistogramOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "transformation_latencies_microseconds", Name: "transformation_latencies_microseconds",
@ -52,63 +63,70 @@ var (
// In-process transformations (ex. AES CBC) complete on the order of 20 microseconds. However, when // In-process transformations (ex. AES CBC) complete on the order of 20 microseconds. However, when
// external KMS is involved latencies may climb into milliseconds. // external KMS is involved latencies may climb into milliseconds.
Buckets: prometheus.ExponentialBuckets(5, 2, 14), Buckets: prometheus.ExponentialBuckets(5, 2, 14),
StabilityLevel: metrics.ALPHA,
}, },
[]string{"transformation_type"}, []string{"transformation_type"},
) )
transformerOperationsTotal = prometheus.NewCounterVec( transformerOperationsTotal = metrics.NewCounterVec(
prometheus.CounterOpts{ &metrics.CounterOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "transformation_operations_total", Name: "transformation_operations_total",
Help: "Total number of transformations.", Help: "Total number of transformations.",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"transformation_type", "transformer_prefix", "status"}, []string{"transformation_type", "transformer_prefix", "status"},
) )
deprecatedTransformerFailuresTotal = prometheus.NewCounterVec( deprecatedTransformerFailuresTotal = metrics.NewCounterVec(
prometheus.CounterOpts{ &metrics.CounterOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "transformation_failures_total", Name: "transformation_failures_total",
Help: "(Deprecated) Total number of failed transformation operations.", Help: "(Deprecated) Total number of failed transformation operations.",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"transformation_type"}, []string{"transformation_type"},
) )
envelopeTransformationCacheMissTotal = prometheus.NewCounter( envelopeTransformationCacheMissTotal = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "envelope_transformation_cache_misses_total", Name: "envelope_transformation_cache_misses_total",
Help: "Total number of cache misses while accessing key decryption key(KEK).", Help: "Total number of cache misses while accessing key decryption key(KEK).",
StabilityLevel: metrics.ALPHA,
}, },
) )
dataKeyGenerationLatencies = prometheus.NewHistogram( dataKeyGenerationLatencies = metrics.NewHistogram(
prometheus.HistogramOpts{ &metrics.HistogramOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "data_key_generation_duration_seconds", Name: "data_key_generation_duration_seconds",
Help: "Latencies in seconds of data encryption key(DEK) generation operations.", Help: "Latencies in seconds of data encryption key(DEK) generation operations.",
Buckets: prometheus.ExponentialBuckets(5e-6, 2, 14), Buckets: prometheus.ExponentialBuckets(5e-6, 2, 14),
StabilityLevel: metrics.ALPHA,
}, },
) )
deprecatedDataKeyGenerationLatencies = prometheus.NewHistogram( deprecatedDataKeyGenerationLatencies = metrics.NewHistogram(
prometheus.HistogramOpts{ &metrics.HistogramOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "data_key_generation_latencies_microseconds", Name: "data_key_generation_latencies_microseconds",
Help: "(Deprecated) Latencies in microseconds of data encryption key(DEK) generation operations.", Help: "(Deprecated) Latencies in microseconds of data encryption key(DEK) generation operations.",
Buckets: prometheus.ExponentialBuckets(5, 2, 14), Buckets: prometheus.ExponentialBuckets(5, 2, 14),
StabilityLevel: metrics.ALPHA,
}, },
) )
dataKeyGenerationFailuresTotal = prometheus.NewCounter( dataKeyGenerationFailuresTotal = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Namespace: namespace, Namespace: namespace,
Subsystem: subsystem, Subsystem: subsystem,
Name: "data_key_generation_failures_total", Name: "data_key_generation_failures_total",
Help: "Total number of failed data encryption key(DEK) generation operations.", Help: "Total number of failed data encryption key(DEK) generation operations.",
StabilityLevel: metrics.ALPHA,
}, },
) )
) )
@ -117,14 +135,14 @@ var registerMetrics sync.Once
func RegisterMetrics() { func RegisterMetrics() {
registerMetrics.Do(func() { registerMetrics.Do(func() {
prometheus.MustRegister(transformerLatencies) legacyregistry.MustRegister(transformerLatencies)
prometheus.MustRegister(deprecatedTransformerLatencies) legacyregistry.MustRegister(deprecatedTransformerLatencies)
prometheus.MustRegister(transformerOperationsTotal) legacyregistry.MustRegister(transformerOperationsTotal)
prometheus.MustRegister(deprecatedTransformerFailuresTotal) legacyregistry.MustRegister(deprecatedTransformerFailuresTotal)
prometheus.MustRegister(envelopeTransformationCacheMissTotal) legacyregistry.MustRegister(envelopeTransformationCacheMissTotal)
prometheus.MustRegister(dataKeyGenerationLatencies) legacyregistry.MustRegister(dataKeyGenerationLatencies)
prometheus.MustRegister(deprecatedDataKeyGenerationLatencies) legacyregistry.MustRegister(deprecatedDataKeyGenerationLatencies)
prometheus.MustRegister(dataKeyGenerationFailuresTotal) legacyregistry.MustRegister(dataKeyGenerationFailuresTotal)
}) })
} }

View File

@ -44,10 +44,10 @@ func TestTotals(t *testing.T) {
}, },
error: errors.New("foo"), error: errors.New("foo"),
want: ` want: `
# HELP apiserver_storage_transformation_failures_total (Deprecated) Total number of failed transformation operations. # HELP apiserver_storage_transformation_failures_total [ALPHA] (Deprecated) Total number of failed transformation operations.
# TYPE apiserver_storage_transformation_failures_total counter # TYPE apiserver_storage_transformation_failures_total counter
apiserver_storage_transformation_failures_total{transformation_type="encrypt"} 1 apiserver_storage_transformation_failures_total{transformation_type="encrypt"} 1
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="encrypt",transformer_prefix="k8s:enc:kms:v1:"} 1 apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="encrypt",transformer_prefix="k8s:enc:kms:v1:"} 1
`, `,
@ -59,7 +59,7 @@ func TestTotals(t *testing.T) {
"apiserver_storage_transformation_failures_total", "apiserver_storage_transformation_failures_total",
}, },
want: ` want: `
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="OK",transformation_type="encrypt",transformer_prefix="k8s:enc:kms:v1:"} 1 apiserver_storage_transformation_operations_total{status="OK",transformation_type="encrypt",transformer_prefix="k8s:enc:kms:v1:"} 1
`, `,
@ -72,10 +72,10 @@ func TestTotals(t *testing.T) {
}, },
error: status.Error(codes.FailedPrecondition, "foo"), error: status.Error(codes.FailedPrecondition, "foo"),
want: ` want: `
# HELP apiserver_storage_transformation_failures_total (Deprecated) Total number of failed transformation operations. # HELP apiserver_storage_transformation_failures_total [ALPHA] (Deprecated) Total number of failed transformation operations.
# TYPE apiserver_storage_transformation_failures_total counter # TYPE apiserver_storage_transformation_failures_total counter
apiserver_storage_transformation_failures_total{transformation_type="encrypt"} 1 apiserver_storage_transformation_failures_total{transformation_type="encrypt"} 1
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="FailedPrecondition",transformation_type="encrypt",transformer_prefix="k8s:enc:kms:v1:"} 1 apiserver_storage_transformation_operations_total{status="FailedPrecondition",transformation_type="encrypt",transformer_prefix="k8s:enc:kms:v1:"} 1
`, `,

View File

@ -128,7 +128,7 @@ func TestPrefixFromMetrics(t *testing.T) {
"apiserver_storage_transformation_operations_total", "apiserver_storage_transformation_operations_total",
}, },
want: ` want: `
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="OK",transformation_type="from_storage",transformer_prefix="identity"} 1 apiserver_storage_transformation_operations_total{status="OK",transformation_type="from_storage",transformer_prefix="identity"} 1
`, `,
@ -142,7 +142,7 @@ func TestPrefixFromMetrics(t *testing.T) {
"apiserver_storage_transformation_operations_total", "apiserver_storage_transformation_operations_total",
}, },
want: ` want: `
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="OK",transformation_type="from_storage",transformer_prefix="other:"} 1 apiserver_storage_transformation_operations_total{status="OK",transformation_type="from_storage",transformer_prefix="other:"} 1
`, `,
@ -156,7 +156,7 @@ func TestPrefixFromMetrics(t *testing.T) {
"apiserver_storage_transformation_operations_total", "apiserver_storage_transformation_operations_total",
}, },
want: ` want: `
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="from_storage",transformer_prefix="other:"} 1 apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="from_storage",transformer_prefix="other:"} 1
`, `,
@ -170,7 +170,7 @@ func TestPrefixFromMetrics(t *testing.T) {
"apiserver_storage_transformation_operations_total", "apiserver_storage_transformation_operations_total",
}, },
want: ` want: `
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="from_storage",transformer_prefix="unknown"} 1 apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="from_storage",transformer_prefix="unknown"} 1
`, `,
@ -214,7 +214,7 @@ func TestPrefixToMetrics(t *testing.T) {
"apiserver_storage_transformation_operations_total", "apiserver_storage_transformation_operations_total",
}, },
want: ` want: `
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="OK",transformation_type="to_storage",transformer_prefix="other:"} 1 apiserver_storage_transformation_operations_total{status="OK",transformation_type="to_storage",transformer_prefix="other:"} 1
`, `,
@ -228,7 +228,7 @@ func TestPrefixToMetrics(t *testing.T) {
"apiserver_storage_transformation_operations_total", "apiserver_storage_transformation_operations_total",
}, },
want: ` want: `
# HELP apiserver_storage_transformation_operations_total Total number of transformations. # HELP apiserver_storage_transformation_operations_total [ALPHA] Total number of transformations.
# TYPE apiserver_storage_transformation_operations_total counter # TYPE apiserver_storage_transformation_operations_total counter
apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="to_storage",transformer_prefix="other:"} 1 apiserver_storage_transformation_operations_total{status="Unknown",transformation_type="to_storage",transformer_prefix="other:"} 1
`, `,

View File

@ -10,7 +10,6 @@ require (
github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4 // indirect github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4 // indirect
github.com/go-openapi/spec v0.19.2 github.com/go-openapi/spec v0.19.2
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d
github.com/prometheus/client_golang v0.9.2
github.com/spf13/cobra v0.0.5 github.com/spf13/cobra v0.0.5
github.com/spf13/pflag v1.0.3 github.com/spf13/pflag v1.0.3
github.com/stretchr/testify v1.3.0 github.com/stretchr/testify v1.3.0

View File

@ -25,13 +25,14 @@ go_library(
"//staging/src/k8s.io/client-go/tools/cache:go_default_library", "//staging/src/k8s.io/client-go/tools/cache:go_default_library",
"//staging/src/k8s.io/client-go/transport:go_default_library", "//staging/src/k8s.io/client-go/transport:go_default_library",
"//staging/src/k8s.io/client-go/util/workqueue:go_default_library", "//staging/src/k8s.io/client-go/util/workqueue:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/v1/helper:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/client/informers/externalversions/apiregistration/v1:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/client/listers/apiregistration/v1:go_default_library",
"//staging/src/k8s.io/kube-aggregator/pkg/controllers:go_default_library", "//staging/src/k8s.io/kube-aggregator/pkg/controllers:go_default_library",
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
"//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/klog:go_default_library",
], ],
) )

View File

@ -17,27 +17,38 @@ limitations under the License.
package apiserver package apiserver
import ( import (
"github.com/prometheus/client_golang/prometheus" "k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
unavailableCounter = prometheus.NewCounterVec( unavailableCounter = metrics.NewCounterVec(
prometheus.CounterOpts{ &metrics.CounterOpts{
Name: "aggregator_unavailable_apiservice_count", Name: "aggregator_unavailable_apiservice_count",
Help: "Counter of APIServices which are marked as unavailable broken down by APIService name and reason.", Help: "Counter of APIServices which are marked as unavailable broken down by APIService name and reason.",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"name", "reason"}, []string{"name", "reason"},
) )
unavailableGauge = prometheus.NewGaugeVec( unavailableGauge = metrics.NewGaugeVec(
prometheus.GaugeOpts{ &metrics.GaugeOpts{
Name: "aggregator_unavailable_apiservice", Name: "aggregator_unavailable_apiservice",
Help: "Gauge of APIServices which are marked as unavailable broken down by APIService name.", Help: "Gauge of APIServices which are marked as unavailable broken down by APIService name.",
StabilityLevel: metrics.ALPHA,
}, },
[]string{"name"}, []string{"name"},
) )
) )
func init() { func init() {
prometheus.MustRegister(unavailableCounter) legacyregistry.MustRegister(unavailableCounter)
prometheus.MustRegister(unavailableGauge) legacyregistry.MustRegister(unavailableGauge)
} }

View File

@ -66,6 +66,8 @@ go_library(
"//staging/src/k8s.io/cloud-provider/volume:go_default_library", "//staging/src/k8s.io/cloud-provider/volume:go_default_library",
"//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/errors:go_default_library",
"//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library", "//staging/src/k8s.io/cloud-provider/volume/helpers:go_default_library",
"//staging/src/k8s.io/component-base/metrics:go_default_library",
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
"//vendor/cloud.google.com/go/compute/metadata:go_default_library", "//vendor/cloud.google.com/go/compute/metadata:go_default_library",
"//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud:go_default_library", "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud:go_default_library",
"//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/filter:go_default_library", "//vendor/github.com/GoogleCloudPlatform/k8s-cloud-provider/pkg/cloud/filter:go_default_library",

View File

@ -25,12 +25,13 @@ import (
"strings" "strings"
"time" "time"
"k8s.io/client-go/util/flowcontrol"
"github.com/prometheus/client_golang/prometheus"
"golang.org/x/oauth2" "golang.org/x/oauth2"
"golang.org/x/oauth2/google" "golang.org/x/oauth2/google"
"google.golang.org/api/googleapi" "google.golang.org/api/googleapi"
"k8s.io/client-go/util/flowcontrol"
"k8s.io/component-base/metrics"
"k8s.io/component-base/metrics/legacyregistry"
) )
const ( const (
@ -40,24 +41,34 @@ const (
tokenURLBurst = 3 tokenURLBurst = 3
) )
/*
* By default, all the following metrics are defined as falling under
* ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes)
*
* Promoting the stability level of the metric is a responsibility of the component owner, since it
* involves explicitly acknowledging support for the metric across multiple releases, in accordance with
* the metric stability policy.
*/
var ( var (
getTokenCounter = prometheus.NewCounter( getTokenCounter = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Name: "get_token_count", Name: "get_token_count",
Help: "Counter of total Token() requests to the alternate token source", Help: "Counter of total Token() requests to the alternate token source",
StabilityLevel: metrics.ALPHA,
}, },
) )
getTokenFailCounter = prometheus.NewCounter( getTokenFailCounter = metrics.NewCounter(
prometheus.CounterOpts{ &metrics.CounterOpts{
Name: "get_token_fail_count", Name: "get_token_fail_count",
Help: "Counter of failed Token() requests to the alternate token source", Help: "Counter of failed Token() requests to the alternate token source",
StabilityLevel: metrics.ALPHA,
}, },
) )
) )
func init() { func init() {
prometheus.MustRegister(getTokenCounter) legacyregistry.MustRegister(getTokenCounter)
prometheus.MustRegister(getTokenFailCounter) legacyregistry.MustRegister(getTokenFailCounter)
} }
// AltTokenSource is the structure holding the data for the functionality needed to generates tokens // AltTokenSource is the structure holding the data for the functionality needed to generates tokens

View File

@ -33,6 +33,7 @@ github.com/aws/aws-sdk-go v1.16.26 h1:GWkl3rkRO/JGRTWoLLIqwf7AWC4/W/1hMOUZqmX0js
github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs=
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=

4
vendor/modules.txt vendored
View File

@ -1638,6 +1638,10 @@ k8s.io/component-base/featuregate/testing
k8s.io/component-base/logs k8s.io/component-base/logs
k8s.io/component-base/metrics k8s.io/component-base/metrics
k8s.io/component-base/metrics/legacyregistry k8s.io/component-base/metrics/legacyregistry
k8s.io/component-base/metrics/prometheus/clientgo
k8s.io/component-base/metrics/prometheus/clientgo/leaderelection
k8s.io/component-base/metrics/prometheus/restclient
k8s.io/component-base/metrics/prometheus/workqueue
k8s.io/component-base/version k8s.io/component-base/version
# k8s.io/cri-api v0.0.0 => ./staging/src/k8s.io/cri-api # k8s.io/cri-api v0.0.0 => ./staging/src/k8s.io/cri-api
k8s.io/cri-api/pkg/apis k8s.io/cri-api/pkg/apis