From 84c9c25edf2207398771735d2fd9ff9f3621000f Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Tue, 22 Aug 2017 09:58:50 -0700 Subject: [PATCH 1/2] GCE: Add functions for Alpha address and forwarding rules --- .../providers/gce/gce_addresses.go | 18 +++++++++++++++++ .../providers/gce/gce_addresses_fakes.go | 9 +++++++++ .../providers/gce/gce_forwardingrule.go | 20 +++++++++++++++++++ .../providers/gce/gce_interfaces.go | 9 ++++++++- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/pkg/cloudprovider/providers/gce/gce_addresses.go b/pkg/cloudprovider/providers/gce/gce_addresses.go index 0a7b0d199741..f3bd9dea7804 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses.go @@ -21,6 +21,7 @@ import ( "time" "github.com/golang/glog" + computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" ) @@ -71,6 +72,16 @@ func (gce *GCECloud) ReserveRegionAddress(addr *compute.Address, region string) return gce.waitForRegionOp(op, region, mc) } +// ReserveAlphaRegionAddress creates an Alpha, regional address. +func (gce *GCECloud) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error { + mc := newAddressMetricContext("reserve", region) + op, err := gce.serviceAlpha.Addresses.Insert(gce.projectID, region, addr).Do() + if err != nil { + return mc.Observe(err) + } + return gce.waitForRegionOp(op, region, mc) +} + // DeleteRegionAddress deletes a region address by name. func (gce *GCECloud) DeleteRegionAddress(name, region string) error { mc := newAddressMetricContext("delete", region) @@ -88,6 +99,13 @@ func (gce *GCECloud) GetRegionAddress(name, region string) (*compute.Address, er return v, mc.Observe(err) } +// GetAlphaRegionAddress returns the Alpha, regional address by name. +func (gce *GCECloud) GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) { + mc := newAddressMetricContext("get", region) + v, err := gce.serviceAlpha.Addresses.Get(gce.projectID, region, name).Do() + return v, mc.Observe(err) +} + // GetRegionAddressByIP returns the regional address matching the given IP // address. func (gce *GCECloud) GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) { diff --git a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go index c114c1b66ca4..ce4422a7fd51 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses_fakes.go @@ -20,6 +20,7 @@ import ( "fmt" "net/http" + computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" "google.golang.org/api/googleapi" ) @@ -103,3 +104,11 @@ func (cas *FakeCloudAddressService) GetRegionAddressByIP(region, ipAddress strin } return nil, makeGoogleAPINotFoundError("") } + +func (cas *FakeCloudAddressService) GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) { + return nil, fmt.Errorf("not implemented") +} + +func (cas *FakeCloudAddressService) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error { + return fmt.Errorf("not implemented") +} diff --git a/pkg/cloudprovider/providers/gce/gce_forwardingrule.go b/pkg/cloudprovider/providers/gce/gce_forwardingrule.go index 47c5f20c3b64..8a7110da6ba2 100644 --- a/pkg/cloudprovider/providers/gce/gce_forwardingrule.go +++ b/pkg/cloudprovider/providers/gce/gce_forwardingrule.go @@ -19,6 +19,7 @@ package gce import ( "time" + computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" ) @@ -85,6 +86,13 @@ func (gce *GCECloud) GetRegionForwardingRule(name, region string) (*compute.Forw return v, mc.Observe(err) } +// GetAlphaRegionForwardingRule returns the Alpha forwarding rule by name & region. +func (gce *GCECloud) GetAlphaRegionForwardingRule(name, region string) (*computealpha.ForwardingRule, error) { + mc := newForwardingRuleMetricContext("get", region) + v, err := gce.serviceAlpha.ForwardingRules.Get(gce.projectID, region, name).Do() + return v, mc.Observe(err) +} + // ListRegionForwardingRules lists all RegionalForwardingRules in the project & region. func (gce *GCECloud) ListRegionForwardingRules(region string) (*compute.ForwardingRuleList, error) { mc := newForwardingRuleMetricContext("list", region) @@ -105,6 +113,18 @@ func (gce *GCECloud) CreateRegionForwardingRule(rule *compute.ForwardingRule, re return gce.waitForRegionOp(op, region, mc) } +// CreateAlphaRegionForwardingRule creates and returns an Alpha +// forwarding fule in the given region. +func (gce *GCECloud) CreateAlphaRegionForwardingRule(rule *computealpha.ForwardingRule, region string) error { + mc := newForwardingRuleMetricContext("create", region) + op, err := gce.serviceAlpha.ForwardingRules.Insert(gce.projectID, region, rule).Do() + if err != nil { + return mc.Observe(err) + } + + return gce.waitForRegionOp(op, region, mc) +} + // DeleteRegionForwardingRule deletes the RegionalForwardingRule by name & region. func (gce *GCECloud) DeleteRegionForwardingRule(name, region string) error { mc := newForwardingRuleMetricContext("delete", region) diff --git a/pkg/cloudprovider/providers/gce/gce_interfaces.go b/pkg/cloudprovider/providers/gce/gce_interfaces.go index 43ce54afd5cf..34fcdde42782 100644 --- a/pkg/cloudprovider/providers/gce/gce_interfaces.go +++ b/pkg/cloudprovider/providers/gce/gce_interfaces.go @@ -16,7 +16,10 @@ limitations under the License. package gce -import compute "google.golang.org/api/compute/v1" +import ( + computealpha "google.golang.org/api/compute/v0.alpha" + compute "google.golang.org/api/compute/v1" +) // CloudAddressService is an interface for managing addresses type CloudAddressService interface { @@ -25,4 +28,8 @@ type CloudAddressService interface { GetRegionAddressByIP(region, ipAddress string) (*compute.Address, error) // TODO: Mock `DeleteRegionAddress(name, region string) endpoint // TODO: Mock Global endpoints + + // Alpha API. + GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) + ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error } From 0d1efd5e78a44659c049387918b336cefc41c50b Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Tue, 22 Aug 2017 16:13:46 -0700 Subject: [PATCH 2/2] GCE: add a new label "version" for metrics --- pkg/cloudprovider/providers/gce/BUILD | 1 + .../providers/gce/gce_addresses.go | 14 +++++----- .../providers/gce/gce_backendservice.go | 6 +--- pkg/cloudprovider/providers/gce/gce_cert.go | 6 +--- .../providers/gce/gce_clusters.go | 7 +---- pkg/cloudprovider/providers/gce/gce_disks.go | 6 +--- .../providers/gce/gce_firewall.go | 7 +---- .../providers/gce/gce_forwardingrule.go | 14 ++++------ .../providers/gce/gce_healthchecks.go | 7 +---- .../providers/gce/gce_instancegroup.go | 11 ++------ .../providers/gce/gce_instances.go | 5 +--- .../providers/gce/gce_loadbalancer.go | 6 +--- pkg/cloudprovider/providers/gce/gce_routes.go | 6 +--- .../providers/gce/gce_targetpool.go | 11 ++------ .../providers/gce/gce_targetproxy.go | 6 +--- pkg/cloudprovider/providers/gce/gce_urlmap.go | 6 +--- pkg/cloudprovider/providers/gce/gce_zones.go | 6 +--- pkg/cloudprovider/providers/gce/metrics.go | 25 +++++++++++++++-- .../providers/gce/metrics_test.go | 28 +++++++++++++++++++ 19 files changed, 80 insertions(+), 98 deletions(-) create mode 100644 pkg/cloudprovider/providers/gce/metrics_test.go diff --git a/pkg/cloudprovider/providers/gce/BUILD b/pkg/cloudprovider/providers/gce/BUILD index f33f482e6e93..23b674b5554c 100644 --- a/pkg/cloudprovider/providers/gce/BUILD +++ b/pkg/cloudprovider/providers/gce/BUILD @@ -82,6 +82,7 @@ go_test( "gce_healthchecks_test.go", "gce_loadbalancer_external_test.go", "gce_test.go", + "metrics_test.go", ], library = ":go_default_library", deps = [ diff --git a/pkg/cloudprovider/providers/gce/gce_addresses.go b/pkg/cloudprovider/providers/gce/gce_addresses.go index f3bd9dea7804..7e963e901bd3 100644 --- a/pkg/cloudprovider/providers/gce/gce_addresses.go +++ b/pkg/cloudprovider/providers/gce/gce_addresses.go @@ -18,7 +18,6 @@ package gce import ( "fmt" - "time" "github.com/golang/glog" computealpha "google.golang.org/api/compute/v0.alpha" @@ -26,10 +25,11 @@ import ( ) func newAddressMetricContext(request, region string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"address_" + request, region, unusedMetricLabel}, - } + return newAddressMetricContextWithVersion(request, region, computeV1Version) +} + +func newAddressMetricContextWithVersion(request, region, version string) *metricContext { + return newGenericMetricContext("address", request, region, unusedMetricLabel, version) } // ReserveGlobalAddress creates a global address. @@ -74,7 +74,7 @@ func (gce *GCECloud) ReserveRegionAddress(addr *compute.Address, region string) // ReserveAlphaRegionAddress creates an Alpha, regional address. func (gce *GCECloud) ReserveAlphaRegionAddress(addr *computealpha.Address, region string) error { - mc := newAddressMetricContext("reserve", region) + mc := newAddressMetricContextWithVersion("reserve", region, computeAlphaVersion) op, err := gce.serviceAlpha.Addresses.Insert(gce.projectID, region, addr).Do() if err != nil { return mc.Observe(err) @@ -101,7 +101,7 @@ func (gce *GCECloud) GetRegionAddress(name, region string) (*compute.Address, er // GetAlphaRegionAddress returns the Alpha, regional address by name. func (gce *GCECloud) GetAlphaRegionAddress(name, region string) (*computealpha.Address, error) { - mc := newAddressMetricContext("get", region) + mc := newAddressMetricContextWithVersion("get", region, computeAlphaVersion) v, err := gce.serviceAlpha.Addresses.Get(gce.projectID, region, name).Do() return v, mc.Observe(err) } diff --git a/pkg/cloudprovider/providers/gce/gce_backendservice.go b/pkg/cloudprovider/providers/gce/gce_backendservice.go index d460c6157d86..7bf3d73e0d88 100644 --- a/pkg/cloudprovider/providers/gce/gce_backendservice.go +++ b/pkg/cloudprovider/providers/gce/gce_backendservice.go @@ -18,16 +18,12 @@ package gce import ( "net/http" - "time" compute "google.golang.org/api/compute/v1" ) func newBackendServiceMetricContext(request, region string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"backendservice_" + request, region, unusedMetricLabel}, - } + return newGenericMetricContext("backendservice", request, region, unusedMetricLabel, computeV1Version) } // GetGlobalBackendService retrieves a backend by name. diff --git a/pkg/cloudprovider/providers/gce/gce_cert.go b/pkg/cloudprovider/providers/gce/gce_cert.go index 77af58bbe3c4..e981fe71765e 100644 --- a/pkg/cloudprovider/providers/gce/gce_cert.go +++ b/pkg/cloudprovider/providers/gce/gce_cert.go @@ -18,16 +18,12 @@ package gce import ( "net/http" - "time" compute "google.golang.org/api/compute/v1" ) func newCertMetricContext(request string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"cert_" + request, unusedMetricLabel, unusedMetricLabel}, - } + return newGenericMetricContext("cert", request, unusedMetricLabel, unusedMetricLabel, computeV1Version) } // GetSslCertificate returns the SslCertificate by name. diff --git a/pkg/cloudprovider/providers/gce/gce_clusters.go b/pkg/cloudprovider/providers/gce/gce_clusters.go index 4524d483f693..dad330ca5d55 100644 --- a/pkg/cloudprovider/providers/gce/gce_clusters.go +++ b/pkg/cloudprovider/providers/gce/gce_clusters.go @@ -16,13 +16,8 @@ limitations under the License. package gce -import "time" - func newClustersMetricContext(request, zone string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"clusters_" + request, unusedMetricLabel, zone}, - } + return newGenericMetricContext("clusters", request, unusedMetricLabel, zone, computeV1Version) } func (gce *GCECloud) ListClusters() ([]string, error) { diff --git a/pkg/cloudprovider/providers/gce/gce_disks.go b/pkg/cloudprovider/providers/gce/gce_disks.go index c916989b5ee2..57ca223da733 100644 --- a/pkg/cloudprovider/providers/gce/gce_disks.go +++ b/pkg/cloudprovider/providers/gce/gce_disks.go @@ -21,7 +21,6 @@ import ( "fmt" "net/http" "strings" - "time" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider" @@ -85,10 +84,7 @@ type GCEDisk struct { } func newDiskMetricContext(request, zone string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"disk_" + request, unusedMetricLabel, zone}, - } + return newGenericMetricContext("disk", request, unusedMetricLabel, zone, computeV1Version) } func (gce *GCECloud) AttachDisk(diskName string, nodeName types.NodeName, readOnly bool) error { diff --git a/pkg/cloudprovider/providers/gce/gce_firewall.go b/pkg/cloudprovider/providers/gce/gce_firewall.go index 668f2e055222..b08d3f280674 100644 --- a/pkg/cloudprovider/providers/gce/gce_firewall.go +++ b/pkg/cloudprovider/providers/gce/gce_firewall.go @@ -17,16 +17,11 @@ limitations under the License. package gce import ( - "time" - compute "google.golang.org/api/compute/v1" ) func newFirewallMetricContext(request string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"firewall_" + request, unusedMetricLabel, unusedMetricLabel}, - } + return newGenericMetricContext("firewall", request, unusedMetricLabel, unusedMetricLabel, computeV1Version) } // GetFirewall returns the Firewall by name. diff --git a/pkg/cloudprovider/providers/gce/gce_forwardingrule.go b/pkg/cloudprovider/providers/gce/gce_forwardingrule.go index 8a7110da6ba2..0473c44266d6 100644 --- a/pkg/cloudprovider/providers/gce/gce_forwardingrule.go +++ b/pkg/cloudprovider/providers/gce/gce_forwardingrule.go @@ -17,17 +17,15 @@ limitations under the License. package gce import ( - "time" - computealpha "google.golang.org/api/compute/v0.alpha" compute "google.golang.org/api/compute/v1" ) func newForwardingRuleMetricContext(request, region string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"forwardingrule_" + request, region, unusedMetricLabel}, - } + return newForwardingRuleMetricContextWithVersion(request, region, computeV1Version) +} +func newForwardingRuleMetricContextWithVersion(request, region, version string) *metricContext { + return newGenericMetricContext("forwardingrule", request, region, unusedMetricLabel, version) } // CreateGlobalForwardingRule creates the passed GlobalForwardingRule @@ -88,7 +86,7 @@ func (gce *GCECloud) GetRegionForwardingRule(name, region string) (*compute.Forw // GetAlphaRegionForwardingRule returns the Alpha forwarding rule by name & region. func (gce *GCECloud) GetAlphaRegionForwardingRule(name, region string) (*computealpha.ForwardingRule, error) { - mc := newForwardingRuleMetricContext("get", region) + mc := newForwardingRuleMetricContextWithVersion("get", region, computeAlphaVersion) v, err := gce.serviceAlpha.ForwardingRules.Get(gce.projectID, region, name).Do() return v, mc.Observe(err) } @@ -116,7 +114,7 @@ func (gce *GCECloud) CreateRegionForwardingRule(rule *compute.ForwardingRule, re // CreateAlphaRegionForwardingRule creates and returns an Alpha // forwarding fule in the given region. func (gce *GCECloud) CreateAlphaRegionForwardingRule(rule *computealpha.ForwardingRule, region string) error { - mc := newForwardingRuleMetricContext("create", region) + mc := newForwardingRuleMetricContextWithVersion("create", region, computeAlphaVersion) op, err := gce.serviceAlpha.ForwardingRules.Insert(gce.projectID, region, rule).Do() if err != nil { return mc.Observe(err) diff --git a/pkg/cloudprovider/providers/gce/gce_healthchecks.go b/pkg/cloudprovider/providers/gce/gce_healthchecks.go index 9fd2989b2a67..85f077f0007c 100644 --- a/pkg/cloudprovider/providers/gce/gce_healthchecks.go +++ b/pkg/cloudprovider/providers/gce/gce_healthchecks.go @@ -17,8 +17,6 @@ limitations under the License. package gce import ( - "time" - "k8s.io/api/core/v1" "k8s.io/kubernetes/pkg/master/ports" utilversion "k8s.io/kubernetes/pkg/util/version" @@ -45,10 +43,7 @@ func init() { } func newHealthcheckMetricContext(request string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"healthcheck_" + request, unusedMetricLabel, unusedMetricLabel}, - } + return newGenericMetricContext("healthcheck", request, unusedMetricLabel, unusedMetricLabel, computeV1Version) } // GetHttpHealthCheck returns the given HttpHealthCheck by name. diff --git a/pkg/cloudprovider/providers/gce/gce_instancegroup.go b/pkg/cloudprovider/providers/gce/gce_instancegroup.go index 044847ab3b42..67083224bb2c 100644 --- a/pkg/cloudprovider/providers/gce/gce_instancegroup.go +++ b/pkg/cloudprovider/providers/gce/gce_instancegroup.go @@ -16,17 +16,10 @@ limitations under the License. package gce -import ( - "time" - - compute "google.golang.org/api/compute/v1" -) +import compute "google.golang.org/api/compute/v1" func newInstanceGroupMetricContext(request string, zone string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"instancegroup_" + request, unusedMetricLabel, zone}, - } + return newGenericMetricContext("instancegroup", request, unusedMetricLabel, zone, computeV1Version) } // CreateInstanceGroup creates an instance group with the given diff --git a/pkg/cloudprovider/providers/gce/gce_instances.go b/pkg/cloudprovider/providers/gce/gce_instances.go index 8d997ae9ed4f..4c1c4af6c966 100644 --- a/pkg/cloudprovider/providers/gce/gce_instances.go +++ b/pkg/cloudprovider/providers/gce/gce_instances.go @@ -41,10 +41,7 @@ const ( ) func newInstancesMetricContext(request, zone string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"instances_" + request, unusedMetricLabel, zone}, - } + return newGenericMetricContext("instances", request, unusedMetricLabel, zone, computeV1Version) } func splitNodesByZone(nodes []*v1.Node) map[string][]*v1.Node { diff --git a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go index 7026df8fea12..ba2fa03cdb8c 100644 --- a/pkg/cloudprovider/providers/gce/gce_loadbalancer.go +++ b/pkg/cloudprovider/providers/gce/gce_loadbalancer.go @@ -21,7 +21,6 @@ import ( "fmt" "net" "strings" - "time" "github.com/golang/glog" @@ -40,10 +39,7 @@ var ( ) func newLoadBalancerMetricContext(request, region string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"loadbalancer_" + request, region, unusedMetricLabel}, - } + return newGenericMetricContext("loadbalancer", request, region, unusedMetricLabel, computeV1Version) } type lbScheme string diff --git a/pkg/cloudprovider/providers/gce/gce_routes.go b/pkg/cloudprovider/providers/gce/gce_routes.go index 1e0d82661b53..5f6459cd1a8c 100644 --- a/pkg/cloudprovider/providers/gce/gce_routes.go +++ b/pkg/cloudprovider/providers/gce/gce_routes.go @@ -20,7 +20,6 @@ import ( "fmt" "net/http" "path" - "time" "k8s.io/apimachinery/pkg/types" "k8s.io/kubernetes/pkg/cloudprovider" @@ -30,10 +29,7 @@ import ( ) func newRoutesMetricContext(request string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"routes_" + request, unusedMetricLabel, unusedMetricLabel}, - } + return newGenericMetricContext("routes", request, unusedMetricLabel, unusedMetricLabel, computeV1Version) } func (gce *GCECloud) ListRoutes(clusterName string) ([]*cloudprovider.Route, error) { diff --git a/pkg/cloudprovider/providers/gce/gce_targetpool.go b/pkg/cloudprovider/providers/gce/gce_targetpool.go index 9de1f6befb93..0efe15adfc0f 100644 --- a/pkg/cloudprovider/providers/gce/gce_targetpool.go +++ b/pkg/cloudprovider/providers/gce/gce_targetpool.go @@ -16,17 +16,10 @@ limitations under the License. package gce -import ( - "time" - - compute "google.golang.org/api/compute/v1" -) +import compute "google.golang.org/api/compute/v1" func newTargetPoolMetricContext(request, region string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"targetpool_" + request, region, unusedMetricLabel}, - } + return newGenericMetricContext("targetpool", request, region, unusedMetricLabel, computeV1Version) } // GetTargetPool returns the TargetPool by name. diff --git a/pkg/cloudprovider/providers/gce/gce_targetproxy.go b/pkg/cloudprovider/providers/gce/gce_targetproxy.go index af5a52855d4b..b92206cfc4e0 100644 --- a/pkg/cloudprovider/providers/gce/gce_targetproxy.go +++ b/pkg/cloudprovider/providers/gce/gce_targetproxy.go @@ -18,16 +18,12 @@ package gce import ( "net/http" - "time" compute "google.golang.org/api/compute/v1" ) func newTargetProxyMetricContext(request string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"targetproxy_" + request, unusedMetricLabel, unusedMetricLabel}, - } + return newGenericMetricContext("targetproxy", request, unusedMetricLabel, unusedMetricLabel, computeV1Version) } // GetTargetHttpProxy returns the UrlMap by name. diff --git a/pkg/cloudprovider/providers/gce/gce_urlmap.go b/pkg/cloudprovider/providers/gce/gce_urlmap.go index f19db2f23a70..60184ac43549 100644 --- a/pkg/cloudprovider/providers/gce/gce_urlmap.go +++ b/pkg/cloudprovider/providers/gce/gce_urlmap.go @@ -18,16 +18,12 @@ package gce import ( "net/http" - "time" compute "google.golang.org/api/compute/v1" ) func newUrlMapMetricContext(request string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"urlmap_" + request, unusedMetricLabel, unusedMetricLabel}, - } + return newGenericMetricContext("urlmap", request, unusedMetricLabel, unusedMetricLabel, computeV1Version) } // GetUrlMap returns the UrlMap by name. diff --git a/pkg/cloudprovider/providers/gce/gce_zones.go b/pkg/cloudprovider/providers/gce/gce_zones.go index 3179e7578928..212e740893c7 100644 --- a/pkg/cloudprovider/providers/gce/gce_zones.go +++ b/pkg/cloudprovider/providers/gce/gce_zones.go @@ -18,7 +18,6 @@ package gce import ( "fmt" - "time" compute "google.golang.org/api/compute/v1" @@ -27,10 +26,7 @@ import ( ) func newZonesMetricContext(request, region string) *metricContext { - return &metricContext{ - start: time.Now(), - attributes: []string{"zones_" + request, region, unusedMetricLabel}, - } + return newGenericMetricContext("zones", request, region, unusedMetricLabel, computeV1Version) } // GetZone creates a cloudprovider.Zone of the current zone and region diff --git a/pkg/cloudprovider/providers/gce/metrics.go b/pkg/cloudprovider/providers/gce/metrics.go index 16536898f9b5..649bd11b132b 100644 --- a/pkg/cloudprovider/providers/gce/metrics.go +++ b/pkg/cloudprovider/providers/gce/metrics.go @@ -22,21 +22,33 @@ import ( "github.com/prometheus/client_golang/prometheus" ) +const ( + // Version strings for recording metrics. + computeV1Version = "v1" + computeAlphaVersion = "alpha" + computeBetaVersion = "beta" +) + type apiCallMetrics struct { latency *prometheus.HistogramVec errors *prometheus.CounterVec } var ( - apiMetrics = registerAPIMetrics( + metricLabels = []string{ "request", // API function that is begin invoked. "region", // region (optional). "zone", // zone (optional). - ) + "version", // API version. + } + + apiMetrics = registerAPIMetrics(metricLabels...) ) type metricContext struct { - start time.Time + start time.Time + // The cardinalities of attributes and metricLabels (defined above) must + // match, or prometheus will panic. attributes []string } @@ -54,6 +66,13 @@ func (mc *metricContext) Observe(err error) error { return err } +func newGenericMetricContext(prefix, request, region, zone, version string) *metricContext { + return &metricContext{ + start: time.Now(), + attributes: []string{prefix + "_" + request, region, zone, version}, + } +} + // registerApiMetrics adds metrics definitions for a category of API calls. func registerAPIMetrics(attributes ...string) *apiCallMetrics { metrics := &apiCallMetrics{ diff --git a/pkg/cloudprovider/providers/gce/metrics_test.go b/pkg/cloudprovider/providers/gce/metrics_test.go new file mode 100644 index 000000000000..89fde2ac4b66 --- /dev/null +++ b/pkg/cloudprovider/providers/gce/metrics_test.go @@ -0,0 +1,28 @@ +/* +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 gce + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestVerifyMetricLabelCardinality(t *testing.T) { + mc := newGenericMetricContext("foo", "get", "us-central1", "", "alpha") + assert.Len(t, mc.attributes, len(metricLabels), "cardinalities of labels and values must match") +}