@@ -2,6 +2,9 @@ package main
22
33import (
44 "context"
5+ "fmt"
6+ "regexp"
7+ "strings"
58
69 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/keyvault/armkeyvault"
710 "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armsubscriptions"
@@ -15,9 +18,15 @@ import (
1518 "go.uber.org/zap"
1619)
1720
21+ var (
22+ azureTagNameToPrometheusNameRegExp = regexp .MustCompile ("[^_a-zA-Z0-9]" )
23+ )
24+
1825type MetricsCollectorKeyvault struct {
1926 collector.Processor
2027
28+ contentTagManager ContentTagManager
29+
2130 prometheus struct {
2231 // general
2332 keyvault * prometheus.GaugeVec
@@ -39,9 +48,67 @@ type MetricsCollectorKeyvault struct {
3948 }
4049}
4150
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+
42101func (m * MetricsCollectorKeyvault ) Setup (collector * collector.Collector ) {
43102 m .Processor .Setup (collector )
44103
104+ m .contentTagManager = ContentTagManager {
105+ config : []ContentTagConfig {},
106+ }
107+
108+ for _ , tagName := range opts .KeyVault .Content .Tags {
109+ m .contentTagManager .AddTag (tagName )
110+ }
111+
45112 m .prometheus .keyvault = prometheus .NewGaugeVec (
46113 prometheus.GaugeOpts {
47114 Name : "azurerm_keyvault_info" ,
@@ -93,13 +160,15 @@ func (m *MetricsCollectorKeyvault) Setup(collector *collector.Collector) {
93160 Name : "azurerm_keyvault_key_info" ,
94161 Help : "Azure KeyVault key information" ,
95162 },
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+ ),
103172 )
104173 m .Collector .RegisterMetricList ("keyvaultKeyInfo" , m .prometheus .keyvaultKeyInfo , true )
105174
@@ -124,13 +193,15 @@ func (m *MetricsCollectorKeyvault) Setup(collector *collector.Collector) {
124193 Name : "azurerm_keyvault_secret_info" ,
125194 Help : "Azure KeyVault secret information" ,
126195 },
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+ ),
134205 )
135206 m .Collector .RegisterMetricList ("keyvaultSecretInfo" , m .prometheus .keyvaultSecretInfo , true )
136207
@@ -155,13 +226,15 @@ func (m *MetricsCollectorKeyvault) Setup(collector *collector.Collector) {
155226 Name : "azurerm_keyvault_certificate_info" ,
156227 Help : "Azure KeyVault certificate information" ,
157228 },
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+ ),
165238 )
166239 m .Collector .RegisterMetricList ("keyvaultCertificateInfo" , m .prometheus .keyvaultCertificateInfo , true )
167240
@@ -342,13 +415,18 @@ func (m *MetricsCollectorKeyvault) collectKeyVault(callback chan<- func(), vault
342415 itemID := string (* item .KID )
343416 itemName := item .KID .Name ()
344417
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+ )
352430
353431 // expiry date
354432 expiryDate := float64 (0 )
@@ -440,13 +518,18 @@ func (m *MetricsCollectorKeyvault) collectKeyVault(callback chan<- func(), vault
440518 itemID := string (* item .ID )
441519 itemName := item .ID .Name ()
442520
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+ )
450533
451534 // expiry date
452535 expiryDate := float64 (0 )
@@ -538,13 +621,18 @@ func (m *MetricsCollectorKeyvault) collectKeyVault(callback chan<- func(), vault
538621 itemID := string (* item .ID )
539622 itemName := item .ID .Name ()
540623
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+ )
548636
549637 // expiry
550638 expiryDate := float64 (0 )
0 commit comments