monitor.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package monitor
  2. import (
  3. "bet24.com/log"
  4. "expvar"
  5. "fmt"
  6. "net/http"
  7. _ "net/http/pprof"
  8. "os"
  9. "path/filepath"
  10. "runtime/pprof"
  11. )
  12. func metricsHandler(w http.ResponseWriter, r *http.Request) {
  13. w.Header().Set("Content-Type", "application/json; charset=utf-8")
  14. first := true
  15. report := func(key string, value interface{}) {
  16. if !first {
  17. fmt.Fprintf(w, ",\n")
  18. }
  19. first = false
  20. if str, ok := value.(string); ok {
  21. fmt.Fprintf(w, "%q: %q", key, str)
  22. } else {
  23. fmt.Fprintf(w, "%q: %v", key, value)
  24. }
  25. }
  26. fmt.Fprintf(w, "{\n")
  27. expvar.Do(func(kv expvar.KeyValue) {
  28. report(kv.Key, kv.Value)
  29. })
  30. fmt.Fprintf(w, "\n}\n")
  31. }
  32. func Run(port int, logPath string) {
  33. go func() {
  34. if logPath != "" {
  35. p, _ := filepath.Abs(filepath.Dir(logPath + "\\"))
  36. http.Handle("/logs/", http.StripPrefix("/logs/", http.FileServer(http.Dir(p))))
  37. }
  38. http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
  39. }()
  40. }
  41. func logCPU(port int) {
  42. // 如果文件夹不存在则创建
  43. os.MkdirAll("./tmp", 0777)
  44. f, err := os.OpenFile(fmt.Sprintf("./tmp/cpu_%d.prof", port), os.O_RDWR|os.O_CREATE, 0644)
  45. if err != nil {
  46. log.Release("%v", err)
  47. }
  48. defer f.Close()
  49. pprof.StartCPUProfile(f)
  50. defer pprof.StopCPUProfile()
  51. }
  52. func logMem(port int) {
  53. os.MkdirAll("./tmp", 0777)
  54. fm, err := os.OpenFile(fmt.Sprintf("./tmp/mem_%d.out", port), os.O_RDWR|os.O_CREATE, 0644)
  55. if err != nil {
  56. log.Release("%v", err)
  57. }
  58. pprof.WriteHeapProfile(fm)
  59. fm.Close()
  60. }