Skip to content

Commit 8b704d2

Browse files
committed
add content tags
fixes #6 Signed-off-by: Markus Blaschke <[email protected]>
1 parent 479f861 commit 8b704d2

File tree

2 files changed

+134
-43
lines changed

2 files changed

+134
-43
lines changed

config/opts.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ type (
2222
}
2323

2424
KeyVault struct {
25-
Filter string `long:"keyvault.filter" env:"KEYVAULT_FILTER" description:"Filter KeyVaults via ResourceGraph kusto filter, query: 'resource | ${filter} | project id'"`
25+
Filter string `long:"keyvault.filter" env:"KEYVAULT_FILTER" description:"Filter KeyVaults via ResourceGraph kusto filter, query: 'resource | ${filter} | project id'"`
26+
Content struct {
27+
Tags []string `long:"keyvault.content.tag" env:"KEYVAULT_CONTENT_TAG" env-delim:" " description:"KeyVault content (secret, key, certificates) tags (space delimiter)"`
28+
}
2629
}
2730

2831
// caching

metrics.keyvault.go

+130-42
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package main
22

33
import (
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+
1825
type 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+
42101
func (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

Comments
 (0)