smon/nodata.go

76 lines
1.3 KiB
Go
Raw Normal View History

2024-05-25 09:40:40 +02:00
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
}