Skip to content

Commit cc63a1b

Browse files
committed
add subscriptionName as label
fixes #26 Signed-off-by: Markus Blaschke <[email protected]>
1 parent fe2da83 commit cc63a1b

File tree

3 files changed

+88
-78
lines changed

3 files changed

+88
-78
lines changed

metrics/insights.subscription.go

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"strings"
55

66
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor"
7+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions"
78
"github.com/prometheus/client_golang/prometheus"
89
"github.com/webdevops/go-common/azuresdk/armclient"
910
stringsCommon "github.com/webdevops/go-common/strings"
@@ -14,8 +15,8 @@ type (
1415
AzureInsightSubscriptionMetricsResult struct {
1516
AzureInsightBaseMetricsResult
1617

17-
subscriptionID string
18-
Result *armmonitor.MetricsClientListAtSubscriptionScopeResponse
18+
subscription *armsubscriptions.Subscription
19+
Result *armmonitor.MetricsClientListAtSubscriptionScopeResponse
1920
}
2021
)
2122

@@ -53,15 +54,16 @@ func (r *AzureInsightSubscriptionMetricsResult) SendMetricToChannel(channel chan
5354
}
5455

5556
metricLabels := prometheus.Labels{
56-
"resourceID": strings.ToLower(resourceId),
57-
"subscriptionID": azureResource.Subscription,
58-
"resourceGroup": azureResource.ResourceGroup,
59-
"resourceName": azureResource.ResourceName,
60-
"metric": to.String(metric.Name.Value),
61-
"unit": metricUnit,
62-
"interval": to.String(r.prober.settings.Interval),
63-
"timespan": r.prober.settings.Timespan,
64-
"aggregation": "",
57+
"resourceID": strings.ToLower(resourceId),
58+
"subscriptionID": azureResource.Subscription,
59+
"subscriptionName": to.String(r.subscription.DisplayName),
60+
"resourceGroup": azureResource.ResourceGroup,
61+
"resourceName": azureResource.ResourceName,
62+
"metric": to.String(metric.Name.Value),
63+
"unit": metricUnit,
64+
"interval": to.String(r.prober.settings.Interval),
65+
"timespan": r.prober.settings.Timespan,
66+
"aggregation": "",
6567
}
6668

6769
// add resource tags as labels

metrics/insights.target.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,22 @@ func (r *AzureInsightMetricsResult) SendMetricToChannel(channel chan<- Prometheu
4545
metricUnit = string(*metric.Unit)
4646
}
4747

48+
subscriptionName := ""
49+
if subscription, err := r.prober.AzureClient.GetCachedSubscription(r.prober.ctx, azureResource.Subscription); err == nil && subscription != nil {
50+
subscriptionName = to.String(subscription.DisplayName)
51+
}
52+
4853
metricLabels := prometheus.Labels{
49-
"resourceID": strings.ToLower(resourceId),
50-
"subscriptionID": azureResource.Subscription,
51-
"resourceGroup": azureResource.ResourceGroup,
52-
"resourceName": azureResource.ResourceName,
53-
"metric": to.String(metric.Name.Value),
54-
"unit": metricUnit,
55-
"interval": to.String(r.prober.settings.Interval),
56-
"timespan": r.prober.settings.Timespan,
57-
"aggregation": "",
54+
"resourceID": strings.ToLower(resourceId),
55+
"subscriptionID": azureResource.Subscription,
56+
"subscriptionName": subscriptionName,
57+
"resourceGroup": azureResource.ResourceGroup,
58+
"resourceName": azureResource.ResourceName,
59+
"metric": to.String(metric.Name.Value),
60+
"unit": metricUnit,
61+
"interval": to.String(r.prober.settings.Interval),
62+
"timespan": r.prober.settings.Timespan,
63+
"aggregation": "",
5864
}
5965

6066
// add resource tags as labels

metrics/prober.go

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"time"
88

99
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor"
10+
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions"
1011
"github.com/Azure/go-autorest/autorest/azure"
1112
"github.com/patrickmn/go-cache"
1213
"github.com/prometheus/client_golang/prometheus"
@@ -176,77 +177,78 @@ func (p *MetricProber) RunOnSubscriptionScope() {
176177
func (p *MetricProber) collectMetricsFromSubscriptions() {
177178
metricsChannel := make(chan PrometheusMetricResult)
178179

179-
wgSubscription := sizedwaitgroup.New(p.Conf.Prober.ConcurrencySubscription)
180+
subscriptionIterator := armclient.NewSubscriptionIterator(p.AzureClient, p.settings.Subscriptions...)
181+
subscriptionIterator.SetConcurrency(p.Conf.Prober.ConcurrencySubscription)
180182

181183
go func() {
182-
for _, subscriptionId := range p.settings.Subscriptions {
184+
185+
err := subscriptionIterator.ForEachAsync(p.logger, func(subscription *armsubscriptions.Subscription, logger *zap.SugaredLogger) {
183186
for _, region := range p.settings.Regions {
184-
wgSubscription.Add()
185-
go func(subscriptionId, region string) {
186-
defer wgSubscription.Done()
187+
client, err := p.MetricsClient(*subscription.SubscriptionID)
188+
if err != nil {
189+
// FIXME: find a better way to report errors
190+
p.logger.Error(err)
191+
return
192+
}
187193

188-
client, err := p.MetricsClient(subscriptionId)
189-
if err != nil {
190-
// FIXME: find a better way to report errors
191-
p.logger.Error(err)
192-
return
194+
// request metrics in 20 metrics chunks (azure metric api limitation)
195+
for i := 0; i < len(p.settings.Metrics); i += AzureMetricApiMaxMetricNumber {
196+
end := i + AzureMetricApiMaxMetricNumber
197+
if end > len(p.settings.Metrics) {
198+
end = len(p.settings.Metrics)
199+
}
200+
metricList := p.settings.Metrics[i:end]
201+
202+
resultType := armmonitor.MetricResultTypeData
203+
opts := armmonitor.MetricsClientListAtSubscriptionScopeOptions{
204+
Interval: p.settings.Interval,
205+
Timespan: to.StringPtr(p.settings.Timespan),
206+
Metricnames: to.StringPtr(strings.Join(metricList, ",")),
207+
Metricnamespace: to.StringPtr(p.settings.ResourceType),
208+
Top: p.settings.MetricTop,
209+
AutoAdjustTimegrain: to.BoolPtr(true),
210+
ResultType: &resultType,
211+
Filter: to.StringPtr(`Microsoft.ResourceId eq '*'`),
193212
}
194213

195-
// request metrics in 20 metrics chunks (azure metric api limitation)
196-
for i := 0; i < len(p.settings.Metrics); i += AzureMetricApiMaxMetricNumber {
197-
end := i + AzureMetricApiMaxMetricNumber
198-
if end > len(p.settings.Metrics) {
199-
end = len(p.settings.Metrics)
200-
}
201-
metricList := p.settings.Metrics[i:end]
202-
203-
resultType := armmonitor.MetricResultTypeData
204-
opts := armmonitor.MetricsClientListAtSubscriptionScopeOptions{
205-
Interval: p.settings.Interval,
206-
Timespan: to.StringPtr(p.settings.Timespan),
207-
Metricnames: to.StringPtr(strings.Join(metricList, ",")),
208-
Metricnamespace: to.StringPtr(p.settings.ResourceType),
209-
Top: p.settings.MetricTop,
210-
AutoAdjustTimegrain: to.BoolPtr(true),
211-
ResultType: &resultType,
212-
Filter: to.StringPtr(`Microsoft.ResourceId eq '*'`),
213-
}
214-
215-
if len(p.settings.Aggregations) >= 1 {
216-
opts.Aggregation = to.StringPtr(strings.Join(p.settings.Aggregations, ","))
217-
}
218-
219-
if len(p.settings.MetricFilter) >= 1 {
220-
opts.Filter = to.StringPtr(*opts.Filter + " and " + p.settings.MetricFilter)
221-
}
222-
223-
if len(p.settings.MetricOrderBy) >= 1 {
224-
opts.Orderby = to.StringPtr(p.settings.MetricOrderBy)
225-
}
214+
if len(p.settings.Aggregations) >= 1 {
215+
opts.Aggregation = to.StringPtr(strings.Join(p.settings.Aggregations, ","))
216+
}
226217

227-
response, err := client.ListAtSubscriptionScope(p.ctx, region, &opts)
228-
if err != nil {
229-
// FIXME: find a better way to report errors
230-
p.logger.Error(err)
231-
return
232-
}
218+
if len(p.settings.MetricFilter) >= 1 {
219+
opts.Filter = to.StringPtr(*opts.Filter + " and " + p.settings.MetricFilter)
220+
}
233221

234-
result := AzureInsightSubscriptionMetricsResult{
235-
AzureInsightBaseMetricsResult: AzureInsightBaseMetricsResult{
236-
prober: p,
237-
},
238-
subscriptionID: subscriptionId,
239-
Result: &response}
240-
result.SendMetricToChannel(metricsChannel)
222+
if len(p.settings.MetricOrderBy) >= 1 {
223+
opts.Orderby = to.StringPtr(p.settings.MetricOrderBy)
241224
}
242225

243-
if p.callbackSubscriptionFishish != nil {
244-
p.callbackSubscriptionFishish(subscriptionId)
226+
response, err := client.ListAtSubscriptionScope(p.ctx, region, &opts)
227+
if err != nil {
228+
// FIXME: find a better way to report errors
229+
p.logger.Error(err)
230+
return
245231
}
246-
}(subscriptionId, region)
232+
233+
result := AzureInsightSubscriptionMetricsResult{
234+
AzureInsightBaseMetricsResult: AzureInsightBaseMetricsResult{
235+
prober: p,
236+
},
237+
subscription: subscription,
238+
Result: &response}
239+
result.SendMetricToChannel(metricsChannel)
240+
}
241+
242+
if p.callbackSubscriptionFishish != nil {
243+
p.callbackSubscriptionFishish(*subscription.SubscriptionID)
244+
}
247245
}
246+
})
247+
if err != nil {
248+
// FIXME: find a better way to report errors
249+
p.logger.Error(err)
248250
}
249-
wgSubscription.Wait()
251+
250252
close(metricsChannel)
251253
}()
252254

0 commit comments

Comments
 (0)