76 lines
1.3 KiB
Go
76 lines
1.3 KiB
Go
|
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
|
||
|
}
|