github.com/glide-im/glide@v1.6.0/internal/server_state/server_state.go (about) 1 package server_state 2 3 import ( 4 "fmt" 5 "github.com/glide-im/glide/internal/im_server" 6 "github.com/glide-im/glide/pkg/logger" 7 "io" 8 "net/http" 9 ) 10 11 type httpHandler struct { 12 g *im_server.GatewayServer 13 } 14 15 func (h *httpHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) { 16 defer func() { 17 if err := recover(); err != nil { 18 writer.WriteHeader(http.StatusInternalServerError) 19 bytes := []byte(fmt.Sprintf("%v", err)) 20 logger.E("%v", err) 21 _, _ = writer.Write(bytes) 22 } 23 }() 24 if request.URL.Path == "/state" { 25 writer.WriteHeader(200) 26 state := h.g.GetState() 27 metricsLog := printBeautifulState(&state) 28 //bytes, err2 := json.Marshal(&state) 29 //if err2 != nil { 30 // panic(err2) 31 //} 32 _, err := writer.Write([]byte(metricsLog)) 33 if err != nil { 34 panic(err) 35 } 36 } else { 37 writer.WriteHeader(http.StatusNotFound) 38 } 39 } 40 41 func StartSrv(port int, server *im_server.GatewayServer) { 42 a := fmt.Sprintf("0.0.0.0:%d", port) 43 err := http.ListenAndServe(a, &httpHandler{g: server}) 44 if err != nil { 45 return 46 } 47 } 48 49 func ShowServerState(addr string) { 50 url := fmt.Sprintf("http://%s/state", addr) 51 fmt.Printf("get state from %s\n", url) 52 resp, err := http.Get(url) 53 if err != nil { 54 panic(err) 55 } 56 defer resp.Body.Close() 57 if resp.StatusCode != 200 { 58 fmt.Printf("get state from %s failed, status code %d\n", url, resp.StatusCode) 59 return 60 } 61 62 bytes, err := io.ReadAll(resp.Body) 63 if err != nil { 64 panic(err) 65 } 66 67 if len(bytes) <= 0 { 68 fmt.Println("get state failed, empty body") 69 return 70 } 71 fmt.Println(string(bytes)) 72 } 73 74 func printBeautifulState(state *im_server.GatewayMetrics) string { 75 return fmt.Sprintf("\nServerId:\t%s", state.ServerId) + 76 fmt.Sprintf("\nAddr:\t\t%s", state.Addr) + 77 fmt.Sprintf("\nPort:\t\t%d", state.Port) + 78 fmt.Sprintf("\nStartAt:\t%s", state.StartAt.Format("2006-01-02 15:04:05")) + 79 fmt.Sprintf("\nRunningHours:\t\t%.2f", state.RunningHours) + 80 fmt.Sprintf("\n== metric ==") + 81 fmt.Sprintf("\nOnlineClients:\t\t%d", state.Conn.ConnectionCounter.Count()) + 82 fmt.Sprintf("\nOnlineTempClients:\t%d", state.Conn.OnlineTempCounter.Count()) + 83 fmt.Sprintf("\nTempConnAliveMaxSec:\t%d", state.Conn.AliveTempH.Max()) + 84 fmt.Sprintf("\nTempConnAliveMeanSec:\t%f", state.Conn.AliveTempH.Mean()) + 85 fmt.Sprintf("\nOnlineTempClients:\t%d", state.Conn.OnlineTempCounter.Count()) + 86 fmt.Sprintf("\nLoggedConnAliveMaxSec:\t%d", state.Conn.AliveLoggedH.Max()) + 87 fmt.Sprintf("\nLoggedConnAliveMeanSec:\t%f", state.Conn.AliveLoggedH.Mean()) + 88 fmt.Sprintf("\nOutMessages:\t\t%d", state.Message.OutCounter.Count()) + 89 fmt.Sprintf("\nOutMessageFails:\t%d", state.Message.FailsCounter.Count()) + 90 fmt.Sprintf("\nInMessages:\t\t%d", state.Message.InCounter.Count()) + 91 fmt.Sprintf("\n") 92 }