@@ -2,6 +2,9 @@ package main
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
6
+ "regexp"
7
+ "strings"
5
8
6
9
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault"
7
10
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions"
@@ -15,9 +18,15 @@ import (
15
18
"go.uber.org/zap"
16
19
)
17
20
21
+ var (
22
+ azureTagNameToPrometheusNameRegExp = regexp .MustCompile ("[^_a-zA-Z0-9]" )
23
+ )
24
+
18
25
type MetricsCollectorKeyvault struct {
19
26
collector.Processor
20
27
28
+ contentTagManager ContentTagManager
29
+
21
30
prometheus struct {
22
31
// general
23
32
keyvault * prometheus.GaugeVec
@@ -39,9 +48,67 @@ type MetricsCollectorKeyvault struct {
39
48
}
40
49
}
41
50
51
+ type (
52
+ ContentTagManager struct {
53
+ config []ContentTagConfig
54
+ }
55
+
56
+ ContentTagConfig struct {
57
+ Label string
58
+ Tag string
59
+ }
60
+ )
61
+
62
+ // AddTag adds tag to configuration
63
+ func (ctm * ContentTagManager ) AddTag (tagName string ) {
64
+ labelName := fmt .Sprintf (
65
+ "tag_%s" ,
66
+ azureTagNameToPrometheusNameRegExp .ReplaceAllLiteralString (strings .ToLower (tagName ), "_" ),
67
+ )
68
+
69
+ ctm .config = append (
70
+ ctm .config ,
71
+ ContentTagConfig {
72
+ Tag : tagName ,
73
+ Label : labelName ,
74
+ },
75
+ )
76
+ }
77
+
78
+ // AddContentTags adds content tags to prometheus labels for metric
79
+ func (ctm * ContentTagManager ) AddContentTags (labels prometheus.Labels , tags map [string ]* string ) prometheus.Labels {
80
+ for _ , row := range ctm .config {
81
+ // default value
82
+ labels [row .Label ] = ""
83
+
84
+ if val , exists := tags [row .Tag ]; exists {
85
+ labels [row .Label ] = to .String (val )
86
+ }
87
+ }
88
+
89
+ return labels
90
+ }
91
+
92
+ // AddToPrometheusLabels adds prometheus labels for metric definition
93
+ func (ctm * ContentTagManager ) AddToPrometheusLabels (val []string ) []string {
94
+ for _ , row := range ctm .config {
95
+ val = append (val , row .Label )
96
+ }
97
+
98
+ return val
99
+ }
100
+
42
101
func (m * MetricsCollectorKeyvault ) Setup (collector * collector.Collector ) {
43
102
m .Processor .Setup (collector )
44
103
104
+ m .contentTagManager = ContentTagManager {
105
+ config : []ContentTagConfig {},
106
+ }
107
+
108
+ for _ , tagName := range opts .KeyVault .Content .Tags {
109
+ m .contentTagManager .AddTag (tagName )
110
+ }
111
+
45
112
m .prometheus .keyvault = prometheus .NewGaugeVec (
46
113
prometheus.GaugeOpts {
47
114
Name : "azurerm_keyvault_info" ,
@@ -93,13 +160,15 @@ func (m *MetricsCollectorKeyvault) Setup(collector *collector.Collector) {
93
160
Name : "azurerm_keyvault_key_info" ,
94
161
Help : "Azure KeyVault key information" ,
95
162
},
96
- []string {
97
- "resourceID" ,
98
- "vaultName" ,
99
- "keyName" ,
100
- "keyID" ,
101
- "enabled" ,
102
- },
163
+ m .contentTagManager .AddToPrometheusLabels (
164
+ []string {
165
+ "resourceID" ,
166
+ "vaultName" ,
167
+ "keyName" ,
168
+ "keyID" ,
169
+ "enabled" ,
170
+ },
171
+ ),
103
172
)
104
173
m .Collector .RegisterMetricList ("keyvaultKeyInfo" , m .prometheus .keyvaultKeyInfo , true )
105
174
@@ -124,13 +193,15 @@ func (m *MetricsCollectorKeyvault) Setup(collector *collector.Collector) {
124
193
Name : "azurerm_keyvault_secret_info" ,
125
194
Help : "Azure KeyVault secret information" ,
126
195
},
127
- []string {
128
- "resourceID" ,
129
- "vaultName" ,
130
- "secretName" ,
131
- "secretID" ,
132
- "enabled" ,
133
- },
196
+ m .contentTagManager .AddToPrometheusLabels (
197
+ []string {
198
+ "resourceID" ,
199
+ "vaultName" ,
200
+ "secretName" ,
201
+ "secretID" ,
202
+ "enabled" ,
203
+ },
204
+ ),
134
205
)
135
206
m .Collector .RegisterMetricList ("keyvaultSecretInfo" , m .prometheus .keyvaultSecretInfo , true )
136
207
@@ -155,13 +226,15 @@ func (m *MetricsCollectorKeyvault) Setup(collector *collector.Collector) {
155
226
Name : "azurerm_keyvault_certificate_info" ,
156
227
Help : "Azure KeyVault certificate information" ,
157
228
},
158
- []string {
159
- "resourceID" ,
160
- "vaultName" ,
161
- "certificateName" ,
162
- "certificateID" ,
163
- "enabled" ,
164
- },
229
+ m .contentTagManager .AddToPrometheusLabels (
230
+ []string {
231
+ "resourceID" ,
232
+ "vaultName" ,
233
+ "certificateName" ,
234
+ "certificateID" ,
235
+ "enabled" ,
236
+ },
237
+ ),
165
238
)
166
239
m .Collector .RegisterMetricList ("keyvaultCertificateInfo" , m .prometheus .keyvaultCertificateInfo , true )
167
240
@@ -342,13 +415,18 @@ func (m *MetricsCollectorKeyvault) collectKeyVault(callback chan<- func(), vault
342
415
itemID := string (* item .KID )
343
416
itemName := item .KID .Name ()
344
417
345
- vaultKeyMetrics .AddInfo (prometheus.Labels {
346
- "resourceID" : vaultResourceId ,
347
- "vaultName" : azureResource .ResourceName ,
348
- "keyName" : itemName ,
349
- "keyID" : itemID ,
350
- "enabled" : to .BoolString (to .Bool (item .Attributes .Enabled )),
351
- })
418
+ vaultKeyMetrics .AddInfo (
419
+ m .contentTagManager .AddContentTags (
420
+ prometheus.Labels {
421
+ "resourceID" : vaultResourceId ,
422
+ "vaultName" : azureResource .ResourceName ,
423
+ "keyName" : itemName ,
424
+ "keyID" : itemID ,
425
+ "enabled" : to .BoolString (to .Bool (item .Attributes .Enabled )),
426
+ },
427
+ item .Tags ,
428
+ ),
429
+ )
352
430
353
431
// expiry date
354
432
expiryDate := float64 (0 )
@@ -440,13 +518,18 @@ func (m *MetricsCollectorKeyvault) collectKeyVault(callback chan<- func(), vault
440
518
itemID := string (* item .ID )
441
519
itemName := item .ID .Name ()
442
520
443
- vaultSecretMetrics .AddInfo (prometheus.Labels {
444
- "resourceID" : vaultResourceId ,
445
- "vaultName" : azureResource .ResourceName ,
446
- "secretName" : itemName ,
447
- "secretID" : itemID ,
448
- "enabled" : to .BoolString (to .Bool (item .Attributes .Enabled )),
449
- })
521
+ vaultSecretMetrics .AddInfo (
522
+ m .contentTagManager .AddContentTags (
523
+ prometheus.Labels {
524
+ "resourceID" : vaultResourceId ,
525
+ "vaultName" : azureResource .ResourceName ,
526
+ "secretName" : itemName ,
527
+ "secretID" : itemID ,
528
+ "enabled" : to .BoolString (to .Bool (item .Attributes .Enabled )),
529
+ },
530
+ item .Tags ,
531
+ ),
532
+ )
450
533
451
534
// expiry date
452
535
expiryDate := float64 (0 )
@@ -538,13 +621,18 @@ func (m *MetricsCollectorKeyvault) collectKeyVault(callback chan<- func(), vault
538
621
itemID := string (* item .ID )
539
622
itemName := item .ID .Name ()
540
623
541
- vaultCertificateMetrics .AddInfo (prometheus.Labels {
542
- "resourceID" : vaultResourceId ,
543
- "vaultName" : azureResource .ResourceName ,
544
- "certificateName" : itemName ,
545
- "certificateID" : itemID ,
546
- "enabled" : to .BoolString (to .Bool (item .Attributes .Enabled )),
547
- })
624
+ vaultCertificateMetrics .AddInfo (
625
+ m .contentTagManager .AddContentTags (
626
+ prometheus.Labels {
627
+ "resourceID" : vaultResourceId ,
628
+ "vaultName" : azureResource .ResourceName ,
629
+ "certificateName" : itemName ,
630
+ "certificateID" : itemID ,
631
+ "enabled" : to .BoolString (to .Bool (item .Attributes .Enabled )),
632
+ },
633
+ item .Tags ,
634
+ ),
635
+ )
548
636
549
637
// expiry
550
638
expiryDate := float64 (0 )
0 commit comments