1
0
mirror of https://github.com/astaxie/beego.git synced 2024-11-26 04:01:29 +00:00

Improve monitoring management module

This commit is contained in:
astaxie 2013-11-15 18:08:53 +08:00
parent 18335194bc
commit 097bcb3b5b
4 changed files with 57 additions and 12 deletions

View File

@ -2,22 +2,56 @@ package beego
import ( import (
"fmt" "fmt"
"github.com/astaxie/beego/admin"
"net/http" "net/http"
"time"
) )
var BeeAdminApp *AdminApp var BeeAdminApp *AdminApp
//func MyFilterMonitor(method, requestPath string, t time.Duration) bool {
// if method == "POST" {
// return false
// }
// if t.Nanoseconds() < 100 {
// return false
// }
// if strings.HasPrefix(requestPath, "/astaxie") {
// return false
// }
// return true
//}
//beego.FilterMonitorFunc = MyFilterMonitor
var FilterMonitorFunc func(string, string, time.Duration) bool
func init() { func init() {
BeeAdminApp = &AdminApp{ BeeAdminApp = &AdminApp{
routers: make(map[string]http.HandlerFunc), routers: make(map[string]http.HandlerFunc),
} }
BeeAdminApp.Route("/", AdminIndex) BeeAdminApp.Route("/", AdminIndex)
BeeAdminApp.Route("/qps", QpsIndex)
BeeAdminApp.Route("/prof", ProfIndex)
FilterMonitorFunc = func(string, string, time.Duration) bool { return true }
} }
func AdminIndex(rw http.ResponseWriter, r *http.Request) { func AdminIndex(rw http.ResponseWriter, r *http.Request) {
rw.Write([]byte("Welcome to Admin Dashboard")) rw.Write([]byte("Welcome to Admin Dashboard"))
} }
func QpsIndex(rw http.ResponseWriter, r *http.Request) {
info := admin.UrlMap.GetMap(rw)
}
func ProfIndex(rw http.ResponseWriter, r *http.Request) {
r.ParseForm()
command := r.Form.Get("command")
if command != "" {
admin.ProcessInput(command)
} else {
rw.Write([]byte("request url like '/prof?command=lookup goroutine'"))
}
}
type AdminApp struct { type AdminApp struct {
routers map[string]http.HandlerFunc routers map[string]http.HandlerFunc
} }

View File

@ -1,7 +1,8 @@
package admin package admin
import ( import (
"encoding/json" "io"
"strconv"
"sync" "sync"
"time" "time"
) )
@ -60,14 +61,21 @@ func (m *UrlMap) AddStatistics(requestMethod, requestUrl, requestController stri
} }
} }
func (m *UrlMap) GetMap() []byte { func (m *UrlMap) GetMap(rw io.Writer) {
m.lock.RLock() m.lock.RLock()
defer m.lock.RUnlock() defer m.lock.RUnlock()
r, err := json.Marshal(m.urlmap) rw.Write([]byte("requestURL avgTime"))
if err != nil { for k, v := range m.urlmap {
return []byte("") rw.Write([]byte(k + ""))
for kk, vv := range v {
rw.Write([]byte(kk))
rw.Write([]byte(strconv.FormatInt(vv.RequestNum, 10)))
rw.Write([]byte(strconv.FormatInt(int64(vv.TotalTime), 10)))
rw.Write([]byte(strconv.FormatInt(int64(vv.MaxTime), 10)))
rw.Write([]byte(strconv.FormatInt(int64(vv.MinTime), 10)))
rw.Write([]byte(strconv.FormatInt(int64(vv.TotalTime)/vv.RequestNum, 10)))
}
} }
return r
} }
var StatisticsMap *UrlMap var StatisticsMap *UrlMap

View File

@ -1,6 +1,7 @@
package admin package admin
import ( import (
"os"
"testing" "testing"
"time" "time"
) )
@ -13,5 +14,5 @@ func TestStatics(t *testing.T) {
StatisticsMap.AddStatistics("POST", "/api/user/astaxie", "&admin.user", time.Duration(1200000)) StatisticsMap.AddStatistics("POST", "/api/user/astaxie", "&admin.user", time.Duration(1200000))
StatisticsMap.AddStatistics("POST", "/api/user/xiemengjun", "&admin.user", time.Duration(1300000)) StatisticsMap.AddStatistics("POST", "/api/user/xiemengjun", "&admin.user", time.Duration(1300000))
StatisticsMap.AddStatistics("DELETE", "/api/user", "&admin.user", time.Duration(1400000)) StatisticsMap.AddStatistics("DELETE", "/api/user", "&admin.user", time.Duration(1400000))
s := StatisticsMap.GetMap() StatisticsMap.GetMap(os.Stdout)
} }

View File

@ -846,12 +846,14 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request)
Admin: Admin:
//admin module record QPS //admin module record QPS
if EnableAdmin { if EnableAdmin {
if runrouter != nil { timeend := time.Since(starttime)
go admin.StatisticsMap.AddStatistics(r.Method, requestPath, runrouter.controllerType.Name(), time.Since(starttime)) if FilterMonitorFunc(r.Method, requestPath, timeend) {
} else { if runrouter != nil {
go admin.StatisticsMap.AddStatistics(r.Method, requestPath, "", time.Since(starttime)) go admin.StatisticsMap.AddStatistics(r.Method, requestPath, runrouter.controllerType.Name(), timeend)
} else {
go admin.StatisticsMap.AddStatistics(r.Method, requestPath, "", timeend)
}
} }
} }
} }