Skip to content

Commit 56af5da

Browse files
sleepyfoodieskl
andauthored
feat: add support for more workload types (#1052)
Update namespace_workload_pod:kube_pod_owner:relabel recording rule to support more workload types, which now include (but not limited to): * replicaset NEW (also supports other replicaset types e.g. Rollout) * deployment UPDATED - fixed replicaset appearing as deployment with empty workload label, those will now appear as the new replicaset type instead * daemonset * statefulset * job UPDATED - now includes support for Pod job type * CronJob NEW (also supports other job types e.g. ScaledJob) * barepod NEW - a pod without a controller * staticpod NEW - a pod controlled by a static file manifest on disk * As well as other custom pod controllers, e.g. StrimziPodSet Unit tests for all of the above test cases have been added. --------- Co-authored-by: Stephen Lang <[email protected]> Co-authored-by: Stephen Lang <[email protected]>
1 parent ddfa651 commit 56af5da

File tree

3 files changed

+290
-32
lines changed

3 files changed

+290
-32
lines changed

rules/apps.libsonnet

Lines changed: 111 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,28 @@
205205
{
206206
name: 'k8s.rules.pod_owner',
207207
rules: [
208+
// workload aggregation for replicasets
209+
{
210+
record: 'namespace_workload_pod:kube_pod_owner:relabel',
211+
expr: |||
212+
max by (%(clusterLabel)s, namespace, workload, pod) (
213+
label_replace(
214+
label_replace(
215+
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="ReplicaSet"},
216+
"replicaset", "$1", "owner_name", "(.*)"
217+
) * on (%(clusterLabel)s, replicaset, namespace) group_left(owner_name) topk by(%(clusterLabel)s, replicaset, namespace) (
218+
1, max by (%(clusterLabel)s, replicaset, namespace, owner_name) (
219+
kube_replicaset_owner{%(kubeStateMetricsSelector)s, owner_kind=""}
220+
)
221+
),
222+
"workload", "$1", "replicaset", "(.*)"
223+
)
224+
)
225+
||| % $._config,
226+
labels: {
227+
workload_type: 'replicaset',
228+
},
229+
},
208230
// workload aggregation for deployments
209231
{
210232
record: 'namespace_workload_pod:kube_pod_owner:relabel',
@@ -214,9 +236,9 @@
214236
label_replace(
215237
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="ReplicaSet"},
216238
"replicaset", "$1", "owner_name", "(.*)"
217-
) * on(replicaset, namespace) group_left(owner_name) topk by(replicaset, namespace) (
218-
1, max by (replicaset, namespace, owner_name) (
219-
kube_replicaset_owner{%(kubeStateMetricsSelector)s}
239+
) * on(replicaset, namespace, %(clusterLabel)s) group_left(owner_name) topk by(%(clusterLabel)s, replicaset, namespace) (
240+
1, max by (%(clusterLabel)s, replicaset, namespace, owner_name) (
241+
kube_replicaset_owner{%(kubeStateMetricsSelector)s, owner_kind="Deployment"}
220242
)
221243
),
222244
"workload", "$1", "owner_name", "(.*)"
@@ -227,6 +249,7 @@
227249
workload_type: 'deployment',
228250
},
229251
},
252+
// workload aggregation for daemonsets
230253
{
231254
record: 'namespace_workload_pod:kube_pod_owner:relabel',
232255
expr: |||
@@ -241,34 +264,113 @@
241264
workload_type: 'daemonset',
242265
},
243266
},
267+
// workload aggregation for statefulsets
244268
{
245269
record: 'namespace_workload_pod:kube_pod_owner:relabel',
246270
expr: |||
247271
max by (%(clusterLabel)s, namespace, workload, pod) (
248272
label_replace(
249273
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="StatefulSet"},
250-
"workload", "$1", "owner_name", "(.*)"
251-
)
274+
"workload", "$1", "owner_name", "(.*)")
252275
)
253276
||| % $._config,
254277
labels: {
255278
workload_type: 'statefulset',
256279
},
257280
},
281+
// backwards compatibility for jobs
282+
{
283+
record: 'namespace_workload_pod:kube_pod_owner:relabel',
284+
expr: |||
285+
group by (%(clusterLabel)s, namespace, workload, pod) (
286+
label_join(
287+
group by (%(clusterLabel)s, namespace, job_name, pod, owner_name) (
288+
label_join(
289+
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="Job"}
290+
, "job_name", "", "owner_name")
291+
)
292+
* on (%(clusterLabel)s, namespace, job_name) group_left()
293+
group by (%(clusterLabel)s, namespace, job_name) (
294+
kube_job_owner{%(kubeStateMetricsSelector)s, owner_kind=~"Pod|"}
295+
)
296+
, "workload", "", "owner_name")
297+
)
298+
||| % $._config,
299+
labels: {
300+
workload_type: 'job',
301+
},
302+
},
303+
// workload aggregation for barepods
258304
{
259305
record: 'namespace_workload_pod:kube_pod_owner:relabel',
260306
expr: |||
261307
max by (%(clusterLabel)s, namespace, workload, pod) (
262308
label_replace(
263-
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="Job"},
264-
"workload", "$1", "owner_name", "(.*)"
265-
)
309+
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="", owner_name=""},
310+
"workload", "$1", "pod", "(.+)")
266311
)
267312
||| % $._config,
268313
labels: {
269-
workload_type: 'job',
314+
workload_type: 'barepod',
270315
},
271316
},
317+
// workload aggregation for staticpods
318+
{
319+
record: 'namespace_workload_pod:kube_pod_owner:relabel',
320+
expr: |||
321+
max by (%(clusterLabel)s, namespace, workload, pod) (
322+
label_replace(
323+
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="Node"},
324+
"workload", "$1", "pod", "(.+)")
325+
)
326+
||| % $._config,
327+
labels: {
328+
workload_type: 'staticpod',
329+
},
330+
},
331+
// workload aggregation for non-standard types (jobs, replicasets)
332+
{
333+
record: 'namespace_workload_pod:kube_pod_owner:relabel',
334+
expr: |||
335+
group by (%(clusterLabel)s, namespace, workload, workload_type, pod) (
336+
label_join(
337+
label_join(
338+
group by (%(clusterLabel)s, namespace, job_name, pod) (
339+
label_join(
340+
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="Job"}
341+
, "job_name", "", "owner_name")
342+
)
343+
* on (%(clusterLabel)s, namespace, job_name) group_left(owner_kind, owner_name)
344+
group by (%(clusterLabel)s, namespace, job_name, owner_kind, owner_name) (
345+
kube_job_owner{%(kubeStateMetricsSelector)s, owner_kind!="Pod", owner_kind!=""}
346+
)
347+
, "workload", "", "owner_name")
348+
, "workload_type", "", "owner_kind")
349+
350+
OR
351+
352+
label_replace(
353+
label_replace(
354+
label_replace(
355+
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind="ReplicaSet"}
356+
, "replicaset", "$1", "owner_name", "(.+)"
357+
)
358+
* on(%(clusterLabel)s, namespace, replicaset) group_left(owner_kind, owner_name)
359+
group by (%(clusterLabel)s, namespace, replicaset, owner_kind, owner_name) (
360+
kube_replicaset_owner{%(kubeStateMetricsSelector)s, owner_kind!="Deployment", owner_kind!=""}
361+
)
362+
, "workload", "$1", "owner_name", "(.+)")
363+
OR
364+
label_replace(
365+
group by (%(clusterLabel)s, namespace, pod, owner_name, owner_kind) (
366+
kube_pod_owner{%(kubeStateMetricsSelector)s, owner_kind!="ReplicaSet", owner_kind!="DaemonSet", owner_kind!="StatefulSet", owner_kind!="Job", owner_kind!="Node", owner_kind!=""}
367+
)
368+
, "workload", "$1", "owner_name", "(.+)"
369+
)
370+
, "workload_type", "$1", "owner_kind", "(.+)")
371+
)
372+
||| % $._config,
373+
},
272374
],
273375
},
274376
],

0 commit comments

Comments
 (0)