diff --git a/admin.go b/admin.go index b570a3fa..47dc5738 100644 --- a/admin.go +++ b/admin.go @@ -2,22 +2,56 @@ package beego import ( "fmt" + "github.com/astaxie/beego/admin" "net/http" + "time" ) 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() { BeeAdminApp = &AdminApp{ routers: make(map[string]http.HandlerFunc), } 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) { 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 { routers map[string]http.HandlerFunc } diff --git a/admin/statistics.go b/admin/statistics.go index 55ebb79a..63b374e8 100644 --- a/admin/statistics.go +++ b/admin/statistics.go @@ -1,7 +1,8 @@ package admin import ( - "encoding/json" + "io" + "strconv" "sync" "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() defer m.lock.RUnlock() - r, err := json.Marshal(m.urlmap) - if err != nil { - return []byte("") + rw.Write([]byte("requestURL avgTime")) + for k, v := range m.urlmap { + 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 diff --git a/admin/statistics_test.go b/admin/statistics_test.go index 4ef0bfcb..e5eb6e11 100644 --- a/admin/statistics_test.go +++ b/admin/statistics_test.go @@ -1,6 +1,7 @@ package admin import ( + "os" "testing" "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/xiemengjun", "&admin.user", time.Duration(1300000)) StatisticsMap.AddStatistics("DELETE", "/api/user", "&admin.user", time.Duration(1400000)) - s := StatisticsMap.GetMap() + StatisticsMap.GetMap(os.Stdout) } diff --git a/router.go b/router.go index 4c7dd761..83f64951 100644 --- a/router.go +++ b/router.go @@ -846,12 +846,14 @@ func (p *ControllerRegistor) ServeHTTP(rw http.ResponseWriter, r *http.Request) Admin: //admin module record QPS if EnableAdmin { - if runrouter != nil { - go admin.StatisticsMap.AddStatistics(r.Method, requestPath, runrouter.controllerType.Name(), time.Since(starttime)) - } else { - go admin.StatisticsMap.AddStatistics(r.Method, requestPath, "", time.Since(starttime)) + timeend := time.Since(starttime) + if FilterMonitorFunc(r.Method, requestPath, timeend) { + if runrouter != nil { + go admin.StatisticsMap.AddStatistics(r.Method, requestPath, runrouter.controllerType.Name(), timeend) + } else { + go admin.StatisticsMap.AddStatistics(r.Method, requestPath, "", timeend) + } } - } }