Use keyvalue for metrics
continuous-integration/drone/pr Build is passing Details

This commit is contained in:
kolaente 2020-10-10 13:17:20 +02:00
parent 47864aedf5
commit 6294c57704
Signed by: konrad
GPG Key ID: F40E70337AB24C9B
4 changed files with 27 additions and 40 deletions

View File

@ -17,10 +17,9 @@
package metrics
import (
"bytes"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/modules/keyvalue"
"code.vikunja.io/web"
"encoding/gob"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"sync"
@ -91,36 +90,19 @@ func SetUserActive(a web.Auth) (err error) {
// getActiveUsers returns the active users from redis
func getActiveUsers() (users activeUsersMap, err error) {
activeUsersR, err := r.Get(ActiveUsersKey).Bytes()
if err != nil {
if err.Error() == "redis: nil" {
return users, nil
}
return
}
var b bytes.Buffer
_, err = b.Write(activeUsersR)
u, err := keyvalue.Get(ActiveUsersKey)
if err != nil {
return nil, err
}
d := gob.NewDecoder(&b)
if err := d.Decode(&users); err != nil {
return nil, err
}
users = u.(activeUsersMap)
return
}
// PushActiveUsers pushed the content of the activeUsers map to redis
func PushActiveUsers() (err error) {
var b bytes.Buffer
e := gob.NewEncoder(&b)
activeUsers.mutex.Lock()
defer activeUsers.mutex.Unlock()
if err := e.Encode(activeUsers.users); err != nil {
return err
}
return r.Set(ActiveUsersKey, b.Bytes(), 0).Err()
return keyvalue.Put(ActiveUsersKey, activeUsers.users)
}

View File

@ -19,14 +19,12 @@ package metrics
import (
"code.vikunja.io/api/pkg/config"
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/red"
"github.com/go-redis/redis/v7"
"code.vikunja.io/api/pkg/modules/keyvalue"
e "code.vikunja.io/api/pkg/modules/keyvalue/error"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
)
var r *redis.Client
const (
// ListCountKey is the name of the key in which we save the list count
ListCountKey = `listcount`
@ -46,8 +44,6 @@ const (
// InitMetrics Initializes the metrics
func InitMetrics() {
r = red.GetRedis()
// init active users, sometimes we'll have garbage from previous runs in redis instead
if err := PushActiveUsers(); err != nil {
log.Fatalf("Could not set initial count for active users, error was %s", err)
@ -101,18 +97,21 @@ func InitMetrics() {
// GetCount returns the current count from redis
func GetCount(key string) (count int64, err error) {
count, err = r.Get(key).Int64()
if err != nil && err.Error() != "redis: nil" {
return
cnt, err := keyvalue.Get(key)
if err != nil {
if e.IsErrValueNotFoundForKey(err) {
return 0, nil
}
return 0, err
}
err = nil
count = cnt.(int64)
return
}
// SetCount sets the list count to a given value
func SetCount(count int64, key string) error {
return r.Set(key, count, 0).Err()
return keyvalue.Put(key, count)
}
// UpdateCount updates a count with a given amount
@ -121,13 +120,13 @@ func UpdateCount(update int64, key string) {
return
}
if update > 0 {
err := r.IncrBy(key, update).Err()
err := keyvalue.IncrBy(key, update)
if err != nil {
log.Error(err.Error())
}
}
if update < 0 {
err := r.DecrBy(key, update).Err()
err := keyvalue.DecrBy(key, update)
if err != nil {
log.Error(err.Error())
}

View File

@ -59,3 +59,13 @@ func Get(key string) (value interface{}, err error) {
func Del(key string) (err error) {
return store.Del(key)
}
// IncrBy increases a value at key by the amount in update
func IncrBy(key string, update int64) (err error) {
return store.IncrBy(key, update)
}
// DecrBy increases a value at key by the amount in update
func DecrBy(key string, update int64) (err error) {
return store.DecrBy(key, update)
}

View File

@ -33,10 +33,6 @@ func setupMetrics(a *echo.Group) {
return
}
if !config.RedisEnabled.GetBool() {
log.Fatal("You have to enable redis in order to use metrics")
}
metrics.InitMetrics()
type countable struct {