mirror of
https://github.com/buger/goreplay.git
synced 2024-04-21 12:32:02 +00:00
83 lines
1.6 KiB
Go
83 lines
1.6 KiB
Go
// 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"
|
|
_ "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 {
|
|
// 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)
|
|
}
|
|
|
|
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()
|
|
})
|
|
}
|
|
}
|