diff options
author | Gibheer <gibheer+git@zero-knowledge.org> | 2018-12-11 13:02:23 +0100 |
---|---|---|
committer | Gibheer <gibheer+git@zero-knowledge.org> | 2018-12-11 13:02:23 +0100 |
commit | 24456400eb2adcf99bd5aba0b9ca1427b56472fe (patch) | |
tree | fbc3d2dff0b1b57d7c4af67b0423905259b3f4c1 /cmd | |
parent | dece1ac2dc4554f66f8ec194269cd91d330edae1 (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.
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/moncheck/main.go | 39 |
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, ¬ify); err != nil { + err := rows.Scan(&id, pq.Array(&cmdLine), &states, ¬ify, &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) |