mirror of
				https://github.com/ehang-io/nps
				synced 2025-10-30 15:26:58 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			155 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package mux
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"github.com/astaxie/beego/logs"
 | |
| 	"net/http"
 | |
| 	"sort"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"sync"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| type connLog struct {
 | |
| 	startTime time.Time
 | |
| 	isClose   bool
 | |
| 	logs      []string
 | |
| }
 | |
| 
 | |
| var logms map[int]*connLog
 | |
| var logmc map[int]*connLog
 | |
| 
 | |
| var copyMaps map[int]*connLog
 | |
| var copyMapc map[int]*connLog
 | |
| var stashTimeNow time.Time
 | |
| var mutex sync.Mutex
 | |
| 
 | |
| func deepCopyMaps() {
 | |
| 	copyMaps = make(map[int]*connLog)
 | |
| 	for k, v := range logms {
 | |
| 		copyMaps[k] = &connLog{
 | |
| 			startTime: v.startTime,
 | |
| 			isClose:   v.isClose,
 | |
| 			logs:      v.logs,
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func deepCopyMapc() {
 | |
| 	copyMapc = make(map[int]*connLog)
 | |
| 	for k, v := range logmc {
 | |
| 		copyMapc[k] = &connLog{
 | |
| 			startTime: v.startTime,
 | |
| 			isClose:   v.isClose,
 | |
| 			logs:      v.logs,
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	logms = make(map[int]*connLog)
 | |
| 	logmc = make(map[int]*connLog)
 | |
| }
 | |
| 
 | |
| type IntSlice []int
 | |
| 
 | |
| func (s IntSlice) Len() int { return len(s) }
 | |
| 
 | |
| func (s IntSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
 | |
| 
 | |
| func (s IntSlice) Less(i, j int) bool { return s[i] < s[j] }
 | |
| 
 | |
| func NewLogServer() {
 | |
| 	http.HandleFunc("/", index)
 | |
| 	http.HandleFunc("/detail", detail)
 | |
| 	http.HandleFunc("/stash", stash)
 | |
| 	fmt.Println(http.ListenAndServe(":8899", nil))
 | |
| }
 | |
| 
 | |
| func stash(w http.ResponseWriter, r *http.Request) {
 | |
| 	stashTimeNow = time.Now()
 | |
| 	deepCopyMaps()
 | |
| 	deepCopyMapc()
 | |
| 	w.Write([]byte("ok"))
 | |
| }
 | |
| 
 | |
| func getM(label string, id int) (cL *connLog) {
 | |
| 	label = strings.TrimSpace(label)
 | |
| 	mutex.Lock()
 | |
| 	defer mutex.Unlock()
 | |
| 	if label == "nps" {
 | |
| 		cL = logms[id]
 | |
| 	}
 | |
| 	if label == "npc" {
 | |
| 		cL = logmc[id]
 | |
| 	}
 | |
| 	return
 | |
| }
 | |
| 
 | |
| func setM(label string, id int, cL *connLog) {
 | |
| 	label = strings.TrimSpace(label)
 | |
| 	mutex.Lock()
 | |
| 	defer mutex.Unlock()
 | |
| 	if label == "nps" {
 | |
| 		logms[id] = cL
 | |
| 	}
 | |
| 	if label == "npc" {
 | |
| 		logmc[id] = cL
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func index(w http.ResponseWriter, r *http.Request) {
 | |
| 	var keys []int
 | |
| 	for k := range copyMaps {
 | |
| 		keys = append(keys, k)
 | |
| 	}
 | |
| 	sort.Sort(IntSlice(keys))
 | |
| 	var s string
 | |
| 	s += "<h1>nps</h1>"
 | |
| 	for _, v := range keys {
 | |
| 		connL := copyMaps[v]
 | |
| 		s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=nps" + "'>" + strconv.Itoa(v) + "</a>----------"
 | |
| 		s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
 | |
| 		s += strconv.FormatBool(connL.isClose)
 | |
| 		s += "<br>"
 | |
| 	}
 | |
| 
 | |
| 	keys = keys[:0]
 | |
| 	s += "<h1>npc</h1>"
 | |
| 	for k := range copyMapc {
 | |
| 		keys = append(keys, k)
 | |
| 	}
 | |
| 	sort.Sort(IntSlice(keys))
 | |
| 
 | |
| 	for _, v := range keys {
 | |
| 		connL := copyMapc[v]
 | |
| 		s += "<a href='/detail?id=" + strconv.Itoa(v) + "&label=npc" + "'>" + strconv.Itoa(v) + "</a>----------"
 | |
| 		s += strconv.Itoa(int(stashTimeNow.Sub(connL.startTime).Milliseconds())) + "ms----------"
 | |
| 		s += strconv.FormatBool(connL.isClose)
 | |
| 		s += "<br>"
 | |
| 	}
 | |
| 	w.Write([]byte(s))
 | |
| }
 | |
| 
 | |
| func detail(w http.ResponseWriter, r *http.Request) {
 | |
| 	id := r.FormValue("id")
 | |
| 	label := r.FormValue("label")
 | |
| 	logs.Warn(label)
 | |
| 	i, _ := strconv.Atoi(id)
 | |
| 	var v *connLog
 | |
| 	if label == "nps" {
 | |
| 		v, _ = copyMaps[i]
 | |
| 	}
 | |
| 	if label == "npc" {
 | |
| 		v, _ = copyMapc[i]
 | |
| 	}
 | |
| 	var s string
 | |
| 	if v != nil {
 | |
| 		for i, vv := range v.logs {
 | |
| 			s += "<p>" + strconv.Itoa(i+1) + ":" + vv + "</p>"
 | |
| 		}
 | |
| 	}
 | |
| 	w.Write([]byte(s))
 | |
| }
 | 
