diff --git a/README.md b/README.md index 5d375fb..d59e7e5 100644 --- a/README.md +++ b/README.md @@ -272,6 +272,7 @@ resources. - [Day 3 – Keynote](https://youtu.be/JQPOPV_VH5w?t=815) showing Stackdriver APM (Tracing, Code Search, Profiler, Google Cloud Build) - [Introduction to Service Management with Istio](https://www.youtube.com/watch?v=wCJrdKdD6UM&feature=youtu.be&t=586) +- [KubeCon EU 2019 - Reinventing Networking: A Deep Dive into Istio's Multicluster Gateways - Steve Dake, Independent](https://youtu.be/-t2BfT59zJA?t=982) --- diff --git a/build.out b/build.out index c02c410..bab023b 100644 --- a/build.out +++ b/build.out @@ -1 +1 @@ -{"builds":[{"imageName":"gcr.io/lesser-weevil/emailservice","tag":"gcr.io/lesser-weevil/emailservice:v0.1.0-50-g60a1fc4@sha256:b5642298862ce0852e6038cf029ed75df6a08530c3ca9b86cd2ad4b50d5cff00"},{"imageName":"gcr.io/lesser-weevil/productcatalogservice","tag":"gcr.io/lesser-weevil/productcatalogservice:v0.1.0-50-g60a1fc4@sha256:74288be0207731ee0f846273da3486638777cf8d4077bddd45e0aeac75bb3559"},{"imageName":"gcr.io/lesser-weevil/recommendationservice","tag":"gcr.io/lesser-weevil/recommendationservice:v0.1.0-50-g60a1fc4-dirty@sha256:761fcf9065618d1edf9739c5a99e0b85e85a00ea79831d9cd14ceef281bfcb96"},{"imageName":"gcr.io/lesser-weevil/shippingservice","tag":"gcr.io/lesser-weevil/shippingservice:v0.1.0-50-g60a1fc4@sha256:6625a1e45b63c32585248a51d32b1b5137c16c7fb0f622ee9efbd08ef0cfed42"},{"imageName":"gcr.io/lesser-weevil/checkoutservice","tag":"gcr.io/lesser-weevil/checkoutservice:v0.1.0-50-g60a1fc4@sha256:cab8d517f524609837c7c70d357d7ba4aeb836dc417414d726079ed811928804"},{"imageName":"gcr.io/lesser-weevil/paymentservice","tag":"gcr.io/lesser-weevil/paymentservice:v0.1.0-50-g60a1fc4@sha256:1d65c32c95fbf5fe7348e8d4975bf15a305279f78264f342734afc3d1273a7cb"},{"imageName":"gcr.io/lesser-weevil/currencyservice","tag":"gcr.io/lesser-weevil/currencyservice:v0.1.0-50-g60a1fc4@sha256:dcbf4a09a2b7961ad00496c70ebb33b125d40b3a2c28e92dc18e44ad15ff9139"},{"imageName":"gcr.io/lesser-weevil/cartservice","tag":"gcr.io/lesser-weevil/cartservice:v0.1.0-50-g60a1fc4@sha256:2d6b7b6422669a0850f3743c734d300cbcf247fe850127ea99f695e831e32374"},{"imageName":"gcr.io/lesser-weevil/frontend","tag":"gcr.io/lesser-weevil/frontend:v0.1.0-50-g60a1fc4@sha256:119a11554f457f3a4df05672de4f51050f305fba67482b242543ec6fb4ed1f05"},{"imageName":"gcr.io/lesser-weevil/loadgenerator","tag":"gcr.io/lesser-weevil/loadgenerator:v0.1.0-50-g60a1fc4@sha256:de90c5ce3bef7e118183a82b6a5de5f994045727b66462c2bffd4f57749f40c1"},{"imageName":"gcr.io/lesser-weevil/adservice","tag":"gcr.io/lesser-weevil/adservice:v0.1.0-50-g60a1fc4@sha256:39a383bafca249864cd67a8eac66e67a19dc107b46566d7e16501c4f15ee0935"},{"imageName":"gcr.io/lesser-weevil/pingjob","tag":"gcr.io/lesser-weevil/pingjob:v0.1.0-50-g60a1fc4-dirty@sha256:708fc0f27f2c950c9f5a3478c1b7d4d32b82165f5b323acca9b53abba8409ca5"}]} \ No newline at end of file +{"builds":[{"imageName":"gcr.io/lesser-weevil/emailservice","tag":"gcr.io/lesser-weevil/emailservice:v0.1.0-53-g334f50b@sha256:b5642298862ce0852e6038cf029ed75df6a08530c3ca9b86cd2ad4b50d5cff00"},{"imageName":"gcr.io/lesser-weevil/productcatalogservice","tag":"gcr.io/lesser-weevil/productcatalogservice:v0.1.0-53-g334f50b@sha256:74288be0207731ee0f846273da3486638777cf8d4077bddd45e0aeac75bb3559"},{"imageName":"gcr.io/lesser-weevil/recommendationservice","tag":"gcr.io/lesser-weevil/recommendationservice:v0.1.0-53-g334f50b-dirty@sha256:761fcf9065618d1edf9739c5a99e0b85e85a00ea79831d9cd14ceef281bfcb96"},{"imageName":"gcr.io/lesser-weevil/shippingservice","tag":"gcr.io/lesser-weevil/shippingservice:v0.1.0-53-g334f50b@sha256:6625a1e45b63c32585248a51d32b1b5137c16c7fb0f622ee9efbd08ef0cfed42"},{"imageName":"gcr.io/lesser-weevil/checkoutservice","tag":"gcr.io/lesser-weevil/checkoutservice:v0.1.0-53-g334f50b@sha256:cab8d517f524609837c7c70d357d7ba4aeb836dc417414d726079ed811928804"},{"imageName":"gcr.io/lesser-weevil/paymentservice","tag":"gcr.io/lesser-weevil/paymentservice:v0.1.0-53-g334f50b@sha256:1d65c32c95fbf5fe7348e8d4975bf15a305279f78264f342734afc3d1273a7cb"},{"imageName":"gcr.io/lesser-weevil/currencyservice","tag":"gcr.io/lesser-weevil/currencyservice:v0.1.0-53-g334f50b@sha256:dcbf4a09a2b7961ad00496c70ebb33b125d40b3a2c28e92dc18e44ad15ff9139"},{"imageName":"gcr.io/lesser-weevil/cartservice","tag":"gcr.io/lesser-weevil/cartservice:v0.1.0-53-g334f50b@sha256:2d6b7b6422669a0850f3743c734d300cbcf247fe850127ea99f695e831e32374"},{"imageName":"gcr.io/lesser-weevil/frontend","tag":"gcr.io/lesser-weevil/frontend:v0.1.0-53-g334f50b@sha256:119a11554f457f3a4df05672de4f51050f305fba67482b242543ec6fb4ed1f05"},{"imageName":"gcr.io/lesser-weevil/loadgenerator","tag":"gcr.io/lesser-weevil/loadgenerator:v0.1.0-53-g334f50b@sha256:de90c5ce3bef7e118183a82b6a5de5f994045727b66462c2bffd4f57749f40c1"},{"imageName":"gcr.io/lesser-weevil/adservice","tag":"gcr.io/lesser-weevil/adservice:v0.1.0-53-g334f50b@sha256:39a383bafca249864cd67a8eac66e67a19dc107b46566d7e16501c4f15ee0935"},{"imageName":"gcr.io/lesser-weevil/pingjob","tag":"gcr.io/lesser-weevil/pingjob:v0.1.0-53-g334f50b-dirty@sha256:e55b195ae794a48ec045ee4652dc5feb40166c99edb58f78b7e4e59e572979af"}]} \ No newline at end of file diff --git a/release/istio-manifests.yaml b/release/istio-manifests.yaml index 284131d..57d669d 100644 --- a/release/istio-manifests.yaml +++ b/release/istio-manifests.yaml @@ -48,21 +48,6 @@ spec: number: 80 --- apiVersion: networking.istio.io/v1alpha3 -kind: ServiceEntry -metadata: - name: currency-provider-external -spec: - hosts: - - www.ecb.europa.eu - ports: - - number: 80 - name: http - protocol: HTTP - - number: 443 - name: https - protocol: HTTPS ---- -apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: frontend diff --git a/release/kubernetes-manifests.yaml b/release/kubernetes-manifests.yaml index 6fd20cd..737e5be 100644 --- a/release/kubernetes-manifests.yaml +++ b/release/kubernetes-manifests.yaml @@ -32,9 +32,12 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/emailservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/emailservice:v0.1.1 ports: - containerPort: 8080 + env: + - name: PORT + value: "8080" readinessProbe: periodSeconds: 5 exec: @@ -43,6 +46,9 @@ spec: periodSeconds: 5 exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] + env: + - name: ENABLE_PROFILER + value: "0" resources: requests: cpu: 100m @@ -79,7 +85,7 @@ spec: spec: containers: - name: server - image: gcr.io/google-samples/microservices-demo/checkoutservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/checkoutservice:v0.1.1 ports: - containerPort: 5050 readinessProbe: @@ -89,6 +95,8 @@ spec: exec: command: ["/bin/grpc_health_probe", "-addr=:5050"] env: + - name: PORT + value: "5050" - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" - name: SHIPPING_SERVICE_ADDR @@ -140,7 +148,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/recommendationservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/recommendationservice:v0.1.1 ports: - containerPort: 8080 readinessProbe: @@ -152,8 +160,12 @@ spec: exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] env: + - name: PORT + value: "8080" - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" + - name: ENABLE_PROFILER + value: "0" resources: requests: cpu: 100m @@ -190,7 +202,7 @@ spec: spec: containers: - name: server - image: gcr.io/google-samples/microservices-demo/frontend:v0.1.0 + image: gcr.io/google-samples/microservices-demo/frontend:v0.1.1 ports: - containerPort: 8080 readinessProbe: @@ -210,6 +222,8 @@ spec: - name: "Cookie" value: "shop_session-id=x-liveness-probe" env: + - name: PORT + value: "8080" - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" - name: CURRENCY_SERVICE_ADDR @@ -276,9 +290,12 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/paymentservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/paymentservice:v0.1.1 ports: - containerPort: 50051 + env: + - name: PORT + value: "50051" readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:50051"] @@ -322,9 +339,12 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.1.1 ports: - containerPort: 3550 + env: + - name: PORT + value: "3550" readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:3550"] @@ -371,7 +391,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/cartservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/cartservice:v0.1.1 ports: - containerPort: 7070 env: @@ -440,7 +460,7 @@ spec: value: "frontend:80" containers: - name: main - image: gcr.io/google-samples/microservices-demo/loadgenerator:v0.1.0 + image: gcr.io/google-samples/microservices-demo/loadgenerator:v0.1.1 env: - name: FRONTEND_ADDR value: "frontend:80" @@ -470,10 +490,13 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/currencyservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/currencyservice:v0.1.1 ports: - name: grpc containerPort: 7000 + env: + - name: PORT + value: "7000" readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:7000"] @@ -516,9 +539,12 @@ spec: spec: containers: - name: server - image: gcr.io/google-samples/microservices-demo/shippingservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/shippingservice:v0.1.1 ports: - containerPort: 50051 + env: + - name: PORT + value: "50051" readinessProbe: periodSeconds: 5 exec: @@ -619,7 +645,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/adservice:v0.1.0 + image: gcr.io/google-samples/microservices-demo/adservice:v0.1.1 ports: - containerPort: 9555 env: diff --git a/src/adservice/src/main/java/hipstershop/AdService.java b/src/adservice/src/main/java/hipstershop/AdService.java index 3c63c98..4817e1b 100644 --- a/src/adservice/src/main/java/hipstershop/AdService.java +++ b/src/adservice/src/main/java/hipstershop/AdService.java @@ -214,7 +214,7 @@ public final class AdService { } private static void initStackdriver() { - logger.info("Initialize StackDriver"); + logger.info("Initialize Stackdriver"); long sleepTime = 10; /* seconds */ int maxAttempts = 5; @@ -252,7 +252,7 @@ public final class AdService { } } } - logger.info("StackDriver initialization complete."); + logger.info("Stackdriver initialization complete."); } private static void initJaeger() { diff --git a/src/checkoutservice/main.go b/src/checkoutservice/main.go index fdf1c83..42a6783 100644 --- a/src/checkoutservice/main.go +++ b/src/checkoutservice/main.go @@ -131,7 +131,7 @@ func initStats(exporter *stackdriver.Exporter) { } } -func initStackDriverTracing() { +func initStackdriverTracing() { // TODO(ahmetb) this method is duplicated in other microservices using Go // since they are not sharing packages. for i := 1; i <= 3; i++ { @@ -140,22 +140,22 @@ func initStackDriverTracing() { log.Infof("failed to initialize stackdriver exporter: %+v", err) } else { trace.RegisterExporter(exporter) - log.Info("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.Infof("sleeping %v to retry initializing stackdriver exporter", d) + log.Infof("sleeping %v to retry initializing Stackdriver exporter", d) time.Sleep(d) } - log.Warn("could not initialize stackdriver exporter after retrying, giving up") + log.Warn("could not initialize Stackdriver exporter after retrying, giving up") } func initTracing() { initJaegerTracing() - initStackDriverTracing() + initStackdriverTracing() } func initProfiling(service, version string) { @@ -170,14 +170,14 @@ func initProfiling(service, version string) { }); err != nil { log.Warnf("failed to start profiler: %+v", err) } else { - log.Info("started stackdriver profiler") + log.Info("started Stackdriver profiler") return } d := time.Second * 10 * time.Duration(i) - log.Infof("sleeping %v to retry initializing stackdriver profiler", d) + log.Infof("sleeping %v to retry initializing Stackdriver profiler", d) time.Sleep(d) } - log.Warn("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) { diff --git a/src/currencyservice/client.js b/src/currencyservice/client.js index f381dc8..d23aa30 100644 --- a/src/currencyservice/client.js +++ b/src/currencyservice/client.js @@ -46,7 +46,7 @@ const request = { }; function _moneyToString (m) { - return `${m.units}.${leftPad(m.nanos, 9, '0')} ${m.currency_code}`; + return `${m.units}.${m.nanos.toString().padStart(9, '0')} ${m.currency_code}`; } client.getSupportedCurrencies({}, (err, response) => { diff --git a/src/currencyservice/package.json b/src/currencyservice/package.json index 7a21752..3f45984 100644 --- a/src/currencyservice/package.json +++ b/src/currencyservice/package.json @@ -16,7 +16,6 @@ "async": "^1.5.2", "google-protobuf": "^3.0.0", "grpc": "^1.0.0", - "left-pad": "^1.3.0", "pino": "^5.6.2", "request": "^2.87.0", "xml2js": "^0.4.19" diff --git a/src/frontend/main.go b/src/frontend/main.go index a6bccda..5ba9577 100644 --- a/src/frontend/main.go +++ b/src/frontend/main.go @@ -191,20 +191,20 @@ func initStackdriverTracing(log logrus.FieldLogger) { // log.Warnf is used since there are multiple backends (stackdriver & jaeger) // to store the traces. In production setup most likely you would use only one backend. // In that case you should use log.Fatalf. - log.Warnf("failed to initialize stackdriver exporter: %+v", err) + log.Warnf("failed to initialize Stackdriver exporter: %+v", err) } else { trace.RegisterExporter(exporter) - log.Info("registered stackdriver tracing") + log.Info("registered Stackdriver tracing") // Register the views to collect server stats. initStats(log, exporter) return } d := time.Second * 20 * time.Duration(i) - log.Debugf("sleeping %v to retry initializing stackdriver exporter", d) + log.Debugf("sleeping %v to retry initializing Stackdriver exporter", d) time.Sleep(d) } - log.Warn("could not initialize stackdriver exporter after retrying, giving up") + log.Warn("could not initialize Stackdriver exporter after retrying, giving up") } func initTracing(log logrus.FieldLogger) { @@ -232,14 +232,14 @@ func initProfiling(log logrus.FieldLogger, service, version string) { }); err != nil { log.Warnf("warn: failed to start profiler: %+v", err) } else { - log.Info("started stackdriver profiler") + log.Info("started Stackdriver profiler") return } d := time.Second * 10 * time.Duration(i) - log.Debugf("sleeping %v to retry initializing stackdriver profiler", d) + log.Debugf("sleeping %v to retry initializing Stackdriver profiler", d) time.Sleep(d) } - log.Warn("warning: could not initialize stackdriver profiler after retrying, giving up") + log.Warn("warning: could not initialize Stackdriver profiler after retrying, giving up") } func mustMapEnv(target *string, envKey string) { diff --git a/src/productcatalogservice/server.go b/src/productcatalogservice/server.go index 60b0f3a..c76eafc 100644 --- a/src/productcatalogservice/server.go +++ b/src/productcatalogservice/server.go @@ -158,32 +158,32 @@ func initStats(exporter *stackdriver.Exporter) { } } -func initStackDriverTracing() { +func initStackdriverTracing() { // TODO(ahmetb) this method is duplicated in other microservices using Go // since they are not sharing packages. for i := 1; i <= 3; i++ { exporter, err := stackdriver.NewExporter(stackdriver.Options{}) if err != nil { - log.Warnf("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.Info("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.Infof("sleeping %v to retry initializing stackdriver exporter", d) + log.Infof("sleeping %v to retry initializing Stackdriver exporter", d) time.Sleep(d) } - log.Warn("could not initialize stackdriver exporter after retrying, giving up") + log.Warn("could not initialize Stackdriver exporter after retrying, giving up") } func initTracing() { initJaegerTracing() - initStackDriverTracing() + initStackdriverTracing() } func initProfiling(service, version string) { @@ -198,14 +198,14 @@ func initProfiling(service, version string) { }); err != nil { log.Warnf("failed to start profiler: %+v", err) } else { - log.Info("started stackdriver profiler") + log.Info("started Stackdriver profiler") return } d := time.Second * 10 * time.Duration(i) - log.Infof("sleeping %v to retry initializing stackdriver profiler", d) + log.Infof("sleeping %v to retry initializing Stackdriver profiler", d) time.Sleep(d) } - log.Warn("could not initialize stackdriver profiler after retrying, giving up") + log.Warn("could not initialize Stackdriver profiler after retrying, giving up") } type productCatalog struct{} diff --git a/src/shippingservice/main.go b/src/shippingservice/main.go index 6360cd8..a203318 100644 --- a/src/shippingservice/main.go +++ b/src/shippingservice/main.go @@ -161,32 +161,32 @@ func initStats(exporter *stackdriver.Exporter) { } } -func initStackDriverTracing() { +func initStackdriverTracing() { // TODO(ahmetb) this method is duplicated in other microservices using Go // since they are not sharing packages. for i := 1; i <= 3; i++ { exporter, err := stackdriver.NewExporter(stackdriver.Options{}) if err != nil { - log.Warnf("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.Info("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.Infof("sleeping %v to retry initializing stackdriver exporter", d) + log.Infof("sleeping %v to retry initializing Stackdriver exporter", d) time.Sleep(d) } - log.Warn("could not initialize stackdriver exporter after retrying, giving up") + log.Warn("could not initialize Stackdriver exporter after retrying, giving up") } func initTracing() { initJaegerTracing() - initStackDriverTracing() + initStackdriverTracing() } func initProfiling(service, version string) { @@ -201,12 +201,12 @@ func initProfiling(service, version string) { }); err != nil { log.Warnf("failed to start profiler: %+v", err) } else { - log.Info("started stackdriver profiler") + log.Info("started Stackdriver profiler") return } d := time.Second * 10 * time.Duration(i) - log.Infof("sleeping %v to retry initializing stackdriver profiler", d) + log.Infof("sleeping %v to retry initializing Stackdriver profiler", d) time.Sleep(d) } - log.Warn("could not initialize stackdriver profiler after retrying, giving up") + log.Warn("could not initialize Stackdriver profiler after retrying, giving up") }