增加:workerManager统计数据获取API

This commit is contained in:
Qiu Jian
2018-10-22 09:53:50 +08:00
parent 2d7e575e6f
commit 9cbd8891a9
2 changed files with 43 additions and 3 deletions
+2 -1
View File
@@ -49,7 +49,7 @@ func NewApplication(name string, connMax int) *Application {
app := Application{name: name,
context: context.Background(),
connMax: connMax,
session: NewWorkerManager("sessionMan", connMax, DEFAULT_BACKLOG),
session: NewWorkerManager("HttpRequestWorkerManager", connMax, DEFAULT_BACKLOG),
roots: make(map[string]*RadixNode),
rootLock: &sync.Mutex{},
idleTimeout: DEFAULT_IDLE_TIMEOUT,
@@ -239,6 +239,7 @@ func (app *Application) addDefaultHandler() {
app.AddHandler("POST", "/ping", PingHandler)
app.AddHandler("GET", "/ping", PingHandler)
// app.AddHandler("OPTIONS", "/", CORSHandler)
app.AddHandler("GET", "/worker_stats", WorkerStatsHandler)
}
func timeoutHandle(h http.Handler) http.HandlerFunc {
+41 -2
View File
@@ -1,11 +1,14 @@
package appsrv
import (
"container/list"
"context"
"fmt"
"net/http"
"runtime/debug"
"sync"
"container/list"
"fmt"
"yunion.io/x/jsonutils"
"yunion.io/x/log"
)
@@ -20,6 +23,12 @@ func enableDebug() {
isDebug = true
}
var workerManagers []*SWorkerManager
func init() {
workerManagers = make([]*SWorkerManager, 0)
}
type SWorker struct {
id uint64
state int
@@ -133,6 +142,8 @@ func NewWorkerManager(name string, workerCount int, backlog int) *SWorkerManager
detachedWorker: newWorkerList(),
workerLock: &sync.Mutex{},
workerId: 0}
workerManagers = append(workerManagers, &manager)
return &manager
}
@@ -201,6 +212,34 @@ func (wm *SWorkerManager) DetachedWorkerCount() int {
return wm.detachedWorker.size()
}
type SWorkerManagerStates struct {
Name string
Backlog int
ActiveWorkerCnt int
DetachWorkerCnt int
}
func (wm *SWorkerManager) getState() SWorkerManagerStates {
state := SWorkerManagerStates{}
state.Name = wm.name
state.Backlog = wm.queue.Size()
state.ActiveWorkerCnt = wm.activeWorker.size()
state.DetachWorkerCnt = wm.detachedWorker.size()
return state
}
func WorkerStatsHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
stats := make([]SWorkerManagerStates, 0)
for i := 0; i < len(workerManagers); i += 1 {
stats = append(stats, workerManagers[i].getState())
}
result := jsonutils.NewDict()
result.Add(jsonutils.Marshal(&stats), "workers")
fmt.Fprintf(w, result.String())
}
func WaitChannel(ch chan interface{}) interface{} {
var ret interface{}
stop := false