Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "flag"
- "time"
- "os"
- "log"
- "fmt"
- "net/http"
- "runtime"
- "encoding/csv"
- )
- var (
- addr = flag.String("addr", "localhost", "http service address")
- port = flag.String("port", "9082", "http service port")
- )
- func serveHome(m *runtime.MemStats) http.HandlerFunc {
- fn := func (w http.ResponseWriter, r *http.Request) {
- log.Println(r.URL)
- runtime.ReadMemStats(m)
- w.WriteHeader(200)
- w.Write([]byte("Server Stats\n"))
- t := time.Now()
- w.Write([]byte(fmt.Sprintf("Timestamp: %d\n", t.Unix())))
- w.Write([]byte(fmt.Sprintf("Alloc usage: %d KB\n", m.Alloc/1e3)))
- w.Write([]byte(fmt.Sprintf("TotalAlloc usage: %d KB\n", m.TotalAlloc/1e3)))
- w.Write([]byte(fmt.Sprintf("Sys usage: %d KB\n", m.Sys/1e3)))
- w.Write([]byte(fmt.Sprintf("Goroutine count: %d\n", runtime.NumGoroutine())))
- }
- return http.HandlerFunc(fn)
- }
- func main() {
- flag.Parse()
- var m runtime.MemStats
- // monitoring
- file, errf := os.Create("stat.txt")
- if errf != nil {
- log.Fatal(errf)
- }
- defer file.Close()
- writer := csv.NewWriter(file)
- defer writer.Flush()
- errw := writer.Write([]string{"TIME", "ALLOC", "SYS"})
- if errw != nil {
- log.Fatal(errw)
- }
- ticker := time.NewTicker(10 * time.Second)
- quit := make(chan struct{})
- defer close(quit)
- go func(m *runtime.MemStats) {
- for {
- select {
- case <- ticker.C:
- runtime.ReadMemStats(m)
- errw = writer.Write([]string{fmt.Sprintf("%d", time.Now().Unix()), string(fmt.Sprintf("%d", m.Alloc)), string(fmt.Sprintf("%d", m.Sys))})
- if errw != nil {
- log.Fatal(errw)
- }
- writer.Flush()
- case <- quit:
- ticker.Stop()
- return
- }
- }
- }(&m)
- http.HandleFunc("/", serveHome(&m))
- err := http.ListenAndServe(*addr + ":" + *port, nil)
- if err != nil {
- log.Fatal("ListenAndServe: ", err)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement