Skip to content

Commit 5e7d0f4

Browse files
authored
Merge pull request #2542 from Indresh2410/add-kube-job-status-suspended-metric
feat: Add new metric kube_job_status_suspended
2 parents c87b507 + 7a54a8e commit 5e7d0f4

File tree

3 files changed

+96
-1
lines changed

3 files changed

+96
-1
lines changed

docs/metrics/workload/job-metrics.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@
1717
| kube_job_complete | Gauge | | `job_name`=&lt;job-name&gt; <br> `namespace`=&lt;job-namespace&gt; <br> `condition`=&lt;true\|false\|unknown&gt; | STABLE |
1818
| kube_job_failed | Gauge | | `job_name`=&lt;job-name&gt; <br> `namespace`=&lt;job-namespace&gt; <br> `condition`=&lt;true\|false\|unknown&gt; | STABLE |
1919
| kube_job_created | Gauge | | `job_name`=&lt;job-name&gt; <br> `namespace`=&lt;job-namespace&gt; | STABLE |
20+
| kube_job_status_suspended | Gauge | | `job_name`=&lt;job-name&gt; <br> `namespace`=&lt;job-namespace&gt; | EXPERIMENTAL |

internal/store/job.go

+22
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
generator "k8s.io/kube-state-metrics/v2/pkg/metric_generator"
2727

2828
v1batch "k8s.io/api/batch/v1"
29+
v1 "k8s.io/api/core/v1"
2930
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031
"k8s.io/apimachinery/pkg/runtime"
3132
"k8s.io/apimachinery/pkg/watch"
@@ -355,6 +356,27 @@ func jobMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generat
355356
}
356357
}),
357358
),
359+
*generator.NewFamilyGeneratorWithStability(
360+
"kube_job_status_suspended",
361+
"The number of pods which reached Phase Suspended.",
362+
metric.Gauge,
363+
basemetrics.ALPHA,
364+
"",
365+
wrapJobFunc(func(j *v1batch.Job) *metric.Family {
366+
ms := []*metric.Metric{}
367+
for _, c := range j.Status.Conditions {
368+
if c.Type == v1batch.JobSuspended {
369+
ms = append(ms, &metric.Metric{
370+
Value: boolFloat64(c.Status == v1.ConditionTrue),
371+
})
372+
}
373+
}
374+
375+
return &metric.Family{
376+
Metrics: ms,
377+
}
378+
}),
379+
),
358380
*generator.NewFamilyGeneratorWithStability(
359381
"kube_job_owner",
360382
"Information about the Job's owner.",

internal/store/job_test.go

+73-1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ var (
4444

4545
func TestJobStore(t *testing.T) {
4646
var trueValue = true
47+
var falseValue = false
4748

4849
// Fixed metadata on type and help text. We prepend this to every expected
4950
// output so we only have to modify a single place when doing adjustments.
@@ -77,7 +78,10 @@ func TestJobStore(t *testing.T) {
7778
# HELP kube_job_status_start_time [STABLE] StartTime represents time when the job was acknowledged by the Job Manager.
7879
# TYPE kube_job_status_start_time gauge
7980
# HELP kube_job_status_succeeded [STABLE] The number of pods which reached Phase Succeeded.
80-
# TYPE kube_job_status_succeeded gauge`
81+
# TYPE kube_job_status_succeeded gauge
82+
# HELP kube_job_status_suspended The number of pods which reached Phase Suspended.
83+
# TYPE kube_job_status_suspended gauge
84+
`
8185

8286
cases := []generateMetricsTestCase{
8387
{
@@ -272,6 +276,74 @@ func TestJobStore(t *testing.T) {
272276
kube_job_status_failed{job_name="SuccessfulJob2NoActiveDeadlineSeconds",namespace="ns1"} 0
273277
kube_job_status_start_time{job_name="SuccessfulJob2NoActiveDeadlineSeconds",namespace="ns1"} 1.495800607e+09
274278
kube_job_status_succeeded{job_name="SuccessfulJob2NoActiveDeadlineSeconds",namespace="ns1"} 1
279+
`,
280+
},
281+
{
282+
Obj: &v1batch.Job{
283+
ObjectMeta: metav1.ObjectMeta{
284+
Name: "SuspendedNoActiveDeadlineSeconds",
285+
Namespace: "ns1",
286+
Generation: 1,
287+
},
288+
Status: v1batch.JobStatus{
289+
Active: 0,
290+
Failed: 0,
291+
Succeeded: 0,
292+
StartTime: &metav1.Time{Time: SuccessfulJob2StartTime},
293+
Conditions: []v1batch.JobCondition{
294+
{Type: v1batch.JobSuspended, Status: v1.ConditionTrue},
295+
},
296+
},
297+
Spec: v1batch.JobSpec{
298+
Suspend: &trueValue,
299+
Parallelism: &Parallelism1,
300+
Completions: &Completions1,
301+
},
302+
},
303+
Want: metadata + `
304+
kube_job_owner{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1",owner_is_controller="",owner_kind="",owner_name=""} 1
305+
kube_job_info{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1
306+
kube_job_spec_completions{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1
307+
kube_job_spec_parallelism{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1
308+
kube_job_status_active{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 0
309+
kube_job_status_failed{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 0
310+
kube_job_status_start_time{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1.495800607e+09
311+
kube_job_status_succeeded{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 0
312+
kube_job_status_suspended{job_name="SuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1
313+
`,
314+
},
315+
{
316+
Obj: &v1batch.Job{
317+
ObjectMeta: metav1.ObjectMeta{
318+
Name: "UnsuspendedNoActiveDeadlineSeconds",
319+
Namespace: "ns1",
320+
Generation: 1,
321+
},
322+
Status: v1batch.JobStatus{
323+
Active: 0,
324+
Failed: 0,
325+
Succeeded: 0,
326+
StartTime: &metav1.Time{Time: SuccessfulJob2StartTime},
327+
Conditions: []v1batch.JobCondition{
328+
{Type: v1batch.JobSuspended, Status: v1.ConditionFalse},
329+
},
330+
},
331+
Spec: v1batch.JobSpec{
332+
Suspend: &falseValue,
333+
Parallelism: &Parallelism1,
334+
Completions: &Completions1,
335+
},
336+
},
337+
Want: metadata + `
338+
kube_job_owner{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1",owner_is_controller="",owner_kind="",owner_name=""} 1
339+
kube_job_info{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1
340+
kube_job_spec_completions{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1
341+
kube_job_spec_parallelism{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1
342+
kube_job_status_active{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 0
343+
kube_job_status_failed{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 0
344+
kube_job_status_start_time{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 1.495800607e+09
345+
kube_job_status_succeeded{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 0
346+
kube_job_status_suspended{job_name="UnsuspendedNoActiveDeadlineSeconds",namespace="ns1"} 0
275347
`,
276348
},
277349
}

0 commit comments

Comments
 (0)