// 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" "io" "log" "os" "os/signal" "runtime" _ "runtime/debug" "runtime/pprof" "syscall" "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 { // fmt.Printf("PANIC: pkg: %v %s \n", r, debug.Stack()) // } // }() // If not set via env cariable if len(os.Getenv("GOMAXPROCS")) == 0 { runtime.GOMAXPROCS(runtime.NumCPU() * 2) } 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) c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c for _, p := range Plugins.All { if cp, ok := p.(io.Closer); ok { cp.Close() } } os.Exit(1) }() } func profileCPU(cpuprofile string) { if cpuprofile != "" { f, err := os.Create(cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) time.AfterFunc(30*time.Second, func() { pprof.StopCPUProfile() f.Close() log.Println("Stop profiling after 30 seconds") }) } } func profileMEM(memprofile string) { if memprofile != "" { f, err := os.Create(memprofile) if err != nil { log.Fatal(err) } time.AfterFunc(30*time.Second, func() { pprof.WriteHeapProfile(f) f.Close() }) } }