mirror of
https://github.com/astaxie/beego.git
synced 2024-11-25 19:00:55 +00:00
golint toolbox
This commit is contained in:
parent
be7accc94c
commit
1d200da472
@ -12,7 +12,7 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
// toolbox healthcheck
|
// Package toolbox healthcheck
|
||||||
//
|
//
|
||||||
// type DatabaseCheck struct {
|
// type DatabaseCheck struct {
|
||||||
// }
|
// }
|
||||||
@ -33,12 +33,12 @@ package toolbox
|
|||||||
// health checker map
|
// health checker map
|
||||||
var AdminCheckList map[string]HealthChecker
|
var AdminCheckList map[string]HealthChecker
|
||||||
|
|
||||||
// health checker interface
|
// HealthChecker health checker interface
|
||||||
type HealthChecker interface {
|
type HealthChecker interface {
|
||||||
Check() error
|
Check() error
|
||||||
}
|
}
|
||||||
|
|
||||||
// add health checker with name string
|
// AddHealthCheck add health checker with name string
|
||||||
func AddHealthCheck(name string, hc HealthChecker) {
|
func AddHealthCheck(name string, hc HealthChecker) {
|
||||||
AdminCheckList[name] = hc
|
AdminCheckList[name] = hc
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ func init() {
|
|||||||
pid = os.Getpid()
|
pid = os.Getpid()
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse input command string
|
// ProcessInput parse input command string
|
||||||
func ProcessInput(input string, w io.Writer) {
|
func ProcessInput(input string, w io.Writer) {
|
||||||
switch input {
|
switch input {
|
||||||
case "lookup goroutine":
|
case "lookup goroutine":
|
||||||
@ -58,7 +58,7 @@ func ProcessInput(input string, w io.Writer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// record memory profile in pprof
|
// MemProf record memory profile in pprof
|
||||||
func MemProf(w io.Writer) {
|
func MemProf(w io.Writer) {
|
||||||
filename := "mem-" + strconv.Itoa(pid) + ".memprof"
|
filename := "mem-" + strconv.Itoa(pid) + ".memprof"
|
||||||
if f, err := os.Create(filename); err != nil {
|
if f, err := os.Create(filename); err != nil {
|
||||||
@ -74,7 +74,7 @@ func MemProf(w io.Writer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// start cpu profile monitor
|
// GetCPUProfile start cpu profile monitor
|
||||||
func GetCPUProfile(w io.Writer) {
|
func GetCPUProfile(w io.Writer) {
|
||||||
sec := 30
|
sec := 30
|
||||||
filename := "cpu-" + strconv.Itoa(pid) + ".pprof"
|
filename := "cpu-" + strconv.Itoa(pid) + ".pprof"
|
||||||
@ -92,7 +92,7 @@ func GetCPUProfile(w io.Writer) {
|
|||||||
fmt.Fprintf(w, "Now you can use this to check it: go tool pprof %s %s\n", fl, filename)
|
fmt.Fprintf(w, "Now you can use this to check it: go tool pprof %s %s\n", fl, filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// print gc information to io.Writer
|
// PrintGCSummary print gc information to io.Writer
|
||||||
func PrintGCSummary(w io.Writer) {
|
func PrintGCSummary(w io.Writer) {
|
||||||
memStats := &runtime.MemStats{}
|
memStats := &runtime.MemStats{}
|
||||||
runtime.ReadMemStats(memStats)
|
runtime.ReadMemStats(memStats)
|
||||||
|
@ -22,7 +22,7 @@ import (
|
|||||||
|
|
||||||
// Statistics struct
|
// Statistics struct
|
||||||
type Statistics struct {
|
type Statistics struct {
|
||||||
RequestUrl string
|
RequestURL string
|
||||||
RequestController string
|
RequestController string
|
||||||
RequestNum int64
|
RequestNum int64
|
||||||
MinTime time.Duration
|
MinTime time.Duration
|
||||||
@ -30,21 +30,21 @@ type Statistics struct {
|
|||||||
TotalTime time.Duration
|
TotalTime time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
// UrlMap contains several statistics struct to log different data
|
// URLMap contains several statistics struct to log different data
|
||||||
type UrlMap struct {
|
type URLMap struct {
|
||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
LengthLimit int //limit the urlmap's length if it's equal to 0 there's no limit
|
LengthLimit int //limit the urlmap's length if it's equal to 0 there's no limit
|
||||||
urlmap map[string]map[string]*Statistics
|
urlmap map[string]map[string]*Statistics
|
||||||
}
|
}
|
||||||
|
|
||||||
// add statistics task.
|
// AddStatistics add statistics task.
|
||||||
// it needs request method, request url, request controller and statistics time duration
|
// it needs request method, request url, request controller and statistics time duration
|
||||||
func (m *UrlMap) AddStatistics(requestMethod, requestUrl, requestController string, requesttime time.Duration) {
|
func (m *URLMap) AddStatistics(requestMethod, requestURL, requestController string, requesttime time.Duration) {
|
||||||
m.lock.Lock()
|
m.lock.Lock()
|
||||||
defer m.lock.Unlock()
|
defer m.lock.Unlock()
|
||||||
if method, ok := m.urlmap[requestUrl]; ok {
|
if method, ok := m.urlmap[requestURL]; ok {
|
||||||
if s, ok := method[requestMethod]; ok {
|
if s, ok := method[requestMethod]; ok {
|
||||||
s.RequestNum += 1
|
s.RequestNum++
|
||||||
if s.MaxTime < requesttime {
|
if s.MaxTime < requesttime {
|
||||||
s.MaxTime = requesttime
|
s.MaxTime = requesttime
|
||||||
}
|
}
|
||||||
@ -54,14 +54,14 @@ func (m *UrlMap) AddStatistics(requestMethod, requestUrl, requestController stri
|
|||||||
s.TotalTime += requesttime
|
s.TotalTime += requesttime
|
||||||
} else {
|
} else {
|
||||||
nb := &Statistics{
|
nb := &Statistics{
|
||||||
RequestUrl: requestUrl,
|
RequestURL: requestURL,
|
||||||
RequestController: requestController,
|
RequestController: requestController,
|
||||||
RequestNum: 1,
|
RequestNum: 1,
|
||||||
MinTime: requesttime,
|
MinTime: requesttime,
|
||||||
MaxTime: requesttime,
|
MaxTime: requesttime,
|
||||||
TotalTime: requesttime,
|
TotalTime: requesttime,
|
||||||
}
|
}
|
||||||
m.urlmap[requestUrl][requestMethod] = nb
|
m.urlmap[requestURL][requestMethod] = nb
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -70,7 +70,7 @@ func (m *UrlMap) AddStatistics(requestMethod, requestUrl, requestController stri
|
|||||||
}
|
}
|
||||||
methodmap := make(map[string]*Statistics)
|
methodmap := make(map[string]*Statistics)
|
||||||
nb := &Statistics{
|
nb := &Statistics{
|
||||||
RequestUrl: requestUrl,
|
RequestURL: requestURL,
|
||||||
RequestController: requestController,
|
RequestController: requestController,
|
||||||
RequestNum: 1,
|
RequestNum: 1,
|
||||||
MinTime: requesttime,
|
MinTime: requesttime,
|
||||||
@ -78,18 +78,18 @@ func (m *UrlMap) AddStatistics(requestMethod, requestUrl, requestController stri
|
|||||||
TotalTime: requesttime,
|
TotalTime: requesttime,
|
||||||
}
|
}
|
||||||
methodmap[requestMethod] = nb
|
methodmap[requestMethod] = nb
|
||||||
m.urlmap[requestUrl] = methodmap
|
m.urlmap[requestURL] = methodmap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// put url statistics result in io.Writer
|
// GetMap put url statistics result in io.Writer
|
||||||
func (m *UrlMap) GetMap() map[string]interface{} {
|
func (m *URLMap) GetMap() map[string]interface{} {
|
||||||
m.lock.RLock()
|
m.lock.RLock()
|
||||||
defer m.lock.RUnlock()
|
defer m.lock.RUnlock()
|
||||||
|
|
||||||
var fields = []string{"requestUrl", "method", "times", "used", "max used", "min used", "avg used"}
|
var fields = []string{"requestUrl", "method", "times", "used", "max used", "min used", "avg used"}
|
||||||
|
|
||||||
resultLists := make([][]string, 0)
|
var resultLists [][]string
|
||||||
content := make(map[string]interface{})
|
content := make(map[string]interface{})
|
||||||
content["Fields"] = fields
|
content["Fields"] = fields
|
||||||
|
|
||||||
@ -111,9 +111,10 @@ func (m *UrlMap) GetMap() map[string]interface{} {
|
|||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *UrlMap) GetMapData() []map[string]interface{} {
|
// GetMapData return all mapdata
|
||||||
|
func (m *URLMap) GetMapData() []map[string]interface{} {
|
||||||
|
|
||||||
resultLists := make([]map[string]interface{}, 0)
|
var resultLists []map[string]interface{}
|
||||||
|
|
||||||
for k, v := range m.urlmap {
|
for k, v := range m.urlmap {
|
||||||
for kk, vv := range v {
|
for kk, vv := range v {
|
||||||
@ -133,10 +134,10 @@ func (m *UrlMap) GetMapData() []map[string]interface{} {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// global statistics data map
|
// global statistics data map
|
||||||
var StatisticsMap *UrlMap
|
var StatisticsMap *URLMap
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
StatisticsMap = &UrlMap{
|
StatisticsMap = &URLMap{
|
||||||
urlmap: make(map[string]map[string]*Statistics),
|
urlmap: make(map[string]map[string]*Statistics),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ const (
|
|||||||
starBit = 1 << 63
|
starBit = 1 << 63
|
||||||
)
|
)
|
||||||
|
|
||||||
// time taks schedule
|
// Schedule time taks schedule
|
||||||
type Schedule struct {
|
type Schedule struct {
|
||||||
Second uint64
|
Second uint64
|
||||||
Minute uint64
|
Minute uint64
|
||||||
@ -79,10 +79,10 @@ type Schedule struct {
|
|||||||
Week uint64
|
Week uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
// task func type
|
// TaskFunc task func type
|
||||||
type TaskFunc func() error
|
type TaskFunc func() error
|
||||||
|
|
||||||
// task interface
|
// Tasker task interface
|
||||||
type Tasker interface {
|
type Tasker interface {
|
||||||
GetSpec() string
|
GetSpec() string
|
||||||
GetStatus() string
|
GetStatus() string
|
||||||
@ -99,7 +99,7 @@ type taskerr struct {
|
|||||||
errinfo string
|
errinfo string
|
||||||
}
|
}
|
||||||
|
|
||||||
// task struct
|
// Task task struct
|
||||||
type Task struct {
|
type Task struct {
|
||||||
Taskname string
|
Taskname string
|
||||||
Spec *Schedule
|
Spec *Schedule
|
||||||
@ -111,7 +111,7 @@ type Task struct {
|
|||||||
ErrLimit int // max length for the errlist, 0 stand for no limit
|
ErrLimit int // max length for the errlist, 0 stand for no limit
|
||||||
}
|
}
|
||||||
|
|
||||||
// add new task with name, time and func
|
// NewTask add new task with name, time and func
|
||||||
func NewTask(tname string, spec string, f TaskFunc) *Task {
|
func NewTask(tname string, spec string, f TaskFunc) *Task {
|
||||||
|
|
||||||
task := &Task{
|
task := &Task{
|
||||||
@ -124,49 +124,49 @@ func NewTask(tname string, spec string, f TaskFunc) *Task {
|
|||||||
return task
|
return task
|
||||||
}
|
}
|
||||||
|
|
||||||
//get spec string
|
// GetSpec get spec string
|
||||||
func (s *Task) GetSpec() string {
|
func (t *Task) GetSpec() string {
|
||||||
return s.SpecStr
|
return t.SpecStr
|
||||||
}
|
}
|
||||||
|
|
||||||
// get current task status
|
// GetStatus get current task status
|
||||||
func (tk *Task) GetStatus() string {
|
func (t *Task) GetStatus() string {
|
||||||
var str string
|
var str string
|
||||||
for _, v := range tk.Errlist {
|
for _, v := range t.Errlist {
|
||||||
str += v.t.String() + ":" + v.errinfo + "<br>"
|
str += v.t.String() + ":" + v.errinfo + "<br>"
|
||||||
}
|
}
|
||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
|
|
||||||
// run task
|
// Run run all tasks
|
||||||
func (tk *Task) Run() error {
|
func (t *Task) Run() error {
|
||||||
err := tk.DoFunc()
|
err := t.DoFunc()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if tk.ErrLimit > 0 && tk.ErrLimit > len(tk.Errlist) {
|
if t.ErrLimit > 0 && t.ErrLimit > len(t.Errlist) {
|
||||||
tk.Errlist = append(tk.Errlist, &taskerr{t: tk.Next, errinfo: err.Error()})
|
t.Errlist = append(t.Errlist, &taskerr{t: t.Next, errinfo: err.Error()})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// set next time for this task
|
// SetNext set next time for this task
|
||||||
func (tk *Task) SetNext(now time.Time) {
|
func (t *Task) SetNext(now time.Time) {
|
||||||
tk.Next = tk.Spec.Next(now)
|
t.Next = t.Spec.Next(now)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the next call time of this task
|
// GetNext get the next call time of this task
|
||||||
func (tk *Task) GetNext() time.Time {
|
func (t *Task) GetNext() time.Time {
|
||||||
return tk.Next
|
return t.Next
|
||||||
}
|
}
|
||||||
|
|
||||||
// set prev time of this task
|
// SetPrev set prev time of this task
|
||||||
func (tk *Task) SetPrev(now time.Time) {
|
func (t *Task) SetPrev(now time.Time) {
|
||||||
tk.Prev = now
|
t.Prev = now
|
||||||
}
|
}
|
||||||
|
|
||||||
// get prev time of this task
|
// GetPrev get prev time of this task
|
||||||
func (tk *Task) GetPrev() time.Time {
|
func (t *Task) GetPrev() time.Time {
|
||||||
return tk.Prev
|
return t.Prev
|
||||||
}
|
}
|
||||||
|
|
||||||
// six columns mean:
|
// six columns mean:
|
||||||
@ -177,7 +177,7 @@ func (tk *Task) GetPrev() time.Time {
|
|||||||
// month:1-12
|
// month:1-12
|
||||||
// week:0-6(0 means Sunday)
|
// week:0-6(0 means Sunday)
|
||||||
|
|
||||||
// some signals:
|
// SetCron some signals:
|
||||||
// *: any time
|
// *: any time
|
||||||
// ,: separate signal
|
// ,: separate signal
|
||||||
// -:duration
|
// -:duration
|
||||||
@ -289,7 +289,7 @@ func (t *Task) parseSpec(spec string) *Schedule {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// set schedule to next time
|
// Next set schedule to next time
|
||||||
func (s *Schedule) Next(t time.Time) time.Time {
|
func (s *Schedule) Next(t time.Time) time.Time {
|
||||||
|
|
||||||
// Start at the earliest possible time (the upcoming second).
|
// Start at the earliest possible time (the upcoming second).
|
||||||
@ -377,8 +377,8 @@ WRAP:
|
|||||||
|
|
||||||
func dayMatches(s *Schedule, t time.Time) bool {
|
func dayMatches(s *Schedule, t time.Time) bool {
|
||||||
var (
|
var (
|
||||||
domMatch bool = 1<<uint(t.Day())&s.Day > 0
|
domMatch = 1<<uint(t.Day())&s.Day > 0
|
||||||
dowMatch bool = 1<<uint(t.Weekday())&s.Week > 0
|
dowMatch = 1<<uint(t.Weekday())&s.Week > 0
|
||||||
)
|
)
|
||||||
|
|
||||||
if s.Day&starBit > 0 || s.Week&starBit > 0 {
|
if s.Day&starBit > 0 || s.Week&starBit > 0 {
|
||||||
@ -387,7 +387,7 @@ func dayMatches(s *Schedule, t time.Time) bool {
|
|||||||
return domMatch || dowMatch
|
return domMatch || dowMatch
|
||||||
}
|
}
|
||||||
|
|
||||||
// start all tasks
|
// StartTask start all tasks
|
||||||
func StartTask() {
|
func StartTask() {
|
||||||
isstart = true
|
isstart = true
|
||||||
go run()
|
go run()
|
||||||
@ -430,13 +430,13 @@ func run() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// start all tasks
|
// StopTask stop all tasks
|
||||||
func StopTask() {
|
func StopTask() {
|
||||||
isstart = false
|
isstart = false
|
||||||
stop <- true
|
stop <- true
|
||||||
}
|
}
|
||||||
|
|
||||||
// add task with name
|
// AddTask add task with name
|
||||||
func AddTask(taskname string, t Tasker) {
|
func AddTask(taskname string, t Tasker) {
|
||||||
AdminTaskList[taskname] = t
|
AdminTaskList[taskname] = t
|
||||||
if isstart {
|
if isstart {
|
||||||
@ -444,7 +444,7 @@ func AddTask(taskname string, t Tasker) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// add task with name
|
// DeleteTask delete task with name
|
||||||
func DeleteTask(taskname string) {
|
func DeleteTask(taskname string) {
|
||||||
delete(AdminTaskList, taskname)
|
delete(AdminTaskList, taskname)
|
||||||
if isstart {
|
if isstart {
|
||||||
@ -452,13 +452,13 @@ func DeleteTask(taskname string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// sort map for tasker
|
// MapSorter sort map for tasker
|
||||||
type MapSorter struct {
|
type MapSorter struct {
|
||||||
Keys []string
|
Keys []string
|
||||||
Vals []Tasker
|
Vals []Tasker
|
||||||
}
|
}
|
||||||
|
|
||||||
// create new tasker map
|
// NewMapSorter create new tasker map
|
||||||
func NewMapSorter(m map[string]Tasker) *MapSorter {
|
func NewMapSorter(m map[string]Tasker) *MapSorter {
|
||||||
ms := &MapSorter{
|
ms := &MapSorter{
|
||||||
Keys: make([]string, 0, len(m)),
|
Keys: make([]string, 0, len(m)),
|
||||||
@ -471,7 +471,7 @@ func NewMapSorter(m map[string]Tasker) *MapSorter {
|
|||||||
return ms
|
return ms
|
||||||
}
|
}
|
||||||
|
|
||||||
// sort tasker map
|
// Sort sort tasker map
|
||||||
func (ms *MapSorter) Sort() {
|
func (ms *MapSorter) Sort() {
|
||||||
sort.Sort(ms)
|
sort.Sort(ms)
|
||||||
}
|
}
|
||||||
@ -512,11 +512,11 @@ func getRange(expr string, r bounds) uint64 {
|
|||||||
singleDigit = len(lowAndHigh) == 1
|
singleDigit = len(lowAndHigh) == 1
|
||||||
)
|
)
|
||||||
|
|
||||||
var extra_star uint64
|
var extrastar uint64
|
||||||
if lowAndHigh[0] == "*" || lowAndHigh[0] == "?" {
|
if lowAndHigh[0] == "*" || lowAndHigh[0] == "?" {
|
||||||
start = r.min
|
start = r.min
|
||||||
end = r.max
|
end = r.max
|
||||||
extra_star = starBit
|
extrastar = starBit
|
||||||
} else {
|
} else {
|
||||||
start = parseIntOrName(lowAndHigh[0], r.names)
|
start = parseIntOrName(lowAndHigh[0], r.names)
|
||||||
switch len(lowAndHigh) {
|
switch len(lowAndHigh) {
|
||||||
@ -553,7 +553,7 @@ func getRange(expr string, r bounds) uint64 {
|
|||||||
log.Panicf("Beginning of range (%d) beyond end of range (%d): %s", start, end, expr)
|
log.Panicf("Beginning of range (%d) beyond end of range (%d): %s", start, end, expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
return getBits(start, end, step) | extra_star
|
return getBits(start, end, step) | extrastar
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseIntOrName returns the (possibly-named) integer contained in expr.
|
// parseIntOrName returns the (possibly-named) integer contained in expr.
|
||||||
|
Loading…
Reference in New Issue
Block a user