aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGibheer <gibheer+git@zero-knowledge.org>2018-12-11 13:02:23 +0100
committerGibheer <gibheer+git@zero-knowledge.org>2018-12-11 13:02:23 +0100
commit24456400eb2adcf99bd5aba0b9ca1427b56472fe (patch)
treefbc3d2dff0b1b57d7c4af67b0423905259b3f4c1
parentdece1ac2dc4554f66f8ec194269cd91d330edae1 (diff)
moncheck - add mapping levels
This adds mapping levels to the check runner. When the exit code is returned, the actual level is looked up using the configured mapping. After that, the state is entered into the table and added the same way to the notifications.
-rw-r--r--cmd/moncheck/main.go39
1 files changed, 27 insertions, 12 deletions
diff --git a/cmd/moncheck/main.go b/cmd/moncheck/main.go
index 60051e2..766aa37 100644
--- a/cmd/moncheck/main.go
+++ b/cmd/moncheck/main.go
@@ -81,7 +81,13 @@ func check(thread int, db *sql.DB, waitDuration, timeout time.Duration) {
log.Printf("[%d] could not start transaction: %s", thread, err)
continue
}
- rows, err := tx.Query("select check_id, cmdLine, states, notify from active_checks where next_time < now() and enabled order by next_time for update skip locked limit 1;")
+ rows, err := tx.Query(`select check_id, cmdLine, states, notify, mapping_id
+ from active_checks
+ where next_time < now()
+ and enabled
+ order by next_time
+ for update skip locked
+ limit 1;`)
if err != nil {
log.Printf("[%d] could not start query: %s", thread, err)
tx.Rollback()
@@ -92,6 +98,8 @@ func check(thread int, db *sql.DB, waitDuration, timeout time.Duration) {
cmdLine []string
states States
notify bool
+ mapId int
+ state int
)
found := false
for rows.Next() {
@@ -100,7 +108,8 @@ func check(thread int, db *sql.DB, waitDuration, timeout time.Duration) {
tx.Rollback()
break
}
- if err := rows.Scan(&id, pq.Array(&cmdLine), &states, &notify); err != nil {
+ err := rows.Scan(&id, pq.Array(&cmdLine), &states, &notify, &mapId)
+ if err != nil {
log.Printf("could not scan values: %s", err)
tx.Rollback()
break
@@ -120,31 +129,37 @@ func check(thread int, db *sql.DB, waitDuration, timeout time.Duration) {
err = cmd.Run()
if err != nil && ctx.Err() == context.DeadlineExceeded {
cancel()
- // TODO which state to choose?
- // TODO add notification handler
- // TODO all this casting should be done better
- states.Add(99)
+ state = 2
fmt.Fprintf(output, "check took longer than %s", timeout)
} else if err != nil && cmd.ProcessState == nil {
log.Printf("[%d] error running check: %s", id, err)
- states.Add(1)
+ state = 3
} else if err != nil {
cancel()
status, ok := cmd.ProcessState.Sys().(syscall.WaitStatus)
if !ok {
log.Printf("[%d]error running check: %s", id, err)
- states.Add(1)
+ state = 2
} else {
- log.Printf("%s", cmd.ProcessState.String())
- states.Add(status.ExitStatus())
+ state = status.ExitStatus()
}
} else {
cancel()
- states.Add(0)
+ state = 0
+ }
+
+ err = db.QueryRow(`select target
+ from mapping_level
+ where mapping_id = $1 and source = $2`, mapId, state).Scan(&state)
+ if err != nil {
+ log.Printf("[%d] could not fetch error mapping for check '%d': %s", thread, id, err)
+ tx.Rollback()
+ continue
}
+ states.Add(state)
msg := output.String()
- if _, err := tx.Exec(`update active_checks
+ if _, err := tx.Exec(`update active_checks ac
set next_time = now() + intval, states = $2, msg = $3, acknowledged = case when $4 then false else acknowledged end
where check_id = $1`, id, &states, &msg, states.ToOK()); err != nil {
log.Printf("[%d] could not update row '%d': %s", thread, id, err)