summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorey Hulen <corey@hulen.com>2016-11-28 07:40:02 -0800
committerHarrison Healey <harrisonmhealey@gmail.com>2016-11-28 10:40:02 -0500
commit0383c58d01c3f67552e2a3f018e4667206a0363c (patch)
tree85e607e96837bb8f45b3818fab2e1ccfb8f5bb2f
parentbe0ae364223efb1c32a8a1815583663071f255c5 (diff)
downloadchat-0383c58d01c3f67552e2a3f018e4667206a0363c.tar.gz
chat-0383c58d01c3f67552e2a3f018e4667206a0363c.tar.bz2
chat-0383c58d01c3f67552e2a3f018e4667206a0363c.zip
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
-rw-r--r--api/admin.go30
-rw-r--r--einterfaces/cluster.go1
-rw-r--r--model/cluster_stats.go36
-rw-r--r--model/cluster_stats_test.go19
4 files changed, 83 insertions, 3 deletions
diff --git a/api/admin.go b/api/admin.go
index 16ec98fcf..d371d2515 100644
--- a/api/admin.go
+++ b/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[5].Value = float64(TotalWebsocketConnections())
- rows[6].Value = float64(Srv.Store.TotalMasterDbConnections())
- rows[7].Value = float64(Srv.Store.TotalReadDbConnections())
+ // If in HA mode then aggregrate all the stats
+ if einterfaces.GetClusterInterface() != nil && *utils.Cfg.ClusterSettings.Enable {
+ 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()))
} else if name == "post_counts_day" {
diff --git a/einterfaces/cluster.go b/einterfaces/cluster.go
index 6b4395398..30a1af103 100644
--- a/einterfaces/cluster.go
+++ b/einterfaces/cluster.go
@@ -11,6 +11,7 @@ type ClusterInterface interface {
StartInterNodeCommunication()
StopInterNodeCommunication()
GetClusterInfos() []*model.ClusterInfo
+ GetClusterStats() ([]*model.ClusterStats, *model.AppError)
RemoveAllSessionsForUserId(userId string)
InvalidateCacheForUser(userId string)
Publish(event *model.WebSocketEvent)
diff --git a/model/cluster_stats.go b/model/cluster_stats.go
new file mode 100644
index 000000000..f2efa323e
--- /dev/null
+++ b/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
+ }
+}
diff --git a/model/cluster_stats_test.go b/model/cluster_stats_test.go
new file mode 100644
index 000000000..13920b5d1
--- /dev/null
+++ b/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")
+ }
+}