add cpu-profile flag (#2723)

This commit is contained in:
blotus 2024-01-16 11:40:29 +01:00 committed by GitHub
parent 08794c5b6d
commit 421ef3bf9c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 1 deletions

View file

@ -6,6 +6,7 @@ import (
_ "net/http/pprof" _ "net/http/pprof"
"os" "os"
"runtime" "runtime"
"runtime/pprof"
"strings" "strings"
"time" "time"
@ -71,6 +72,7 @@ type Flags struct {
DisableCAPI bool DisableCAPI bool
Transform string Transform string
OrderEvent bool OrderEvent bool
CpuProfile string
} }
type labelsMap map[string]string type labelsMap map[string]string
@ -179,6 +181,7 @@ func (f *Flags) Parse() {
} }
flag.StringVar(&dumpFolder, "dump-data", "", "dump parsers/buckets raw outputs") flag.StringVar(&dumpFolder, "dump-data", "", "dump parsers/buckets raw outputs")
flag.StringVar(&f.CpuProfile, "cpu-profile", "", "write cpu profile to file")
flag.Parse() flag.Parse()
} }
@ -352,9 +355,24 @@ func main() {
os.Exit(0) os.Exit(0)
} }
if flags.CpuProfile != "" {
f, err := os.Create(flags.CpuProfile)
if err != nil {
log.Fatalf("could not create CPU profile: %s", err)
}
log.Infof("CPU profile will be written to %s", flags.CpuProfile)
if err := pprof.StartCPUProfile(f); err != nil {
f.Close()
log.Fatalf("could not start CPU profile: %s", err)
}
defer f.Close()
defer pprof.StopCPUProfile()
}
err := StartRunSvc() err := StartRunSvc()
if err != nil { if err != nil {
log.Fatal(err) pprof.StopCPUProfile()
log.Fatal(err) //nolint:gocritic // Disable warning for the defer pprof.StopCPUProfile() call
} }
os.Exit(0) os.Exit(0)

View file

@ -4,6 +4,7 @@ package main
import ( import (
"fmt" "fmt"
"runtime/pprof"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -22,6 +23,10 @@ func StartRunSvc() error {
defer trace.CatchPanic("crowdsec/StartRunSvc") defer trace.CatchPanic("crowdsec/StartRunSvc")
//Always try to stop CPU profiling to avoid passing flags around
//It's a noop if profiling is not enabled
defer pprof.StopCPUProfile()
if cConfig, err = LoadConfig(flags.ConfigFile, flags.DisableAgent, flags.DisableAPI, false); err != nil { if cConfig, err = LoadConfig(flags.ConfigFile, flags.DisableAgent, flags.DisableAPI, false); err != nil {
return err return err
} }

View file

@ -2,6 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"runtime/pprof"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"golang.org/x/sys/windows/svc" "golang.org/x/sys/windows/svc"
@ -19,6 +20,10 @@ func StartRunSvc() error {
defer trace.CatchPanic("crowdsec/StartRunSvc") defer trace.CatchPanic("crowdsec/StartRunSvc")
//Always try to stop CPU profiling to avoid passing flags around
//It's a noop if profiling is not enabled
defer pprof.StopCPUProfile()
isRunninginService, err := svc.IsWindowsService() isRunninginService, err := svc.IsWindowsService()
if err != nil { if err != nil {
return fmt.Errorf("failed to determine if we are running in windows service mode: %w", err) return fmt.Errorf("failed to determine if we are running in windows service mode: %w", err)

View file

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"os" "os"
"os/signal" "os/signal"
"runtime/pprof"
"syscall" "syscall"
"time" "time"
@ -245,6 +246,10 @@ func HandleSignals(cConfig *csconfig.Config) error {
exitChan := make(chan error) exitChan := make(chan error)
//Always try to stop CPU profiling to avoid passing flags around
//It's a noop if profiling is not enabled
defer pprof.StopCPUProfile()
go func() { go func() {
defer trace.CatchPanic("crowdsec/HandleSignals") defer trace.CatchPanic("crowdsec/HandleSignals")
Loop: Loop: