blob: b2d45466b77b0483064c2ef972c82c2d555422aa [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package main
import (
"context"
"flag"
"fmt"
_ "net/http/pprof"
)
import (
clusterutils "dubbo.apache.org/dubbo-go/v3/cluster/utils"
"dubbo.apache.org/dubbo-go/v3/config"
_ "dubbo.apache.org/dubbo-go/v3/imports"
"github.com/dubbogo/gost/log/logger"
testerpkg "github.com/dubbogo/tools/pkg/tester"
)
import (
"github.com/dubbogo/dubbo-go-benchmark/3.0/adaptivesvc-triple/api"
"github.com/dubbogo/dubbo-go-benchmark/3.0/filters/offline_simulator"
)
const (
defaultTps = 200
defaultDuration = "1m"
defaultFibonacciN = 1
)
var (
duration string
tps int
fibonacciN int64
)
func main() {
flag.IntVar(&tps, "c", defaultTps, "TPS")
flag.StringVar(&duration, "d", defaultDuration, "Test duration. It should be a string representing a time, like \"1h\", \"30m\", etc")
flag.Int64Var(&fibonacciN, "n", defaultFibonacciN, "Parameter for the call to fibonacci")
flag.Parse()
provider := new(api.ProviderClientImpl)
config.SetConsumerService(provider)
if err := config.Load(); err != nil {
panic(err)
}
ctx := context.TODO()
doInvoke := func(uid int) {
if result, err := fibonacci(ctx, provider); err != nil {
handleErr(err)
} else {
fmt.Printf("result: %d\n", result.Result)
}
}
tester := testerpkg.NewStressTester()
tester.
SetTPS(tps).
SetDuration(duration).
SetTestFn(doInvoke).
Run()
fmt.Printf("Sent request num: %d\n", tester.GetTransactionNum())
fmt.Printf("TPS: %.2f\n", tester.GetTPS())
fmt.Printf("RT: %.2fs\n", tester.GetAverageRTSeconds())
}
func fibonacci(ctx context.Context, provider *api.ProviderClientImpl) (result *api.FibonacciResult, err error) {
req := &api.FibonacciRequest{
N: fibonacciN,
}
result, err = provider.Fibonacci(ctx, req)
return
}
func handleErr(err error) {
if clusterutils.DoesAdaptiveServiceReachLimitation(err) {
logger.Infof("Reach Limitation")
} else if err.Error() == context.DeadlineExceeded.Error() {
logger.Warnf("Consumer Request Timeout, err: %v", err)
} else if offline_simulator.IsServerOfflineErr(err) {
logger.Warnf("Server offline, err: %v", err)
} else {
panic(err)
}
}