79 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package http enables the http profiler
 | 
						|
package http
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"net/http"
 | 
						|
	"net/http/pprof"
 | 
						|
	"sync"
 | 
						|
 | 
						|
	"github.com/micro/go-micro/debug/profile"
 | 
						|
)
 | 
						|
 | 
						|
type httpProfile struct {
 | 
						|
	sync.Mutex
 | 
						|
	running bool
 | 
						|
	server  *http.Server
 | 
						|
}
 | 
						|
 | 
						|
var (
 | 
						|
	DefaultAddress = ":6060"
 | 
						|
)
 | 
						|
 | 
						|
// Start the profiler
 | 
						|
func (h *httpProfile) Start() error {
 | 
						|
	h.Lock()
 | 
						|
	defer h.Unlock()
 | 
						|
 | 
						|
	if h.running {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
 | 
						|
	go func() {
 | 
						|
		if err := h.server.ListenAndServe(); err != nil {
 | 
						|
			h.Lock()
 | 
						|
			h.running = false
 | 
						|
			h.Unlock()
 | 
						|
		}
 | 
						|
	}()
 | 
						|
 | 
						|
	h.running = true
 | 
						|
 | 
						|
	return nil
 | 
						|
}
 | 
						|
 | 
						|
// Stop the profiler
 | 
						|
func (h *httpProfile) Stop() error {
 | 
						|
	h.Lock()
 | 
						|
	defer h.Unlock()
 | 
						|
 | 
						|
	if !h.running {
 | 
						|
		return nil
 | 
						|
	}
 | 
						|
 | 
						|
	h.running = false
 | 
						|
 | 
						|
	return h.server.Shutdown(context.TODO())
 | 
						|
}
 | 
						|
 | 
						|
func (h *httpProfile) String() string {
 | 
						|
	return "http"
 | 
						|
}
 | 
						|
 | 
						|
func NewProfile(opts ...profile.Option) profile.Profile {
 | 
						|
	mux := http.NewServeMux()
 | 
						|
 | 
						|
	mux.HandleFunc("/debug/pprof/", pprof.Index)
 | 
						|
	mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
 | 
						|
	mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
 | 
						|
	mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
 | 
						|
	mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
 | 
						|
 | 
						|
	return &httpProfile{
 | 
						|
		server: &http.Server{
 | 
						|
			Addr:    DefaultAddress,
 | 
						|
			Handler: mux,
 | 
						|
		},
 | 
						|
	}
 | 
						|
}
 |