Skip to content

Commit c69b8a2

Browse files
committed
Add metrics exporter for AWS quota service.
1 parent 0be09c9 commit c69b8a2

29 files changed

+2208
-26
lines changed

go.mod

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.24.0
44

55
require (
66
github.com/aws/aws-sdk-go v1.55.7
7-
github.com/aws/aws-sdk-go-v2 v1.41.1
7+
github.com/aws/aws-sdk-go-v2 v1.41.3
88
github.com/aws/aws-sdk-go-v2/config v1.32.7
99
github.com/aws/aws-sdk-go-v2/credentials v1.19.7
1010
github.com/aws/aws-sdk-go-v2/service/amp v1.42.5
@@ -20,6 +20,8 @@ require (
2020
github.com/aws/aws-sdk-go-v2/service/lambda v1.87.1
2121
github.com/aws/aws-sdk-go-v2/service/rds v1.114.0
2222
github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.31.6
23+
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.0
24+
github.com/aws/aws-sdk-go-v2/service/servicequotas v1.34.3
2325
github.com/aws/aws-sdk-go-v2/service/shield v1.34.17
2426
github.com/aws/aws-sdk-go-v2/service/storagegateway v1.43.10
2527
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6
@@ -40,14 +42,17 @@ require (
4042
require (
4143
github.com/alecthomas/kingpin/v2 v2.4.0 // indirect
4244
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
43-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 // indirect
45+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 // indirect
4446
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 // indirect
45-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 // indirect
46-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 // indirect
47+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 // indirect
48+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 // indirect
4749
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
48-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
50+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20 // indirect
51+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 // indirect
52+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11 // indirect
4953
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.17 // indirect
50-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 // indirect
54+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 // indirect
55+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19 // indirect
5156
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect
5257
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 // indirect
5358
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 // indirect

go.sum

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,24 @@ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vS
44
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
55
github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE=
66
github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
7-
github.com/aws/aws-sdk-go-v2 v1.41.1 h1:ABlyEARCDLN034NhxlRUSZr4l71mh+T5KAeGh6cerhU=
8-
github.com/aws/aws-sdk-go-v2 v1.41.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
9-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU=
10-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
7+
github.com/aws/aws-sdk-go-v2 v1.41.3 h1:4kQ/fa22KjDt13QCy1+bYADvdgcxpfH18f0zP542kZA=
8+
github.com/aws/aws-sdk-go-v2 v1.41.3/go.mod h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
9+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6 h1:N4lRUXZpZ1KVEUn6hxtco/1d2lgYhNn1fHkkl8WhlyQ=
10+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.6/go.mod h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI=
1111
github.com/aws/aws-sdk-go-v2/config v1.32.7 h1:vxUyWGUwmkQ2g19n7JY/9YL8MfAIl7bTesIUykECXmY=
1212
github.com/aws/aws-sdk-go-v2/config v1.32.7/go.mod h1:2/Qm5vKUU/r7Y+zUk/Ptt2MDAEKAfUtKc1+3U1Mo3oY=
1313
github.com/aws/aws-sdk-go-v2/credentials v1.19.7 h1:tHK47VqqtJxOymRrNtUXN5SP/zUTvZKeLx4tH6PGQc8=
1414
github.com/aws/aws-sdk-go-v2/credentials v1.19.7/go.mod h1:qOZk8sPDrxhf+4Wf4oT2urYJrYt3RejHSzgAquYeppw=
1515
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 h1:I0GyV8wiYrP8XpA70g1HBcQO1JlQxCMTW9npl5UbDHY=
1616
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17/go.mod h1:tyw7BOl5bBe/oqvoIeECFJjMdzXoa/dfVz3QQ5lgHGA=
17-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 h1:xOLELNKGp2vsiteLsvLPwxC+mYmO6OZ8PYgiuPJzF8U=
18-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17/go.mod h1:5M5CI3D12dNOtH3/mk6minaRwI2/37ifCURZISxA/IQ=
19-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 h1:WWLqlh79iO48yLkj1v3ISRNiv+3KdQoZ6JWyfcsyQik=
20-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17/go.mod h1:EhG22vHRrvF8oXSTYStZhJc1aUgKtnJe+aOiFEV90cM=
17+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19 h1:/sECfyq2JTifMI2JPyZ4bdRN77zJmr6SrS1eL3augIA=
18+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.19/go.mod h1:dMf8A5oAqr9/oxOfLkC/c2LU/uMcALP0Rgn2BD5LWn0=
19+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19 h1:AWeJMk33GTBf6J20XJe6qZoRSJo0WfUhsMdUKhoODXE=
20+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.19/go.mod h1:+GWrYoaAsV7/4pNHpwh1kiNLXkKaSoppxQq9lbH8Ejw=
2121
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
2222
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
23+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20 h1:qi3e/dmpdONhj1RyIZdi6DKKpDXS5Lb8ftr3p7cyHJc=
24+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.20/go.mod h1:V1K+TeJVD5JOk3D9e5tsX2KUdL7BlB+FV6cBhdobN8c=
2325
github.com/aws/aws-sdk-go-v2/service/amp v1.42.5 h1:Pd07a2Tdhl3591h+hbJZCC+50NGraSyt/I6yLx4FDak=
2426
github.com/aws/aws-sdk-go-v2/service/amp v1.42.5/go.mod h1:6q5j2wH8o1tf4glByj2hBDIEiOAKDh0x5QpjLKmIi40=
2527
github.com/aws/aws-sdk-go-v2/service/apigateway v1.38.4 h1:V8gcFwJPP3eXZXpeui+p97JmO7WtCkQlEAHrE6Kyt0k=
@@ -40,18 +42,26 @@ github.com/aws/aws-sdk-go-v2/service/elasticache v1.51.9 h1:hTgZLyNoDWphZUtTtcvQ
4042
github.com/aws/aws-sdk-go-v2/service/elasticache v1.51.9/go.mod h1:91RkIYy9ubykxB50XGYDsbljLZnrZ6rp/Urt4rZrbwQ=
4143
github.com/aws/aws-sdk-go-v2/service/iam v1.53.2 h1:62G6btFUwAa5uR5iPlnlNVAM0zJSLbWgDfKOfUC7oW4=
4244
github.com/aws/aws-sdk-go-v2/service/iam v1.53.2/go.mod h1:av9clChrbZbJ5E21msSsiT2oghl2BJHfQGhCkXmhyu8=
43-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
44-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
45+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6 h1:XAq62tBTJP/85lFD5oqOOe7YYgWxY9LvWq8plyDvDVg=
46+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.6/go.mod h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
47+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11 h1:BYf7XNsJMzl4mObARUBUib+j2tf0U//JAAtTnYqvqCw=
48+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.11/go.mod h1:aEUS4WrNk/+FxkBZZa7tVgp4pGH+kFGW40Y8rCPqt5g=
4549
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.17 h1:Nhx/OYX+ukejm9t/MkWI8sucnsiroNYNGb5ddI9ungQ=
4650
github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.17/go.mod h1:AjmK8JWnlAevq1b1NBtv5oQVG4iqnYXUufdgol+q9wg=
47-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 h1:RuNSMoozM8oXlgLG/n6WLaFGoea7/CddrCfIiSA+xdY=
48-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17/go.mod h1:F2xxQ9TZz5gDWsclCtPQscGpP0VUOc8RqgFM3vDENmU=
51+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19 h1:X1Tow7suZk9UCJHE1Iw9GMZJJl0dAnKXXP1NaSDHwmw=
52+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.19/go.mod h1:/rARO8psX+4sfjUQXp5LLifjUt8DuATZ31WptNJTyQA=
53+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19 h1:JnQeStZvPHFHeyky/7LbMlyQjUa+jIBj36OlWm0pzIk=
54+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.19/go.mod h1:HGyasyHvYdFQeJhvDHfH7HXkHh57htcJGKDZ+7z+I24=
4955
github.com/aws/aws-sdk-go-v2/service/lambda v1.87.1 h1:QBdmTXWwqVgx0PueT/Xgp2+al5HR0gAV743pTzYeBRw=
5056
github.com/aws/aws-sdk-go-v2/service/lambda v1.87.1/go.mod h1:ogjbkxFgFOjG3dYFQ8irC92gQfpfMDcy1RDKNSZWXNU=
5157
github.com/aws/aws-sdk-go-v2/service/rds v1.114.0 h1:p9c6HDzx6sTf7uyc9xsQd693uzArsPrsVr9n0oRk7DU=
5258
github.com/aws/aws-sdk-go-v2/service/rds v1.114.0/go.mod h1:JBRYWpz5oXQtHgQC+X8LX9lh0FBCwRHJlWEIT+TTLaE=
5359
github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.31.6 h1:gd7YMnFZQGdy4lERF9ffz9kbc6K/IPhCu5CrJDJr8XY=
5460
github.com/aws/aws-sdk-go-v2/service/resourcegroupstaggingapi v1.31.6/go.mod h1:lnTv81am9e2C2SjX3VKyUrKEzDADD9lKST9ou96UBoY=
61+
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.0 h1:zyKY4OxzUImu+DigelJI9o49QQv8CjREs5E1CywjtIA=
62+
github.com/aws/aws-sdk-go-v2/service/s3 v1.97.0/go.mod h1:NF3JcMGOiARAss1ld3WGORCw71+4ExDD2cbbdKS5PpA=
63+
github.com/aws/aws-sdk-go-v2/service/servicequotas v1.34.3 h1:sImEaE1KtqSb+y7SZh71y4O0mIgXndXEYDxqGQ5TEyI=
64+
github.com/aws/aws-sdk-go-v2/service/servicequotas v1.34.3/go.mod h1:zOPufbmfmRDQw0ewok+EoPkLSBjFdMnkDtNocC723Ns=
5565
github.com/aws/aws-sdk-go-v2/service/shield v1.34.17 h1:XOqXVwczmfk6/GtGW7eee1RvCp7NhPKn8wYbZp+yTa8=
5666
github.com/aws/aws-sdk-go-v2/service/shield v1.34.17/go.mod h1:eQV3cCW6J6J+cpBitDt/tDvVTmBFTdlZdEGNKsB76O8=
5767
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 h1:VrhDvQib/i0lxvr3zqlUwLwJP4fpmpyD9wYG1vfSu+Y=

pkg/config/config.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"gopkg.in/yaml.v2"
2424

2525
"github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/internal/enhancedmetrics"
26+
"github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/internal/quotametrics"
2627
"github.com/prometheus-community/yet-another-cloudwatch-exporter/pkg/model"
2728
)
2829

@@ -68,6 +69,7 @@ type Job struct {
6869
RecentlyActiveOnly bool `yaml:"recentlyActiveOnly"`
6970
IncludeContextOnInfoMetrics bool `yaml:"includeContextOnInfoMetrics"`
7071
EnhancedMetrics []*EnhancedMetric `yaml:"enhancedMetrics"`
72+
QuotaMetrics bool `yaml:"quotaMetrics"`
7173
JobLevelMetricFields `yaml:",inline"`
7274
}
7375

@@ -244,8 +246,8 @@ func (j *Job) validateDiscoveryJob(logger *slog.Logger, jobIdx int) error {
244246
if len(j.Regions) == 0 {
245247
return fmt.Errorf("Discovery job [%s/%d]: Regions should not be empty", j.Type, jobIdx)
246248
}
247-
if len(j.Metrics) == 0 && len(j.EnhancedMetrics) == 0 {
248-
return fmt.Errorf("Discovery job [%s/%d]: Metrics and EnhancedMetrics should not both be empty", j.Type, jobIdx)
249+
if len(j.Metrics) == 0 && len(j.EnhancedMetrics) == 0 && !j.QuotaMetrics {
250+
return fmt.Errorf("Discovery job [%s/%d]: Metrics, EnhancedMetrics, and QuotaMetrics should not all be empty", j.Type, jobIdx)
249251
}
250252
for metricIdx, metric := range j.Metrics {
251253
err := metric.validateMetric(logger, metricIdx, parent, &j.JobLevelMetricFields)
@@ -277,6 +279,12 @@ func (j *Job) validateDiscoveryJob(logger *slog.Logger, jobIdx int) error {
277279
}
278280
}
279281

282+
if j.QuotaMetrics {
283+
if !quotametrics.DefaultQuotaMetricServiceRegistry.IsNamespaceSupported(j.Type) {
284+
return fmt.Errorf("Discovery job [%s/%d]: quota metrics are not supported for namespace %q", j.Type, jobIdx, j.Type)
285+
}
286+
}
287+
280288
return nil
281289
}
282290

@@ -458,6 +466,7 @@ func (c *ScrapeConf) toModelConfig() model.JobsConfig {
458466
job.IncludeContextOnInfoMetrics = discoveryJob.IncludeContextOnInfoMetrics
459467
job.DimensionsRegexps = svc.ToModelDimensionsRegexp()
460468
job.EnhancedMetrics = svc.toModelEnhancedMetricsConfig(discoveryJob.EnhancedMetrics)
469+
job.QuotaMetrics = discoveryJob.QuotaMetrics
461470

462471
job.ExportedTagsOnMetrics = []string{}
463472
if len(c.Discovery.ExportedTagsOnMetrics) > 0 {

pkg/config/config_quota_test.go

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// Copyright 2026 The Prometheus Authors
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
package config
14+
15+
import (
16+
"fmt"
17+
"strings"
18+
"testing"
19+
20+
"github.com/prometheus/common/promslog"
21+
"github.com/stretchr/testify/require"
22+
)
23+
24+
func TestQuotaMetricsConfig(t *testing.T) {
25+
testCases := []struct {
26+
name string
27+
configFile string
28+
wantErr bool
29+
errorMsg string
30+
}{
31+
{
32+
name: "valid config with quotaMetrics for supported namespace",
33+
configFile: "quota_metrics_ec2.ok.yml",
34+
wantErr: false,
35+
},
36+
{
37+
name: "invalid config with quotaMetrics for unsupported namespace",
38+
configFile: "quota_metrics_unsupported.bad.yml",
39+
wantErr: true,
40+
errorMsg: "quota metrics are not supported for namespace",
41+
},
42+
{
43+
name: "config with only quotaMetrics is valid",
44+
configFile: "quota_metrics_only.ok.yml",
45+
wantErr: false,
46+
},
47+
{
48+
name: "empty config with no metrics, no enhanced, no quota is invalid",
49+
configFile: "quota_metrics_empty.bad.yml",
50+
wantErr: true,
51+
errorMsg: "Metrics, EnhancedMetrics, and QuotaMetrics should not all be empty",
52+
},
53+
}
54+
55+
for _, tc := range testCases {
56+
t.Run(tc.name, func(t *testing.T) {
57+
config := ScrapeConf{}
58+
configFile := fmt.Sprintf("testdata/%s", tc.configFile)
59+
_, err := config.Load(configFile, promslog.NewNopLogger())
60+
if tc.wantErr {
61+
require.Error(t, err)
62+
require.True(t, strings.Contains(err.Error(), tc.errorMsg),
63+
"expected error to contain %q but got: %s", tc.errorMsg, err)
64+
} else {
65+
require.NoError(t, err)
66+
}
67+
})
68+
}
69+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: v1alpha1
2+
discovery:
3+
jobs:
4+
- type: AWS/EC2
5+
regions:
6+
- us-east-1
7+
roles:
8+
- {}
9+
metrics:
10+
- name: CPUUtilization
11+
statistics:
12+
- Average
13+
period: 300
14+
length: 300
15+
quotaMetrics: true
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
apiVersion: v1alpha1
2+
discovery:
3+
jobs:
4+
- type: AWS/EC2
5+
regions:
6+
- us-east-1
7+
roles:
8+
- {}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
apiVersion: v1alpha1
2+
discovery:
3+
jobs:
4+
- type: AWS/EC2
5+
regions:
6+
- us-east-1
7+
roles:
8+
- {}
9+
quotaMetrics: true
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: v1alpha1
2+
discovery:
3+
jobs:
4+
- type: AWS/Billing
5+
regions:
6+
- us-east-1
7+
roles:
8+
- {}
9+
metrics:
10+
- name: EstimatedCharges
11+
statistics:
12+
- Sum
13+
period: 3600
14+
length: 87600
15+
quotaMetrics: true

pkg/exporter.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ func UpdateMetrics(
196196
// add feature flags to context passed down to all other layers
197197
ctx = config.CtxWithFlags(ctx, options.featureFlags)
198198

199-
tagsData, cloudwatchData := job.ScrapeAwsData(
199+
tagsData, cloudwatchData, quotaData := job.ScrapeAwsData(
200200
ctx,
201201
logger,
202202
jobsCfg,
@@ -212,6 +212,19 @@ func UpdateMetrics(
212212
return nil
213213
}
214214
metrics, observedMetricLabels = promutil.BuildNamespaceInfoMetrics(tagsData, metrics, observedMetricLabels, options.labelsSnakeCase, logger)
215+
216+
quotaMetrics, quotaLabels := promutil.BuildQuotaMetrics(quotaData, options.labelsSnakeCase, logger)
217+
metrics = append(metrics, quotaMetrics...)
218+
for k, v := range quotaLabels {
219+
if existing, ok := observedMetricLabels[k]; ok {
220+
for label := range v {
221+
existing[label] = struct{}{}
222+
}
223+
} else {
224+
observedMetricLabels[k] = v
225+
}
226+
}
227+
215228
metrics = promutil.EnsureLabelConsistencyAndRemoveDuplicates(metrics, observedMetricLabels)
216229

217230
registry.MustRegister(promutil.NewPrometheusCollector(metrics))

0 commit comments

Comments
 (0)