Skip to content

Commit 5b8a018

Browse files
committed
refactoring
- allow multiple scopes for reservations - add reservation to example.yaml Signed-off-by: Markus Blaschke <[email protected]>
1 parent e534352 commit 5b8a018

File tree

3 files changed

+44
-61
lines changed

3 files changed

+44
-61
lines changed

config/config_reservation.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ type (
44
CollectorReservation struct {
55
CollectorBase `yaml:",inline"`
66

7-
ResourceScope string `yaml:"resourceScope"`
8-
Granularity string `yaml:"granularity"`
9-
FromDays int `yaml:"FromDays"`
7+
Scopes []string `yaml:"scopes"`
8+
Granularity string `yaml:"granularity"`
9+
FromDays int `yaml:"fromDays"`
1010
}
1111
)

example.yaml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ collectors:
5858
# Azure cost metrics (cost queries, budgets)
5959
# needs queries below
6060
costs:
61-
scrapeTime: 5m
61+
scrapeTime: 60m
6262

6363
queries:
6464
- # name of metric (azurerm_costs_${name})
@@ -104,6 +104,22 @@ collectors:
104104
# optional, additional static labels
105105
labels: {}
106106

107+
reservation:
108+
scrapeTime: 1h
109+
110+
# resourceScopes:
111+
#
112+
# The scope associated with reservations summaries operations.
113+
# This includes '/providers/Microsoft.Billing/billingAccounts/{billingAccountId}' for BillingAccount scope (legacy),
114+
# and '/providers/Microsoft.Billing/billingAccounts/{billingAccountId}/billingProfiles/{billingProfileId}'
115+
# for BillingProfile scope (modern).
116+
#
117+
# see https://learn.microsoft.com/en-us/rest/api/consumption/reservations-summaries/list?view=rest-consumption-2023-05-01&tabs=HTTP
118+
scopes: []
119+
120+
granularity: daily # or monthly
121+
fromDays: 30
122+
107123
# Portscan of Azure Public IPs
108124
portscan:
109125
scrapeTime: 12h

metrics_azurerm_reservation.go

Lines changed: 24 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,20 @@ type MetricsCollectorAzureRmReservation struct {
2929
func (m *MetricsCollectorAzureRmReservation) Setup(collector *collector.Collector) {
3030
m.Processor.Setup(collector)
3131

32+
commonLabels := []string{
33+
"reservationOrderID",
34+
"reservationID",
35+
"skuName",
36+
"kind",
37+
"usageDate",
38+
}
39+
3240
m.prometheus.reservationInfo = prometheus.NewGaugeVec(
3341
prometheus.GaugeOpts{
3442
Name: "azurerm_reservation_info",
3543
Help: "Azure ResourceManager Reservation Information",
3644
},
37-
[]string{
38-
"reservationOrderID",
39-
"reservationID",
40-
"skuName",
41-
"kind",
42-
"usageDate",
43-
},
45+
commonLabels,
4446
)
4547
m.Collector.RegisterMetricList("reservationInfo", m.prometheus.reservationInfo, true)
4648

@@ -49,13 +51,7 @@ func (m *MetricsCollectorAzureRmReservation) Setup(collector *collector.Collecto
4951
Name: "azurerm_reservation_utilization",
5052
Help: "Azure ResourceManager Reservation Utilization",
5153
},
52-
[]string{
53-
"reservationOrderID",
54-
"reservationID",
55-
"skuName",
56-
"kind",
57-
"usageDate",
58-
},
54+
commonLabels,
5955
)
6056
m.Collector.RegisterMetricList("reservationUsage", m.prometheus.reservationUsage, true)
6157

@@ -64,13 +60,7 @@ func (m *MetricsCollectorAzureRmReservation) Setup(collector *collector.Collecto
6460
Name: "azurerm_reservation_utilization_min",
6561
Help: "Azure ResourceManager Reservation Min Utilization",
6662
},
67-
[]string{
68-
"reservationOrderID",
69-
"reservationID",
70-
"skuName",
71-
"kind",
72-
"usageDate",
73-
},
63+
commonLabels,
7464
)
7565
m.Collector.RegisterMetricList("reservationMinUsage", m.prometheus.reservationMinUsage, true)
7666

@@ -79,13 +69,7 @@ func (m *MetricsCollectorAzureRmReservation) Setup(collector *collector.Collecto
7969
Name: "azurerm_reservation_utilization_max",
8070
Help: "Azure ResourceManager Reservation Max Utilization",
8171
},
82-
[]string{
83-
"reservationOrderID",
84-
"reservationID",
85-
"skuName",
86-
"kind",
87-
"usageDate",
88-
},
72+
commonLabels,
8973
)
9074
m.Collector.RegisterMetricList("reservationMaxUsage", m.prometheus.reservationMaxUsage, true)
9175

@@ -94,13 +78,7 @@ func (m *MetricsCollectorAzureRmReservation) Setup(collector *collector.Collecto
9478
Name: "azurerm_reservation_used_hours",
9579
Help: "Azure ResourceManager Reservation Used Hours",
9680
},
97-
[]string{
98-
"reservationOrderID",
99-
"reservationID",
100-
"skuName",
101-
"kind",
102-
"usageDate",
103-
},
81+
commonLabels,
10482
)
10583
m.Collector.RegisterMetricList("reservationUsedHours", m.prometheus.reservationUsedHours, true)
10684

@@ -109,13 +87,7 @@ func (m *MetricsCollectorAzureRmReservation) Setup(collector *collector.Collecto
10987
Name: "azurerm_reservation_reserved_hours",
11088
Help: "Azure ResourceManager Reservation Reserved Hours",
11189
},
112-
[]string{
113-
"reservationOrderID",
114-
"reservationID",
115-
"skuName",
116-
"kind",
117-
"usageDate",
118-
},
90+
commonLabels,
11991
)
12092
m.Collector.RegisterMetricList("reservationReservedHours", m.prometheus.reservationReservedHours, true)
12193

@@ -124,24 +96,20 @@ func (m *MetricsCollectorAzureRmReservation) Setup(collector *collector.Collecto
12496
Name: "azurerm_reservation_total_reserved_quantity",
12597
Help: "Azure ResourceManager Reservation Total Reserved Quantity",
12698
},
127-
[]string{
128-
"reservationOrderID",
129-
"reservationID",
130-
"skuName",
131-
"kind",
132-
"usageDate",
133-
},
99+
commonLabels,
134100
)
135101
m.Collector.RegisterMetricList("reservationTotalReservedQuantity", m.prometheus.reservationTotalReservedQuantity, true)
136102
}
137103

138104
func (m *MetricsCollectorAzureRmReservation) Reset() {}
139105

140106
func (m *MetricsCollectorAzureRmReservation) Collect(callback chan<- func()) {
141-
m.collectReservationUsage(logger, callback)
107+
for _, scope := range Config.Collectors.Reservation.Scopes {
108+
m.collectReservationUsage(logger, scope, callback)
109+
}
142110
}
143111

144-
func (m *MetricsCollectorAzureRmReservation) collectReservationUsage(logger *zap.SugaredLogger, callback chan<- func()) {
112+
func (m *MetricsCollectorAzureRmReservation) collectReservationUsage(logger *zap.SugaredLogger, scope string, callback chan<- func()) {
145113
reservationInfo := m.Collector.GetMetricList("reservationInfo")
146114
reservationUsage := m.Collector.GetMetricList("reservationUsage")
147115
reservationMinUsage := m.Collector.GetMetricList("reservationMinUsage")
@@ -151,21 +119,19 @@ func (m *MetricsCollectorAzureRmReservation) collectReservationUsage(logger *zap
151119
reservationTotalReservedQuantity := m.Collector.GetMetricList("reservationTotalReservedQuantity")
152120

153121
days := Config.Collectors.Reservation.FromDays
154-
resourceScope := Config.Collectors.Reservation.ResourceScope
155122
granularity := Config.Collectors.Reservation.Granularity
156123

157124
now := time.Now()
158-
formattedDate := now.AddDate(0, 0, -days).Format("2006-01-02")
159-
startDate := formattedDate
160-
endDate := time.Now().Format("2006-01-02")
125+
startDate := now.AddDate(0, 0, -days).Format("2006-01-02")
126+
endDate := now.Format("2006-01-02")
161127

162128
clientFactory, err := armconsumption.NewClientFactory("<subscription-id>", AzureClient.GetCred(), AzureClient.NewArmClientOptions())
163129
if err != nil {
164130
logger.Panic(err)
165131
}
166132

167-
// "Create a pager to retrieve daily booking summaries
168-
pager := clientFactory.NewReservationsSummariesClient().NewListPager(resourceScope, armconsumption.Datagrain(granularity), &armconsumption.ReservationsSummariesClientListOptions{
133+
// Create a pager to retrieve daily booking summaries
134+
pager := clientFactory.NewReservationsSummariesClient().NewListPager(scope, armconsumption.Datagrain(granularity), &armconsumption.ReservationsSummariesClientListOptions{
169135
StartDate: to.Ptr(startDate),
170136
EndDate: to.Ptr(endDate),
171137
Filter: nil,
@@ -182,6 +148,7 @@ func (m *MetricsCollectorAzureRmReservation) collectReservationUsage(logger *zap
182148

183149
for _, reservationProperties := range page.Value {
184150
labels := prometheus.Labels{
151+
"scope": scope,
185152
"reservationOrderID": to.String(reservationProperties.Properties.ReservationOrderID),
186153
"reservationID": to.String(reservationProperties.Properties.ReservationID),
187154
"skuName": to.String(reservationProperties.Properties.SKUName),

0 commit comments

Comments
 (0)