github.com/luchsh/agentlib.go@v0.0.0-20221115155834-ffd0caec4d72/main.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 "net/http" 8 "runtime" 9 10 _ "net/http/pprof" 11 12 "github.com/luchsh/agentlib.go/jgo" 13 ) 14 15 func handleIndex(w http.ResponseWriter, req *http.Request) { 16 var b bytes.Buffer 17 b.WriteString(`<html> 18 <head> 19 <title>/debug/java/</title> 20 </head> 21 <body> 22 /debug/java/<br> 23 <br> 24 <li><a href="/debug/java/version">Java version</a></li> 25 <li><a href="/debug/java/threads">All Java threads</a></li> 26 </body> 27 </html>`) 28 w.Write(b.Bytes()) 29 } 30 31 func init() { 32 var err error 33 _, err = jgo.Exec([]string{"-Djava.class.path=./testdata", "loop"}) 34 if err != nil { 35 panic(err) 36 } 37 } 38 39 func main() { 40 http.HandleFunc("/debug/java/version", func(w http.ResponseWriter, req *http.Request) { 41 runtime.LockOSThread() 42 defer runtime.UnlockOSThread() 43 vm := jgo.CurrentVM() 44 w.Write([]byte(vm.FullVersion())) 45 }) 46 47 http.HandleFunc("/debug/java/threads", func(w http.ResponseWriter, req *http.Request) { 48 runtime.LockOSThread() 49 defer runtime.UnlockOSThread() 50 vm := jgo.CurrentVM() 51 52 thrds, e := vm.DumpThreads() 53 if e != nil { 54 s := fmt.Sprintf("Failed to DumpThreads: %v", e) 55 w.Write([]byte(s)) 56 return 57 } 58 for i, th := range thrds { 59 s := fmt.Sprintf("Thread-%d %s\n", i, th.String()) 60 w.Write([]byte(s)) 61 } 62 }) 63 http.HandleFunc("/debug/java", handleIndex) 64 65 log.Fatal(http.ListenAndServe(":8081", nil)) 66 }