Skip to content

Commit 16c002f

Browse files
committed
Add metrics of POST/UPDATE/DELETE actions
1 parent 5281717 commit 16c002f

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
)
@@ -217,11 +218,14 @@ func (s *Service) createInstance(eventObject runtime.Object, clusterName string,
217218

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

221+
mc := metrics.NewMetricPrometheusContext("server", "create")
222+
220223
server, err := servers.Create(s.computeClient, keypairs.CreateOptsExt{
221224
CreateOptsBuilder: serverCreateOpts,
222225
KeyName: i.SSHKeyName,
223226
}).Extract()
224-
if err != nil {
227+
228+
if mc.ObserveRequest(err) != nil {
225229
if err = s.deletePorts(eventObject, portList); err != nil {
226230
return nil, err
227231
}
@@ -400,8 +404,10 @@ func (s *Service) getOrCreatePort(eventObject runtime.Object, clusterName string
400404
if net.Subnet.ID != "" {
401405
portCreateOpts.FixedIPs = []ports.IP{{SubnetID: net.Subnet.ID}}
402406
}
407+
mc := metrics.NewMetricPrometheusContext("port", "create")
408+
403409
port, err := ports.Create(s.networkClient, portCreateOpts).Extract()
404-
if err != nil {
410+
if mc.ObserveRequest(err) != nil {
405411
record.Warnf(eventObject, "FailedCreatePort", "Failed to create port %s: %v", portName, err)
406412
return nil, err
407413
}
@@ -431,8 +437,10 @@ func (s *Service) getOrCreateTrunk(eventObject runtime.Object, trunkName, portID
431437
Name: trunkName,
432438
PortID: portID,
433439
}
440+
mc := metrics.NewMetricPrometheusContext("trunk", "create")
441+
434442
trunk, err := trunks.Create(s.networkClient, trunkCreateOpts).Extract()
435-
if err != nil {
443+
if mc.ObserveRequest(err) != nil {
436444
record.Warnf(eventObject, "FailedCreateTrunk", "Failed to create trunk %s: %v", trunkName, err)
437445
return nil, err
438446
}
@@ -442,10 +450,11 @@ func (s *Service) getOrCreateTrunk(eventObject runtime.Object, trunkName, portID
442450
}
443451

444452
func (s *Service) replaceAllAttributesTags(eventObject runtime.Object, trunkID string, tags []string) error {
453+
mc := metrics.NewMetricPrometheusContext("trunk", "update")
445454
_, err := attributestags.ReplaceAll(s.networkClient, "trunks", trunkID, attributestags.ReplaceAllOpts{
446455
Tags: tags,
447456
}).Extract()
448-
if err != nil {
457+
if mc.ObserveRequest(err) != nil {
449458
record.Warnf(eventObject, "FailedReplaceAllAttributesTags", "Failed to replace all attributestags, trunk %s: %v", trunkID, err)
450459
return err
451460
}
@@ -488,8 +497,9 @@ func (s *Service) AssociateFloatingIP(instanceID, floatingIP string) error {
488497
opts := floatingips.AssociateOpts{
489498
FloatingIP: floatingIP,
490499
}
500+
mc := metrics.NewMetricPrometheusContext("floating_ip", "update")
491501
err := floatingips.AssociateInstance(s.computeClient, instanceID, opts).ExtractErr()
492-
if err != nil {
502+
if mc.ObserveRequest(err) != nil {
493503
return err
494504
}
495505
return nil
@@ -551,8 +561,9 @@ func (s *Service) deletePort(eventObject runtime.Object, portID string) error {
551561
}
552562

553563
err = util.PollImmediate(RetryIntervalPortDelete, TimeoutPortDelete, func() (bool, error) {
564+
mc := metrics.NewMetricPrometheusContext("port", "delete")
554565
err := ports.Delete(s.networkClient, port.ID).ExtractErr()
555-
if err != nil {
566+
if mc.ObserveRequest(err) != nil {
556567
if capoerrors.IsRetryable(err) {
557568
return false, nil
558569
}
@@ -595,8 +606,9 @@ func (s *Service) deleteAttachInterface(eventObject runtime.Object, instanceID,
595606
return nil
596607
}
597608

609+
mc := metrics.NewMetricPrometheusContext("router_interface", "delete")
598610
err = attachinterfaces.Delete(s.computeClient, instanceID, portID).ExtractErr()
599-
if err != nil {
611+
if mc.ObserveRequest(err) != nil {
600612
if capoerrors.IsNotFound(err) {
601613
return nil
602614
}
@@ -673,8 +685,9 @@ func (s *Service) deleteInstance(eventObject runtime.Object, instanceID string)
673685
if instance == nil || instance.ID == "" {
674686
return nil
675687
}
676-
677-
if err = servers.Delete(s.computeClient, instance.ID).ExtractErr(); err != nil {
688+
mc := metrics.NewMetricPrometheusContext("server", "delete")
689+
err = servers.Delete(s.computeClient, instance.ID).ExtractErr()
690+
if mc.ObserveRequest(err) != nil {
678691
record.Warnf(eventObject, "FailedDeleteServer", "Failed to deleted server %s with id %s: %v", instance.Name, instance.ID, err)
679692
return err
680693
}

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
)
3536

@@ -54,8 +55,10 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
5455
VipSubnetID: openStackCluster.Status.Network.Subnet.ID,
5556
}
5657

58+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "create")
5759
lb, err = loadbalancers.Create(s.loadbalancerClient, lbCreateOpts).Extract()
58-
if err != nil {
60+
61+
if mc.ObserveRequest(err) != nil {
5962
record.Warnf(openStackCluster, "FailedCreateLoadBalancer", "Failed to create load balancer %s: %v", loadBalancerName, err)
6063
return err
6164
}
@@ -95,8 +98,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
9598
ProtocolPort: port,
9699
LoadbalancerID: lb.ID,
97100
}
101+
mc := metrics.NewMetricPrometheusContext("loadbalancer_listener", "create")
98102
listener, err = listeners.Create(s.loadbalancerClient, listenerCreateOpts).Extract()
99-
if err != nil {
103+
if mc.ObserveRequest(err) != nil {
100104
return fmt.Errorf("error creating listener: %s", err)
101105
}
102106
}
@@ -121,8 +125,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
121125
LBMethod: pools.LBMethodRoundRobin,
122126
ListenerID: listener.ID,
123127
}
128+
mc := metrics.NewMetricPrometheusContext("loadbalancer_pool", "create")
124129
pool, err = pools.Create(s.loadbalancerClient, poolCreateOpts).Extract()
125-
if err != nil {
130+
if mc.ObserveRequest(err) != nil {
126131
return fmt.Errorf("error creating pool: %s", err)
127132
}
128133
}
@@ -145,8 +150,9 @@ func (s *Service) ReconcileLoadBalancer(openStackCluster *infrav1.OpenStackClust
145150
Timeout: 5,
146151
MaxRetries: 3,
147152
}
153+
mc := metrics.NewMetricPrometheusContext("loadbalancer_healthmonitor", "create")
148154
_, err = monitors.Create(s.loadbalancerClient, monitorCreateOpts).Extract()
149-
if err != nil {
155+
if mc.ObserveRequest(err) != nil {
150156
return fmt.Errorf("error creating monitor: %s", err)
151157
}
152158
}
@@ -216,8 +222,9 @@ func (s *Service) ReconcileLoadBalancerMember(openStackCluster *infrav1.OpenStac
216222
if err != nil {
217223
return err
218224
}
225+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "delete")
219226
err = pools.DeleteMember(s.loadbalancerClient, pool.ID, lbMember.ID).ExtractErr()
220-
if err != nil {
227+
if mc.ObserveRequest(err) != nil {
221228
return fmt.Errorf("error deleting lbmember: %s", err)
222229
}
223230
err = s.waitForLoadBalancerActive(lbID)
@@ -238,7 +245,9 @@ func (s *Service) ReconcileLoadBalancerMember(openStackCluster *infrav1.OpenStac
238245
if err := s.waitForLoadBalancerActive(lbID); err != nil {
239246
return err
240247
}
241-
if _, err := pools.CreateMember(s.loadbalancerClient, pool.ID, lbMemberOpts).Extract(); err != nil {
248+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "create")
249+
_, err = pools.CreateMember(s.loadbalancerClient, pool.ID, lbMemberOpts).Extract()
250+
if mc.ObserveRequest(err) != nil {
242251
return fmt.Errorf("error create lbmember: %s", err)
243252
}
244253
if err := s.waitForLoadBalancerActive(lbID); err != nil {
@@ -279,8 +288,9 @@ func (s *Service) DeleteLoadBalancer(openStackCluster *infrav1.OpenStackCluster,
279288
Cascade: true,
280289
}
281290
s.logger.Info("Deleting load balancer", "name", loadBalancerName, "cascade", deleteOpts.Cascade)
291+
mc := metrics.NewMetricPrometheusContext("loadbalancer", "delete")
282292
err = loadbalancers.Delete(s.loadbalancerClient, lb.ID, deleteOpts).ExtractErr()
283-
if err != nil {
293+
if mc.ObserveRequest(err) != nil {
284294
record.Warnf(openStackCluster, "FailedDeleteLoadBalancer", "Failed to delete load balancer %s with id %s: %v", lb.Name, lb.ID, err)
285295
return err
286296
}
@@ -333,8 +343,9 @@ func (s *Service) DeleteLoadBalancerMember(openStackCluster *infrav1.OpenStackCl
333343
if err != nil {
334344
return err
335345
}
346+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "delete")
336347
err = pools.DeleteMember(s.loadbalancerClient, pool.ID, lbMember.ID).ExtractErr()
337-
if err != nil {
348+
if mc.ObserveRequest(err) != nil {
338349
return fmt.Errorf("error deleting load balancer member: %s", err)
339350
}
340351
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
)
3233

@@ -122,8 +123,10 @@ func (s *Service) ReconcileNetwork(openStackCluster *infrav1.OpenStackCluster, c
122123
Name: networkName,
123124
}
124125
}
126+
127+
mc := metrics.NewMetricPrometheusContext("network", "create")
125128
network, err := networks.Create(s.client, opts).Extract()
126-
if err != nil {
129+
if mc.ObserveRequest(err) != nil {
127130
record.Warnf(openStackCluster, "FailedCreateNetwork", "Failed to create network %s: %v", networkName, err)
128131
return err
129132
}
@@ -156,7 +159,9 @@ func (s *Service) DeleteNetwork(openStackCluster *infrav1.OpenStackCluster, clus
156159
return nil
157160
}
158161

159-
if err = networks.Delete(s.client, network.ID).ExtractErr(); err != nil {
162+
mc := metrics.NewMetricPrometheusContext("network", "delete")
163+
err = networks.Delete(s.client, network.ID).ExtractErr()
164+
if mc.ObserveRequest(err) != nil {
160165
record.Warnf(openStackCluster, "FailedDeleteNetwork", "Failed to delete network %s with id %s: %v", network.Name, network.ID, err)
161166
return err
162167
}
@@ -220,18 +225,22 @@ func (s *Service) createSubnet(openStackCluster *infrav1.OpenStackCluster, name
220225
CIDR: openStackCluster.Spec.NodeCIDR,
221226
DNSNameservers: openStackCluster.Spec.DNSNameservers,
222227
}
228+
mc := metrics.NewMetricPrometheusContext("subnet", "create")
229+
223230
subnet, err := subnets.Create(s.client, opts).Extract()
224-
if err != nil {
231+
232+
if mc.ObserveRequest(err) != nil {
225233
record.Warnf(openStackCluster, "FailedCreateSubnet", "Failed to create subnet %s: %v", name, err)
226234
return nil, err
227235
}
228236
record.Eventf(openStackCluster, "SuccessfulCreateSubnet", "Created subnet %s with id %s", name, subnet.ID)
229237

230238
if len(openStackCluster.Spec.Tags) > 0 {
239+
mc := metrics.NewMetricPrometheusContext("subnet", "update")
231240
_, err = attributestags.ReplaceAll(s.client, "subnets", subnet.ID, attributestags.ReplaceAllOpts{
232241
Tags: openStackCluster.Spec.Tags,
233242
}).Extract()
234-
if err != nil {
243+
if mc.ObserveRequest(err) != nil {
235244
return nil, err
236245
}
237246
}

0 commit comments

Comments
 (0)