diff --git a/kubernetes-manifests/adservice.yaml b/kubernetes-manifests/adservice.yaml index 37ee35a..6c54424 100644 --- a/kubernetes-manifests/adservice.yaml +++ b/kubernetes-manifests/adservice.yaml @@ -25,7 +25,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/microservices-demo-app/adservice + image: gcr.io/yoshifumi-cloud-demo/adservice ports: - containerPort: 9555 env: diff --git a/kubernetes-manifests/cartservice.yaml b/kubernetes-manifests/cartservice.yaml index 178b8dd..b6c7e54 100644 --- a/kubernetes-manifests/cartservice.yaml +++ b/kubernetes-manifests/cartservice.yaml @@ -25,7 +25,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/microservices-demo-app/cartservice + image: gcr.io/yoshifumi-cloud-demo/cartservice ports: - containerPort: 7070 env: diff --git a/kubernetes-manifests/checkoutservice.yaml b/kubernetes-manifests/checkoutservice.yaml index 23668a6..dd3f4e9 100644 --- a/kubernetes-manifests/checkoutservice.yaml +++ b/kubernetes-manifests/checkoutservice.yaml @@ -24,7 +24,7 @@ spec: spec: containers: - name: server - image: gcr.io/microservices-demo-app/checkoutservice + image: gcr.io/yoshifumi-cloud-demo/checkoutservice ports: - containerPort: 5050 readinessProbe: diff --git a/kubernetes-manifests/currencyservice.yaml b/kubernetes-manifests/currencyservice.yaml index b344b1a..2b9a91f 100644 --- a/kubernetes-manifests/currencyservice.yaml +++ b/kubernetes-manifests/currencyservice.yaml @@ -25,7 +25,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/microservices-demo-app/currencyservice + image: gcr.io/yoshifumi-cloud-demo/currencyservice ports: - name: grpc containerPort: 7000 diff --git a/kubernetes-manifests/emailservice.yaml b/kubernetes-manifests/emailservice.yaml index 7479c2e..fe3312a 100644 --- a/kubernetes-manifests/emailservice.yaml +++ b/kubernetes-manifests/emailservice.yaml @@ -25,7 +25,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/microservices-demo-app/emailservice + image: gcr.io/yoshifumi-cloud-demo/emailservice ports: - containerPort: 8080 readinessProbe: diff --git a/kubernetes-manifests/frontend.yaml b/kubernetes-manifests/frontend.yaml index d921a8f..af6d83f 100644 --- a/kubernetes-manifests/frontend.yaml +++ b/kubernetes-manifests/frontend.yaml @@ -24,7 +24,7 @@ spec: spec: containers: - name: server - image: gcr.io/microservices-demo-app/frontend + image: gcr.io/yoshifumi-cloud-demo/frontend ports: - containerPort: 8080 readinessProbe: diff --git a/kubernetes-manifests/loadgenerator.yaml b/kubernetes-manifests/loadgenerator.yaml index ee84c3a..c5c62c9 100644 --- a/kubernetes-manifests/loadgenerator.yaml +++ b/kubernetes-manifests/loadgenerator.yaml @@ -38,7 +38,7 @@ spec: value: "frontend:80" containers: - name: main - image: gcr.io/microservices-demo-app/loadgenerator + image: gcr.io/yoshifumi-cloud-demo/loadgenerator env: - name: FRONTEND_ADDR value: "frontend:80" diff --git a/kubernetes-manifests/paymentservice.yaml b/kubernetes-manifests/paymentservice.yaml index 8f28410..7b7cffc 100644 --- a/kubernetes-manifests/paymentservice.yaml +++ b/kubernetes-manifests/paymentservice.yaml @@ -25,7 +25,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/microservices-demo-app/paymentservice + image: gcr.io/yoshifumi-cloud-demo/paymentservice ports: - containerPort: 50051 readinessProbe: diff --git a/kubernetes-manifests/productcatalogservice.yaml b/kubernetes-manifests/productcatalogservice.yaml index 1196356..70a13ab 100644 --- a/kubernetes-manifests/productcatalogservice.yaml +++ b/kubernetes-manifests/productcatalogservice.yaml @@ -25,7 +25,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/microservices-demo-app/productcatalogservice + image: gcr.io/yoshifumi-cloud-demo/productcatalogservice ports: - containerPort: 3550 readinessProbe: diff --git a/kubernetes-manifests/recommendationservice.yaml b/kubernetes-manifests/recommendationservice.yaml index 15be40f..2d893e4 100644 --- a/kubernetes-manifests/recommendationservice.yaml +++ b/kubernetes-manifests/recommendationservice.yaml @@ -25,7 +25,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/microservices-demo-app/recommendationservice + image: gcr.io/yoshifumi-cloud-demo/recommendationservice ports: - containerPort: 8080 readinessProbe: diff --git a/kubernetes-manifests/shippingservice.yaml b/kubernetes-manifests/shippingservice.yaml index 107b574..ea2491f 100644 --- a/kubernetes-manifests/shippingservice.yaml +++ b/kubernetes-manifests/shippingservice.yaml @@ -24,7 +24,7 @@ spec: spec: containers: - name: server - image: gcr.io/microservices-demo-app/shippingservice + image: gcr.io/yoshifumi-cloud-demo/shippingservice ports: - containerPort: 50051 readinessProbe: diff --git a/skaffold.yaml b/skaffold.yaml index bd04f86..909d535 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -18,27 +18,27 @@ build: tagPolicy: gitCommit: {} artifacts: - - imageName: gcr.io/microservices-demo-app/emailservice + - imageName: gcr.io/yoshifumi-cloud-demo/emailservice workspace: src/emailservice - - imageName: gcr.io/microservices-demo-app/productcatalogservice + - imageName: gcr.io/yoshifumi-cloud-demo/productcatalogservice workspace: src/productcatalogservice - - imageName: gcr.io/microservices-demo-app/recommendationservice + - imageName: gcr.io/yoshifumi-cloud-demo/recommendationservice workspace: src/recommendationservice - - imageName: gcr.io/microservices-demo-app/shippingservice + - imageName: gcr.io/yoshifumi-cloud-demo/shippingservice workspace: src/shippingservice - - imageName: gcr.io/microservices-demo-app/checkoutservice + - imageName: gcr.io/yoshifumi-cloud-demo/checkoutservice workspace: src/checkoutservice - - imageName: gcr.io/microservices-demo-app/paymentservice + - imageName: gcr.io/yoshifumi-cloud-demo/paymentservice workspace: src/paymentservice - - imageName: gcr.io/microservices-demo-app/currencyservice + - imageName: gcr.io/yoshifumi-cloud-demo/currencyservice workspace: src/currencyservice - - imageName: gcr.io/microservices-demo-app/cartservice + - imageName: gcr.io/yoshifumi-cloud-demo/cartservice workspace: src/cartservice - - imageName: gcr.io/microservices-demo-app/frontend + - imageName: gcr.io/yoshifumi-cloud-demo/frontend workspace: src/frontend - - imageName: gcr.io/microservices-demo-app/loadgenerator + - imageName: gcr.io/yoshifumi-cloud-demo/loadgenerator workspace: src/loadgenerator - - imageName: gcr.io/microservices-demo-app/adservice + - imageName: gcr.io/yoshifumi-cloud-demo/adservice workspace: src/adservice deploy: kubectl: diff --git a/src/checkoutservice/Gopkg.lock b/src/checkoutservice/Gopkg.lock index 036480d..364e527 100644 --- a/src/checkoutservice/Gopkg.lock +++ b/src/checkoutservice/Gopkg.lock @@ -56,6 +56,14 @@ revision = "317e0006254c44a0ac427cc52a0e083ff0b9622f" version = "v2.0.0" +[[projects]] + digest = "1:d867dfa6751c8d7a435821ad3b736310c2ed68945d05b50fb9d23aee0540c8cc" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "UT" + revision = "3e01752db0189b9157070a0e1668a620f9a85da2" + version = "v1.0.6" + [[projects]] name = "go.opencensus.io" packages = [ @@ -77,6 +85,14 @@ revision = "b11f239c032624b045c4c2bfd3d1287b4012ce89" version = "v0.16.0" +[[projects]] + branch = "master" + digest = "1:3f3a05ae0b95893d90b9b3b5afdb79a9b3d96e4e36e099d841ae602e4aca0da8" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + pruneopts = "UT" + revision = "0e37d006457bf46f9e6692014ba72ef82c33022c" + [[projects]] branch = "master" name = "golang.org/x/net" diff --git a/src/checkoutservice/Gopkg.toml b/src/checkoutservice/Gopkg.toml index 0599867..8566b97 100644 --- a/src/checkoutservice/Gopkg.toml +++ b/src/checkoutservice/Gopkg.toml @@ -41,6 +41,10 @@ name = "github.com/google/uuid" version = "1.0.0" +[[constraint]] + name = "github.com/sirupsen/logrus" + version = "1.0.6" + [[constraint]] name = "go.opencensus.io" version = "0.16.0" diff --git a/src/checkoutservice/main.go b/src/checkoutservice/main.go index 116e051..cbc408f 100644 --- a/src/checkoutservice/main.go +++ b/src/checkoutservice/main.go @@ -17,7 +17,6 @@ package main import ( "context" "fmt" - "log" "net" "os" "time" @@ -25,6 +24,7 @@ import ( "cloud.google.com/go/profiler" "contrib.go.opencensus.io/exporter/stackdriver" "github.com/google/uuid" + "github.com/sirupsen/logrus" "go.opencensus.io/plugin/ocgrpc" "go.opencensus.io/stats/view" "go.opencensus.io/trace" @@ -42,6 +42,22 @@ const ( usdCurrency = "USD" ) +var log *logrus.Logger + +func init() { + log = logrus.New() + log.Level = logrus.DebugLevel + log.Formatter = &logrus.JSONFormatter{ + FieldMap: logrus.FieldMap{ + logrus.FieldKeyTime: "timestamp", + logrus.FieldKeyLevel: "severity", + logrus.FieldKeyMsg: "message", + }, + TimestampFormat: time.RFC3339Nano, + } + log.Out = os.Stdout +} + type checkoutService struct { productCatalogSvcAddr string cartSvcAddr string @@ -68,7 +84,7 @@ func main() { mustMapEnv(&svc.emailSvcAddr, "EMAIL_SERVICE_ADDR") mustMapEnv(&svc.paymentSvcAddr, "PAYMENT_SERVICE_ADDR") - log.Printf("service config: %+v", svc) + log.Infof("service config: %+v", svc) lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) if err != nil { @@ -77,16 +93,17 @@ func main() { srv := grpc.NewServer(grpc.StatsHandler(&ocgrpc.ServerHandler{})) pb.RegisterCheckoutServiceServer(srv, svc) healthpb.RegisterHealthServer(srv, svc) - log.Printf("starting to listen on tcp: %q", lis.Addr().String()) - log.Fatal(srv.Serve(lis)) + log.Infof("starting to listen on tcp: %q", lis.Addr().String()) + err = srv.Serve(lis) + log.Fatal(err) } func initStats(exporter *stackdriver.Exporter) { view.RegisterExporter(exporter) if err := view.Register(ocgrpc.DefaultServerViews...); err != nil { - log.Printf("Error registering default server views") + log.Warn("Error registering default server views") } else { - log.Printf("Registered default server views") + log.Info("Registered default server views") } } @@ -96,21 +113,21 @@ func initTracing() { for i := 1; i <= 3; i++ { exporter, err := stackdriver.NewExporter(stackdriver.Options{}) if err != nil { - log.Printf("info: failed to initialize stackdriver exporter: %+v", err) + log.Infof("failed to initialize stackdriver exporter: %+v", err) } else { trace.RegisterExporter(exporter) trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) - log.Print("registered stackdriver tracing") + log.Info("registered stackdriver tracing") // Register the views to collect server stats. initStats(exporter) return } d := time.Second * 10 * time.Duration(i) - log.Printf("sleeping %v to retry initializing stackdriver exporter", d) + log.Infof("sleeping %v to retry initializing stackdriver exporter", d) time.Sleep(d) } - log.Printf("warning: could not initialize stackdriver exporter after retrying, giving up") + log.Warn("could not initialize stackdriver exporter after retrying, giving up") } func initProfiling(service, version string) { @@ -123,16 +140,16 @@ func initProfiling(service, version string) { // ProjectID must be set if not running on GCP. // ProjectID: "my-project", }); err != nil { - log.Printf("warn: failed to start profiler: %+v", err) + log.Warnf("failed to start profiler: %+v", err) } else { - log.Print("started stackdriver profiler") + log.Info("started stackdriver profiler") return } d := time.Second * 10 * time.Duration(i) - log.Printf("sleeping %v to retry initializing stackdriver profiler", d) + log.Infof("sleeping %v to retry initializing stackdriver profiler", d) time.Sleep(d) } - log.Printf("warning: could not initialize stackdriver profiler after retrying, giving up") + log.Warn("could not initialize stackdriver profiler after retrying, giving up") } func mustMapEnv(target *string, envKey string) { @@ -148,7 +165,7 @@ func (cs *checkoutService) Check(ctx context.Context, req *healthpb.HealthCheckR } func (cs *checkoutService) PlaceOrder(ctx context.Context, req *pb.PlaceOrderRequest) (*pb.PlaceOrderResponse, error) { - log.Printf("[PlaceOrder] user_id=%q user_currency=%q", req.UserId, req.UserCurrency) + log.Infof("[PlaceOrder] user_id=%q user_currency=%q", req.UserId, req.UserCurrency) orderID, err := uuid.NewUUID() if err != nil { @@ -172,7 +189,7 @@ func (cs *checkoutService) PlaceOrder(ctx context.Context, req *pb.PlaceOrderReq if err != nil { return nil, status.Errorf(codes.Internal, "failed to charge card: %+v", err) } - log.Printf("payment went through (transaction_id: %s)", txID) + log.Infof("payment went through (transaction_id: %s)", txID) shippingTrackingID, err := cs.shipOrder(ctx, req.Address, prep.cartItems) if err != nil { @@ -190,9 +207,9 @@ func (cs *checkoutService) PlaceOrder(ctx context.Context, req *pb.PlaceOrderReq } if err := cs.sendOrderConfirmation(ctx, req.Email, orderResult); err != nil { - log.Printf("failed to send order confirmation to %q: %+v", req.Email, err) + log.Warnf("failed to send order confirmation to %q: %+v", req.Email, err) } else { - log.Printf("order confirmation email sent to %q", req.Email) + log.Infof("order confirmation email sent to %q", req.Email) } resp := &pb.PlaceOrderResponse{Order: orderResult} return resp, nil diff --git a/src/frontend/main.go b/src/frontend/main.go index e70dac3..8939def 100644 --- a/src/frontend/main.go +++ b/src/frontend/main.go @@ -83,7 +83,15 @@ func main() { ctx := context.Background() log := logrus.New() log.Level = logrus.DebugLevel - log.Formatter = &logrus.TextFormatter{} + log.Formatter = &logrus.JSONFormatter{ + FieldMap: logrus.FieldMap{ + logrus.FieldKeyTime: "timestamp", + logrus.FieldKeyLevel: "severity", + logrus.FieldKeyMsg: "message", + }, + TimestampFormat: time.RFC3339Nano, + } + log.Out = os.Stdout go initProfiling(log, "frontend", "1.0.0") go initTracing(log) diff --git a/src/loadgenerator/locustfile.py b/src/loadgenerator/locustfile.py index 997b3b3..ae4c961 100644 --- a/src/loadgenerator/locustfile.py +++ b/src/loadgenerator/locustfile.py @@ -16,17 +16,7 @@ import random from locust import HttpLocust, TaskSet - -products = [ - '0PUK6V6EV0', - '1YMWWN1N4O', - '2ZYFJ3GM2N', - '66VCHSJNUP', - '6E92ZMYYFZ', - '9SIQT8TOJO', - 'L9ECAV7KIM', - 'LS4PSXUNUM', - 'OLJCESPC7Z'] +import setting def index(l): l.client.get("/") @@ -37,13 +27,13 @@ def setCurrency(l): {'currency_code': random.choice(currencies)}) def browseProduct(l): - l.client.get("/product/" + random.choice(products)) + l.client.get("/product/" + random.choice(setting.products)) def viewCart(l): l.client.get("/cart") def addToCart(l): - product = random.choice(products) + product = random.choice(setting.products) l.client.get("/product/" + product) l.client.post("/cart", { 'product_id': product, @@ -51,18 +41,7 @@ def addToCart(l): def checkout(l): addToCart(l) - l.client.post("/cart/checkout", { - 'email': 'someone@example.com', - 'street_address': '1600 Amphitheatre Parkway', - 'zip_code': '94043', - 'city': 'Mountain View', - 'state': 'CA', - 'country': 'United States', - 'credit_card_number': '4432-8015-6152-0454', - 'credit_card_expiration_month': '1', - 'credit_card_expiration_year': '2019', - 'credit_card_cvv': '672', - }) + l.client.post("/cart/checkout", random.choice(setting.orders)) class UserBehavior(TaskSet): diff --git a/src/loadgenerator/setting.py b/src/loadgenerator/setting.py new file mode 100644 index 0000000..694c0a6 --- /dev/null +++ b/src/loadgenerator/setting.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +# +# Copyright 2018 Google LLC +# +# Licensed 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. + +products = [ + '0PUK6V6EV0', + '1YMWWN1N4O', + '2ZYFJ3GM2N', + '66VCHSJNUP', + '6E92ZMYYFZ', + '9SIQT8TOJO', + 'L9ECAV7KIM', + 'LS4PSXUNUM', + 'OLJCESPC7Z'] + +orders = [ + { + 'email': 'someone@example.com', + 'street_address': '1600 Amphitheatre Parkway', + 'zip_code': '94043', + 'city': 'Mountain View', + 'state': 'CA', + 'country': 'United States', + 'credit_card_number': '4432-8015-6152-0454', + 'credit_card_expiration_month': '1', + 'credit_card_expiration_year': '2019', + 'credit_card_cvv': '672', + }, + { + 'email': 'anyone@example.com', + 'street_address': '6-10-1 Roppongi, Roppongi Hills 44F', + 'zip_code': '1066126', + 'city': 'Minato-ku', + 'state': 'Tokyo', + 'country': 'Japapn', + 'credit_card_number': '4429-3499-0001-7938', + 'credit_card_expiration_month': '4', + 'credit_card_expiration_year': '2021', + 'credit_card_cvv': '124', + } +] diff --git a/src/productcatalogservice/Gopkg.lock b/src/productcatalogservice/Gopkg.lock index b9a3bbd..e1c01e0 100644 --- a/src/productcatalogservice/Gopkg.lock +++ b/src/productcatalogservice/Gopkg.lock @@ -62,6 +62,14 @@ revision = "317e0006254c44a0ac427cc52a0e083ff0b9622f" version = "v2.0.0" +[[projects]] + digest = "1:d867dfa6751c8d7a435821ad3b736310c2ed68945d05b50fb9d23aee0540c8cc" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "UT" + revision = "3e01752db0189b9157070a0e1668a620f9a85da2" + version = "v1.0.6" + [[projects]] name = "go.opencensus.io" packages = [ @@ -83,6 +91,14 @@ revision = "b11f239c032624b045c4c2bfd3d1287b4012ce89" version = "v0.16.0" +[[projects]] + branch = "master" + digest = "1:3f3a05ae0b95893d90b9b3b5afdb79a9b3d96e4e36e099d841ae602e4aca0da8" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + pruneopts = "UT" + revision = "0e37d006457bf46f9e6692014ba72ef82c33022c" + [[projects]] branch = "master" name = "golang.org/x/net" diff --git a/src/productcatalogservice/Gopkg.toml b/src/productcatalogservice/Gopkg.toml index a9b34ec..473b4b8 100644 --- a/src/productcatalogservice/Gopkg.toml +++ b/src/productcatalogservice/Gopkg.toml @@ -41,6 +41,10 @@ name = "github.com/google/go-cmp" version = "0.2.0" +[[constraint]] + name = "github.com/sirupsen/logrus" + version = "1.0.6" + [[constraint]] name = "go.opencensus.io" version = "0.16.0" diff --git a/src/productcatalogservice/server.go b/src/productcatalogservice/server.go index 6599877..0b8efef 100644 --- a/src/productcatalogservice/server.go +++ b/src/productcatalogservice/server.go @@ -20,8 +20,8 @@ import ( "flag" "fmt" "io/ioutil" - "log" "net" + "os" "strings" "time" @@ -31,6 +31,7 @@ import ( "cloud.google.com/go/profiler" "contrib.go.opencensus.io/exporter/stackdriver" "github.com/golang/protobuf/jsonpb" + "github.com/sirupsen/logrus" "go.opencensus.io/plugin/ocgrpc" "go.opencensus.io/stats/view" "go.opencensus.io/trace" @@ -41,6 +42,7 @@ import ( var ( catalogJSON []byte + log *logrus.Logger port = flag.Int("port", 3550, "port to listen at") ) @@ -51,7 +53,17 @@ func init() { log.Fatalf("failed to open product catalog json file: %v", err) } catalogJSON = c - log.Printf("successfully parsed product catalog json") + log = logrus.New() + log.Formatter = &logrus.JSONFormatter{ + FieldMap: logrus.FieldMap{ + logrus.FieldKeyTime: "timestamp", + logrus.FieldKeyLevel: "severity", + logrus.FieldKeyMsg: "message", + }, + TimestampFormat: time.RFC3339Nano, + } + log.Out = os.Stdout + log.Info("successfully parsed product catalog json") } func main() { @@ -59,7 +71,7 @@ func main() { go initProfiling("productcatalogservice", "1.0.0") flag.Parse() - log.Printf("starting grpc server at :%d", *port) + log.Infof("starting grpc server at :%d", *port) run(*port) select {} } @@ -80,9 +92,9 @@ func run(port int) string { func initStats(exporter *stackdriver.Exporter) { view.RegisterExporter(exporter) if err := view.Register(ocgrpc.DefaultServerViews...); err != nil { - log.Printf("Error registering default server views") + log.Info("Error registering default server views") } else { - log.Printf("Registered default server views") + log.Info("Registered default server views") } } @@ -92,21 +104,21 @@ func initTracing() { for i := 1; i <= 3; i++ { exporter, err := stackdriver.NewExporter(stackdriver.Options{}) if err != nil { - log.Printf("info: failed to initialize stackdriver exporter: %+v", err) + log.Warnf("failed to initialize stackdriver exporter: %+v", err) } else { trace.RegisterExporter(exporter) trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) - log.Print("registered stackdriver tracing") + log.Info("registered stackdriver tracing") // Register the views to collect server stats. initStats(exporter) return } d := time.Second * 10 * time.Duration(i) - log.Printf("sleeping %v to retry initializing stackdriver exporter", d) + log.Infof("sleeping %v to retry initializing stackdriver exporter", d) time.Sleep(d) } - log.Printf("warning: could not initialize stackdriver exporter after retrying, giving up") + log.Warn("could not initialize stackdriver exporter after retrying, giving up") } func initProfiling(service, version string) { @@ -119,16 +131,16 @@ func initProfiling(service, version string) { // ProjectID must be set if not running on GCP. // ProjectID: "my-project", }); err != nil { - log.Printf("warn: failed to start profiler: %+v", err) + log.Warnf("failed to start profiler: %+v", err) } else { - log.Print("started stackdriver profiler") + log.Info("started stackdriver profiler") return } d := time.Second * 10 * time.Duration(i) - log.Printf("sleeping %v to retry initializing stackdriver profiler", d) + log.Infof("sleeping %v to retry initializing stackdriver profiler", d) time.Sleep(d) } - log.Printf("warning: could not initialize stackdriver profiler after retrying, giving up") + log.Warn("could not initialize stackdriver profiler after retrying, giving up") } type productCatalog struct{} @@ -137,7 +149,7 @@ func parseCatalog() []*pb.Product { var cat pb.ListProductsResponse if err := jsonpb.Unmarshal(bytes.NewReader(catalogJSON), &cat); err != nil { - log.Printf("warning: failed to parse the catalog JSON: %v", err) + log.Warnf("failed to parse the catalog JSON: %v", err) return nil } return cat.Products diff --git a/src/shippingservice/Gopkg.lock b/src/shippingservice/Gopkg.lock index 998e4eb..9250ec1 100644 --- a/src/shippingservice/Gopkg.lock +++ b/src/shippingservice/Gopkg.lock @@ -50,6 +50,14 @@ revision = "317e0006254c44a0ac427cc52a0e083ff0b9622f" version = "v2.0.0" +[[projects]] + digest = "1:d867dfa6751c8d7a435821ad3b736310c2ed68945d05b50fb9d23aee0540c8cc" + name = "github.com/sirupsen/logrus" + packages = ["."] + pruneopts = "UT" + revision = "3e01752db0189b9157070a0e1668a620f9a85da2" + version = "v1.0.6" + [[projects]] name = "go.opencensus.io" packages = [ @@ -71,6 +79,14 @@ revision = "b11f239c032624b045c4c2bfd3d1287b4012ce89" version = "v0.16.0" +[[projects]] + branch = "master" + digest = "1:3f3a05ae0b95893d90b9b3b5afdb79a9b3d96e4e36e099d841ae602e4aca0da8" + name = "golang.org/x/crypto" + packages = ["ssh/terminal"] + pruneopts = "UT" + revision = "0e37d006457bf46f9e6692014ba72ef82c33022c" + [[projects]] branch = "master" name = "golang.org/x/net" diff --git a/src/shippingservice/Gopkg.toml b/src/shippingservice/Gopkg.toml index eafb618..90a3ce9 100644 --- a/src/shippingservice/Gopkg.toml +++ b/src/shippingservice/Gopkg.toml @@ -37,6 +37,10 @@ name = "github.com/golang/protobuf" version = "1.2.0" +[[constraint]] + name = "github.com/sirupsen/logrus" + version = "1.0.6" + [[constraint]] name = "go.opencensus.io" version = "0.16.0" diff --git a/src/shippingservice/main.go b/src/shippingservice/main.go index f82787a..35f7ed4 100644 --- a/src/shippingservice/main.go +++ b/src/shippingservice/main.go @@ -16,13 +16,13 @@ package main import ( "fmt" - "log" "net" "os" "time" "cloud.google.com/go/profiler" "contrib.go.opencensus.io/exporter/stackdriver" + "github.com/sirupsen/logrus" "go.opencensus.io/plugin/ocgrpc" "go.opencensus.io/stats/view" "go.opencensus.io/trace" @@ -38,6 +38,22 @@ const ( defaultPort = "50051" ) +var log *logrus.Logger + +func init() { + log = logrus.New() + log.Level = logrus.DebugLevel + log.Formatter = &logrus.JSONFormatter{ + FieldMap: logrus.FieldMap{ + logrus.FieldKeyTime: "timestamp", + logrus.FieldKeyLevel: "severity", + logrus.FieldKeyMsg: "message", + }, + TimestampFormat: time.RFC3339Nano, + } + log.Out = os.Stdout +} + func main() { go initTracing() go initProfiling("shippingservice", "1.0.0") @@ -56,7 +72,7 @@ func main() { svc := &server{} pb.RegisterShippingServiceServer(srv, svc) healthpb.RegisterHealthServer(srv, svc) - log.Printf("Shipping Service listening on port %s", port) + log.Infof("Shipping Service listening on port %s", port) // Register reflection service on gRPC server. reflection.Register(srv) @@ -75,8 +91,8 @@ func (s *server) Check(ctx context.Context, req *healthpb.HealthCheckRequest) (* // GetQuote produces a shipping quote (cost) in USD. func (s *server) GetQuote(ctx context.Context, in *pb.GetQuoteRequest) (*pb.GetQuoteResponse, error) { - log.Printf("[GetQuote] received request") - defer log.Printf("[GetQuote] completed request") + log.Info("[GetQuote] received request") + defer log.Info("[GetQuote] completed request") // 1. Our quote system requires the total number of items to be shipped. count := 0 @@ -100,8 +116,8 @@ func (s *server) GetQuote(ctx context.Context, in *pb.GetQuoteRequest) (*pb.GetQ // ShipOrder mocks that the requested items will be shipped. // It supplies a tracking ID for notional lookup of shipment delivery status. func (s *server) ShipOrder(ctx context.Context, in *pb.ShipOrderRequest) (*pb.ShipOrderResponse, error) { - log.Printf("[ShipOrder] received request") - defer log.Printf("[ShipOrder] completed request") + log.Info("[ShipOrder] received request") + defer log.Info("[ShipOrder] completed request") // 1. Create a Tracking ID baseAddress := fmt.Sprintf("%s, %s, %s", in.Address.StreetAddress, in.Address.City, in.Address.State) id := CreateTrackingId(baseAddress) @@ -115,9 +131,9 @@ func (s *server) ShipOrder(ctx context.Context, in *pb.ShipOrderRequest) (*pb.Sh func initStats(exporter *stackdriver.Exporter) { view.RegisterExporter(exporter) if err := view.Register(ocgrpc.DefaultServerViews...); err != nil { - log.Printf("Error registering default server views") + log.Warn("Error registering default server views") } else { - log.Printf("Registered default server views") + log.Info("Registered default server views") } } @@ -127,21 +143,21 @@ func initTracing() { for i := 1; i <= 3; i++ { exporter, err := stackdriver.NewExporter(stackdriver.Options{}) if err != nil { - log.Printf("info: failed to initialize stackdriver exporter: %+v", err) + log.Warnf("failed to initialize stackdriver exporter: %+v", err) } else { trace.RegisterExporter(exporter) trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()}) - log.Print("registered stackdriver tracing") + log.Info("registered stackdriver tracing") // Register the views to collect server stats. initStats(exporter) return } d := time.Second * 10 * time.Duration(i) - log.Printf("sleeping %v to retry initializing stackdriver exporter", d) + log.Infof("sleeping %v to retry initializing stackdriver exporter", d) time.Sleep(d) } - log.Printf("warning: could not initialize stackdriver exporter after retrying, giving up") + log.Warn("could not initialize stackdriver exporter after retrying, giving up") } func initProfiling(service, version string) { @@ -154,14 +170,14 @@ func initProfiling(service, version string) { // ProjectID must be set if not running on GCP. // ProjectID: "my-project", }); err != nil { - log.Printf("warn: failed to start profiler: %+v", err) + log.Warnf("failed to start profiler: %+v", err) } else { - log.Print("started stackdriver profiler") + log.Info("started stackdriver profiler") return } d := time.Second * 10 * time.Duration(i) - log.Printf("sleeping %v to retry initializing stackdriver profiler", d) + log.Infof("sleeping %v to retry initializing stackdriver profiler", d) time.Sleep(d) } - log.Printf("warning: could not initialize stackdriver profiler after retrying, giving up") + log.Warn("could not initialize stackdriver profiler after retrying, giving up") } diff --git a/src/shippingservice/quote.go b/src/shippingservice/quote.go index 09c040a..3732098 100644 --- a/src/shippingservice/quote.go +++ b/src/shippingservice/quote.go @@ -50,6 +50,6 @@ func quoteByCountFloat(count int) float64 { return 0 } count64 := float64(count) - var p float64 = 1 + (count64 * 0.2) + var p = 1 + (count64 * 0.2) return count64 + math.Pow(3, p) }