PLT-4357 Adding stats to HA (#4638)
* PLT-4357 adding stats to HA * PLT-4357 adding stats to HA * Fixing getting stats from the current server
Этот коммит содержится в:
коммит произвёл
Harrison Healey
родитель
be0ae36422
Коммит
0383c58d01
30
api/admin.go
30
api/admin.go
@@ -399,9 +399,33 @@ func getAnalytics(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
rows[4].Value = float64(r.Data.(int64))
|
rows[4].Value = float64(r.Data.(int64))
|
||||||
}
|
}
|
||||||
|
|
||||||
rows[5].Value = float64(TotalWebsocketConnections())
|
// If in HA mode then aggregrate all the stats
|
||||||
rows[6].Value = float64(Srv.Store.TotalMasterDbConnections())
|
if einterfaces.GetClusterInterface() != nil && *utils.Cfg.ClusterSettings.Enable {
|
||||||
rows[7].Value = float64(Srv.Store.TotalReadDbConnections())
|
stats, err := einterfaces.GetClusterInterface().GetClusterStats()
|
||||||
|
if err != nil {
|
||||||
|
c.Err = err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
totalSockets := TotalWebsocketConnections()
|
||||||
|
totalMasterDb := Srv.Store.TotalMasterDbConnections()
|
||||||
|
totalReadDb := Srv.Store.TotalReadDbConnections()
|
||||||
|
|
||||||
|
for _, stat := range stats {
|
||||||
|
totalSockets = totalSockets + stat.TotalWebsocketConnections
|
||||||
|
totalMasterDb = totalMasterDb + stat.TotalMasterDbConnections
|
||||||
|
totalReadDb = totalReadDb + stat.TotalReadDbConnections
|
||||||
|
}
|
||||||
|
|
||||||
|
rows[5].Value = float64(totalSockets)
|
||||||
|
rows[6].Value = float64(totalMasterDb)
|
||||||
|
rows[7].Value = float64(totalReadDb)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
rows[5].Value = float64(TotalWebsocketConnections())
|
||||||
|
rows[6].Value = float64(Srv.Store.TotalMasterDbConnections())
|
||||||
|
rows[7].Value = float64(Srv.Store.TotalReadDbConnections())
|
||||||
|
}
|
||||||
|
|
||||||
w.Write([]byte(rows.ToJson()))
|
w.Write([]byte(rows.ToJson()))
|
||||||
} else if name == "post_counts_day" {
|
} else if name == "post_counts_day" {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ type ClusterInterface interface {
|
|||||||
StartInterNodeCommunication()
|
StartInterNodeCommunication()
|
||||||
StopInterNodeCommunication()
|
StopInterNodeCommunication()
|
||||||
GetClusterInfos() []*model.ClusterInfo
|
GetClusterInfos() []*model.ClusterInfo
|
||||||
|
GetClusterStats() ([]*model.ClusterStats, *model.AppError)
|
||||||
RemoveAllSessionsForUserId(userId string)
|
RemoveAllSessionsForUserId(userId string)
|
||||||
InvalidateCacheForUser(userId string)
|
InvalidateCacheForUser(userId string)
|
||||||
Publish(event *model.WebSocketEvent)
|
Publish(event *model.WebSocketEvent)
|
||||||
|
|||||||
36
model/cluster_stats.go
Обычный файл
36
model/cluster_stats.go
Обычный файл
@@ -0,0 +1,36 @@
|
|||||||
|
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ClusterStats struct {
|
||||||
|
Id string `json:"id"`
|
||||||
|
TotalWebsocketConnections int `json:"total_websocket_connections"`
|
||||||
|
TotalReadDbConnections int `json:"total_read_db_connections"`
|
||||||
|
TotalMasterDbConnections int `json:"total_master_db_connections"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (me *ClusterStats) ToJson() string {
|
||||||
|
b, err := json.Marshal(me)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
} else {
|
||||||
|
return string(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func ClusterStatsFromJson(data io.Reader) *ClusterStats {
|
||||||
|
decoder := json.NewDecoder(data)
|
||||||
|
var me ClusterStats
|
||||||
|
err := decoder.Decode(&me)
|
||||||
|
if err == nil {
|
||||||
|
return &me
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
19
model/cluster_stats_test.go
Обычный файл
19
model/cluster_stats_test.go
Обычный файл
@@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
|
package model
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestClusterStatsJson(t *testing.T) {
|
||||||
|
cluster := ClusterStats{Id: NewId(), TotalWebsocketConnections: 1, TotalReadDbConnections: 1}
|
||||||
|
json := cluster.ToJson()
|
||||||
|
result := ClusterStatsFromJson(strings.NewReader(json))
|
||||||
|
|
||||||
|
if cluster.Id != result.Id {
|
||||||
|
t.Fatal("Ids do not match")
|
||||||
|
}
|
||||||
|
}
|
||||||
Ссылка в новой задаче
Block a user