Skip to content

Commit

Permalink
feat(monitor): introduce MonitorWithStatus
Browse files Browse the repository at this point in the history
  • Loading branch information
FalcoSuessgott committed Sep 19, 2024
1 parent 838bd51 commit 1dbbc48
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ The provided NewLogger uses the standard library's log package.
### Metrics
Metrics may be collected from the execution of each job.
- [**Monitor**](https://pkg.go.dev/github.com/go-co-op/gocron/v2#Monitor):
- [**MonitorWithStatus**](https://pkg.go.dev/github.com/go-co-op/gocron/v2#MonitorWithStatus) (includes the Status of a Job)
A monitor can be used to collect metrics for each job from a scheduler.
- Implementations: [go-co-op monitors](https://github.com/go-co-op?q=-monitor&type=all&language=&sort=)
(don't see what you need? request on slack to get a repo created to contribute it!)
Expand Down
10 changes: 10 additions & 0 deletions executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ type executor struct {
locker Locker
// monitor for reporting metrics
monitor Monitor
// monitor for reporting metrics
MonitorWithStatus MonitorWithStatus
}

type jobIn struct {
Expand Down Expand Up @@ -401,9 +403,11 @@ func (e *executor) runJob(j internalJob, jIn jobIn) {
if err != nil {
_ = callJobFuncWithParams(j.afterJobRunsWithError, j.id, j.name, err)
e.incrementJobCounter(j, Fail)
e.recordJobTimingWithStatus(startTime, time.Now(), j, Fail)
} else {
_ = callJobFuncWithParams(j.afterJobRuns, j.id, j.name)
e.incrementJobCounter(j, Success)
e.recordJobTimingWithStatus(startTime, time.Now(), j, Success)
}
}

Expand All @@ -426,6 +430,12 @@ func (e *executor) recordJobTiming(start time.Time, end time.Time, j internalJob
}
}

func (e *executor) recordJobTimingWithStatus(start time.Time, end time.Time, j internalJob, status JobStatus) {
if e.MonitorWithStatus != nil {
e.MonitorWithStatus.RecordJobTimingWithStatus(start, end, j.id, j.name, j.tags, status)
}
}

func (e *executor) incrementJobCounter(j internalJob, status JobStatus) {
if e.monitor != nil {
e.monitor.IncrementJob(j.id, j.name, j.tags, status)
Expand Down
8 changes: 8 additions & 0 deletions monitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@ type Monitor interface {
// to handle instantiating and recording the value
RecordJobTiming(startTime, endTime time.Time, id uuid.UUID, name string, tags []string)
}

// MonitorWithStatus extends RecordJobTiming with the job status.
type MonitorWithStatus interface {
Monitor
// RecordJobTimingWithStatus will provide details about the job, its status and the timing and expects the underlying implementation
// to handle instantiating and recording the value
RecordJobTimingWithStatus(startTime, endTime time.Time, id uuid.UUID, name string, tags []string, status JobStatus)
}

0 comments on commit 1dbbc48

Please sign in to comment.