Skip to content

Commit c02c4cd

Browse files
authored
Merge pull request #1732 from X4BNet/feature/LastSuccessfulTime
Add missing LastSuccessfulTime metric
2 parents 5aee2c2 + 7f29e6c commit c02c4cd

File tree

3 files changed

+98
-8
lines changed

3 files changed

+98
-8
lines changed

docs/cronjob-metrics.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
| kube_cronjob_next_schedule_time | Gauge | `cronjob`=&lt;cronjob-name&gt; <br> `namespace`=&lt;cronjob-namespace&gt; | STABLE
1010
| kube_cronjob_status_active | Gauge | `cronjob`=&lt;cronjob-name&gt; <br> `namespace`=&lt;cronjob-namespace&gt; | STABLE
1111
| kube_cronjob_status_last_schedule_time | Gauge | `cronjob`=&lt;cronjob-name&gt; <br> `namespace`=&lt;cronjob-namespace&gt; | STABLE
12+
| kube_cronjob_status_last_successful_time | Gauge | `cronjob`=&lt;cronjob-name&gt; <br> `namespace`=&lt;cronjob-namespace&gt; | EXPERIMENTAL
1213
| kube_cronjob_spec_suspend | Gauge | `cronjob`=&lt;cronjob-name&gt; <br> `namespace`=&lt;cronjob-namespace&gt; | STABLE
1314
| kube_cronjob_spec_starting_deadline_seconds | Gauge | `cronjob`=&lt;cronjob-name&gt; <br> `namespace`=&lt;cronjob-namespace&gt; | STABLE
1415
| kube_cronjob_metadata_resource_version| Gauge | `cronjob`=&lt;cronjob-name&gt; <br> `namespace`=&lt;cronjob-namespace&gt; | STABLE

internal/store/cronjob.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,27 @@ func cronJobMetricFamilies(allowAnnotationsList, allowLabelsList []string) []gen
154154
}
155155
}),
156156
),
157+
*generator.NewFamilyGenerator(
158+
"kube_cronjob_status_last_successful_time",
159+
"LastSuccessfulTime keeps information of when was the last time the job was completed successfully.",
160+
metric.Gauge,
161+
"",
162+
wrapCronJobFunc(func(j *batchv1.CronJob) *metric.Family {
163+
ms := []*metric.Metric{}
164+
165+
if j.Status.LastSuccessfulTime != nil {
166+
ms = append(ms, &metric.Metric{
167+
LabelKeys: []string{},
168+
LabelValues: []string{},
169+
Value: float64(j.Status.LastSuccessfulTime.Unix()),
170+
})
171+
}
172+
173+
return &metric.Family{
174+
Metrics: ms,
175+
}
176+
}),
177+
),
157178
*generator.NewFamilyGenerator(
158179
"kube_cronjob_spec_suspend",
159180
"Suspend flag tells the controller to suspend subsequent executions.",

internal/store/cronjob_test.go

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,9 @@ func TestCronJobStore(t *testing.T) {
121121
},
122122
},
123123
Status: batchv1.CronJobStatus{
124-
Active: []v1.ObjectReference{{Name: "FakeJob1"}, {Name: "FakeJob2"}},
125-
LastScheduleTime: &metav1.Time{Time: ActiveRunningCronJob1LastScheduleTime},
124+
Active: []v1.ObjectReference{{Name: "FakeJob1"}, {Name: "FakeJob2"}},
125+
LastScheduleTime: &metav1.Time{Time: ActiveRunningCronJob1LastScheduleTime},
126+
LastSuccessfulTime: nil,
126127
},
127128
Spec: batchv1.CronJobSpec{
128129
StartingDeadlineSeconds: &StartingDeadlineSeconds300,
@@ -197,8 +198,9 @@ func TestCronJobStore(t *testing.T) {
197198
},
198199
},
199200
Status: batchv1.CronJobStatus{
200-
Active: []v1.ObjectReference{},
201-
LastScheduleTime: &metav1.Time{Time: SuspendedCronJob1LastScheduleTime},
201+
Active: []v1.ObjectReference{},
202+
LastScheduleTime: &metav1.Time{Time: SuspendedCronJob1LastScheduleTime},
203+
LastSuccessfulTime: nil,
202204
},
203205
Spec: batchv1.CronJobSpec{
204206
StartingDeadlineSeconds: &StartingDeadlineSeconds300,
@@ -220,6 +222,7 @@ func TestCronJobStore(t *testing.T) {
220222
# HELP kube_cronjob_status_active Active holds pointers to currently running jobs.
221223
# HELP kube_cronjob_metadata_resource_version Resource version representing a specific version of the cronjob.
222224
# HELP kube_cronjob_status_last_schedule_time LastScheduleTime keeps information of when was the last time the job was successfully scheduled.
225+
# HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully.
223226
# TYPE kube_cronjob_created gauge
224227
# TYPE kube_cronjob_info gauge
225228
# TYPE kube_cronjob_labels gauge
@@ -230,6 +233,7 @@ func TestCronJobStore(t *testing.T) {
230233
# TYPE kube_cronjob_status_active gauge
231234
# TYPE kube_cronjob_metadata_resource_version gauge
232235
# TYPE kube_cronjob_status_last_schedule_time gauge
236+
# TYPE kube_cronjob_status_last_successful_time gauge
233237
kube_cronjob_info{concurrency_policy="Forbid",cronjob="SuspendedCronJob1",namespace="ns1",schedule="0 */3 * * *"} 1
234238
kube_cronjob_labels{cronjob="SuspendedCronJob1",namespace="ns1"} 1
235239
kube_cronjob_spec_failed_job_history_limit{cronjob="SuspendedCronJob1",namespace="ns1"} 1
@@ -240,7 +244,68 @@ func TestCronJobStore(t *testing.T) {
240244
kube_cronjob_metadata_resource_version{cronjob="SuspendedCronJob1",namespace="ns1"} 22222
241245
kube_cronjob_status_last_schedule_time{cronjob="SuspendedCronJob1",namespace="ns1"} 1.520762696e+09
242246
`,
243-
MetricNames: []string{"kube_cronjob_spec_starting_deadline_seconds", "kube_cronjob_status_active", "kube_cronjob_metadata_resource_version", "kube_cronjob_spec_suspend", "kube_cronjob_info", "kube_cronjob_created", "kube_cronjob_labels", "kube_cronjob_status_last_schedule_time", "kube_cronjob_spec_successful_job_history_limit", "kube_cronjob_spec_failed_job_history_limit"},
247+
MetricNames: []string{"kube_cronjob_status_last_successful_time", "kube_cronjob_spec_starting_deadline_seconds", "kube_cronjob_status_active", "kube_cronjob_metadata_resource_version", "kube_cronjob_spec_suspend", "kube_cronjob_info", "kube_cronjob_created", "kube_cronjob_labels", "kube_cronjob_status_last_schedule_time", "kube_cronjob_spec_successful_job_history_limit", "kube_cronjob_spec_failed_job_history_limit"},
248+
},
249+
{
250+
Obj: &batchv1.CronJob{
251+
ObjectMeta: metav1.ObjectMeta{
252+
Name: "SuspendedCronJob1",
253+
Namespace: "ns1",
254+
Generation: 1,
255+
ResourceVersion: "22222",
256+
Labels: map[string]string{
257+
"app": "example-suspended-1",
258+
},
259+
},
260+
Status: batchv1.CronJobStatus{
261+
Active: []v1.ObjectReference{},
262+
LastScheduleTime: &metav1.Time{Time: SuspendedCronJob1LastScheduleTime},
263+
LastSuccessfulTime: &metav1.Time{Time: SuspendedCronJob1LastScheduleTime},
264+
},
265+
Spec: batchv1.CronJobSpec{
266+
StartingDeadlineSeconds: &StartingDeadlineSeconds300,
267+
ConcurrencyPolicy: "Forbid",
268+
Suspend: &SuspendTrue,
269+
Schedule: "0 */3 * * *",
270+
SuccessfulJobsHistoryLimit: &SuccessfulJobHistoryLimit3,
271+
FailedJobsHistoryLimit: &FailedJobHistoryLimit1,
272+
},
273+
},
274+
Want: `
275+
# HELP kube_cronjob_created Unix creation timestamp
276+
# HELP kube_cronjob_info Info about cronjob.
277+
# HELP kube_cronjob_labels Kubernetes labels converted to Prometheus labels.
278+
# HELP kube_cronjob_spec_failed_job_history_limit Failed job history limit tells the controller how many failed jobs should be preserved.
279+
# HELP kube_cronjob_spec_starting_deadline_seconds Deadline in seconds for starting the job if it misses scheduled time for any reason.
280+
# HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved.
281+
# HELP kube_cronjob_spec_suspend Suspend flag tells the controller to suspend subsequent executions.
282+
# HELP kube_cronjob_status_active Active holds pointers to currently running jobs.
283+
# HELP kube_cronjob_metadata_resource_version Resource version representing a specific version of the cronjob.
284+
# HELP kube_cronjob_status_last_schedule_time LastScheduleTime keeps information of when was the last time the job was successfully scheduled.
285+
# HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully.
286+
# TYPE kube_cronjob_created gauge
287+
# TYPE kube_cronjob_info gauge
288+
# TYPE kube_cronjob_labels gauge
289+
# TYPE kube_cronjob_spec_failed_job_history_limit gauge
290+
# TYPE kube_cronjob_spec_starting_deadline_seconds gauge
291+
# TYPE kube_cronjob_spec_successful_job_history_limit gauge
292+
# TYPE kube_cronjob_spec_suspend gauge
293+
# TYPE kube_cronjob_status_active gauge
294+
# TYPE kube_cronjob_metadata_resource_version gauge
295+
# TYPE kube_cronjob_status_last_schedule_time gauge
296+
# TYPE kube_cronjob_status_last_successful_time gauge
297+
kube_cronjob_info{concurrency_policy="Forbid",cronjob="SuspendedCronJob1",namespace="ns1",schedule="0 */3 * * *"} 1
298+
kube_cronjob_labels{cronjob="SuspendedCronJob1",namespace="ns1"} 1
299+
kube_cronjob_spec_failed_job_history_limit{cronjob="SuspendedCronJob1",namespace="ns1"} 1
300+
kube_cronjob_spec_starting_deadline_seconds{cronjob="SuspendedCronJob1",namespace="ns1"} 300
301+
kube_cronjob_spec_successful_job_history_limit{cronjob="SuspendedCronJob1",namespace="ns1"} 3
302+
kube_cronjob_spec_suspend{cronjob="SuspendedCronJob1",namespace="ns1"} 1
303+
kube_cronjob_status_active{cronjob="SuspendedCronJob1",namespace="ns1"} 0
304+
kube_cronjob_metadata_resource_version{cronjob="SuspendedCronJob1",namespace="ns1"} 22222
305+
kube_cronjob_status_last_schedule_time{cronjob="SuspendedCronJob1",namespace="ns1"} 1.520762696e+09
306+
kube_cronjob_status_last_successful_time{cronjob="SuspendedCronJob1",namespace="ns1"} 1.520762696e+09
307+
`,
308+
MetricNames: []string{"kube_cronjob_status_last_successful_time", "kube_cronjob_spec_starting_deadline_seconds", "kube_cronjob_status_active", "kube_cronjob_metadata_resource_version", "kube_cronjob_spec_suspend", "kube_cronjob_info", "kube_cronjob_created", "kube_cronjob_labels", "kube_cronjob_status_last_schedule_time", "kube_cronjob_spec_successful_job_history_limit", "kube_cronjob_spec_failed_job_history_limit"},
244309
},
245310
{
246311
Obj: &batchv1.CronJob{
@@ -255,8 +320,9 @@ func TestCronJobStore(t *testing.T) {
255320
},
256321
},
257322
Status: batchv1.CronJobStatus{
258-
Active: []v1.ObjectReference{},
259-
LastScheduleTime: nil,
323+
Active: []v1.ObjectReference{},
324+
LastScheduleTime: nil,
325+
LastSuccessfulTime: nil,
260326
},
261327
Spec: batchv1.CronJobSpec{
262328
StartingDeadlineSeconds: &StartingDeadlineSeconds300,
@@ -277,6 +343,7 @@ func TestCronJobStore(t *testing.T) {
277343
# HELP kube_cronjob_spec_successful_job_history_limit Successful job history limit tells the controller how many completed jobs should be preserved.
278344
# HELP kube_cronjob_spec_suspend Suspend flag tells the controller to suspend subsequent executions.
279345
# HELP kube_cronjob_status_active Active holds pointers to currently running jobs.
346+
# HELP kube_cronjob_status_last_successful_time LastSuccessfulTime keeps information of when was the last time the job was completed successfully.
280347
# HELP kube_cronjob_metadata_resource_version Resource version representing a specific version of the cronjob.
281348
# TYPE kube_cronjob_created gauge
282349
# TYPE kube_cronjob_info gauge
@@ -288,6 +355,7 @@ func TestCronJobStore(t *testing.T) {
288355
# TYPE kube_cronjob_spec_suspend gauge
289356
# TYPE kube_cronjob_status_active gauge
290357
# TYPE kube_cronjob_metadata_resource_version gauge
358+
# TYPE kube_cronjob_status_last_successful_time gauge
291359
kube_cronjob_spec_starting_deadline_seconds{cronjob="ActiveCronJob1NoLastScheduled",namespace="ns1"} 300
292360
kube_cronjob_status_active{cronjob="ActiveCronJob1NoLastScheduled",namespace="ns1"} 0
293361
kube_cronjob_metadata_resource_version{cronjob="ActiveCronJob1NoLastScheduled",namespace="ns1"} 33333
@@ -300,7 +368,7 @@ func TestCronJobStore(t *testing.T) {
300368
` +
301369
fmt.Sprintf("kube_cronjob_next_schedule_time{cronjob=\"ActiveCronJob1NoLastScheduled\",namespace=\"ns1\"} %ve+09\n",
302370
float64(ActiveCronJob1NoLastScheduledNextScheduleTime.Unix())/math.Pow10(9)),
303-
MetricNames: []string{"kube_cronjob_next_schedule_time", "kube_cronjob_spec_starting_deadline_seconds", "kube_cronjob_status_active", "kube_cronjob_metadata_resource_version", "kube_cronjob_spec_suspend", "kube_cronjob_info", "kube_cronjob_created", "kube_cronjob_labels", "kube_cronjob_spec_successful_job_history_limit", "kube_cronjob_spec_failed_job_history_limit"},
371+
MetricNames: []string{"kube_cronjob_status_last_successful_time", "kube_cronjob_next_schedule_time", "kube_cronjob_spec_starting_deadline_seconds", "kube_cronjob_status_active", "kube_cronjob_metadata_resource_version", "kube_cronjob_spec_suspend", "kube_cronjob_info", "kube_cronjob_created", "kube_cronjob_labels", "kube_cronjob_spec_successful_job_history_limit", "kube_cronjob_spec_failed_job_history_limit"},
304372
},
305373
}
306374
for i, c := range cases {

0 commit comments

Comments
 (0)