Skip to content
This repository was archived by the owner on Jan 21, 2025. It is now read-only.

Commit 0a6913f

Browse files
committed
pkg/metrics/openstack.go add openstack api request metrics
Signed-off-by: Schlotter, Christian <[email protected]>
1 parent 834aeb0 commit 0a6913f

File tree

6 files changed

+146
-156
lines changed

6 files changed

+146
-156
lines changed

docs/metrics.md

Lines changed: 69 additions & 152 deletions
Large diffs are not rendered by default.

pkg/metrics/cinder.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,18 +107,20 @@ func ScrapeCinderMetrics(client *gophercloud.ServiceClient, clientset *kubernete
107107
cinderVolumeAttachedAt.Reset()
108108

109109
// get all volumes and scrape them
110+
mc := newOpenStackMetric("volume", "list")
110111
pager := volumes.List(client, volumes.ListOpts{})
111112
err = pager.EachPage(func(page pagination.Page) (bool, error) {
112113
return scrapeVolumesPage(page, pvs)
113114
})
114-
if err != nil {
115+
if mc.Observe(err) != nil {
115116
// only warn, maybe the next scrape will work.
116117
klog.Warningf("Unable to scrape volumes: %v", err)
117118
return err
118119
}
119120

121+
mc = newOpenStackMetric("volume_quotasets_usage", "get")
120122
q, err := quotasets.GetUsage(client, tenantID).Extract()
121-
if err != nil {
123+
if mc.Observe(err) != nil {
122124
// only warn, maybe the next scrape will work.
123125
klog.Warningf("Unable to scrape quotas: %v", err)
124126
return err

pkg/metrics/loadbalancer.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ func registerLoadBalancerMetrics() {
4343
// passes the result to a scrape function.
4444
func ScrapeLoadBalancerMetrics(client *gophercloud.ServiceClient, tenantID string) error {
4545
// first step: gather the data
46+
mc := newOpenStackMetric("loadbalancer", "list")
4647
pages, err := loadbalancers.List(client, loadbalancers.ListOpts{}).AllPages()
47-
if err != nil {
48+
if mc.Observe(err) != nil {
4849
// only warn, maybe the next scrape will work.
4950
klog.Warningf("Unable to scrape floating ips: %v", err)
5051
return err

pkg/metrics/metrics.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ func RegisterMetrics(prefix string) {
2121
registerCinderMetrics()
2222
registerNeutronMetrics()
2323
registerLoadBalancerMetrics()
24+
registerOpenStackMetrics()
2425
}
2526

2627
// AddPrefix adds the given prefix to the string, if set

pkg/metrics/neutron.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ func registerNeutronMetrics() {
4949
// the result to a scrape function.
5050
func ScrapeNeutronMetrics(neutronClient *gophercloud.ServiceClient, tenantID string) error {
5151
// first step: gather the data
52+
mc := newOpenStackMetric("floating_ip", "list")
5253
pages, err := floatingips.List(neutronClient, floatingips.ListOpts{}).AllPages()
53-
if err != nil {
54+
if mc.Observe(err) != nil {
5455
// only warn, maybe the next scrape will work.
5556
klog.Warningf("Unable to scrape floating ips: %v", err)
5657
return err

pkg/metrics/openstack.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
package metrics
4+
5+
import (
6+
"time"
7+
8+
"github.com/prometheus/client_golang/prometheus"
9+
)
10+
11+
type openstackMetrics struct {
12+
duration *prometheus.HistogramVec
13+
total *prometheus.CounterVec
14+
errors *prometheus.CounterVec
15+
}
16+
17+
var (
18+
requestMetrics *openstackMetrics
19+
)
20+
21+
func registerOpenStackMetrics() {
22+
requestMetrics = &openstackMetrics{
23+
duration: prometheus.NewHistogramVec(
24+
prometheus.HistogramOpts{
25+
Name: generateName("openstack_api_request_duration_seconds"),
26+
Help: "Latency of an OpenStack API call",
27+
}, []string{"request"}),
28+
total: prometheus.NewCounterVec(
29+
prometheus.CounterOpts{
30+
Name: generateName("openstack_api_requests_total"),
31+
Help: "Total number of OpenStack API calls",
32+
}, []string{"request"}),
33+
errors: prometheus.NewCounterVec(
34+
prometheus.CounterOpts{
35+
Name: generateName("openstack_api_request_errors_total"),
36+
Help: "Total number of errors for an OpenStack API call",
37+
}, []string{"request"}),
38+
}
39+
40+
prometheus.MustRegister(requestMetrics.duration)
41+
prometheus.MustRegister(requestMetrics.total)
42+
prometheus.MustRegister(requestMetrics.errors)
43+
}
44+
45+
// openStackMetric indicates the context for OpenStack metrics.
46+
type openStackMetric struct {
47+
start time.Time
48+
attributes []string
49+
}
50+
51+
// newOpenStackMetric creates a new MetricContext.
52+
func newOpenStackMetric(resource string, request string) *openStackMetric {
53+
return &openStackMetric{
54+
start: time.Now(),
55+
attributes: []string{resource + "_" + request},
56+
}
57+
}
58+
59+
// Observe records the request latency and counts the errors.
60+
func (mc *openStackMetric) Observe(err error) error {
61+
requestMetrics.duration.WithLabelValues(mc.attributes...).Observe(
62+
time.Since(mc.start).Seconds())
63+
requestMetrics.total.WithLabelValues(mc.attributes...).Inc()
64+
if err != nil {
65+
requestMetrics.errors.WithLabelValues(mc.attributes...).Inc()
66+
}
67+
return err
68+
}

0 commit comments

Comments
 (0)