From c6e7b80a3262a6a35f5041093f18d7307b8bcd1a Mon Sep 17 00:00:00 2001 From: Yoshi Yamaguchi Date: Mon, 24 Sep 2018 21:04:36 +0900 Subject: [PATCH] log: change log format to JSON payload for better log in Stackdriver change the log format in Go written service from text payload to JSON payload using 3rd party logging library (logrus). https://cloud.google.com/logging/docs/structured-logging https://github.com/sirupsen/logrus/blob/33a1e118e113c7d1dd24a80f80670864cd598519/json_formatter.go#L40-L49 Effected services are frontend, productcatalogservice, checkoutservice, and shippinservice. Also change target container registry and locust scenario for testing. --- kubernetes-manifests/adservice.yaml | 2 +- kubernetes-manifests/cartservice.yaml | 2 +- kubernetes-manifests/checkoutservice.yaml | 2 +- kubernetes-manifests/currencyservice.yaml | 2 +- kubernetes-manifests/emailservice.yaml | 2 +- kubernetes-manifests/frontend.yaml | 2 +- kubernetes-manifests/loadgenerator.yaml | 2 +- kubernetes-manifests/paymentservice.yaml | 2 +- .../productcatalogservice.yaml | 2 +- .../recommendationservice.yaml | 2 +- kubernetes-manifests/shippingservice.yaml | 2 +- skaffold.yaml | 22 ++++---- src/checkoutservice/Gopkg.lock | 16 ++++++ src/checkoutservice/Gopkg.toml | 4 ++ src/checkoutservice/main.go | 53 ++++++++++++------- src/frontend/main.go | 10 +++- src/loadgenerator/locustfile.py | 29 ++-------- src/loadgenerator/setting.py | 53 +++++++++++++++++++ src/productcatalogservice/Gopkg.lock | 16 ++++++ src/productcatalogservice/Gopkg.toml | 4 ++ src/productcatalogservice/server.go | 40 +++++++++----- src/shippingservice/Gopkg.lock | 16 ++++++ src/shippingservice/Gopkg.toml | 4 ++ src/shippingservice/main.go | 48 +++++++++++------ src/shippingservice/quote.go | 2 +- 25 files changed, 242 insertions(+), 97 deletions(-) create mode 100644 src/loadgenerator/setting.py 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) }