* Adding debugbar layer * Adding sql debugbar info * Make duration consistent across the debugbar lines * Adding the debugbar/systeminfo endpoint * Adding logs to the debugbar * Improve the debugbar logger fields info * Improving the debug bar architecture * Allow to enable/disable debugbar in the backend * Exposing the Debug Bar enable in the client config * Adding more system information to the debugbar * Adding params info to the store layer * Organizing a bit the debugbar code in the server and adding some extra data to the system info api * Adding debugbar email traces * Changing the socket event name to 'debugbar' * Adding explain support for the debugbar * Adding missed file * Omitting data related to the debugbar itself * Removing unneeded functions * Avoid arbitrary execution in explain api * Moving debugbar inside the platform directory * Replacing debugbar logger with a new logger Target * Removed uneeded changes * Fixing some linter errors * Adding a debugbar log level to use it later for log events strictly related to the debug bar * Fixing linter errors * Fixing tests * Adding i18n strings
88 строки
3.0 KiB
Go
88 строки
3.0 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package app
|
|
|
|
import (
|
|
"net/http"
|
|
"runtime"
|
|
|
|
"github.com/mattermost/mattermost-server/v6/model"
|
|
)
|
|
|
|
func (a *App) GetDebugBarInfo() (*model.DebugBarInfo, *model.AppError) {
|
|
sessionsCount, err := a.Srv().Store().Session().AnalyticsSessionCount()
|
|
if err != nil {
|
|
return nil, model.NewAppError("GetDebugBarInfo", "debugbar.info.session-count.error", nil, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
// Here we are getting information regarding Elastic Search
|
|
var elasticServerVersion string
|
|
var elasticServerPlugins []string
|
|
if a.Srv().Platform().SearchEngine.ElasticsearchEngine != nil {
|
|
elasticServerVersion = a.Srv().Platform().SearchEngine.ElasticsearchEngine.GetFullVersion()
|
|
elasticServerPlugins = a.Srv().Platform().SearchEngine.ElasticsearchEngine.GetPlugins()
|
|
}
|
|
|
|
// Here we are getting information regarding LDAP
|
|
ldapInterface := a.Channels().Ldap
|
|
var vendorName, vendorVersion string
|
|
if ldapInterface != nil {
|
|
vendorName, vendorVersion = ldapInterface.GetVendorNameAndVendorVersion()
|
|
}
|
|
|
|
// Here we are getting information regarding the database (mysql/postgres + current schema version)
|
|
databaseType, databaseVersion := a.Srv().DatabaseTypeAndSchemaVersion()
|
|
|
|
info := model.DebugBarInfo{
|
|
SessionsCount: sessionsCount,
|
|
GoVersion: runtime.Version(),
|
|
Goroutines: runtime.NumGoroutine(),
|
|
Cpus: runtime.NumCPU(),
|
|
CgoCalls: runtime.NumCgoCall(),
|
|
ServerOS: runtime.GOOS,
|
|
ServerArchitecture: runtime.GOARCH,
|
|
ServerVersion: model.CurrentVersion,
|
|
BuildHash: model.BuildHash,
|
|
DatabaseType: databaseType,
|
|
DatabaseVersion: databaseVersion,
|
|
LdapVendorName: vendorName,
|
|
LdapVendorVersion: vendorVersion,
|
|
ElasticServerVersion: elasticServerVersion,
|
|
ElasticServerPlugins: elasticServerPlugins,
|
|
}
|
|
|
|
runtime.ReadMemStats(&info.GoMemStats)
|
|
|
|
totalSockets := a.TotalWebsocketConnections()
|
|
totalMasterDb := a.Srv().Store().TotalMasterDbConnections()
|
|
totalReadDb := a.Srv().Store().TotalReadDbConnections()
|
|
|
|
// If in HA mode then aggregate all the stats
|
|
if a.Cluster() != nil && *a.Config().ClusterSettings.Enable {
|
|
stats, appErr := a.Cluster().GetClusterStats()
|
|
if appErr != nil {
|
|
return nil, appErr
|
|
}
|
|
|
|
for _, stat := range stats {
|
|
totalSockets = totalSockets + stat.TotalWebsocketConnections
|
|
totalMasterDb = totalMasterDb + stat.TotalMasterDbConnections
|
|
totalReadDb = totalReadDb + stat.TotalReadDbConnections
|
|
}
|
|
}
|
|
|
|
info.WebSocketConnections = totalSockets
|
|
info.MasterDBConnections = totalMasterDb
|
|
info.ReadDBConnections = totalReadDb
|
|
|
|
return &info, nil
|
|
}
|
|
|
|
func (a *App) GetQueryExplain(query string, args []interface{}) (string, *model.AppError) {
|
|
explain, err := a.Srv().Store().Explain(query, args)
|
|
if err != nil {
|
|
return "", model.NewAppError("GetQueryExplain", "debugbar.query_explain.error", nil, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
return explain, nil
|
|
}
|