From 45ed99c3a68fd26056b7839d232ccd80bf42c35d Mon Sep 17 00:00:00 2001 From: Wojciech Tyczynski Date: Tue, 16 May 2017 13:11:58 +0200 Subject: [PATCH] Add syncProxyRules prometheus metric --- cmd/kube-proxy/app/server.go | 1 + pkg/proxy/iptables/BUILD | 6 ++++- pkg/proxy/iptables/metrics.go | 50 +++++++++++++++++++++++++++++++++++ pkg/proxy/iptables/proxier.go | 1 + 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 pkg/proxy/iptables/metrics.go diff --git a/cmd/kube-proxy/app/server.go b/cmd/kube-proxy/app/server.go index 2e465eea3ed..eb98919eda0 100644 --- a/cmd/kube-proxy/app/server.go +++ b/cmd/kube-proxy/app/server.go @@ -424,6 +424,7 @@ func NewProxyServer(config *componentconfig.KubeProxyConfiguration, cleanupAndEx if err != nil { return nil, fmt.Errorf("unable to create proxier: %v", err) } + iptables.RegisterMetrics() proxier = proxierIPTables serviceEventHandler = proxierIPTables endpointsEventHandler = proxierIPTables diff --git a/pkg/proxy/iptables/BUILD b/pkg/proxy/iptables/BUILD index 4a2d71e594f..56019173f6e 100644 --- a/pkg/proxy/iptables/BUILD +++ b/pkg/proxy/iptables/BUILD @@ -10,7 +10,10 @@ load( go_library( name = "go_default_library", - srcs = ["proxier.go"], + srcs = [ + "metrics.go", + "proxier.go", + ], tags = ["automanaged"], deps = [ "//pkg/api:go_default_library", @@ -25,6 +28,7 @@ go_library( "//pkg/util/sysctl:go_default_library", "//pkg/util/version:go_default_library", "//vendor/github.com/golang/glog:go_default_library", + "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", diff --git a/pkg/proxy/iptables/metrics.go b/pkg/proxy/iptables/metrics.go new file mode 100644 index 00000000000..fabe6a59569 --- /dev/null +++ b/pkg/proxy/iptables/metrics.go @@ -0,0 +1,50 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package iptables + +import ( + "sync" + "time" + + "github.com/prometheus/client_golang/prometheus" +) + +const kubeProxySubsystem = "kubeproxy" + +var ( + SyncProxyRulesLatency = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Subsystem: kubeProxySubsystem, + Name: "sync_proxy_rules_latency_microseconds", + Help: "SyncProxyRules latency", + Buckets: prometheus.ExponentialBuckets(1000, 2, 15), + }, + ) +) + +var registerMetricsOnce sync.Once + +func RegisterMetrics() { + registerMetricsOnce.Do(func() { + prometheus.MustRegister(SyncProxyRulesLatency) + }) +} + +// Gets the time since the specified start in microseconds. +func sinceInMicroseconds(start time.Time) float64 { + return float64(time.Since(start).Nanoseconds() / time.Microsecond.Nanoseconds()) +} diff --git a/pkg/proxy/iptables/proxier.go b/pkg/proxy/iptables/proxier.go index b126b66ab49..1a6f6e62ac4 100644 --- a/pkg/proxy/iptables/proxier.go +++ b/pkg/proxy/iptables/proxier.go @@ -885,6 +885,7 @@ func (proxier *Proxier) syncProxyRules() { } start := time.Now() defer func() { + SyncProxyRulesLatency.Observe(sinceInMicroseconds(start)) glog.V(4).Infof("syncProxyRules took %v", time.Since(start)) }() // don't sync rules till we've received services and endpoints