bilibili-backup/app/admin/main/apm/http/pprof.go
2019-04-22 02:59:20 +00:00

156 lines
3.7 KiB
Go

package http
import (
"io/ioutil"
"net/http"
"go-common/app/admin/main/apm/conf"
mpprof "go-common/app/admin/main/apm/model/pprof"
"go-common/library/ecode"
"go-common/library/log"
bm "go-common/library/net/http/blademaster"
)
func buildSvg(c *bm.Context) {
v := new(struct {
URL string `form:"url" validate:"required"`
URI string `form:"uri" validate:"required"`
SvgName string `form:"name" validate:"required"`
Time int64 `form:"time" validate:"required"`
HostName string `form:"hostname" validate:"required"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
if !(v.URI == "profile" || v.URI == "heap") {
c.JSON(nil, ecode.RequestErr)
return
}
err = apmSvc.Pprof(v.URL, v.URI, v.SvgName, v.HostName, v.Time, 2)
c.JSON(nil, err)
}
func readSvg(c *bm.Context) {
v := new(struct {
SvgName string `form:"name" validate:"required"`
URI string `form:"uri" validate:"required"`
HostName string `form:"hostname" validate:"required"`
})
var err error
if err = c.Bind(v); err != nil {
return
}
url := conf.Conf.Pprof.Dir + "/" + v.SvgName + "_" + v.HostName + "_" + v.URI + ".svg"
data, err := ioutil.ReadFile(url)
if err != nil {
log.Error("readfile error(%v)", err)
c.JSON(nil, err)
return
}
c.Bytes(http.StatusOK, "image/svg+xml; charset=utf-8", data)
}
func heap(c *bm.Context) {
v := new(struct {
URL string `form:"url" validate:"required"`
URI string `form:"uri" validate:"required"`
SvgName string `form:"name" validate:"required"`
HostName string `form:"hostname" validate:"required"`
})
var err error
var data []byte
if err = c.Bind(v); err != nil {
return
}
if v.URI != "heap" {
c.JSON(nil, ecode.RequestErr)
return
}
err = apmSvc.Pprof(v.URL, v.URI, v.SvgName, v.HostName, 1, 1)
if err != nil {
c.JSON(nil, err)
return
}
url := conf.Conf.Pprof.Dir + "/" + v.SvgName + "_" + v.HostName + "_" + v.URI + ".svg"
data, err = ioutil.ReadFile(url)
if err != nil {
log.Error("readfile error(%v)", err)
c.JSON(nil, err)
return
}
c.Bytes(http.StatusOK, "image/svg+xml; charset=utf-8", data)
}
func flame(c *bm.Context) {
v := new(struct {
URL string `form:"url" validate:"required"`
URI string `form:"uri" validate:"required"`
SvgName string `form:"name" validate:"required"`
Time int64 `form:"time"`
HostName string `form:"hostname" validate:"required"`
})
var err error
var data []byte
if err = c.Bind(v); err != nil {
return
}
if !(v.URI == "profile" || v.URI == "heap") {
c.JSON(nil, ecode.RequestErr)
return
}
if v.URI == "heap" {
err = apmSvc.Torch(c, v.URL, v.URI, v.SvgName, v.HostName, 1, 1)
if err != nil {
c.JSON(nil, err)
return
}
url := conf.Conf.Pprof.Dir + "/" + v.SvgName + "_" + v.HostName + "_" + v.URI + "_flame.svg"
data, err = ioutil.ReadFile(url)
if err != nil {
log.Error("readfile error(%v)", err)
c.JSON(nil, err)
return
}
c.Bytes(http.StatusOK, "image/svg+xml; charset=utf-8", data)
} else {
err = apmSvc.Torch(c, v.URL, v.URI, v.SvgName, v.HostName, v.Time, 2)
c.JSON(nil, err)
}
}
func activeWarning(c *bm.Context) {
// var (
// err error
// body []byte
// )
// if body, err = ioutil.ReadAll(c.Request.Body); err != nil {
// c.JSON(nil, fmt.Errorf("warning body empty"))
// return
// }
// if err = apmSvc.ActiveWarning(c, string(body)); err != nil {
// c.JSON(nil, err)
// return
// }
// ioutil.ReadAll You need close body.
c.JSON(nil, nil)
}
func pprof(c *bm.Context) {
var (
err error
pws = make([]*mpprof.Warn, 0)
req = &mpprof.Params{}
)
if err = c.Bind(req); err != nil {
c.JSON(nil, err)
return
}
if pws, err = apmSvc.PprofWarn(c, req); err != nil {
c.JSON(nil, err)
return
}
c.JSON(pws, nil)
}