// Gor is simple http traffic replication tool written in Go. Its main goal to replay traffic from production servers to staging and dev environments. // Now you can test your code on real user sessions in an automated and repeatable fashion. package main import ( "flag" "fmt" "log" "os" "runtime/debug" "runtime/pprof" "time" ) var ( mode string cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") memprofile = flag.String("memprofile", "", "write memory profile to this file") ) func main() { // Don't exit on panic defer func() { if r := recover(); r != nil { if _, ok := r.(error); !ok { fmt.Printf("PANIC: pkg: %v %s \n", r, debug.Stack()) } } }() fmt.Println("Version:", VERSION) flag.Parse() InitPlugins() if len(Plugins.Inputs) == 0 || len(Plugins.Outputs) == 0 { log.Fatal("Required at least 1 input and 1 output") } if *memprofile != "" { profileMEM(*memprofile) } if *cpuprofile != "" { profileCPU(*cpuprofile) } Start(nil) } func profileCPU(cpuprofile string) { if cpuprofile != "" { f, err := os.Create(cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) time.AfterFunc(60*time.Second, func() { pprof.StopCPUProfile() f.Close() log.Println("Stop profiling after 60 seconds") }) } } func profileMEM(memprofile string) { if memprofile != "" { f, err := os.Create(memprofile) if err != nil { log.Fatal(err) } time.AfterFunc(60*time.Second, func() { pprof.WriteHeapProfile(f) f.Close() }) } }