Merge pull request #10 from FreifunkBremen/purge-influxdb
want to resolve #8: Purge node specific statistics after several days
This commit is contained in:
commit
40fb10eb4e
|
@ -1,6 +1,7 @@
|
|||
package database
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
@ -13,7 +14,6 @@ import (
|
|||
const (
|
||||
MeasurementNode = "node" // Measurement for per-node statistics
|
||||
MeasurementGlobal = "global" // Measurement for summarized global statistics
|
||||
batchDuration = time.Second * 5
|
||||
batchMaxSize = 500
|
||||
)
|
||||
|
||||
|
@ -22,6 +22,7 @@ type DB struct {
|
|||
client client.Client
|
||||
points chan *client.Point
|
||||
wg sync.WaitGroup
|
||||
quit chan struct{}
|
||||
}
|
||||
|
||||
func New(config *models.Config) *DB {
|
||||
|
@ -40,14 +41,22 @@ func New(config *models.Config) *DB {
|
|||
config: config,
|
||||
client: c,
|
||||
points: make(chan *client.Point, 1000),
|
||||
quit: make(chan struct{}),
|
||||
}
|
||||
|
||||
db.wg.Add(1)
|
||||
go db.worker()
|
||||
go db.addWorker()
|
||||
go db.deleteWorker()
|
||||
|
||||
return db
|
||||
}
|
||||
|
||||
func (db *DB) DeletePoints() {
|
||||
query := fmt.Sprintf("delete from %s where time < now() - %dm", MeasurementNode, db.config.Influxdb.DeleteTill)
|
||||
log.Println("delete", MeasurementNode, "older than", db.config.Influxdb.DeleteTill, "minutes")
|
||||
db.client.Query(client.NewQuery(query, db.config.Influxdb.Database, "m"))
|
||||
}
|
||||
|
||||
func (db *DB) AddPoint(name string, tags imodels.Tags, fields imodels.Fields, time time.Time) {
|
||||
point, err := client.NewPoint(name, tags.Map(), fields, time)
|
||||
if err != nil {
|
||||
|
@ -63,13 +72,27 @@ func (db *DB) Add(nodeId string, node *models.Node) {
|
|||
}
|
||||
|
||||
func (db *DB) Close() {
|
||||
close(db.quit)
|
||||
close(db.points)
|
||||
db.wg.Wait()
|
||||
db.client.Close()
|
||||
}
|
||||
func (db *DB) deleteWorker() {
|
||||
duration := time.Minute * time.Duration(db.config.Influxdb.DeleteInterval)
|
||||
ticker := time.NewTicker(duration)
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
db.DeletePoints()
|
||||
case <-db.quit:
|
||||
ticker.Stop()
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// stores data points in batches into the influxdb
|
||||
func (db *DB) worker() {
|
||||
func (db *DB) addWorker() {
|
||||
bpConfig := client.BatchPointsConfig{
|
||||
Database: db.config.Influxdb.Database,
|
||||
Precision: "m",
|
||||
|
@ -78,6 +101,7 @@ func (db *DB) worker() {
|
|||
var bp client.BatchPoints
|
||||
var err error
|
||||
var writeNow, closed bool
|
||||
batchDuration := time.Second * time.Duration(db.config.Influxdb.SaveInterval)
|
||||
timer := time.NewTimer(batchDuration)
|
||||
|
||||
for !closed {
|
||||
|
|
|
@ -35,11 +35,14 @@ type Config struct {
|
|||
MaxAge int `yaml:"max_age"` // Remove nodes after n days of inactivity
|
||||
} `yaml:"nodes"`
|
||||
Influxdb struct {
|
||||
Enable bool `yaml:"enable"`
|
||||
Addr string `yaml:"host"`
|
||||
Database string `yaml:"database"`
|
||||
Username string `yaml:"username"`
|
||||
Password string `yaml:"password"`
|
||||
Enable bool `yaml:"enable"`
|
||||
Addr string `yaml:"host"`
|
||||
Database string `yaml:"database"`
|
||||
Username string `yaml:"username"`
|
||||
Password string `yaml:"password"`
|
||||
SaveInterval int `yaml:"saveinterval"` // Save nodes every n seconds
|
||||
DeleteInterval int `yaml:"deleteinterval"` // Delete stats of nodes every n minutes
|
||||
DeleteTill int `yaml:"deletetill"` // Delete stats of nodes till now-deletetill n minutes
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue