gosora/routes/panel/debug.go
Azareal df6e268a06 Speed up template compilation by not building the same parse trees multiple times.
Compile panel_debug.
Add the ability to print int8, int16, int32, uint, uint8, uint16, uint32 and uint64 in compiled templates.
Add the ability to pass string nodes to subtemplates in the template compiler.
Fix bunit in the template compiler.

Shorten some things.
2019-10-13 08:49:08 +10:00

123 lines
3.5 KiB
Go

package panel
import (
"net/http"
"runtime"
"strconv"
"time"
c "github.com/Azareal/Gosora/common"
"github.com/Azareal/Gosora/query_gen"
)
func Debug(w http.ResponseWriter, r *http.Request, user c.User) c.RouteError {
basePage, ferr := buildBasePage(w, r, &user, "debug", "debug")
if ferr != nil {
return ferr
}
goVersion := runtime.Version()
dbVersion := qgen.Builder.DbVersion()
upDuration := time.Since(c.StartTime)
hours := int(upDuration.Hours())
minutes := int(upDuration.Minutes())
var uptime string
if hours > 24 {
days := hours / 24
hours -= days * 24
uptime += strconv.Itoa(days) + "d"
uptime += strconv.Itoa(hours) + "h"
} else if hours >= 1 {
uptime += strconv.Itoa(hours) + "h"
}
uptime += strconv.Itoa(minutes) + "m"
dbStats := qgen.Builder.GetConn().Stats()
openConnCount := dbStats.OpenConnections
// Disk I/O?
// TODO: Fetch the adapter from Builder rather than getting it from a global?
goroutines := runtime.NumGoroutine()
cpus := runtime.NumCPU()
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
var tlen, ulen, rlen int
var tcap, ucap, rcap int
tcache := c.Topics.GetCache()
if tcache != nil {
tlen = tcache.Length()
tcap = tcache.GetCapacity()
}
ucache := c.Users.GetCache()
if ucache != nil {
ulen = ucache.Length()
ucap = ucache.GetCapacity()
}
rcache := c.Rstore.GetCache()
if rcache != nil {
rlen = rcache.Length()
rcap = rcache.GetCapacity()
}
topicListThawed := c.TopicListThaw.Thawed()
debugCache := c.DebugPageCache{tlen, ulen, rlen, tcap, ucap, rcap, topicListThawed}
var fErr error
count := func(tbl string) int {
if fErr != nil {
return 0
}
c, err := qgen.NewAcc().Count(tbl).Total()
fErr = err
return c
}
// TODO: Call Count on an attachment store
attachs := count("attachments")
// TODO: Implement a PollStore and call Count on that instead
polls := count("polls")
loginLogs := count("login_logs")
regLogs := count("registration_logs")
modLogs := count("moderation_logs")
adminLogs := count("administration_logs")
views := count("viewchunks")
viewsAgents := count("viewchunks_agents")
viewsForums := count("viewchunks_forums")
viewsLangs := count("viewchunks_langs")
viewsReferrers := count("viewchunks_referrers")
viewsSystems := count("viewchunks_systems")
postChunks := count("postchunks")
topicChunks := count("topicchunks")
if fErr != nil {
return c.InternalError(fErr,w,r)
}
debugDatabase := c.DebugPageDatabase{c.Topics.Count(),c.Users.Count(),c.Rstore.Count(),c.Prstore.Count(),c.Activity.Count(),c.Likes.Count(),attachs,polls,loginLogs,regLogs,modLogs,adminLogs,views,viewsAgents,viewsForums,viewsLangs,viewsReferrers,viewsSystems,postChunks,topicChunks}
dirSize := func(path string) int {
if fErr != nil {
return 0
}
c, err := c.DirSize(path)
fErr = err
return c
}
staticSize := dirSize("./public/")
attachSize := dirSize("./attachs/")
uploadsSize := dirSize("./uploads/")
logsSize := dirSize("./logs/")
backupsSize := dirSize("./backups/")
if fErr != nil {
return c.InternalError(fErr,w,r)
}
gitSize, _ := c.DirSize("./.git")
debugDisk := c.DebugPageDisk{staticSize,attachSize,uploadsSize,logsSize,backupsSize,gitSize}
pi := c.PanelDebugPage{basePage, goVersion, dbVersion, uptime, openConnCount, qgen.Builder.GetAdapter().GetName(), goroutines, cpus, memStats, debugCache, debugDatabase, debugDisk}
return renderTemplate("panel", w, r, basePage.Header, c.Panel{basePage, "panel_dashboard_right", "debug_page", "panel_debug", pi})
}