Skip to content

Commit c73f022

Browse files
authored
Merge pull request #932 from Daimler/tobiasgiese/add-metrics
✨ Add GET gophercloud metrics
2 parents a1ccb52 + f459bbc commit c73f022

File tree

9 files changed

+89
-41
lines changed

9 files changed

+89
-41
lines changed

pkg/cloud/services/compute/availabilityzone.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ import (
2020
"fmt"
2121

2222
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones"
23+
24+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
2325
)
2426

2527
func (s *Service) GetAvailabilityZones() ([]availabilityzones.AvailabilityZone, error) {
28+
mc := metrics.NewMetricPrometheusContext("availability_zone", "list")
2629
allPages, err := availabilityzones.List(s.computeClient).AllPages()
27-
if err != nil {
30+
if mc.ObserveRequest(err) != nil {
2831
return nil, fmt.Errorf("error getting availability zone list: %v", err)
2932
}
3033
availabilityZoneList, err := availabilityzones.ExtractAvailabilityZones(allPages)

pkg/cloud/services/compute/instance.go

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,9 @@ func applyServerGroupID(opts servers.CreateOptsBuilder, serverGroupID string) se
330330
}
331331

332332
func (s *Service) getTrunkSupport() (bool, error) {
333+
mc := metrics.NewMetricPrometheusContext("network_extension", "list")
333334
allPages, err := netext.List(s.networkClient).AllPages()
334-
if err != nil {
335+
if mc.ObserveRequest(err) != nil {
335336
return false, err
336337
}
337338

@@ -357,8 +358,9 @@ func (s *Service) getSecurityGroups(securityGroupParams []infrav1.SecurityGroupP
357358
}
358359
listOpts.Name = sg.Name
359360
listOpts.ID = sg.UUID
361+
mc := metrics.NewMetricPrometheusContext("security_group", "list")
360362
pages, err := groups.List(s.networkClient, listOpts).AllPages()
361-
if err != nil {
363+
if mc.ObserveRequest(err) != nil {
362364
return nil, err
363365
}
364366

@@ -422,11 +424,12 @@ func (s *Service) getServerNetworks(networkParams []infrav1.NetworkParam) ([]inf
422424
}
423425

424426
func (s *Service) getOrCreatePort(eventObject runtime.Object, clusterName string, portName string, net infrav1.Network, instanceSecurityGroups *[]string) (*ports.Port, error) {
427+
mc := metrics.NewMetricPrometheusContext("port", "list")
425428
allPages, err := ports.List(s.networkClient, ports.ListOpts{
426429
Name: portName,
427430
NetworkID: net.ID,
428431
}).AllPages()
429-
if err != nil {
432+
if mc.ObserveRequest(err) != nil {
430433
return nil, fmt.Errorf("searching for existing port for server: %v", err)
431434
}
432435
existingPorts, err := ports.ExtractPorts(allPages)
@@ -491,8 +494,8 @@ func (s *Service) getOrCreatePort(eventObject runtime.Object, clusterName string
491494
if len(fixedIPs) > 0 {
492495
createOpts.FixedIPs = fixedIPs
493496
}
494-
mc := metrics.NewMetricPrometheusContext("port", "create")
495497

498+
mc = metrics.NewMetricPrometheusContext("port", "create")
496499
port, err := ports.Create(s.networkClient, portsbinding.CreateOptsExt{
497500
CreateOptsBuilder: createOpts,
498501
HostID: portOpts.HostID,
@@ -509,11 +512,12 @@ func (s *Service) getOrCreatePort(eventObject runtime.Object, clusterName string
509512
}
510513

511514
func (s *Service) getOrCreateTrunk(eventObject runtime.Object, clusterName, trunkName, portID string) (*trunks.Trunk, error) {
515+
mc := metrics.NewMetricPrometheusContext("trunk", "list")
512516
allPages, err := trunks.List(s.networkClient, trunks.ListOpts{
513517
Name: trunkName,
514518
PortID: portID,
515519
}).AllPages()
516-
if err != nil {
520+
if mc.ObserveRequest(err) != nil {
517521
return nil, fmt.Errorf("searching for existing trunk for server: %v", err)
518522
}
519523
trunkList, err := trunks.ExtractTrunks(allPages)
@@ -530,8 +534,8 @@ func (s *Service) getOrCreateTrunk(eventObject runtime.Object, clusterName, trun
530534
PortID: portID,
531535
Description: names.GetDescription(clusterName),
532536
}
533-
mc := metrics.NewMetricPrometheusContext("trunk", "create")
534537

538+
mc = metrics.NewMetricPrometheusContext("trunk", "create")
535539
trunk, err := trunks.Create(s.networkClient, trunkCreateOpts).Extract()
536540
if mc.ObserveRequest(err) != nil {
537541
record.Warnf(eventObject, "FailedCreateTrunk", "Failed to create trunk %s: %v", trunkName, err)
@@ -566,8 +570,9 @@ func (s *Service) getImageID(imageName string) (string, error) {
566570
Name: imageName,
567571
}
568572

573+
mc := metrics.NewMetricPrometheusContext("image", "list")
569574
pages, err := images.List(s.imagesClient, opts).AllPages()
570-
if err != nil {
575+
if mc.ObserveRequest(err) != nil {
571576
return "", err
572577
}
573578

@@ -608,8 +613,9 @@ func (s *Service) DeleteInstance(eventObject runtime.Object, instanceName string
608613
return nil
609614
}
610615

616+
mc := metrics.NewMetricPrometheusContext("server_os_interface", "list")
611617
allInterfaces, err := attachinterfaces.List(s.computeClient, instance.ID).AllPages()
612-
if err != nil {
618+
if mc.ObserveRequest(err) != nil {
613619
return err
614620
}
615621
instanceInterfaces, err := attachinterfaces.ExtractInterfaces(allInterfaces)
@@ -699,9 +705,9 @@ func (s *Service) deleteAttachInterface(eventObject runtime.Object, instanceID,
699705
return nil
700706
}
701707

702-
mc := metrics.NewMetricPrometheusContext("router_interface", "delete")
708+
mc := metrics.NewMetricPrometheusContext("server_os_interface", "delete")
703709
err = attachinterfaces.Delete(s.computeClient, instanceID, portID).ExtractErr()
704-
if mc.ObserveRequest(err) != nil {
710+
if mc.ObserveRequestIgnoreNotFound(err) != nil {
705711
if capoerrors.IsNotFound(err) {
706712
return nil
707713
}
@@ -725,8 +731,9 @@ func (s *Service) deleteTrunk(eventObject runtime.Object, portID string) error {
725731
listOpts := trunks.ListOpts{
726732
PortID: port.ID,
727733
}
734+
mc := metrics.NewMetricPrometheusContext("trunk", "list")
728735
trunkList, err := trunks.List(s.networkClient, listOpts).AllPages()
729-
if err != nil {
736+
if mc.ObserveRequest(err) != nil {
730737
return err
731738
}
732739
trunkInfo, err := trunks.ExtractTrunks(trunkList)
@@ -738,7 +745,8 @@ func (s *Service) deleteTrunk(eventObject runtime.Object, portID string) error {
738745
}
739746

740747
err = util.PollImmediate(retryIntervalTrunkDelete, timeoutTrunkDelete, func() (bool, error) {
741-
if err := trunks.Delete(s.networkClient, trunkInfo[0].ID).ExtractErr(); err != nil {
748+
mc := metrics.NewMetricPrometheusContext("trunk", "delete")
749+
if err := trunks.Delete(s.networkClient, trunkInfo[0].ID).ExtractErr(); mc.ObserveRequest(err) != nil {
742750
if capoerrors.IsRetryable(err) {
743751
return false, nil
744752
}
@@ -759,8 +767,9 @@ func (s *Service) getPort(portID string) (port *ports.Port, err error) {
759767
if portID == "" {
760768
return nil, fmt.Errorf("portID should be specified to get detail")
761769
}
770+
mc := metrics.NewMetricPrometheusContext("port", "get")
762771
port, err = ports.Get(s.networkClient, portID).Extract()
763-
if err != nil {
772+
if mc.ObserveRequestIgnoreNotFound(err) != nil {
764773
if capoerrors.IsNotFound(err) {
765774
return nil, nil
766775
}
@@ -808,8 +817,9 @@ func (s *Service) GetInstance(resourceID string) (instance *infrav1.Instance, er
808817
if resourceID == "" {
809818
return nil, fmt.Errorf("resourceId should be specified to get detail")
810819
}
820+
mc := metrics.NewMetricPrometheusContext("server", "get")
811821
server, err := servers.Get(s.computeClient, resourceID).Extract()
812-
if err != nil {
822+
if mc.ObserveRequestIgnoreNotFound(err) != nil {
813823
if capoerrors.IsNotFound(err) {
814824
return nil, nil
815825
}
@@ -835,8 +845,9 @@ func (s *Service) InstanceExists(name string) (instance *infrav1.Instance, err e
835845
listOpts = servers.ListOpts{}
836846
}
837847

848+
mc := metrics.NewMetricPrometheusContext("server", "list")
838849
allPages, err := servers.List(s.computeClient, listOpts).AllPages()
839-
if err != nil {
850+
if mc.ObserveRequest(err) != nil {
840851
return nil, fmt.Errorf("get server list: %v", err)
841852
}
842853
serverList, err := servers.ExtractServers(allPages)

pkg/cloud/services/loadbalancer/loadbalancer.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,9 @@ func getLoadBalancerName(clusterName string) string {
422422
}
423423

424424
func (s *Service) checkIfLbExists(name string) (*loadbalancers.LoadBalancer, error) {
425+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "list")
425426
allPages, err := loadbalancers.List(s.loadbalancerClient, loadbalancers.ListOpts{Name: name}).AllPages()
426-
if err != nil {
427+
if mc.ObserveRequest(err) != nil {
427428
return nil, err
428429
}
429430
lbList, err := loadbalancers.ExtractLoadBalancers(allPages)
@@ -437,8 +438,9 @@ func (s *Service) checkIfLbExists(name string) (*loadbalancers.LoadBalancer, err
437438
}
438439

439440
func (s *Service) checkIfListenerExists(name string) (*listeners.Listener, error) {
441+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "list")
440442
allPages, err := listeners.List(s.loadbalancerClient, listeners.ListOpts{Name: name}).AllPages()
441-
if err != nil {
443+
if mc.ObserveRequest(err) != nil {
442444
return nil, err
443445
}
444446
listenerList, err := listeners.ExtractListeners(allPages)
@@ -452,8 +454,9 @@ func (s *Service) checkIfListenerExists(name string) (*listeners.Listener, error
452454
}
453455

454456
func (s *Service) checkIfPoolExists(name string) (*pools.Pool, error) {
457+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "list")
455458
allPages, err := pools.List(s.loadbalancerClient, pools.ListOpts{Name: name}).AllPages()
456-
if err != nil {
459+
if mc.ObserveRequest(err) != nil {
457460
return nil, err
458461
}
459462
poolList, err := pools.ExtractPools(allPages)
@@ -467,8 +470,9 @@ func (s *Service) checkIfPoolExists(name string) (*pools.Pool, error) {
467470
}
468471

469472
func (s *Service) checkIfMonitorExists(name string) (*monitors.Monitor, error) {
473+
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "list")
470474
allPages, err := monitors.List(s.loadbalancerClient, monitors.ListOpts{Name: name}).AllPages()
471-
if err != nil {
475+
if mc.ObserveRequest(err) != nil {
472476
return nil, err
473477
}
474478
monitorList, err := monitors.ExtractMonitors(allPages)
@@ -482,8 +486,9 @@ func (s *Service) checkIfMonitorExists(name string) (*monitors.Monitor, error) {
482486
}
483487

484488
func (s *Service) checkIfLbMemberExists(poolID, name string) (*pools.Member, error) {
489+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "list")
485490
allPages, err := pools.ListMembers(s.loadbalancerClient, poolID, pools.ListMembersOpts{Name: name}).AllPages()
486-
if err != nil {
491+
if mc.ObserveRequest(err) != nil {
487492
return nil, err
488493
}
489494
lbMemberList, err := pools.ExtractMembers(allPages)
@@ -507,8 +512,9 @@ var backoff = wait.Backoff{
507512
func (s *Service) waitForLoadBalancerActive(id string) error {
508513
s.logger.Info("Waiting for load balancer", "id", id, "targetStatus", "ACTIVE")
509514
return wait.ExponentialBackoff(backoff, func() (bool, error) {
515+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "get")
510516
lb, err := loadbalancers.Get(s.loadbalancerClient, id).Extract()
511-
if err != nil {
517+
if mc.ObserveRequest(err) != nil {
512518
return false, err
513519
}
514520
return lb.ProvisioningStatus == "ACTIVE", nil
@@ -518,8 +524,9 @@ func (s *Service) waitForLoadBalancerActive(id string) error {
518524
func (s *Service) waitForListener(id, target string) error {
519525
s.logger.Info("Waiting for load balancer listener", "id", id, "targetStatus", target)
520526
return wait.ExponentialBackoff(backoff, func() (bool, error) {
527+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "get")
521528
_, err := listeners.Get(s.loadbalancerClient, id).Extract()
522-
if err != nil {
529+
if mc.ObserveRequest(err) != nil {
523530
return false, err
524531
}
525532
// The listener resource has no Status attribute, so a successful Get is the best we can do

pkg/cloud/services/networking/floatingip.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,9 @@ func (s *Service) GetOrCreateFloatingIP(openStackCluster *infrav1.OpenStackClust
7171
}
7272

7373
func (s *Service) checkIfFloatingIPExists(ip string) (*floatingips.FloatingIP, error) {
74+
mc := metrics.NewMetricPrometheusContext("floating_ip", "list")
7475
allPages, err := floatingips.List(s.client, floatingips.ListOpts{FloatingIP: ip}).AllPages()
75-
if err != nil {
76+
if mc.ObserveRequest(err) != nil {
7677
return nil, err
7778
}
7879
fpList, err := floatingips.ExtractFloatingIPs(allPages)
@@ -86,8 +87,9 @@ func (s *Service) checkIfFloatingIPExists(ip string) (*floatingips.FloatingIP, e
8687
}
8788

8889
func (s *Service) GetFloatingIPByPortID(portID string) (*floatingips.FloatingIP, error) {
90+
mc := metrics.NewMetricPrometheusContext("floating_ip", "list")
8991
allPages, err := floatingips.List(s.client, floatingips.ListOpts{PortID: portID}).AllPages()
90-
if err != nil {
92+
if mc.ObserveRequest(err) != nil {
9193
return nil, err
9294
}
9395
fpList, err := floatingips.ExtractFloatingIPs(allPages)
@@ -186,8 +188,9 @@ func (s *Service) DisassociateFloatingIP(openStackCluster *infrav1.OpenStackClus
186188
func (s *Service) waitForFloatingIP(id, target string) error {
187189
s.logger.Info("Waiting for floating IP", "id", id, "targetStatus", target)
188190
return wait.ExponentialBackoff(backoff, func() (bool, error) {
191+
mc := metrics.NewMetricPrometheusContext("floating_ip", "get")
189192
fip, err := floatingips.Get(s.client, id).Extract()
190-
if err != nil {
193+
if mc.ObserveRequest(err) != nil {
191194
return false, err
192195
}
193196
return fip.Status == target, nil

pkg/cloud/services/networking/network.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ func (s *Service) ReconcileExternalNetwork(openStackCluster *infrav1.OpenStackCl
6666
External: &iTrue,
6767
}
6868

69+
mc := metrics.NewMetricPrometheusContext("network", "list")
6970
allPages, err := networks.List(s.client, listOpts).AllPages()
70-
if err != nil {
71+
if mc.ObserveRequest(err) != nil {
7172
return err
7273
}
7374
networkList, err := networks.ExtractNetworks(allPages)
@@ -180,11 +181,12 @@ func (s *Service) ReconcileSubnet(openStackCluster *infrav1.OpenStackCluster, cl
180181
subnetName := getSubnetName(clusterName)
181182
s.logger.Info("Reconciling subnet", "name", subnetName)
182183

184+
mc := metrics.NewMetricPrometheusContext("subnet", "list")
183185
allPages, err := subnets.List(s.client, subnets.ListOpts{
184186
NetworkID: openStackCluster.Status.Network.ID,
185187
CIDR: openStackCluster.Spec.NodeCIDR,
186188
}).AllPages()
187-
if err != nil {
189+
if mc.ObserveRequest(err) != nil {
188190
return err
189191
}
190192

@@ -255,8 +257,9 @@ func (s *Service) getNetworkByID(networkID string) (networks.Network, error) {
255257
ID: networkID,
256258
}
257259

260+
mc := metrics.NewMetricPrometheusContext("network", "list")
258261
allPages, err := networks.List(s.client, opts).AllPages()
259-
if err != nil {
262+
if mc.ObserveRequest(err) != nil {
260263
return networks.Network{}, err
261264
}
262265

@@ -279,8 +282,9 @@ func (s *Service) getNetworkByName(networkName string) (networks.Network, error)
279282
Name: networkName,
280283
}
281284

285+
mc := metrics.NewMetricPrometheusContext("network", "list")
282286
allPages, err := networks.List(s.client, opts).AllPages()
283-
if err != nil {
287+
if mc.ObserveRequest(err) != nil {
284288
return networks.Network{}, err
285289
}
286290

@@ -303,11 +307,12 @@ func (s *Service) GetNetworksByFilter(opts networks.ListOptsBuilder) ([]networks
303307
if opts == nil {
304308
return nil, fmt.Errorf("no Filters were passed")
305309
}
310+
mc := metrics.NewMetricPrometheusContext("network", "list")
306311
pager := networks.List(s.client, opts)
307312
var nets []networks.Network
308313
err := pager.EachPage(func(page pagination.Page) (bool, error) {
309314
networkList, err := networks.ExtractNetworks(page)
310-
if err != nil {
315+
if mc.ObserveRequest(err) != nil {
311316
return false, err
312317
} else if len(networkList) == 0 {
313318
return false, fmt.Errorf("no networks could be found with the filters provided")
@@ -339,11 +344,12 @@ func (s *Service) GetSubnetsByFilter(opts subnets.ListOptsBuilder) ([]subnets.Su
339344
if opts == nil {
340345
return []subnets.Subnet{}, fmt.Errorf("no Filters were passed")
341346
}
347+
mc := metrics.NewMetricPrometheusContext("subnet", "list")
342348
pager := subnets.List(s.client, opts)
343349
var snets []subnets.Subnet
344350
err := pager.EachPage(func(page pagination.Page) (bool, error) {
345351
subnetList, err := subnets.ExtractSubnets(page)
346-
if err != nil {
352+
if mc.ObserveRequest(err) != nil {
347353
return false, err
348354
} else if len(subnetList) == 0 {
349355
return false, fmt.Errorf("no subnets could be found with the filters provided")

0 commit comments

Comments
 (0)