package main import ( // External werr "git.gibonuddevalla.se/go/wrappederror" // Standard "database/sql" "time" ) // nodataLoop checks if datapoint last_value is larger than the nodata_problem_seconds period and // marks them as problems. They are then notified. func nodataLoop() { var ids []int var err error // TODO - should be configurable ticker := time.NewTicker(time.Second * 5) for { <-ticker.C ids, err = nodataDatapointIDs() if err != nil { err = werr.Wrap(err).Log() logger.Error("nodata", "error", err) continue } if len(ids) == 0 { continue } logger.Info("nodata", "problem_ids", ids) } } func nodataDatapointIDs() (ids []int, err error) { ids = []int{} var rows *sql.Rows rows, err = service.Db.Conn.Query(` UPDATE datapoint SET nodata_is_problem = true FROM ( SELECT id FROM datapoint WHERE NOT nodata_is_problem AND extract(EPOCH from (NOW() - last_value))::int > nodata_problem_seconds ) AS subquery WHERE datapoint.id = subquery.id RETURNING datapoint.id `) if err != nil { err = werr.Wrap(err) return } defer rows.Close() var id int for rows.Next() { if err = rows.Scan(&id); err != nil { err = werr.Wrap(err) return } ids = append(ids, id) } return }