1
0

Add prometheus endpoint for getting metrics (#33)

This commit is contained in:
konrad
2018-12-12 22:50:35 +00:00
committed by Gitea
parent ee398b5272
commit e047673c6b
189 changed files with 44128 additions and 94 deletions

View File

@ -16,7 +16,10 @@
package models
import "code.vikunja.io/web"
import (
"code.vikunja.io/api/pkg/metrics"
"code.vikunja.io/web"
)
// CreateOrUpdateList updates a list or creates it if it doesn't exist
func CreateOrUpdateList(list *List) (err error) {
@ -36,6 +39,7 @@ func CreateOrUpdateList(list *List) (err error) {
if list.ID == 0 {
_, err = x.Insert(list)
metrics.UpdateCount(1, metrics.ListCountKey)
} else {
_, err = x.ID(list.ID).Update(list)
}

View File

@ -16,7 +16,10 @@
package models
import _ "code.vikunja.io/web" // For swaggerdocs generation
import (
"code.vikunja.io/api/pkg/metrics"
_ "code.vikunja.io/web" // For swaggerdocs generation
)
// Delete implements the delete method of CRUDable
// @Summary Deletes a list
@ -41,6 +44,7 @@ func (l *List) Delete() (err error) {
if err != nil {
return
}
metrics.UpdateCount(-1, metrics.ListCountKey)
// Delete all todotasks on that list
_, err = x.Where("list_id = ?", l.ID).Delete(&ListTask{})

View File

@ -17,6 +17,7 @@
package models
import (
"code.vikunja.io/api/pkg/metrics"
"code.vikunja.io/web"
"github.com/imdario/mergo"
)
@ -61,8 +62,12 @@ func (i *ListTask) Create(a web.Auth) (err error) {
i.CreatedByID = u.ID
i.CreatedBy = u
_, err = x.Insert(i)
return err
if _, err = x.Insert(i); err != nil {
return err
}
metrics.UpdateCount(1, metrics.TaskCountKey)
return
}
// Update updates a list task

View File

@ -16,7 +16,10 @@
package models
import _ "code.vikunja.io/web" // For swaggerdocs generation
import (
"code.vikunja.io/api/pkg/metrics"
_ "code.vikunja.io/web" // For swaggerdocs generation
)
// Delete implements the delete method for listTask
// @Summary Delete a task
@ -38,6 +41,10 @@ func (i *ListTask) Delete() (err error) {
return
}
_, err = x.ID(i.ID).Delete(ListTask{})
if _, err = x.ID(i.ID).Delete(ListTask{}); err != nil {
return err
}
metrics.UpdateCount(-1, metrics.TaskCountKey)
return
}

View File

@ -17,14 +17,13 @@
package models
import (
"encoding/gob"
"fmt"
_ "github.com/go-sql-driver/mysql" // Because.
"github.com/go-xorm/core"
"github.com/go-xorm/xorm"
xrc "github.com/go-xorm/xorm-redis-cache"
_ "github.com/mattn/go-sqlite3" // Because.
"encoding/gob"
"github.com/spf13/viper"
)
@ -86,7 +85,7 @@ func SetEngine() (err error) {
x.SetDefaultCacher(cacher)
break
case "redis":
cacher := xrc.NewRedisCacher(viper.GetString("cache.redishost"), viper.GetString("cache.redispassword"), xrc.DEFAULT_EXPIRATION, x.Logger())
cacher := xrc.NewRedisCacher(viper.GetString("redis.host"), viper.GetString("redis.password"), xrc.DEFAULT_EXPIRATION, x.Logger())
x.SetDefaultCacher(cacher)
gob.Register(tables)
break
@ -118,3 +117,8 @@ func getLimitFromPageIndex(page int) (limit, start int) {
start = limit * (page - 1)
return
}
// GetTotalCount returns the total amount of something
func GetTotalCount(counting interface{}) (count int64, err error) {
return x.Count(counting)
}

View File

@ -16,7 +16,10 @@
package models
import "code.vikunja.io/web"
import (
"code.vikunja.io/api/pkg/metrics"
"code.vikunja.io/web"
)
// Create implements the creation method via the interface
// @Summary Creates a new namespace
@ -51,6 +54,10 @@ func (n *Namespace) Create(a web.Auth) (err error) {
n.OwnerID = n.Owner.ID
// Insert
_, err = x.Insert(n)
if _, err = x.Insert(n); err != nil {
return err
}
metrics.UpdateCount(1, metrics.NamespaceCountKey)
return
}

View File

@ -16,7 +16,10 @@
package models
import _ "code.vikunja.io/web" // For swaggerdocs generation
import (
"code.vikunja.io/api/pkg/metrics"
_ "code.vikunja.io/web" // For swaggerdocs generation
)
// Delete deletes a namespace
// @Summary Deletes a namespace
@ -66,5 +69,7 @@ func (n *Namespace) Delete() (err error) {
return
}
metrics.UpdateCount(-1, metrics.NamespaceCountKey)
return
}

View File

@ -16,7 +16,10 @@
package models
import "code.vikunja.io/web"
import (
"code.vikunja.io/api/pkg/metrics"
"code.vikunja.io/web"
)
// Create is the handler to create a team
// @Summary Creates a new team
@ -51,6 +54,10 @@ func (t *Team) Create(a web.Auth) (err error) {
// Insert the current user as member and admin
tm := TeamMember{TeamID: t.ID, UserID: doer.ID, Admin: true}
err = tm.Create(doer)
if err = tm.Create(doer); err != nil {
return err
}
metrics.UpdateCount(1, metrics.TeamCountKey)
return
}

View File

@ -16,7 +16,10 @@
package models
import _ "code.vikunja.io/web" // For swaggerdocs generation
import (
"code.vikunja.io/api/pkg/metrics"
_ "code.vikunja.io/web" // For swaggerdocs generation
)
// Delete deletes a team
// @Summary Deletes a team
@ -57,5 +60,10 @@ func (t *Team) Delete() (err error) {
// Delete team <-> lists relations
_, err = x.Where("team_id = ?", t.ID).Delete(&TeamList{})
if err != nil {
return
}
metrics.UpdateCount(-1, metrics.TeamCountKey)
return
}

View File

@ -17,6 +17,8 @@
package models
import (
_ "code.vikunja.io/api/pkg/config" // To trigger its init() which initializes the config
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/mail"
"fmt"
"github.com/go-xorm/core"
@ -36,8 +38,7 @@ func MainTest(m *testing.M, pathToRoot string) {
var err error
fixturesDir := filepath.Join(pathToRoot, "models", "fixtures")
if err = createTestEngine(fixturesDir); err != nil {
fmt.Fprintf(os.Stderr, "Error creating test engine: %v\n", err)
os.Exit(1)
log.Log.Fatalf("Error creating test engine: %v\n", err)
}
IsTesting = true
@ -46,7 +47,9 @@ func MainTest(m *testing.M, pathToRoot string) {
mail.StartMailDaemon()
// Create test database
PrepareTestDatabase()
if err = PrepareTestDatabase(); err != nil {
log.Log.Fatal(err.Error())
}
os.Exit(m.Run())
}

View File

@ -18,12 +18,14 @@ package models
import (
"code.vikunja.io/api/pkg/log"
"code.vikunja.io/api/pkg/metrics"
"code.vikunja.io/web"
"fmt"
"github.com/dgrijalva/jwt-go"
"github.com/labstack/echo"
"golang.org/x/crypto/bcrypt"
"reflect"
"time"
)
// UserLogin Object to recive user credentials in JSON format
@ -159,3 +161,30 @@ func GetCurrentUser(c echo.Context) (user *User, err error) {
return
}
// UpdateActiveUsersFromContext updates the currently active users in redis
func UpdateActiveUsersFromContext(c echo.Context) (err error) {
user, err := GetCurrentUser(c)
if err != nil {
return err
}
allActiveUsers, err := metrics.GetActiveUsers()
if err != nil {
return
}
var uupdated bool
for in, u := range allActiveUsers {
if u.UserID == user.ID {
allActiveUsers[in].LastSeen = time.Now()
uupdated = true
}
}
if !uupdated {
allActiveUsers = append(allActiveUsers, &metrics.ActiveUser{UserID: user.ID, LastSeen: time.Now()})
}
return metrics.SetActiveUsers(allActiveUsers)
}

View File

@ -18,6 +18,7 @@ package models
import (
"code.vikunja.io/api/pkg/mail"
"code.vikunja.io/api/pkg/metrics"
"code.vikunja.io/api/pkg/utils"
"golang.org/x/crypto/bcrypt"
)
@ -78,6 +79,9 @@ func CreateUser(user User) (newUser User, err error) {
return User{}, err
}
// Update the metrics
metrics.UpdateCount(1, metrics.ActiveUsersKey)
// Get the full new User
newUserOut, err := GetUser(newUser)
if err != nil {

View File

@ -16,6 +16,8 @@
package models
import "code.vikunja.io/api/pkg/metrics"
// DeleteUserByID deletes a user by its ID
func DeleteUserByID(id int64, doer *User) error {
// Check if the id is 0
@ -30,5 +32,8 @@ func DeleteUserByID(id int64, doer *User) error {
return err
}
// Update the metrics
metrics.UpdateCount(-1, metrics.ActiveUsersKey)
return err
}