e2e-examples/echo/echo-client/main.go (87 lines of code) (raw):

package main import ( "context" "flag" "log" "sort" "strings" "sync" "time" pb "github.com/GoogleCloudPlatform/grpc-gcp-go/e2e-examples/echo/echo" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) var ( addr = flag.String("addr", "staging-grpc-cfe-benchmarks.googleapis.com:443", "server address") numRpcs = flag.Int("numRpcs", 1, "number of blocking unary calls") warmup = flag.Int("warmup", 5, "number of warmup calls before test") rspSize = flag.Int("rspSize", 1, "response size in KB") reqSize = flag.Int("reqSize", 1, "request size in KB") async = flag.Bool("async", false, "use async echo calls") ) func printRsts(numRpcs int, rspSize int, reqSize int, rsts []int) { sort.Ints(rsts) n := len(rsts) sum := 0 for _, r := range rsts { sum += r } log.Printf( "\n[Number of RPCs: %v, Request size: %vKB, Response size: %vKB]\n"+ "\t\tAvg\tMin\tp50\tp90\tp99\tMax\n"+ "Time(ms)\t%v\t%v\t%v\t%v\t%v\t%v\n", numRpcs, reqSize, rspSize, sum/n, rsts[0], rsts[int(float64(n)*0.5)], rsts[int(float64(n)*0.9)], rsts[int(float64(n)*0.99)], rsts[n-1], ) } func main() { flag.Parse() conn, err := grpc.Dial( *addr, grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, "")), grpc.WithBlock()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() client := pb.NewGrpcCloudapiClient(conn) msg := strings.Repeat("x", *reqSize*1024) req := &pb.EchoWithResponseSizeRequest{EchoMsg: msg, ResponseSize: int32(*rspSize * 1024)} // begin warmup calls for i := 0; i < *warmup; i++ { _, err := client.EchoWithResponseSize(context.Background(), req) if err != nil { log.Fatalf("EchoWithResponseSize failed with error during warmup: %v", err) } } rsts := []int{} if !*async { // begin tests for i := 0; i < *numRpcs; i++ { start := time.Now() _, err := client.EchoWithResponseSize(context.Background(), req) if err != nil { log.Fatalf("EchoWithResponseSize failed with error: %v", err) } rsts = append(rsts, int(time.Since(start).Milliseconds())) } printRsts(*numRpcs, *rspSize, *reqSize, rsts) } else { var wg sync.WaitGroup wg.Add(*numRpcs) for i := 0; i < *numRpcs; i++ { go func(r *pb.EchoWithResponseSizeRequest, n int) { defer wg.Done() _, err := client.EchoWithResponseSize(context.Background(), r) if err != nil { log.Fatalf("EchoWithResponseSize failed with error: %v", err) } log.Printf("Done %vth request", n) }(req, i) } wg.Wait() } }