feat: collect pprofs on cscli support dump
This commit is contained in:
parent
0746e0c091
commit
67c268d16c
|
@ -12,6 +12,7 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/blackfireio/osinfo"
|
"github.com/blackfireio/osinfo"
|
||||||
"github.com/go-openapi/strfmt"
|
"github.com/go-openapi/strfmt"
|
||||||
|
@ -47,6 +48,9 @@ const (
|
||||||
SUPPORT_CAPI_STATUS_PATH = "capi_status.txt"
|
SUPPORT_CAPI_STATUS_PATH = "capi_status.txt"
|
||||||
SUPPORT_ACQUISITION_CONFIG_BASE_PATH = "config/acquis/"
|
SUPPORT_ACQUISITION_CONFIG_BASE_PATH = "config/acquis/"
|
||||||
SUPPORT_CROWDSEC_PROFILE_PATH = "config/profiles.yaml"
|
SUPPORT_CROWDSEC_PROFILE_PATH = "config/profiles.yaml"
|
||||||
|
SUPPORT_PPROF_CPU_PATH = "pprof/cpu.pprof"
|
||||||
|
SUPPORT_PPROF_MEM_PATH = "pprof/mem.pprof"
|
||||||
|
SUPPORT_PPROF_ROUTINES_PATH = "pprof/routines.pprof"
|
||||||
)
|
)
|
||||||
|
|
||||||
// from https://github.com/acarl005/stripansi
|
// from https://github.com/acarl005/stripansi
|
||||||
|
@ -264,6 +268,50 @@ func collectAcquisitionConfig() map[string][]byte {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func collectPprofs() ([]byte, []byte, []byte) {
|
||||||
|
log.Info("Collecting pprof data")
|
||||||
|
client := &http.Client{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
}
|
||||||
|
cpu, err := collectPprof(client, "profile")
|
||||||
|
if err != nil {
|
||||||
|
cpu = []byte(fmt.Sprintf("could not read cpu profile: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
mem, err := collectPprof(client, "heap")
|
||||||
|
if err != nil {
|
||||||
|
mem = []byte(fmt.Sprintf("could not read mem profile: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
routines, err := collectPprof(client, "goroutine")
|
||||||
|
if err != nil {
|
||||||
|
routines = []byte(fmt.Sprintf("could not read goroutine profile: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
return cpu, mem, routines
|
||||||
|
}
|
||||||
|
|
||||||
|
func collectPprof(h *http.Client, endpoint string) ([]byte, error) {
|
||||||
|
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("http://%s:%d/debug/pprof/%s", csConfig.Prometheus.ListenAddr, csConfig.Prometheus.ListenPort, endpoint), nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("could not create request to get cpu profile: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := h.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, err := io.ReadAll(resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return body, nil
|
||||||
|
}
|
||||||
|
|
||||||
type cliSupport struct{}
|
type cliSupport struct{}
|
||||||
|
|
||||||
func NewCLISupport() *cliSupport {
|
func NewCLISupport() *cliSupport {
|
||||||
|
@ -420,6 +468,9 @@ cscli support dump -f /tmp/crowdsec-support.zip
|
||||||
LAPIURLPrefix,
|
LAPIURLPrefix,
|
||||||
hub)
|
hub)
|
||||||
infos[SUPPORT_CROWDSEC_PROFILE_PATH] = collectCrowdsecProfile()
|
infos[SUPPORT_CROWDSEC_PROFILE_PATH] = collectCrowdsecProfile()
|
||||||
|
if csConfig.Prometheus.Enabled {
|
||||||
|
infos[SUPPORT_PPROF_CPU_PATH], infos[SUPPORT_PPROF_MEM_PATH], infos[SUPPORT_PPROF_ROUTINES_PATH] = collectPprofs()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !skipAgent {
|
if !skipAgent {
|
||||||
|
|
Loading…
Reference in a new issue