Skip to content

Commit cb38623

Browse files
authored
Merge pull request #863 from jichenjc/add_metrics
Add metrics of gophercloud (POST,UPDATE and DELETE) actions
2 parents 55ec7fa + 16c002f commit cb38623

File tree

9 files changed

+193
-34
lines changed

9 files changed

+193
-34
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/onsi/ginkgo v1.16.1
1010
github.com/onsi/gomega v1.11.0
1111
github.com/pkg/errors v0.9.1
12+
github.com/prometheus/client_golang v1.9.0
1213
github.com/spf13/pflag v1.0.5
1314
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83
1415
gopkg.in/ini.v1 v1.62.0

main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040

4141
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha4"
4242
"sigs.k8s.io/cluster-api-provider-openstack/controllers"
43+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
4344
"sigs.k8s.io/cluster-api-provider-openstack/pkg/record"
4445
"sigs.k8s.io/cluster-api-provider-openstack/version"
4546
)
@@ -72,6 +73,8 @@ func init() {
7273
_ = clusterv1.AddToScheme(scheme)
7374
_ = infrav1.AddToScheme(scheme)
7475
// +kubebuilder:scaffold:scheme
76+
77+
metrics.RegisterAPIPrometheusMetrics()
7578
}
7679

7780
// InitFlags initializes the flags.

pkg/cloud/services/compute/instance.go

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import (
4545
"sigs.k8s.io/cluster-api/util"
4646

4747
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha4"
48+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
4849
"sigs.k8s.io/cluster-api-provider-openstack/pkg/record"
4950
capoerrors "sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/errors"
5051
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/names"
@@ -218,11 +219,14 @@ func (s *Service) createInstance(eventObject runtime.Object, clusterName string,
218219

219220
serverCreateOpts = applyServerGroupID(serverCreateOpts, i.ServerGroupID)
220221

222+
mc := metrics.NewMetricPrometheusContext("server", "create")
223+
221224
server, err := servers.Create(s.computeClient, keypairs.CreateOptsExt{
222225
CreateOptsBuilder: serverCreateOpts,
223226
KeyName: i.SSHKeyName,
224227
}).Extract()
225-
if err != nil {
228+
229+
if mc.ObserveRequest(err) != nil {
226230
if err = s.deletePorts(eventObject, portList); err != nil {
227231
return nil, err
228232
}
@@ -401,8 +405,10 @@ func (s *Service) getOrCreatePort(eventObject runtime.Object, clusterName string
401405
if net.Subnet.ID != "" {
402406
portCreateOpts.FixedIPs = []ports.IP{{SubnetID: net.Subnet.ID}}
403407
}
408+
mc := metrics.NewMetricPrometheusContext("port", "create")
409+
404410
port, err := ports.Create(s.networkClient, portCreateOpts).Extract()
405-
if err != nil {
411+
if mc.ObserveRequest(err) != nil {
406412
record.Warnf(eventObject, "FailedCreatePort", "Failed to create port %s: %v", portName, err)
407413
return nil, err
408414
}
@@ -433,8 +439,10 @@ func (s *Service) getOrCreateTrunk(eventObject runtime.Object, clusterName, trun
433439
PortID: portID,
434440
Description: names.GetDescription(clusterName),
435441
}
442+
mc := metrics.NewMetricPrometheusContext("trunk", "create")
443+
436444
trunk, err := trunks.Create(s.networkClient, trunkCreateOpts).Extract()
437-
if err != nil {
445+
if mc.ObserveRequest(err) != nil {
438446
record.Warnf(eventObject, "FailedCreateTrunk", "Failed to create trunk %s: %v", trunkName, err)
439447
return nil, err
440448
}
@@ -444,10 +452,11 @@ func (s *Service) getOrCreateTrunk(eventObject runtime.Object, clusterName, trun
444452
}
445453

446454
func (s *Service) replaceAllAttributesTags(eventObject runtime.Object, trunkID string, tags []string) error {
455+
mc := metrics.NewMetricPrometheusContext("trunk", "update")
447456
_, err := attributestags.ReplaceAll(s.networkClient, "trunks", trunkID, attributestags.ReplaceAllOpts{
448457
Tags: tags,
449458
}).Extract()
450-
if err != nil {
459+
if mc.ObserveRequest(err) != nil {
451460
record.Warnf(eventObject, "FailedReplaceAllAttributesTags", "Failed to replace all attributestags, trunk %s: %v", trunkID, err)
452461
return err
453462
}
@@ -490,8 +499,9 @@ func (s *Service) AssociateFloatingIP(instanceID, floatingIP string) error {
490499
opts := floatingips.AssociateOpts{
491500
FloatingIP: floatingIP,
492501
}
502+
mc := metrics.NewMetricPrometheusContext("floating_ip", "update")
493503
err := floatingips.AssociateInstance(s.computeClient, instanceID, opts).ExtractErr()
494-
if err != nil {
504+
if mc.ObserveRequest(err) != nil {
495505
return err
496506
}
497507
return nil
@@ -553,8 +563,9 @@ func (s *Service) deletePort(eventObject runtime.Object, portID string) error {
553563
}
554564

555565
err = util.PollImmediate(RetryIntervalPortDelete, TimeoutPortDelete, func() (bool, error) {
566+
mc := metrics.NewMetricPrometheusContext("port", "delete")
556567
err := ports.Delete(s.networkClient, port.ID).ExtractErr()
557-
if err != nil {
568+
if mc.ObserveRequest(err) != nil {
558569
if capoerrors.IsRetryable(err) {
559570
return false, nil
560571
}
@@ -597,8 +608,9 @@ func (s *Service) deleteAttachInterface(eventObject runtime.Object, instanceID,
597608
return nil
598609
}
599610

611+
mc := metrics.NewMetricPrometheusContext("router_interface", "delete")
600612
err = attachinterfaces.Delete(s.computeClient, instanceID, portID).ExtractErr()
601-
if err != nil {
613+
if mc.ObserveRequest(err) != nil {
602614
if capoerrors.IsNotFound(err) {
603615
return nil
604616
}
@@ -675,8 +687,9 @@ func (s *Service) deleteInstance(eventObject runtime.Object, instanceID string)
675687
if instance == nil || instance.ID == "" {
676688
return nil
677689
}
678-
679-
if err = servers.Delete(s.computeClient, instance.ID).ExtractErr(); err != nil {
690+
mc := metrics.NewMetricPrometheusContext("server", "delete")
691+
err = servers.Delete(s.computeClient, instance.ID).ExtractErr()
692+
if mc.ObserveRequest(err) != nil {
680693
record.Warnf(eventObject, "FailedDeleteServer", "Failed to deleted server %s with id %s: %v", instance.Name, instance.ID, err)
681694
return err
682695
}

pkg/cloud/services/loadbalancer/loadbalancer.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"sigs.k8s.io/cluster-api/util"
3131

3232
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha4"
33+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
3334
"sigs.k8s.io/cluster-api-provider-openstack/pkg/record"
3435
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/names"
3536
)
@@ -56,8 +57,10 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
5657
Description: names.GetDescription(clusterName),
5758
}
5859

60+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "create")
5961
lb, err = loadbalancers.Create(s.loadbalancerClient, lbCreateOpts).Extract()
60-
if err != nil {
62+
63+
if mc.ObserveRequest(err) != nil {
6164
record.Warnf(openStackCluster, "FailedCreateLoadBalancer", "Failed to create load balancer %s: %v", loadBalancerName, err)
6265
return err
6366
}
@@ -97,8 +100,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
97100
ProtocolPort: port,
98101
LoadbalancerID: lb.ID,
99102
}
103+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "create")
100104
listener, err = listeners.Create(s.loadbalancerClient, listenerCreateOpts).Extract()
101-
if err != nil {
105+
if mc.ObserveRequest(err) != nil {
102106
return fmt.Errorf("error creating listener: %s", err)
103107
}
104108
}
@@ -123,8 +127,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
123127
LBMethod: pools.LBMethodRoundRobin,
124128
ListenerID: listener.ID,
125129
}
130+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "create")
126131
pool, err = pools.Create(s.loadbalancerClient, poolCreateOpts).Extract()
127-
if err != nil {
132+
if mc.ObserveRequest(err) != nil {
128133
return fmt.Errorf("error creating pool: %s", err)
129134
}
130135
}
@@ -147,8 +152,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
147152
Timeout: 5,
148153
MaxRetries: 3,
149154
}
155+
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "create")
150156
_, err = monitors.Create(s.loadbalancerClient, monitorCreateOpts).Extract()
151-
if err != nil {
157+
if mc.ObserveRequest(err) != nil {
152158
return fmt.Errorf("error creating monitor: %s", err)
153159
}
154160
}
@@ -218,8 +224,9 @@ func (s *Service) ReconcileLoadBalancerMember(openStackCluster *infrav1.OpenStac
218224
if err != nil {
219225
return err
220226
}
227+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "delete")
221228
err = pools.DeleteMember(s.loadbalancerClient, pool.ID, lbMember.ID).ExtractErr()
222-
if err != nil {
229+
if mc.ObserveRequest(err) != nil {
223230
return fmt.Errorf("error deleting lbmember: %s", err)
224231
}
225232
err = s.waitForLoadBalancerActive(lbID)
@@ -240,7 +247,9 @@ func (s *Service) ReconcileLoadBalancerMember(openStackCluster *infrav1.OpenStac
240247
if err := s.waitForLoadBalancerActive(lbID); err != nil {
241248
return err
242249
}
243-
if _, err := pools.CreateMember(s.loadbalancerClient, pool.ID, lbMemberOpts).Extract(); err != nil {
250+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "create")
251+
_, err = pools.CreateMember(s.loadbalancerClient, pool.ID, lbMemberOpts).Extract()
252+
if mc.ObserveRequest(err) != nil {
244253
return fmt.Errorf("error create lbmember: %s", err)
245254
}
246255
if err := s.waitForLoadBalancerActive(lbID); err != nil {
@@ -281,8 +290,9 @@ func (s *Service) DeleteLoadBalancer(openStackCluster *infrav1.OpenStackCluster,
281290
Cascade: true,
282291
}
283292
s.logger.Info("Deleting load balancer", "name", loadBalancerName, "cascade", deleteOpts.Cascade)
293+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "delete")
284294
err = loadbalancers.Delete(s.loadbalancerClient, lb.ID, deleteOpts).ExtractErr()
285-
if err != nil {
295+
if mc.ObserveRequest(err) != nil {
286296
record.Warnf(openStackCluster, "FailedDeleteLoadBalancer", "Failed to delete load balancer %s with id %s: %v", lb.Name, lb.ID, err)
287297
return err
288298
}
@@ -335,8 +345,9 @@ func (s *Service) DeleteLoadBalancerMember(openStackCluster *infrav1.OpenStackCl
335345
if err != nil {
336346
return err
337347
}
348+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "delete")
338349
err = pools.DeleteMember(s.loadbalancerClient, pool.ID, lbMember.ID).ExtractErr()
339-
if err != nil {
350+
if mc.ObserveRequest(err) != nil {
340351
return fmt.Errorf("error deleting load balancer member: %s", err)
341352
}
342353
err = s.waitForLoadBalancerActive(lbID)

pkg/cloud/services/networking/floatingip.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"k8s.io/apimachinery/pkg/util/wait"
2424

2525
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha4"
26+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
2627
"sigs.k8s.io/cluster-api-provider-openstack/pkg/record"
2728
)
2829

@@ -45,8 +46,9 @@ func (s *Service) GetOrCreateFloatingIP(openStackCluster *infrav1.OpenStackClust
4546

4647
fpCreateOpts.FloatingNetworkID = openStackCluster.Status.ExternalNetwork.ID
4748

49+
mc := metrics.NewMetricPrometheusContext("floating_ip", "create")
4850
fp, err = floatingips.Create(s.client, fpCreateOpts).Extract()
49-
if err != nil {
51+
if mc.ObserveRequest(err) != nil {
5052
record.Warnf(openStackCluster, "FailedCreateFloatingIP", "Failed to create floating IP %s: %v", ip, err)
5153
return nil, err
5254
}
@@ -95,7 +97,9 @@ func (s *Service) DeleteFloatingIP(openStackCluster *infrav1.OpenStackCluster, i
9597
return nil
9698
}
9799

98-
if err = floatingips.Delete(s.client, fip.ID).ExtractErr(); err != nil {
100+
mc := metrics.NewMetricPrometheusContext("floating_ip", "delete")
101+
err = floatingips.Delete(s.client, fip.ID).ExtractErr()
102+
if mc.ObserveRequest(err) != nil {
99103
record.Warnf(openStackCluster, "FailedDeleteFloatingIP", "Failed to delete floating IP %s: %v", ip, err)
100104
return err
101105
}
@@ -116,8 +120,9 @@ func (s *Service) AssociateFloatingIP(openStackCluster *infrav1.OpenStackCluster
116120
fpUpdateOpts := &floatingips.UpdateOpts{
117121
PortID: &portID,
118122
}
123+
mc := metrics.NewMetricPrometheusContext("floating_ip", "update")
119124
_, err := floatingips.Update(s.client, fp.ID, fpUpdateOpts).Extract()
120-
if err != nil {
125+
if mc.ObserveRequest(err) != nil {
121126
record.Warnf(openStackCluster, "FailedAssociateFloatingIP", "Failed to associate floating IP %s with port %s: %v", fp.FloatingIP, portID, err)
122127
return err
123128
}
@@ -149,8 +154,9 @@ func (s *Service) DisassociateFloatingIP(openStackCluster *infrav1.OpenStackClus
149154
fpUpdateOpts := &floatingips.UpdateOpts{
150155
PortID: nil,
151156
}
157+
mc := metrics.NewMetricPrometheusContext("floating_ip", "update")
152158
_, err = floatingips.Update(s.client, fip.ID, fpUpdateOpts).Extract()
153-
if err != nil {
159+
if mc.ObserveRequest(err) != nil {
154160
record.Warnf(openStackCluster, "FailedDisassociateFloatingIP", "Failed to disassociate floating IP %s: %v", fip.FloatingIP, err)
155161
return err
156162
}

pkg/cloud/services/networking/network.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/gophercloud/gophercloud/pagination"
2828

2929
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha4"
30+
"sigs.k8s.io/cluster-api-provider-openstack/pkg/metrics"
3031
"sigs.k8s.io/cluster-api-provider-openstack/pkg/record"
3132
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/names"
3233
)
@@ -123,8 +124,10 @@ func (s *Service) ReconcileNetwork(openStackCluster *infrav1.OpenStackCluster, c
123124
Name: networkName,
124125
}
125126
}
127+
128+
mc := metrics.NewMetricPrometheusContext("network", "create")
126129
network, err := networks.Create(s.client, opts).Extract()
127-
if err != nil {
130+
if mc.ObserveRequest(err) != nil {
128131
record.Warnf(openStackCluster, "FailedCreateNetwork", "Failed to create network %s: %v", networkName, err)
129132
return err
130133
}
@@ -157,7 +160,9 @@ func (s *Service) DeleteNetwork(openStackCluster *infrav1.OpenStackCluster, clus
157160
return nil
158161
}
159162

160-
if err = networks.Delete(s.client, network.ID).ExtractErr(); err != nil {
163+
mc := metrics.NewMetricPrometheusContext("network", "delete")
164+
err = networks.Delete(s.client, network.ID).ExtractErr()
165+
if mc.ObserveRequest(err) != nil {
161166
record.Warnf(openStackCluster, "FailedDeleteNetwork", "Failed to delete network %s with id %s: %v", network.Name, network.ID, err)
162167
return err
163168
}
@@ -222,18 +227,22 @@ func (s *Service) createSubnet(openStackCluster *infrav1.OpenStackCluster, clust
222227
DNSNameservers: openStackCluster.Spec.DNSNameservers,
223228
Description: names.GetDescription(clusterName),
224229
}
230+
mc := metrics.NewMetricPrometheusContext("subnet", "create")
231+
225232
subnet, err := subnets.Create(s.client, opts).Extract()
226-
if err != nil {
233+
234+
if mc.ObserveRequest(err) != nil {
227235
record.Warnf(openStackCluster, "FailedCreateSubnet", "Failed to create subnet %s: %v", name, err)
228236
return nil, err
229237
}
230238
record.Eventf(openStackCluster, "SuccessfulCreateSubnet", "Created subnet %s with id %s", name, subnet.ID)
231239

232240
if len(openStackCluster.Spec.Tags) > 0 {
241+
mc := metrics.NewMetricPrometheusContext("subnet", "update")
233242
_, err = attributestags.ReplaceAll(s.client, "subnets", subnet.ID, attributestags.ReplaceAllOpts{
234243
Tags: openStackCluster.Spec.Tags,
235244
}).Extract()
236-
if err != nil {
245+
if mc.ObserveRequest(err) != nil {
237246
return nil, err
238247
}
239248
}

0 commit comments

Comments
 (0)