productcatalog: introduce configurable latency (#134)
This commit is contained in:
parent
3da0ae3b31
commit
1d045de655
2 changed files with 23 additions and 1 deletions
|
@ -29,3 +29,10 @@ kubectl exec \
|
||||||
$(kubectl get pods -l app=productcatalogservice -o jsonpath='{.items[0].metadata.name}') \
|
$(kubectl get pods -l app=productcatalogservice -o jsonpath='{.items[0].metadata.name}') \
|
||||||
-c server -- kill -USR2 1
|
-c server -- kill -USR2 1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Latency injection
|
||||||
|
|
||||||
|
This service has an `EXTRA_LATENCY` environment variable. This will inject a sleep for the specified [time.Duration](https://golang.org/pkg/time/#ParseDuration) on every call to
|
||||||
|
to the server.
|
||||||
|
|
||||||
|
For example, use `EXTRA_LATENCY="5.5s"` to sleep for 5.5 seconds on every request.
|
||||||
|
|
|
@ -48,6 +48,7 @@ var (
|
||||||
cat pb.ListProductsResponse
|
cat pb.ListProductsResponse
|
||||||
catalogMutex *sync.Mutex
|
catalogMutex *sync.Mutex
|
||||||
log *logrus.Logger
|
log *logrus.Logger
|
||||||
|
extraLatency time.Duration
|
||||||
|
|
||||||
port = flag.Int("port", 3550, "port to listen at")
|
port = flag.Int("port", 3550, "port to listen at")
|
||||||
|
|
||||||
|
@ -77,6 +78,18 @@ func main() {
|
||||||
go initProfiling("productcatalogservice", "1.0.0")
|
go initProfiling("productcatalogservice", "1.0.0")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
// set injected latency
|
||||||
|
if s := os.Getenv("EXTRA_LATENCY"); s != "" {
|
||||||
|
v, err := time.ParseDuration(s)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("failed to parse EXTRA_LATENCY (%s) as time.Duration: %+v", v, err)
|
||||||
|
}
|
||||||
|
extraLatency = v
|
||||||
|
log.Infof("extra latency enabled (duration: %v)", extraLatency)
|
||||||
|
} else {
|
||||||
|
extraLatency = time.Duration(0)
|
||||||
|
}
|
||||||
|
|
||||||
sigs := make(chan os.Signal, 1)
|
sigs := make(chan os.Signal, 1)
|
||||||
signal.Notify(sigs, syscall.SIGUSR1, syscall.SIGUSR2)
|
signal.Notify(sigs, syscall.SIGUSR1, syscall.SIGUSR2)
|
||||||
go func() {
|
go func() {
|
||||||
|
@ -117,7 +130,6 @@ func initJaegerTracing() {
|
||||||
log.Info("jaeger initialization disabled.")
|
log.Info("jaeger initialization disabled.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register the Jaeger exporter to be able to retrieve
|
// Register the Jaeger exporter to be able to retrieve
|
||||||
// the collected spans.
|
// the collected spans.
|
||||||
exporter, err := jaeger.NewExporter(jaeger.Options{
|
exporter, err := jaeger.NewExporter(jaeger.Options{
|
||||||
|
@ -226,10 +238,12 @@ func (p *productCatalog) Check(ctx context.Context, req *healthpb.HealthCheckReq
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *productCatalog) ListProducts(context.Context, *pb.Empty) (*pb.ListProductsResponse, error) {
|
func (p *productCatalog) ListProducts(context.Context, *pb.Empty) (*pb.ListProductsResponse, error) {
|
||||||
|
time.Sleep(extraLatency)
|
||||||
return &pb.ListProductsResponse{Products: parseCatalog()}, nil
|
return &pb.ListProductsResponse{Products: parseCatalog()}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *productCatalog) GetProduct(ctx context.Context, req *pb.GetProductRequest) (*pb.Product, error) {
|
func (p *productCatalog) GetProduct(ctx context.Context, req *pb.GetProductRequest) (*pb.Product, error) {
|
||||||
|
time.Sleep(extraLatency)
|
||||||
var found *pb.Product
|
var found *pb.Product
|
||||||
for i := 0; i < len(parseCatalog()); i++ {
|
for i := 0; i < len(parseCatalog()); i++ {
|
||||||
if req.Id == parseCatalog()[i].Id {
|
if req.Id == parseCatalog()[i].Id {
|
||||||
|
@ -243,6 +257,7 @@ func (p *productCatalog) GetProduct(ctx context.Context, req *pb.GetProductReque
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *productCatalog) SearchProducts(ctx context.Context, req *pb.SearchProductsRequest) (*pb.SearchProductsResponse, error) {
|
func (p *productCatalog) SearchProducts(ctx context.Context, req *pb.SearchProductsRequest) (*pb.SearchProductsResponse, error) {
|
||||||
|
time.Sleep(extraLatency)
|
||||||
// Intepret query as a substring match in name or description.
|
// Intepret query as a substring match in name or description.
|
||||||
var ps []*pb.Product
|
var ps []*pb.Product
|
||||||
for _, p := range parseCatalog() {
|
for _, p := range parseCatalog() {
|
||||||
|
|
Loading…
Reference in a new issue