Skip to content

Commit 633cbf4

Browse files
committed
Represent GVK information as labels
Represent GVK information as labels in the metrics, instead of appending them to the metric name itself. This would allow users to aggregate varying GVKs of a CR under the same metric, making operations much more easier.
1 parent 12402a5 commit 633cbf4

File tree

4 files changed

+24
-22
lines changed

4 files changed

+24
-22
lines changed

docs/customresourcestate-metrics.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ spec:
4848
- --resources=certificatesigningrequests,configmaps,cronjobs,daemonsets,deployments,endpoints,foos,horizontalpodautoscalers,ingresses,jobs,limitranges,mutatingwebhookconfigurations,namespaces,networkpolicies,nodes,persistentvolumeclaims,persistentvolumes,poddisruptionbudgets,pods,replicasets,replicationcontrollers,resourcequotas,secrets,services,statefulsets,storageclasses,validatingwebhookconfigurations,volumeattachments,verticalpodautoscalers
4949
```
5050
51+
NOTE: The `group`, `version`, and `kind` common labels are reserved, and will be overwritten by the values from the `groupVersionKind` field.
52+
5153
### Examples
5254

5355
The examples in this section will use the following custom resource:
@@ -114,7 +116,7 @@ spec:
114116
Produces the metric:
115117

116118
```prometheus
117-
kube_myteam_io_v1_Foo_uptime 43.21
119+
uptime{group="myteam.io", kind="Foo", version="v1"} 43.21
118120
```
119121

120122
#### Multiple Metrics/Kitchen Sink
@@ -165,8 +167,8 @@ spec:
165167
Produces the following metrics:
166168

167169
```prometheus
168-
kube_myteam_io_v1_Foo_active_count{active="1",custom_metric="yes",foo="bar",name="foo",bar="baz",qux="quxx",type="type-a"} 1
169-
kube_myteam_io_v1_Foo_active_count{active="3",custom_metric="yes",foo="bar",name="foo",bar="baz",qux="quxx",type="type-b"} 3
170+
active_count{group="myteam.io", kind="Foo", version="v1", active="1",custom_metric="yes",foo="bar",name="foo",bar="baz",qux="quxx",type="type-a"} 1
171+
active_count{group="myteam.io", kind="Foo", version="v1", active="3",custom_metric="yes",foo="bar",name="foo",bar="baz",qux="quxx",type="type-b"} 3
170172
```
171173

172174
### Metric types
@@ -201,7 +203,7 @@ spec:
201203
Produces the metric:
202204

203205
```prometheus
204-
kube_myteam_io_v1_Foo_uptime 43.21
206+
uptime{group="myteam.io", kind="Foo", version="v1"} 43.21
205207
```
206208

207209
#### StateSet
@@ -227,15 +229,15 @@ spec:
227229
list: [Pending, Bar, Baz]
228230
```
229231

230-
Metrics of type `SateSet` will generate a metric for each value defined in `list` for each resource.
232+
Metrics of type `StateSet` will generate a metric for each value defined in `list` for each resource.
231233
The value will be 1, if the value matches the one in list.
232234

233235
Produces the metric:
234236

235237
```prometheus
236-
kube_myteam_io_v1_Foo_status_phase{phase="Pending"} 1
237-
kube_myteam_io_v1_Foo_status_phase{phase="Bar"} 0
238-
kube_myteam_io_v1_Foo_status_phase{phase="Baz"} 0
238+
status_phase{group="myteam.io", kind="Foo", version="v1", phase="Pending"} 1
239+
status_phase{group="myteam.io", kind="Foo", version="v1", phase="Bar"} 0
240+
status_phase{group="myteam.io", kind="Foo", version="v1", phase="Baz"} 0
239241
```
240242

241243
#### Info
@@ -265,7 +267,7 @@ spec:
265267
Produces the metric:
266268

267269
```prometheus
268-
kube_myteam_io_v1_Foo_version{version="v1.2.3"} 1
270+
version{group="myteam.io", kind="Foo", version="v1", version="v1.2.3"} 1
269271
```
270272

271273
### Naming
@@ -287,7 +289,7 @@ spec:
287289

288290
Produces:
289291
```prometheus
290-
myteam_foos_uptime 43.21
292+
myteam_foos_uptime{group="myteam.io", kind="Foo", version="v1"} 43.21
291293
```
292294

293295
To omit namespace and/or subsystem altogether, set them to the empty string:

pkg/customresourcestate/config.go

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,8 @@ type MetricsSpec struct {
4141
// Resource configures a custom resource for metric generation.
4242
type Resource struct {
4343
// MetricNamePrefix defines a prefix for all metrics of the resource.
44-
// Falls back to the GroupVersionKind string prefixed with "kube_", with invalid characters replaced by _ if nil.
4544
// If set to "", no prefix will be added.
46-
// Example: If GroupVersionKind is "my-team.io/v1/MyResource", MetricNamePrefix will be "kube_my_team_io_v1_MyResource".
45+
// Example: If set to "foo", MetricNamePrefix will be "foo_<metric>".
4746
MetricNamePrefix *string `yaml:"metricNamePrefix" json:"metricNamePrefix"`
4847

4948
// GroupVersionKind of the custom resource to be monitored.
@@ -63,17 +62,11 @@ type Resource struct {
6362

6463
// GetMetricNamePrefix returns the prefix to use for metrics.
6564
func (r Resource) GetMetricNamePrefix() string {
66-
if r.MetricNamePrefix == nil {
67-
return strings.NewReplacer(
68-
"/", "_",
69-
".", "_",
70-
"-", "_",
71-
).Replace(fmt.Sprintf("kube_%s_%s_%s", r.GroupVersionKind.Group, r.GroupVersionKind.Version, r.GroupVersionKind.Kind))
72-
}
73-
if *r.MetricNamePrefix == "" {
65+
p := r.MetricNamePrefix
66+
if p == nil {
7467
return ""
7568
}
76-
return *r.MetricNamePrefix
69+
return *p
7770
}
7871

7972
// GetResourceName returns the lowercase, plural form of the resource Kind. This is ResourcePlural if it is set.

pkg/customresourcestate/registry_factory.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ import (
3434

3535
func compile(resource Resource) ([]compiledFamily, error) {
3636
var families []compiledFamily
37+
// Explicitly add GVK labels to all CR metrics.
38+
if resource.CommonLabels == nil {
39+
resource.CommonLabels = map[string]string{}
40+
}
41+
resource.CommonLabels["group"] = resource.GroupVersionKind.Group
42+
resource.CommonLabels["version"] = resource.GroupVersionKind.Version
43+
resource.CommonLabels["kind"] = resource.GroupVersionKind.Kind
3744
for _, f := range resource.Metrics {
3845
family, err := compileFamily(f, resource)
3946
if err != nil {

pkg/customresourcestate/registry_factory_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ func Test_fullName(t *testing.T) {
324324
resource: r(nil),
325325
f: count,
326326
},
327-
want: "kube_apps_v1_Deployment_count",
327+
want: "count",
328328
},
329329
{
330330
name: "no prefix",

0 commit comments

Comments
 (0)