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  }