diff options
| -rw-r--r-- | cmd/moncheck/main.go | 20 | 
1 files changed, 12 insertions, 8 deletions
| diff --git a/cmd/moncheck/main.go b/cmd/moncheck/main.go index fbc2b57..cc05594 100644 --- a/cmd/moncheck/main.go +++ b/cmd/moncheck/main.go @@ -26,8 +26,9 @@ var (  type (  	Config struct { -		DB   string `json:"db"` -		Wait string `json:"wait"` +		DB      string `json:"db"` +		Timeout string `json:"timeout"` +		Wait    string `json:"wait"`  	}  	States []int @@ -40,7 +41,7 @@ func main() {  	if err != nil {  		log.Fatalf("could not read config: %s", err)  	} -	config := Config{} +	config := Config{Timeout: "30s", Wait: "30s"}  	if err := json.Unmarshal(raw, &config); err != nil {  		log.Fatalf("could not parse config: %s", err)  	} @@ -49,6 +50,10 @@ func main() {  	if err != nil {  		log.Fatalf("could not parse wait duration: %s", err)  	} +	timeout, err := time.ParseDuration(config.Timeout) +	if err != nil { +		log.Fatalf("could not parse timeout: %s", err) +	}  	db, err := sql.Open("postgres", config.DB)  	if err != nil { @@ -56,14 +61,14 @@ func main() {  	}  	for i := 0; i < 25; i++ { -		go check(i, db, waitDuration) +		go check(i, db, waitDuration, timeout)  	}  	wg := sync.WaitGroup{}  	wg.Add(1)  	wg.Wait()  } -func check(thread int, db *sql.DB, waitDuration time.Duration) { +func check(thread int, db *sql.DB, waitDuration, timeout time.Duration) {  	for {  		tx, err := db.Begin()  		if err != nil { @@ -101,20 +106,19 @@ func check(thread int, db *sql.DB, waitDuration time.Duration) {  			tx.Rollback()  			continue  		} -		ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) +		ctx, cancel := context.WithTimeout(context.Background(), timeout)  		cmd := exec.CommandContext(ctx, cmdLine[0], cmdLine[1:]...)  		output := bytes.NewBuffer([]byte{})  		cmd.Stdout = output  		cmd.Stderr = output  		err = cmd.Run()  		if err != nil && ctx.Err() == context.DeadlineExceeded { -			log.Printf("[%d] check took too long: %s", id, err)  			cancel()  			// TODO which state to choose?  			// TODO add notification handler  			// TODO all this casting should be done better  			states.Add(99) -			output.Write([]byte(ctx.Err().Error())) +			fmt.Fprintf(output, "check took longer than %s", timeout)  		} else if err != nil {  			cancel()  			status, ok := cmd.ProcessState.Sys().(syscall.WaitStatus) | 
