From 24456400eb2adcf99bd5aba0b9ca1427b56472fe Mon Sep 17 00:00:00 2001 From: Gibheer Date: Tue, 11 Dec 2018 13:02:23 +0100 Subject: [PATCH] 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. --- cmd/moncheck/main.go | 39 +++++++++++++++++++++++++++------------ 1 file 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)