@@ -14,7 +14,8 @@ import (
14
14
)
15
15
16
16
type Runner struct {
17
- cron * cron.Cron
17
+ cron * cron.Cron
18
+ cronjobs map [cron.EntryID ]* CrontabEntry
18
19
}
19
20
20
21
func NewRunner () * Runner {
@@ -26,13 +27,14 @@ func NewRunner() *Runner {
26
27
),
27
28
),
28
29
),
30
+ cronjobs : map [cron.EntryID ]* CrontabEntry {},
29
31
}
30
32
return r
31
33
}
32
34
33
35
// Add crontab entry
34
36
func (r * Runner ) Add (cronjob CrontabEntry ) error {
35
- _ , err := r .cron .AddFunc (cronjob .Spec , r .cmdFunc (cronjob , func (execCmd * exec.Cmd ) bool {
37
+ eid , err := r .cron .AddFunc (cronjob .Spec , r .cmdFunc (& cronjob , func (execCmd * exec.Cmd ) bool {
36
38
// before exec callback
37
39
log .WithFields (LogCronjobToFields (cronjob )).Infof ("executing" )
38
40
return true
@@ -42,6 +44,8 @@ func (r *Runner) Add(cronjob CrontabEntry) error {
42
44
prometheusMetricTask .With (r .cronjobToPrometheusLabels (cronjob )).Set (0 )
43
45
log .WithFields (LogCronjobToFields (cronjob )).Errorf ("cronjob failed adding:%v" , err )
44
46
} else {
47
+ cronjob .SetEntryId (eid )
48
+ r .cronjobs [eid ] = & cronjob
45
49
prometheusMetricTask .With (r .cronjobToPrometheusLabels (cronjob )).Set (1 )
46
50
log .WithFields (LogCronjobToFields (cronjob )).Infof ("cronjob added" )
47
51
}
@@ -51,7 +55,7 @@ func (r *Runner) Add(cronjob CrontabEntry) error {
51
55
52
56
// Add crontab entry with user
53
57
func (r * Runner ) AddWithUser (cronjob CrontabEntry ) error {
54
- _ , err := r .cron .AddFunc (cronjob .Spec , r .cmdFunc (cronjob , func (execCmd * exec.Cmd ) bool {
58
+ eid , err := r .cron .AddFunc (cronjob .Spec , r .cmdFunc (& cronjob , func (execCmd * exec.Cmd ) bool {
55
59
// before exec callback
56
60
log .WithFields (LogCronjobToFields (cronjob )).Debugf ("executing" )
57
61
@@ -86,6 +90,8 @@ func (r *Runner) AddWithUser(cronjob CrontabEntry) error {
86
90
prometheusMetricTask .With (r .cronjobToPrometheusLabels (cronjob )).Set (0 )
87
91
log .WithFields (LogCronjobToFields (cronjob )).Errorf ("cronjob failed adding: %v" , err )
88
92
} else {
93
+ cronjob .SetEntryId (eid )
94
+ r .cronjobs [eid ] = & cronjob
89
95
prometheusMetricTask .With (r .cronjobToPrometheusLabels (cronjob )).Set (1 )
90
96
log .WithFields (LogCronjobToFields (cronjob )).Infof ("cronjob added" )
91
97
}
@@ -102,6 +108,7 @@ func (r *Runner) Len() int {
102
108
func (r * Runner ) Start () {
103
109
log .Infof ("start runner with %d jobs\n " , r .Len ())
104
110
r .cron .Start ()
111
+ r .initAllCronEntryMetrics ()
105
112
}
106
113
107
114
// Stop runner
@@ -111,7 +118,7 @@ func (r *Runner) Stop() {
111
118
}
112
119
113
120
// Execute crontab command
114
- func (r * Runner ) cmdFunc (cronjob CrontabEntry , cmdCallback func (* exec.Cmd ) bool ) func () {
121
+ func (r * Runner ) cmdFunc (cronjob * CrontabEntry , cmdCallback func (* exec.Cmd ) bool ) func () {
115
122
cmdFunc := func () {
116
123
// fall back to normal shell if not specified
117
124
taskShell := cronjob .Shell
@@ -137,25 +144,27 @@ func (r *Runner) cmdFunc(cronjob CrontabEntry, cmdCallback func(*exec.Cmd) bool)
137
144
138
145
elapsed := time .Since (start )
139
146
140
- prometheusMetricTaskRunDuration .With (r .cronjobToPrometheusLabels (cronjob )).Set (elapsed .Seconds ())
141
- prometheusMetricTaskRunTime .With (r .cronjobToPrometheusLabels (cronjob )).SetToCurrentTime ()
147
+ cronjobMetricCommonLables := r .cronjobToPrometheusLabels (* cronjob )
148
+ prometheusMetricTaskRunDuration .With (cronjobMetricCommonLables ).Set (elapsed .Seconds ())
149
+ prometheusMetricTaskRunTime .With (cronjobMetricCommonLables ).SetToCurrentTime ()
142
150
143
- logFields := LogCronjobToFields (cronjob )
151
+ logFields := LogCronjobToFields (* cronjob )
144
152
logFields ["elapsed_s" ] = elapsed .Seconds ()
145
153
if execCmd .ProcessState != nil {
146
154
logFields ["exitCode" ] = execCmd .ProcessState .ExitCode ()
147
155
}
148
156
149
157
if err != nil {
150
- prometheusMetricTaskRunCount .With (r .cronjobToPrometheusLabels (cronjob , prometheus.Labels {"result" : "error" })).Inc ()
151
- prometheusMetricTaskRunResult .With (r . cronjobToPrometheusLabels ( cronjob ) ).Set (0 )
158
+ prometheusMetricTaskRunCount .With (r .cronjobToPrometheusLabels (* cronjob , prometheus.Labels {"result" : "error" })).Inc ()
159
+ prometheusMetricTaskRunResult .With (cronjobMetricCommonLables ).Set (0 )
152
160
logFields ["result" ] = "error"
153
161
} else {
154
- prometheusMetricTaskRunCount .With (r .cronjobToPrometheusLabels (cronjob , prometheus.Labels {"result" : "success" })).Inc ()
155
- prometheusMetricTaskRunResult .With (r . cronjobToPrometheusLabels ( cronjob ) ).Set (1 )
162
+ prometheusMetricTaskRunCount .With (r .cronjobToPrometheusLabels (* cronjob , prometheus.Labels {"result" : "success" })).Inc ()
163
+ prometheusMetricTaskRunResult .With (cronjobMetricCommonLables ).Set (1 )
156
164
logFields ["result" ] = "success"
157
165
}
158
166
167
+ r .updateCronEntryMetrics (cronjob )
159
168
log .WithFields (logFields ).Info ("finished" )
160
169
if len (cmdStdout ) > 0 {
161
170
log .Debugln (string (cmdStdout ))
@@ -178,3 +187,26 @@ func (r *Runner) cronjobToPrometheusLabels(cronjob CrontabEntry, additionalLabel
178
187
}
179
188
return
180
189
}
190
+
191
+ func (r * Runner ) updateCronEntryMetrics (cronjob * CrontabEntry ) {
192
+ cronjobMetricCommonLables := r .cronjobToPrometheusLabels (* cronjob )
193
+ entry := r .cron .Entry (cronjob .EntryId )
194
+
195
+ if entry .Next .IsZero () {
196
+ prometheusMetricTaskRunNextTs .With (cronjobMetricCommonLables ).Set (0 )
197
+ } else {
198
+ prometheusMetricTaskRunNextTs .With (cronjobMetricCommonLables ).Set (float64 (entry .Next .Unix ()))
199
+ }
200
+
201
+ if entry .Prev .IsZero () {
202
+ prometheusMetricTaskRunPrevTs .With (cronjobMetricCommonLables ).Set (0 )
203
+ } else {
204
+ prometheusMetricTaskRunPrevTs .With (cronjobMetricCommonLables ).Set (float64 (entry .Prev .Unix ()))
205
+ }
206
+ }
207
+
208
+ func (r * Runner ) initAllCronEntryMetrics () {
209
+ for _ , cronjob := range r .cronjobs {
210
+ r .updateCronEntryMetrics (cronjob )
211
+ }
212
+ }
0 commit comments