Skip to content

Commit c92541d

Browse files
authored
Merge pull request #2298 from jrcichra/kube_secret_owner
feat: add kube_secret_owner metric
2 parents a1329c1 + 01507af commit c92541d

File tree

3 files changed

+100
-3
lines changed

3 files changed

+100
-3
lines changed

docs/secret-metrics.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88
| kube_secret_labels | Gauge | Kubernetes labels converted to Prometheus labels controlled via [--metric-labels-allowlist](./cli-arguments.md) | `secret`=&lt;secret-name&gt; <br> `namespace`=&lt;secret-namespace&gt; <br> `label_SECRET_LABEL`=&lt;SECRET_LABEL&gt; | STABLE |
99
| kube_secret_created | Gauge | | `secret`=&lt;secret-name&gt; <br> `namespace`=&lt;secret-namespace&gt; | STABLE |
1010
| kube_secret_metadata_resource_version | Gauge | | `secret`=&lt;secret-name&gt; <br> `namespace`=&lt;secret-namespace&gt; | EXPERIMENTAL |
11+
| kube_secret_owner | Gauge | | `secret`=&lt;secret-name&gt; <br> `namespace`=&lt;secret-namespace&gt; <br> `owner_kind`=&lt;owner kind&gt; <br> `owner_name`=&lt;owner name&gt; <br> `owner_is_controller`=&lt;whether owner is controller&gt; | EXPERIMENTAL |

internal/store/secret.go

+47
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package store
1818

1919
import (
2020
"context"
21+
"strconv"
2122

2223
v1 "k8s.io/api/core/v1"
2324
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -153,6 +154,52 @@ func secretMetricFamilies(allowAnnotationsList, allowLabelsList []string) []gene
153154
}
154155
}),
155156
),
157+
*generator.NewFamilyGeneratorWithStability(
158+
"kube_secret_owner",
159+
"Information about the Secret's owner.",
160+
metric.Gauge,
161+
basemetrics.ALPHA,
162+
"",
163+
wrapSecretFunc(func(j *v1.Secret) *metric.Family {
164+
labelKeys := []string{"owner_kind", "owner_name", "owner_is_controller"}
165+
166+
owners := j.GetOwnerReferences()
167+
168+
if len(owners) == 0 {
169+
return &metric.Family{
170+
Metrics: []*metric.Metric{
171+
{
172+
LabelKeys: labelKeys,
173+
LabelValues: []string{"", "", ""},
174+
Value: 1,
175+
},
176+
},
177+
}
178+
}
179+
180+
ms := make([]*metric.Metric, len(owners))
181+
182+
for i, owner := range owners {
183+
if owner.Controller != nil {
184+
ms[i] = &metric.Metric{
185+
LabelKeys: labelKeys,
186+
LabelValues: []string{owner.Kind, owner.Name, strconv.FormatBool(*owner.Controller)},
187+
Value: 1,
188+
}
189+
} else {
190+
ms[i] = &metric.Metric{
191+
LabelKeys: labelKeys,
192+
LabelValues: []string{owner.Kind, owner.Name, "false"},
193+
Value: 1,
194+
}
195+
}
196+
}
197+
198+
return &metric.Family{
199+
Metrics: ms,
200+
}
201+
}),
202+
),
156203
}
157204

158205
}

internal/store/secret_test.go

+52-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
)
2727

2828
func TestSecretStore(t *testing.T) {
29+
var test = true
2930
startTime := 1501569018
3031
metav1StartTime := metav1.Unix(int64(startTime), 0)
3132
cases := []generateMetricsTestCase{
@@ -43,17 +44,20 @@ func TestSecretStore(t *testing.T) {
4344
# HELP kube_secret_info [STABLE] Information about secret.
4445
# HELP kube_secret_labels [STABLE] Kubernetes labels converted to Prometheus labels.
4546
# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret.
47+
# HELP kube_secret_owner Information about the Secret's owner.
4648
# HELP kube_secret_type [STABLE] Type about secret.
4749
# TYPE kube_secret_created gauge
4850
# TYPE kube_secret_info gauge
4951
# TYPE kube_secret_labels gauge
5052
# TYPE kube_secret_metadata_resource_version gauge
53+
# TYPE kube_secret_owner gauge
5154
# TYPE kube_secret_type gauge
5255
kube_secret_info{namespace="ns1",secret="secret1"} 1
56+
kube_secret_owner{namespace="ns1",owner_is_controller="",owner_kind="",owner_name="",secret="secret1"} 1
5357
kube_secret_type{namespace="ns1",secret="secret1",type="Opaque"} 1
5458
kube_secret_metadata_resource_version{namespace="ns1",secret="secret1"} 0
5559
`,
56-
MetricNames: []string{"kube_secret_info", "kube_secret_metadata_resource_version", "kube_secret_created", "kube_secret_labels", "kube_secret_type"},
60+
MetricNames: []string{"kube_secret_info", "kube_secret_metadata_resource_version", "kube_secret_created", "kube_secret_labels", "kube_secret_type", "kube_secret_owner"},
5761
},
5862
{
5963
Obj: &v1.Secret{
@@ -70,17 +74,20 @@ func TestSecretStore(t *testing.T) {
7074
# HELP kube_secret_info [STABLE] Information about secret.
7175
# HELP kube_secret_labels [STABLE] Kubernetes labels converted to Prometheus labels.
7276
# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret.
77+
# HELP kube_secret_owner Information about the Secret's owner.
7378
# HELP kube_secret_type [STABLE] Type about secret.
7479
# TYPE kube_secret_created gauge
7580
# TYPE kube_secret_info gauge
7681
# TYPE kube_secret_labels gauge
7782
# TYPE kube_secret_metadata_resource_version gauge
83+
# TYPE kube_secret_owner gauge
7884
# TYPE kube_secret_type gauge
7985
kube_secret_info{namespace="ns2",secret="secret2"} 1
86+
kube_secret_owner{namespace="ns2",owner_is_controller="",owner_kind="",owner_name="",secret="secret2"} 1
8087
kube_secret_type{namespace="ns2",secret="secret2",type="kubernetes.io/service-account-token"} 1
8188
kube_secret_created{namespace="ns2",secret="secret2"} 1.501569018e+09
8289
`,
83-
MetricNames: []string{"kube_secret_info", "kube_secret_metadata_resource_version", "kube_secret_created", "kube_secret_labels", "kube_secret_type"},
90+
MetricNames: []string{"kube_secret_info", "kube_secret_metadata_resource_version", "kube_secret_created", "kube_secret_labels", "kube_secret_type", "kube_secret_owner"},
8491
},
8592
{
8693
Obj: &v1.Secret{
@@ -98,18 +105,60 @@ func TestSecretStore(t *testing.T) {
98105
# HELP kube_secret_info [STABLE] Information about secret.
99106
# HELP kube_secret_labels [STABLE] Kubernetes labels converted to Prometheus labels.
100107
# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret.
108+
# HELP kube_secret_owner Information about the Secret's owner.
101109
# HELP kube_secret_type [STABLE] Type about secret.
102110
# TYPE kube_secret_created gauge
103111
# TYPE kube_secret_info gauge
104112
# TYPE kube_secret_labels gauge
105113
# TYPE kube_secret_metadata_resource_version gauge
114+
# TYPE kube_secret_owner gauge
106115
# TYPE kube_secret_type gauge
107116
kube_secret_info{namespace="ns3",secret="secret3"} 1
117+
kube_secret_owner{namespace="ns3",owner_is_controller="",owner_kind="",owner_name="",secret="secret3"} 1
108118
kube_secret_type{namespace="ns3",secret="secret3",type="kubernetes.io/dockercfg"} 1
109119
kube_secret_created{namespace="ns3",secret="secret3"} 1.501569018e+09
110120
kube_secret_metadata_resource_version{namespace="ns3",secret="secret3"} 0
111121
`,
112-
MetricNames: []string{"kube_secret_info", "kube_secret_metadata_resource_version", "kube_secret_created", "kube_secret_labels", "kube_secret_type"},
122+
MetricNames: []string{"kube_secret_info", "kube_secret_metadata_resource_version", "kube_secret_created", "kube_secret_labels", "kube_secret_type", "kube_secret_owner"},
123+
},
124+
{
125+
Obj: &v1.Secret{
126+
ObjectMeta: metav1.ObjectMeta{
127+
Name: "secret4",
128+
Namespace: "ns4",
129+
CreationTimestamp: metav1StartTime,
130+
Labels: map[string]string{"test-4": "test-4"},
131+
ResourceVersion: "0",
132+
OwnerReferences: []metav1.OwnerReference{
133+
{
134+
Name: "managed-secret4",
135+
Kind: "ManagedSecret",
136+
Controller: &test,
137+
},
138+
},
139+
},
140+
Type: v1.SecretTypeOpaque,
141+
},
142+
Want: `
143+
# HELP kube_secret_created [STABLE] Unix creation timestamp
144+
# HELP kube_secret_info [STABLE] Information about secret.
145+
# HELP kube_secret_labels [STABLE] Kubernetes labels converted to Prometheus labels.
146+
# HELP kube_secret_metadata_resource_version Resource version representing a specific version of secret.
147+
# HELP kube_secret_owner Information about the Secret's owner.
148+
# HELP kube_secret_type [STABLE] Type about secret.
149+
# TYPE kube_secret_created gauge
150+
# TYPE kube_secret_info gauge
151+
# TYPE kube_secret_labels gauge
152+
# TYPE kube_secret_metadata_resource_version gauge
153+
# TYPE kube_secret_owner gauge
154+
# TYPE kube_secret_type gauge
155+
kube_secret_info{namespace="ns4",secret="secret4"} 1
156+
kube_secret_owner{namespace="ns4",owner_is_controller="true",owner_kind="ManagedSecret",owner_name="managed-secret4",secret="secret4"} 1
157+
kube_secret_type{namespace="ns4",secret="secret4",type="Opaque"} 1
158+
kube_secret_created{namespace="ns4",secret="secret4"} 1.501569018e+09
159+
kube_secret_metadata_resource_version{namespace="ns4",secret="secret4"} 0
160+
`,
161+
MetricNames: []string{"kube_secret_info", "kube_secret_metadata_resource_version", "kube_secret_created", "kube_secret_labels", "kube_secret_type", "kube_secret_owner"},
113162
},
114163
}
115164
for i, c := range cases {

0 commit comments

Comments
 (0)