Merge pull request #69895 from jpbetz/webhook-metrics-cardinality-fix

Reduce cardinality of admission webhook metrics
This commit is contained in:
k8s-ci-robot 2018-10-22 14:21:29 -07:00 committed by GitHub
commit 04d3949048
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 32 deletions

View File

@ -112,17 +112,17 @@ func newAdmissionMetrics() *AdmissionMetrics {
// Admission metrics for a step of the admission flow. The entire admission flow is broken down into a series of steps // Admission metrics for a step of the admission flow. The entire admission flow is broken down into a series of steps
// Each step is identified by a distinct type label value. // Each step is identified by a distinct type label value.
step := newMetricSet("step", step := newMetricSet("step",
[]string{"type", "operation", "group", "version", "resource", "subresource", "rejected"}, []string{"type", "operation", "rejected"},
"Admission sub-step %s, broken out for each operation and API resource and step type (validate or admit).", true) "Admission sub-step %s, broken out for each operation and API resource and step type (validate or admit).", true)
// Built-in admission controller metrics. Each admission controller is identified by name. // Built-in admission controller metrics. Each admission controller is identified by name.
controller := newMetricSet("controller", controller := newMetricSet("controller",
[]string{"name", "type", "operation", "group", "version", "resource", "subresource", "rejected"}, []string{"name", "type", "operation", "rejected"},
"Admission controller %s, identified by name and broken out for each operation and API resource and type (validate or admit).", false) "Admission controller %s, identified by name and broken out for each operation and API resource and type (validate or admit).", false)
// Admission webhook metrics. Each webhook is identified by name. // Admission webhook metrics. Each webhook is identified by name.
webhook := newMetricSet("webhook", webhook := newMetricSet("webhook",
[]string{"name", "type", "operation", "group", "version", "resource", "subresource", "rejected"}, []string{"name", "type", "operation", "rejected"},
"Admission webhook %s, identified by name and broken out for each operation and API resource and type (validate or admit).", false) "Admission webhook %s, identified by name and broken out for each operation and API resource and type (validate or admit).", false)
step.mustRegister() step.mustRegister()
@ -139,20 +139,17 @@ func (m *AdmissionMetrics) reset() {
// ObserveAdmissionStep records admission related metrics for a admission step, identified by step type. // ObserveAdmissionStep records admission related metrics for a admission step, identified by step type.
func (m *AdmissionMetrics) ObserveAdmissionStep(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { func (m *AdmissionMetrics) ObserveAdmissionStep(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) {
gvr := attr.GetResource() m.step.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...)
m.step.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), gvr.Group, gvr.Version, gvr.Resource, attr.GetSubresource(), strconv.FormatBool(rejected))...)
} }
// ObserveAdmissionController records admission related metrics for a built-in admission controller, identified by it's plugin handler name. // ObserveAdmissionController records admission related metrics for a built-in admission controller, identified by it's plugin handler name.
func (m *AdmissionMetrics) ObserveAdmissionController(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { func (m *AdmissionMetrics) ObserveAdmissionController(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) {
gvr := attr.GetResource() m.controller.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...)
m.controller.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), gvr.Group, gvr.Version, gvr.Resource, attr.GetSubresource(), strconv.FormatBool(rejected))...)
} }
// ObserveWebhook records admission related metrics for a admission webhook. // ObserveWebhook records admission related metrics for a admission webhook.
func (m *AdmissionMetrics) ObserveWebhook(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) { func (m *AdmissionMetrics) ObserveWebhook(elapsed time.Duration, rejected bool, attr admission.Attributes, stepType string, extraLabels ...string) {
gvr := attr.GetResource() m.webhook.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), strconv.FormatBool(rejected))...)
m.webhook.observe(elapsed, append(extraLabels, stepType, string(attr.GetOperation()), gvr.Group, gvr.Version, gvr.Resource, attr.GetSubresource(), strconv.FormatBool(rejected))...)
} }
type metricSet struct { type metricSet struct {

View File

@ -37,13 +37,9 @@ func TestObserveAdmissionStep(t *testing.T) {
handler.(admission.MutationInterface).Admit(attr) handler.(admission.MutationInterface).Admit(attr)
handler.(admission.ValidationInterface).Validate(attr) handler.(admission.ValidationInterface).Validate(attr)
wantLabels := map[string]string{ wantLabels := map[string]string{
"operation": string(admission.Create), "operation": string(admission.Create),
"group": resource.Group, "type": "admit",
"version": resource.Version, "rejected": "false",
"resource": resource.Resource,
"subresource": "subresource",
"type": "admit",
"rejected": "false",
} }
expectHistogramCountTotal(t, "apiserver_admission_step_admission_latencies_seconds", wantLabels, 1) expectHistogramCountTotal(t, "apiserver_admission_step_admission_latencies_seconds", wantLabels, 1)
expectFindMetric(t, "apiserver_admission_step_admission_latencies_seconds_summary", wantLabels) expectFindMetric(t, "apiserver_admission_step_admission_latencies_seconds_summary", wantLabels)
@ -59,14 +55,10 @@ func TestObserveAdmissionController(t *testing.T) {
handler.(admission.MutationInterface).Admit(attr) handler.(admission.MutationInterface).Admit(attr)
handler.(admission.ValidationInterface).Validate(attr) handler.(admission.ValidationInterface).Validate(attr)
wantLabels := map[string]string{ wantLabels := map[string]string{
"name": "a", "name": "a",
"operation": string(admission.Create), "operation": string(admission.Create),
"group": resource.Group, "type": "admit",
"version": resource.Version, "rejected": "false",
"resource": resource.Resource,
"subresource": "subresource",
"type": "admit",
"rejected": "false",
} }
expectHistogramCountTotal(t, "apiserver_admission_controller_admission_latencies_seconds", wantLabels, 1) expectHistogramCountTotal(t, "apiserver_admission_controller_admission_latencies_seconds", wantLabels, 1)
@ -78,14 +70,10 @@ func TestObserveWebhook(t *testing.T) {
Metrics.reset() Metrics.reset()
Metrics.ObserveWebhook(2*time.Second, false, attr, stepAdmit, "x") Metrics.ObserveWebhook(2*time.Second, false, attr, stepAdmit, "x")
wantLabels := map[string]string{ wantLabels := map[string]string{
"name": "x", "name": "x",
"operation": string(admission.Create), "operation": string(admission.Create),
"group": resource.Group, "type": "admit",
"version": resource.Version, "rejected": "false",
"resource": resource.Resource,
"subresource": "subresource",
"type": "admit",
"rejected": "false",
} }
expectHistogramCountTotal(t, "apiserver_admission_webhook_admission_latencies_seconds", wantLabels, 1) expectHistogramCountTotal(t, "apiserver_admission_webhook_admission_latencies_seconds", wantLabels, 1)
} }