Beego/toolbox/statistics.go

148 lines
4.1 KiB
Go
Raw Normal View History

2014-08-18 08:41:43 +00:00
// Copyright 2014 beego Author. All Rights Reserved.
//
2014-08-18 08:41:43 +00:00
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
2014-08-18 08:41:43 +00:00
// http://www.apache.org/licenses/LICENSE-2.0
//
2014-08-18 08:41:43 +00:00
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
2013-11-20 13:17:49 +00:00
package toolbox
import (
2013-11-15 10:21:26 +00:00
"fmt"
"sync"
"time"
)
2014-01-29 11:12:00 +00:00
// Statistics struct
type Statistics struct {
2015-09-12 15:28:24 +00:00
RequestURL string
RequestController string
RequestNum int64
MinTime time.Duration
MaxTime time.Duration
TotalTime time.Duration
}
2015-09-12 15:28:24 +00:00
// URLMap contains several statistics struct to log different data
type URLMap struct {
lock sync.RWMutex
LengthLimit int //limit the urlmap's length if it's equal to 0 there's no limit
urlmap map[string]map[string]*Statistics
}
2015-09-12 15:28:24 +00:00
// AddStatistics add statistics task.
2014-01-29 11:12:00 +00:00
// it needs request method, request url, request controller and statistics time duration
2015-09-12 15:28:24 +00:00
func (m *URLMap) AddStatistics(requestMethod, requestURL, requestController string, requesttime time.Duration) {
m.lock.Lock()
defer m.lock.Unlock()
2015-09-12 15:28:24 +00:00
if method, ok := m.urlmap[requestURL]; ok {
if s, ok := method[requestMethod]; ok {
2015-09-12 15:28:24 +00:00
s.RequestNum++
if s.MaxTime < requesttime {
s.MaxTime = requesttime
}
if s.MinTime > requesttime {
s.MinTime = requesttime
}
s.TotalTime += requesttime
} else {
nb := &Statistics{
2015-09-12 15:28:24 +00:00
RequestURL: requestURL,
RequestController: requestController,
RequestNum: 1,
MinTime: requesttime,
MaxTime: requesttime,
TotalTime: requesttime,
}
2015-09-12 15:28:24 +00:00
m.urlmap[requestURL][requestMethod] = nb
}
} else {
if m.LengthLimit > 0 && m.LengthLimit <= len(m.urlmap) {
return
}
methodmap := make(map[string]*Statistics)
nb := &Statistics{
2015-09-12 15:28:24 +00:00
RequestURL: requestURL,
RequestController: requestController,
RequestNum: 1,
MinTime: requesttime,
MaxTime: requesttime,
TotalTime: requesttime,
}
methodmap[requestMethod] = nb
2015-09-12 15:28:24 +00:00
m.urlmap[requestURL] = methodmap
}
}
2015-09-12 15:28:24 +00:00
// GetMap put url statistics result in io.Writer
func (m *URLMap) GetMap() map[string]interface{} {
m.lock.RLock()
defer m.lock.RUnlock()
2014-08-24 17:37:11 +00:00
var fields = []string{"requestUrl", "method", "times", "used", "max used", "min used", "avg used"}
2015-09-12 15:28:24 +00:00
var resultLists [][]string
2014-08-24 17:37:11 +00:00
content := make(map[string]interface{})
content["Fields"] = fields
2014-08-14 09:35:23 +00:00
2013-11-15 10:08:53 +00:00
for k, v := range m.urlmap {
for kk, vv := range v {
2014-08-14 09:35:23 +00:00
result := []string{
fmt.Sprintf("% -50s", k),
fmt.Sprintf("% -10s", kk),
fmt.Sprintf("% -16d", vv.RequestNum),
2016-09-13 14:43:40 +00:00
fmt.Sprintf("%d", vv.TotalTime),
2014-08-14 09:35:23 +00:00
fmt.Sprintf("% -16s", toS(vv.TotalTime)),
2016-09-13 14:43:40 +00:00
fmt.Sprintf("%d", vv.MaxTime),
2014-08-14 09:35:23 +00:00
fmt.Sprintf("% -16s", toS(vv.MaxTime)),
2016-09-13 14:43:40 +00:00
fmt.Sprintf("%d", vv.MinTime),
2014-08-14 09:35:23 +00:00
fmt.Sprintf("% -16s", toS(vv.MinTime)),
2016-09-13 14:43:40 +00:00
fmt.Sprintf("%d", time.Duration(int64(vv.TotalTime)/vv.RequestNum)),
2014-08-14 09:35:23 +00:00
fmt.Sprintf("% -16s", toS(time.Duration(int64(vv.TotalTime)/vv.RequestNum))),
}
resultLists = append(resultLists, result)
2013-11-15 10:08:53 +00:00
}
}
2014-08-24 17:37:11 +00:00
content["Data"] = resultLists
return content
}
2015-09-12 15:28:24 +00:00
// GetMapData return all mapdata
func (m *URLMap) GetMapData() []map[string]interface{} {
2015-09-12 15:28:24 +00:00
var resultLists []map[string]interface{}
for k, v := range m.urlmap {
for kk, vv := range v {
result := map[string]interface{}{
"request_url": k,
"method": kk,
"times": vv.RequestNum,
"total_time": toS(vv.TotalTime),
"max_time": toS(vv.MaxTime),
"min_time": toS(vv.MinTime),
"avg_time": toS(time.Duration(int64(vv.TotalTime) / vv.RequestNum)),
}
resultLists = append(resultLists, result)
}
}
return resultLists
}
2016-01-17 16:18:21 +00:00
// StatisticsMap hosld global statistics data map
2015-09-12 15:28:24 +00:00
var StatisticsMap *URLMap
func init() {
2015-09-12 15:28:24 +00:00
StatisticsMap = &URLMap{
urlmap: make(map[string]map[string]*Statistics),
}
}