From 202f98701441e63aa088eee79fa3515aa64a4c68 Mon Sep 17 00:00:00 2001 From: Rahul Jagad Date: Thu, 20 Aug 2020 17:51:39 -0700 Subject: [PATCH 1/4] Integrate datadog APM integration for the online boutique app for relyance demo. --- apm/datadog/README.md | 30 ++ apm/datadog/datadog-agent-logs-apm.yaml | 283 ++++++++++++++++++ kubernetes-manifests/checkoutservice.yaml | 30 +- kubernetes-manifests/emailservice.yaml | 4 + kubernetes-manifests/frontend.yaml | 20 +- .../productcatalogservice.yaml | 24 +- .../recommendationservice.yaml | 16 +- kubernetes-manifests/redis.yaml | 11 + kubernetes-manifests/shippingservice.yaml | 24 +- src/checkoutservice/Gopkg.lock | 260 ++++++++++++---- src/checkoutservice/Gopkg.toml | 3 +- src/checkoutservice/main.go | 23 +- src/emailservice/Dockerfile | 8 +- src/emailservice/requirements.in | 1 + src/emailservice/requirements.txt | 13 +- src/frontend/Gopkg.lock | 266 ++++++++++++---- src/frontend/main.go | 36 ++- src/loadgenerator/Dockerfile | 2 +- src/productcatalogservice/Gopkg.lock | 251 ++++++++++++---- src/productcatalogservice/server.go | 18 +- src/recommendationservice/Dockerfile | 5 +- src/recommendationservice/requirements.in | 3 +- src/recommendationservice/requirements.txt | 1 + src/shippingservice/Gopkg.lock | 272 +++++++++++++---- src/shippingservice/main.go | 25 +- 25 files changed, 1346 insertions(+), 283 deletions(-) create mode 100644 apm/datadog/README.md create mode 100644 apm/datadog/datadog-agent-logs-apm.yaml diff --git a/apm/datadog/README.md b/apm/datadog/README.md new file mode 100644 index 0000000..1db70f5 --- /dev/null +++ b/apm/datadog/README.md @@ -0,0 +1,30 @@ +## Steps to setup Online Boutique App with Datadog monitoring + +### Steps to install the boutique app on local machine with Kubernetes enabled on docker-desktop + + 1. Clone the source code for the online boutique app + $ git clone git@github.com:Relyance/microservices-demo.git + + 2. Once the source code is cloned, enter the folder containing the source code + $ cd microservices-demo/release + + 3. Run the kubernetes apply command to run the online boutique app + $ kubectl apply -f kubernetes-manifests.yaml + (Note: Wait for 10 minutes for the whole app to be downloaded and up and running + + 4. Do the port-forwarding to run the application from the browser + $ kubectl port-forward service/frontend 8080:80 + + +### Steps to setup Datadog agent for monitoring Online Boutique App (deployed as Kubernetes) [Explained above] + + 1. Configure agent permissions + $ kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/clusterrole.yaml" + $ kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/serviceaccount.yaml" + $ kubectl apply -f "https://raw.githubusercontent.com/DataDog/datadog-agent/master/Dockerfiles/manifests/rbac/clusterrolebinding.yaml" + + 2. Create a secret that contains your Datadog API Key + $ kubectl create secret generic datadog-agent --from-literal api-key="77ed0972ca94340f9db3fb78ee5e89cc" --namespace="default" + + 1. Enable the datadog agent manifest file + $ kubectl apply -f datadog-agent-logs-apm.yaml diff --git a/apm/datadog/datadog-agent-logs-apm.yaml b/apm/datadog/datadog-agent-logs-apm.yaml new file mode 100644 index 0000000..4b096d4 --- /dev/null +++ b/apm/datadog/datadog-agent-logs-apm.yaml @@ -0,0 +1,283 @@ +# Source: datadog/templates/secrets.yaml +# api-key: YzMyZGZiN2FhZTAzYTUxMTczN2NlNDQ3NDdmMTEwNTIK # key for rahul.jagad@relyance.ai account +# API Key +apiVersion: v1 +kind: Secret +metadata: + name: datadog-agent + labels: {} +type: Opaque +data: + api-key: NzdlZDA5NzJjYTk0MzQwZjlkYjNmYjc4ZWU1ZTg5Y2MK +--- +# Source: datadog/templates/daemonset.yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: datadog-agent + labels: {} +spec: + selector: + matchLabels: + app: datadog-agent + template: + metadata: + labels: + app: datadog-agent + name: datadog-agent + annotations: {} + spec: + containers: + - name: agent + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["agent", "run"] + resources: {} + ports: + - containerPort: 8125 + name: dogstatsdport + protocol: UDP + env: + - name: DD_CRI_SOCKET_PATH + value: "unix:///host/var/run/docker.sock" + - name: DD_KUBELET_TLS_VERIFY + value: "false" + # To pick the docker logs directly and submit it to the datadog server. + - name: DOCKER_HOST + value: "unix:///host/var/run/docker.sock" + #TODO : API key needs to be used from the "secrets" container above, but + # somehow its not working currently and so putting the secret directly here. + # The problem that i am facing is the "secrets" against is somehow adding the newline + # character to the key making the key invalid and hence not working. + - name: DD_API_KEY + value: "77ed0972ca94340f9db3fb78ee5e89cc" + # valueFrom: + # secretKeyRef: + # name: "datadog-agent" + # key: api-key + - name: DD_KUBERNETES_KUBELET_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: KUBERNETES + value: "yes" + - name: DD_CONTAINER_EXCLUDE + value: "image:datadog/agent" + - name: DD_AC_EXCLUDE + value: "name:datadog-agent" + - name: DD_LOG_LEVEL + value: "INFO" + - name: DD_DOGSTATSD_PORT + value: "8125" + - name: DD_LEADER_ELECTION + value: "true" + - name: DD_COLLECT_KUBERNETES_EVENTS + value: "true" + - name: DD_APM_ENABLED + value: "true" + - name: DD_LOGS_ENABLED + value: "true" + - name: DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL + value: "true" + - name: DD_LOGS_CONFIG_K8S_CONTAINER_USE_FILE + value: "true" + - name: DD_HEALTH_PORT + value: "5555" + volumeMounts: + - name: config + mountPath: /etc/datadog-agent + - name: runtimesocketdir + mountPath: /host/var/run + readOnly: true + - name: procdir + mountPath: /host/proc + readOnly: true + - name: cgroups + mountPath: /host/sys/fs/cgroup + readOnly: true + - name: pointerdir + mountPath: /opt/datadog-agent/run + - name: logpodpath + mountPath: /var/log/pods + readOnly: true + - name: logdockercontainerpath + mountPath: /var/lib/docker/containers + readOnly: true + # - name: dockersocketdir + # mountPath: /host/var/run + livenessProbe: + failureThreshold: 6 + httpGet: + path: /live + port: 5555 + initialDelaySeconds: 15 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 5 + readinessProbe: + failureThreshold: 6 + httpGet: + path: /ready + port: 5555 + initialDelaySeconds: 15 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 5 + - name: trace-agent + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["trace-agent", "-config=/etc/datadog-agent/datadog.yaml"] + resources: {} + ports: + - containerPort: 8126 + hostPort: 8126 + name: traceport + protocol: TCP + env: + #TODO : API key needs to be used from the "secrets" container above, but + # somehow its not working currently and so putting the secret directly here. + # The problem that i am facing is the "secrets" against is somehow adding the newline + # character to the key making the key invalid and hence not working. + - name: DD_API_KEY + value: "77ed0972ca94340f9db3fb78ee5e89cc" + # valueFrom: + # secretKeyRef: + # name: "datadog-agent" + # key: api-key + - name: DD_KUBERNETES_KUBELET_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: KUBERNETES + value: "yes" + - name: DD_CONTAINER_EXCLUDE + value: "image:datadog/agent" + - name: DOCKER_HOST + value: "unix:///host/var/run/docker.sock" + - name: DD_LOG_LEVEL + value: "debug" + - name: DD_APM_ENABLED + value: "true" + - name: DD_APM_NON_LOCAL_TRAFFIC + value: "true" + - name: DD_APM_RECEIVER_PORT + value: "8126" + volumeMounts: + - name: config + mountPath: /etc/datadog-agent + - name: runtimesocketdir + mountPath: /host/var/run + readOnly: true + livenessProbe: + initialDelaySeconds: 15 + periodSeconds: 15 + tcpSocket: + port: 8126 + timeoutSeconds: 5 + initContainers: + - name: init-volume + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["bash", "-c"] + args: + - cp -r /etc/datadog-agent /opt + volumeMounts: + - name: config + mountPath: /opt/datadog-agent + resources: {} + - name: init-config + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["bash", "-c"] + args: + - for script in $(find /etc/cont-init.d/ -type f -name '*.sh' | sort) ; do bash $script ; done + volumeMounts: + - name: config + mountPath: /etc/datadog-agent + - name: procdir + mountPath: /host/proc + readOnly: true + - name: runtimesocketdir + mountPath: /host/var/run + readOnly: true + env: + #TODO : API key needs to be used from the "secrets" container above, but + # somehow its not working currently and so putting the secret directly here. + # The problem that i am facing is the "secrets" against is somehow adding the newline + # character to the key making the key invalid and hence not working. + - name: DD_API_KEY + value: "77ed0972ca94340f9db3fb78ee5e89cc" + - name: DD_KUBERNETES_KUBELET_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: KUBERNETES + value: "yes" + - name: DD_AC_EXCLUDE + value: "name:datadog-agent" + - name: DOCKER_HOST + value: "unix:///host/var/run/docker.sock" + - name: DD_LEADER_ELECTION + value: "true" + resources: {} + volumes: + - name: config + emptyDir: {} + - hostPath: + path: /var/run + name: runtimesocketdir + - hostPath: + path: /proc + name: procdir + - hostPath: + path: /sys/fs/cgroup + name: cgroups + - name: s6-run + emptyDir: {} + - hostPath: + path: "/var/lib/datadog-agent/logs" + name: pointerdir + - hostPath: + path: /var/log/pods + name: logpodpath + - hostPath: + path: /var/lib/docker/containers + name: logdockercontainerpath + - hostPath: + path: /var/run + name: dockersocketdir + tolerations: + affinity: {} + serviceAccountName: "datadog-agent" + nodeSelector: + kubernetes.io/os: linux + updateStrategy: + rollingUpdate: + maxUnavailable: 10% + type: RollingUpdate + +# Service +# We probably dont need to expose the datadog agent as the service, +# since the way the "DD_AGENT_HOST" environment variable can be exposed +# inside the application is by setting status.hostIP value. +--- +apiVersion: v1 +kind: Service +metadata: + name: datadog-agent +spec: + selector: + app: datadog-agent + ports: + - name: agent + protocol: TCP + port: 8125 + targetPort: 8125 + - name: trace-agent + protocol: TCP + port: 8126 + targetPort: 8126 + +# Source: datadog/templates/containers-common-env.yaml +# The purpose of this template is to define a minimal set of environment +# variables required to operate dedicated containers in the daemonset diff --git a/kubernetes-manifests/checkoutservice.yaml b/kubernetes-manifests/checkoutservice.yaml index 3e244c4..25b6f60 100644 --- a/kubernetes-manifests/checkoutservice.yaml +++ b/kubernetes-manifests/checkoutservice.yaml @@ -51,14 +51,28 @@ spec: value: "currencyservice:7000" - name: CART_SERVICE_ADDR value: "cartservice:7070" - # - name: DISABLE_STATS - # value: "1" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" - # - name: JAEGER_SERVICE_ADDR - # value: "jaeger-collector:14268" + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + # Enable datadog tracing + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "checkoutservice" + - name: DD_LOG_LEVEL + value: "debug" + # Disable default opentracing ? + - name: DISABLE_STATS + value: "1" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" + # - name: JAEGER_SERVICE_ADDR + # value: "jaeger-collector:14268" resources: requests: cpu: 100m diff --git a/kubernetes-manifests/emailservice.yaml b/kubernetes-manifests/emailservice.yaml index bc7e6b9..5569009 100644 --- a/kubernetes-manifests/emailservice.yaml +++ b/kubernetes-manifests/emailservice.yaml @@ -32,6 +32,10 @@ spec: ports: - containerPort: 8080 env: + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP - name: PORT value: "8080" # - name: DISABLE_TRACING diff --git a/kubernetes-manifests/frontend.yaml b/kubernetes-manifests/frontend.yaml index faf461d..2ef974b 100644 --- a/kubernetes-manifests/frontend.yaml +++ b/kubernetes-manifests/frontend.yaml @@ -67,10 +67,22 @@ spec: value: "adservice:9555" - name: ENV_PLATFORM value: "gcp" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "frontend" + - name: DD_LOG_LEVEL + value: "debug" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" # - name: JAEGER_SERVICE_ADDR # value: "jaeger-collector:14268" resources: diff --git a/kubernetes-manifests/productcatalogservice.yaml b/kubernetes-manifests/productcatalogservice.yaml index 6949be0..69ec164 100644 --- a/kubernetes-manifests/productcatalogservice.yaml +++ b/kubernetes-manifests/productcatalogservice.yaml @@ -34,12 +34,24 @@ spec: env: - name: PORT value: "3550" - # - name: DISABLE_STATS - # value: "1" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "productcatalogservice" + - name: DD_LOG_LEVEL + value: "debug" + - name: DISABLE_STATS + value: "1" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" # - name: JAEGER_SERVICE_ADDR # value: "jaeger-collector:14268" readinessProbe: diff --git a/kubernetes-manifests/recommendationservice.yaml b/kubernetes-manifests/recommendationservice.yaml index 0e75f9f..7e71d80 100644 --- a/kubernetes-manifests/recommendationservice.yaml +++ b/kubernetes-manifests/recommendationservice.yaml @@ -40,16 +40,20 @@ spec: exec: command: ["/bin/grpc_health_probe", "-addr=:8080"] env: + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP - name: PORT value: "8080" - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" - # - name: DISABLE_DEBUGGER - # value: "1" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" + - name: DISABLE_DEBUGGER + value: "1" resources: requests: cpu: 100m diff --git a/kubernetes-manifests/redis.yaml b/kubernetes-manifests/redis.yaml index b67649b..e18b08b 100644 --- a/kubernetes-manifests/redis.yaml +++ b/kubernetes-manifests/redis.yaml @@ -16,6 +16,8 @@ apiVersion: apps/v1 kind: Deployment metadata: name: redis-cart + annotations: + ad.datadoghq.com/redis.logs: '[{"source": "redis", "service": "redis-cart"}]' spec: selector: matchLabels: @@ -28,6 +30,15 @@ spec: containers: - name: redis image: redis:alpine + env: + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DD_ENV + value: prod + - name: DD_SERVICE + value: redis-cart ports: - containerPort: 6379 readinessProbe: diff --git a/kubernetes-manifests/shippingservice.yaml b/kubernetes-manifests/shippingservice.yaml index e3027a1..aaa4dbf 100644 --- a/kubernetes-manifests/shippingservice.yaml +++ b/kubernetes-manifests/shippingservice.yaml @@ -33,12 +33,24 @@ spec: env: - name: PORT value: "50051" - # - name: DISABLE_STATS - # value: "1" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "shippingservice" + - name: DD_LOG_LEVEL + value: "debug" + - name: DISABLE_STATS + value: "1" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" # - name: JAEGER_SERVICE_ADDR # value: "jaeger-collector:14268" readinessProbe: diff --git a/src/checkoutservice/Gopkg.lock b/src/checkoutservice/Gopkg.lock index 0c0323e..1472431 100644 --- a/src/checkoutservice/Gopkg.lock +++ b/src/checkoutservice/Gopkg.lock @@ -9,19 +9,19 @@ "internal/version", "monitoring/apiv3", "profiler", - "trace/apiv2" + "trace/apiv2", ] pruneopts = "UT" revision = "457ea5c15ccf3b87db582c450e80101989da35f7" version = "v0.40.0" [[projects]] - digest = "1:bcd1b2dd631e720b6129e801bf0766c50fb4d39455c0a255047e8fc71c31152f" + digest = "1:5baabd5f5d47219f2bbcd130b61376e1b2e641e0826157b017dab3f88f018827" name = "contrib.go.opencensus.io/exporter/jaeger" packages = ["."] pruneopts = "UT" - revision = "540daef1da72376e9b3e1d52e4f90403d72f5c00" - version = "v0.2.0" + revision = "30c8b0fe8ad9d0eac5785893f3941b2e72c5aaaa" + version = "v0.2.1" [[projects]] digest = "1:4b96dcd8534bc6450a922bd16a76360ba3381f0d1daf40abbaec91c053fbfeb5" @@ -32,9 +32,29 @@ version = "v0.5.0" [[projects]] - digest = "1:1d3ad0f6a57c08e2168089a64c34313930571fcbe5359d71c608a97ce504f7ca" + digest = "1:4f726c47cabd8cf517114ff99d0bc16d23ae4e1cfe50c94986c57d90fc66a941" + name = "github.com/DataDog/datadog-go" + packages = ["statsd"] + pruneopts = "UT" + revision = "b5f99e5a502785e43356d1f710e8ae1ee948503b" + version = "v4.0.0" + +[[projects]] + digest = "1:4287343c81d259e828b2e3b579270139a498a2168fbab81d89c3b9926b4ec740" + name = "github.com/GoogleCloudPlatform/microservices-demo" + packages = [ + "src/checkoutservice/genproto", + "src/checkoutservice/money", + ] + pruneopts = "UT" + revision = "c2095a7d4b8abd538251b705325d6a493a23e009" + version = "v0.2.0" + +[[projects]] + digest = "1:9d2705f9d2e7da697c24b2ab104567b155107b2aad26ca615973c0a8f02f757a" name = "github.com/golang/protobuf" packages = [ + "jsonpb", "proto", "protoc-gen-go/descriptor", "ptypes", @@ -43,19 +63,33 @@ "ptypes/empty", "ptypes/struct", "ptypes/timestamp", - "ptypes/wrappers" + "ptypes/wrappers", ] pruneopts = "UT" - revision = "b5d812f8a3706043e23a9cd5babf2e5423744d30" - version = "v1.3.1" + revision = "d04d7b157bb510b1e0c10132224b616ac0e26b17" + version = "v1.4.2" + +[[projects]] + digest = "1:85af59d73a44bd58f524cf05dee34a5021afe1fa4a852079b535c38ae2d1a2e8" + name = "github.com/google/go-cmp" + packages = [ + "cmp", + "cmp/internal/diff", + "cmp/internal/flags", + "cmp/internal/function", + "cmp/internal/value", + ] + pruneopts = "UT" + revision = "9680bfaf28748393e28e00238d94070fb9972fd8" + version = "v0.5.1" [[projects]] branch = "master" - digest = "1:dcb1edb161b1b1cac9aedf2a17b9b2c7829e242624968875a3c1b97dd9f4ef00" + digest = "1:7f49181edc3aa34ec3145a0050ce4af901a9c3238774f362784ce39227bc1f3a" name = "github.com/google/pprof" packages = ["profile"] pruneopts = "UT" - revision = "54271f7e092ff31b10b7626fee166cbc6304e350" + revision = "1a94d8640e99342fa76ae6296aaa921d08ac451f" [[projects]] digest = "1:582b704bebaa06b48c29b0cec224a6058a09c86883aaddabde889cd1a5f73e1b" @@ -74,33 +108,49 @@ version = "v2.0.5" [[projects]] - digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" + digest = "1:09cb61dc19af93deae01587e2fdb1c081e0bf48f1a5ad5fa24f48750dc57dce8" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] pruneopts = "UT" - revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" - version = "v1.0.2" + revision = "edb144dfd453055e1e49a3d8b410a660b5a87613" + version = "v1.0.3" [[projects]] - digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + digest = "1:5e73b34a27d827212102605789de00bd411b2e434812133c83935fe9897c75e1" + name = "github.com/philhofer/fwd" + packages = ["."] + pruneopts = "UT" + revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136" + version = "v1.0.0" + +[[projects]] + digest = "1:05eebdd5727fea23083fce0d98d307d70c86baed644178e81608aaa9f09ea469" name = "github.com/sirupsen/logrus" packages = ["."] pruneopts = "UT" - revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" - version = "v1.4.2" + revision = "60c74ad9be0d874af0ab0daef6ab07c5c5911f0d" + version = "v1.6.0" [[projects]] - digest = "1:be83cecd5ba066751e3f789c1faecf5a3229031c7986eb486f593a6e32446ac0" + digest = "1:6636bfca29dde8561c03e98ccddbe36240f13a01ac770d7ea07f4fd019ed6e65" + name = "github.com/tinylib/msgp" + packages = ["msgp"] + pruneopts = "UT" + revision = "4253cdaa5267687e3b7612da7ff105d4414174da" + version = "v1.1.2" + +[[projects]] + digest = "1:a6175cb931f5b9da33e92f6057e0de28badbe6dfdc32f4bf378ffd9a2c461d03" name = "github.com/uber/jaeger-client-go" packages = [ "thrift", "thrift-gen/agent", "thrift-gen/jaeger", - "thrift-gen/zipkincore" + "thrift-gen/zipkincore", ] pruneopts = "UT" - revision = "f2e1f58485aacf2975cdde9c9f5396e6d98c35ba" - version = "v2.21.1" + revision = "121ee6fb26fd9617fc30d0d95569a39c30ca3b76" + version = "v2.25.0" [[projects]] digest = "1:1bb914cfb78f68f488a91cd7872d3d06a5f83c5bbacf0296dbef44e120b00a91" @@ -119,7 +169,7 @@ "trace", "trace/internal", "trace/propagation", - "trace/tracestate" + "trace/tracestate", ] pruneopts = "UT" revision = "b11f239c032624b045c4c2bfd3d1287b4012ce89" @@ -127,7 +177,7 @@ [[projects]] branch = "master" - digest = "1:2f357867bf425774d35beca5be718402a4488b8b23b1563ce8c5bb91d09285a7" + digest = "1:6a803f0f3ecbe7e804185a165b3e36eeb0a62f806e7fbe61e842966127991a64" name = "golang.org/x/net" packages = [ "context", @@ -137,43 +187,48 @@ "http2/hpack", "idna", "internal/timeseries", - "trace" + "trace", ] pruneopts = "UT" - revision = "da137c7871d730100384dbcf36e6f8fa493aef5b" + revision = "c89045814202410a2d67ec20ecf177ec77ceae7f" [[projects]] branch = "master" - digest = "1:31e33f76456ccf54819ab4a646cf01271d1a99d7712ab84bf1a9e7b61cd2031b" + digest = "1:79edde3241bb55de9f4143d5083bfcff722e550c3cb8db94084eab50d0e440b5" name = "golang.org/x/oauth2" packages = [ ".", "google", "internal", "jws", - "jwt" + "jwt", ] pruneopts = "UT" - revision = "0f29369cfe4552d0e4bcddc57cc75f4d7e672a33" + revision = "bf48bf16ab8d622ce64ec6ce98d2c98f916b6303" [[projects]] branch = "master" - digest = "1:382bb5a7fb4034db3b6a2d19e5a4a6bcf52f4750530603c01ca18a172fa3089b" + digest = "1:4692f916cb72b2c295f04841036d85a3f13e96d1cc9e8e4c2c30edebac518053" name = "golang.org/x/sync" packages = ["semaphore"] pruneopts = "UT" - revision = "112230192c580c3556b8cee6403af37a4fc5f28c" + revision = "6e8e738ad208923de99951fe0b48239bfd864f28" [[projects]] branch = "master" - digest = "1:730ba27cd66db3b98ec8f51a6f20d45ec277d490cca36b1f54e31d3fcaf4840e" + digest = "1:288524d218ffbd2adb8cf423f2afb863ccce0a000446a2b0d467931d1e517ba0" name = "golang.org/x/sys" - packages = ["unix"] + packages = [ + "internal/unsafeheader", + "unix", + "windows", + "windows/registry", + ] pruneopts = "UT" - revision = "04f50cda93cbb67f2afa353c52f342100e80e625" + revision = "c12d262b63d83031f2db2f528267f9a4f58e2775" [[projects]] - digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405" + digest = "1:fa940333c48808b0d86ef21f412ffcfd0e5084a82f13905c028a404803b1908f" name = "golang.org/x/text" packages = [ "collate", @@ -191,15 +246,34 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] pruneopts = "UT" - revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" - version = "v0.3.2" + revision = "23ae387dee1f90d29a23c0e87ee0b46038fbed0e" + version = "v0.3.3" [[projects]] branch = "master" - digest = "1:bc06b12d8436550fccc0212037e9281a7e4d53db25c2349eb3cc6c3457e0406b" + digest = "1:9a12483c63e8328a477280cd6855689af0f584eb580b66c0d113a1f5fe7791b0" + name = "golang.org/x/time" + packages = ["rate"] + pruneopts = "UT" + revision = "3af7569d3a1e776fc2a3c1cec133b43105ea9c2e" + +[[projects]] + branch = "master" + digest = "1:918a46e4a2fb83df33f668f5a6bd51b2996775d073fce1800d3ec01b0a5ddd2b" + name = "golang.org/x/xerrors" + packages = [ + ".", + "internal", + ] + pruneopts = "UT" + revision = "5ec99f83aff198f5fbd629d6c8d8eb38a04218ca" + +[[projects]] + branch = "master" + digest = "1:49329e5d3d686037e3255b4d555f3751d275771cb3e60f6fe6cfa47abf90110f" name = "google.golang.org/api" packages = [ "googleapi/transport", @@ -208,15 +282,16 @@ "option", "support/bundler", "transport", + "transport/cert", "transport/grpc", "transport/http", - "transport/http/internal/propagation" + "transport/http/internal/propagation", ] pruneopts = "UT" - revision = "aae1d1b89c27132abe4fa22731a2a61e7089079c" + revision = "b77a6912936dced70abf0869ccb1d02d802567de" [[projects]] - digest = "1:2c26b1c47556c0e5e73cdb05d8361c463737eee4baac35d38b40c728c3074a94" + digest = "1:9a3c550c85a5a62ccc4cadd8525497b99554094a1adecc560c97bebc231ca81b" name = "google.golang.org/appengine" packages = [ ".", @@ -230,15 +305,15 @@ "internal/socket", "internal/urlfetch", "socket", - "urlfetch" + "urlfetch", ] pruneopts = "UT" - revision = "b2f4a3cf3c67576a2ee09e1fe62656a5086ce880" - version = "v1.6.1" + revision = "553959209a20f3be281c16dd5be5c740a893978f" + version = "v1.6.6" [[projects]] branch = "master" - digest = "1:cb0f37e3cdf50a27abbf33a48797b30786239d4fd69dbfbbc63cfa19d400d3ce" + digest = "1:03c2b11b1e1f705b0f5cfc21a5e2b3e0e71456173cd52591c7478b3d1f2c9792" name = "google.golang.org/genproto" packages = [ "googleapis/api", @@ -252,20 +327,24 @@ "googleapis/monitoring/v3", "googleapis/rpc/errdetails", "googleapis/rpc/status", - "protobuf/field_mask" + "googleapis/type/calendarperiod", + "protobuf/field_mask", ] pruneopts = "UT" - revision = "3bdd9d9f5532d75d09efb230bd767d265245cfe5" + revision = "f69a88009b70a94c67e3910bf1663f5df9fbfc6d" [[projects]] - digest = "1:f379776e36e55e5b5cbf7187ea58280812785071de53046230006e47894650b6" + digest = "1:92f84847381cc2ee44933fa3cfd6d6f669596db21a22e122441ea6b8358afe3d" name = "google.golang.org/grpc" packages = [ ".", + "attributes", + "backoff", "balancer", "balancer/base", "balancer/grpclb", "balancer/grpclb/grpc_lb_v1", + "balancer/grpclb/state", "balancer/roundrobin", "binarylog/grpc_binarylog_v1", "codes", @@ -289,27 +368,96 @@ "internal/backoff", "internal/balancerload", "internal/binarylog", + "internal/buffer", "internal/channelz", + "internal/credentials", "internal/envconfig", + "internal/grpclog", "internal/grpcrand", "internal/grpcsync", + "internal/grpcutil", + "internal/resolver/dns", + "internal/resolver/passthrough", + "internal/serviceconfig", + "internal/status", "internal/syscall", "internal/transport", "keepalive", "metadata", - "naming", "peer", "resolver", - "resolver/dns", - "resolver/passthrough", "serviceconfig", "stats", "status", - "tap" + "tap", ] pruneopts = "UT" - revision = "1d89a3c832915b2314551c1d2a506874d62e53f7" - version = "v1.22.0" + revision = "bde0263672f027525e2950992a4c7db7af572b59" + version = "v1.31.0" + +[[projects]] + digest = "1:4a0202ad403c5a9c79ae7d6673aabb8e4ae2163654167229a49cc0155687effa" + name = "google.golang.org/protobuf" + packages = [ + "encoding/protojson", + "encoding/prototext", + "encoding/protowire", + "internal/descfmt", + "internal/descopts", + "internal/detrand", + "internal/encoding/defval", + "internal/encoding/json", + "internal/encoding/messageset", + "internal/encoding/tag", + "internal/encoding/text", + "internal/errors", + "internal/fieldsort", + "internal/filedesc", + "internal/filetype", + "internal/flags", + "internal/genid", + "internal/impl", + "internal/mapsort", + "internal/pragma", + "internal/set", + "internal/strs", + "internal/version", + "proto", + "reflect/protoreflect", + "reflect/protoregistry", + "runtime/protoiface", + "runtime/protoimpl", + "types/descriptorpb", + "types/known/anypb", + "types/known/durationpb", + "types/known/emptypb", + "types/known/fieldmaskpb", + "types/known/structpb", + "types/known/timestamppb", + "types/known/wrapperspb", + ] + pruneopts = "UT" + revision = "3f7a61f89bb6813f89d981d1870ed68da0b3c3f1" + version = "v1.25.0" + +[[projects]] + digest = "1:c4d5c7382aa68038f57265590b6025bebb3d41fdd66bc8474f0644b422130890" + name = "gopkg.in/DataDog/dd-trace-go.v1" + packages = [ + "contrib/google.golang.org/grpc", + "contrib/google.golang.org/internal/grpcutil", + "ddtrace", + "ddtrace/ext", + "ddtrace/internal", + "ddtrace/tracer", + "internal", + "internal/globalconfig", + "internal/log", + "internal/version", + ] + pruneopts = "UT" + revision = "6d7c52cd8ab1ea309fd54c1a2ef472fadb84429c" + version = "v1.26.0" [solve-meta] analyzer-name = "dep" @@ -318,6 +466,8 @@ "cloud.google.com/go/profiler", "contrib.go.opencensus.io/exporter/jaeger", "contrib.go.opencensus.io/exporter/stackdriver", + "github.com/GoogleCloudPlatform/microservices-demo/src/checkoutservice/genproto", + "github.com/GoogleCloudPlatform/microservices-demo/src/checkoutservice/money", "github.com/golang/protobuf/proto", "github.com/google/uuid", "github.com/sirupsen/logrus", @@ -328,7 +478,9 @@ "google.golang.org/grpc", "google.golang.org/grpc/codes", "google.golang.org/grpc/health/grpc_health_v1", - "google.golang.org/grpc/status" + "google.golang.org/grpc/status", + "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc", + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/src/checkoutservice/Gopkg.toml b/src/checkoutservice/Gopkg.toml index 04b9024..8e053e3 100644 --- a/src/checkoutservice/Gopkg.toml +++ b/src/checkoutservice/Gopkg.toml @@ -23,8 +23,6 @@ # non-go = false # go-tests = true # unused-packages = true - - [[constraint]] name = "cloud.google.com/go" version = "0.40.0" @@ -60,3 +58,4 @@ [[constraint]] name = "contrib.go.opencensus.io/exporter/jaeger" version = "0.2.0" + diff --git a/src/checkoutservice/main.go b/src/checkoutservice/main.go index db78a5f..5e484f8 100644 --- a/src/checkoutservice/main.go +++ b/src/checkoutservice/main.go @@ -29,9 +29,11 @@ import ( "go.opencensus.io/plugin/ocgrpc" "go.opencensus.io/stats/view" "go.opencensus.io/trace" - "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + gt "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc" + "google.golang.org/grpc" pb "github.com/GoogleCloudPlatform/microservices-demo/src/checkoutservice/genproto" money "github.com/GoogleCloudPlatform/microservices-demo/src/checkoutservice/money" @@ -69,6 +71,12 @@ type checkoutService struct { } func main() { + tracer.Start( + tracer.WithEnv("prod"), + tracer.WithService("checkoutservice"), + tracer.WithDebugMode(true), + ) + defer tracer.Stop() if os.Getenv("DISABLE_TRACING") == "" { log.Info("Tracing enabled.") go initTracing() @@ -104,13 +112,24 @@ func main() { } var srv *grpc.Server + if os.Getenv("DISABLE_STATS") == "" { log.Info("Stats enabled.") srv = grpc.NewServer(grpc.StatsHandler(&ocgrpc.ServerHandler{})) + } else if os.Getenv("DATADOG_APM_ENABLED") == "true" { //datadog traces enabled + log.Info("Datadog enabled.") + // Create the server interceptor using the grpc trace package. + grpc_option := gt.WithServiceName(os.Getenv("DD_SERVICE")) + unary_server_trace := gt.UnaryServerInterceptor(grpc_option) + stream_server_trace := gt.StreamServerInterceptor(grpc_option) + unary_trace := grpc.UnaryInterceptor(unary_server_trace) + stream_trace := grpc.StreamInterceptor(stream_server_trace) + srv = grpc.NewServer(unary_trace, stream_trace) } else { log.Info("Stats disabled.") - srv = grpc.NewServer() + srv = grpc.NewServer() } + pb.RegisterCheckoutServiceServer(srv, svc) healthpb.RegisterHealthServer(srv, svc) log.Infof("starting to listen on tcp: %q", lis.Addr().String()) diff --git a/src/emailservice/Dockerfile b/src/emailservice/Dockerfile index 59a86aa..a3679fe 100644 --- a/src/emailservice/Dockerfile +++ b/src/emailservice/Dockerfile @@ -40,6 +40,8 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \ chmod +x /bin/grpc_health_probe +RUN pip install --force ddtrace + WORKDIR /email_server # Grab packages from builder @@ -47,6 +49,8 @@ COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/ # Add the application COPY . . - +ENV DD_LOGS_INJECTION=true +ENV DD_ENV=prod +ENV DD_SERVICE=emailservice EXPOSE 8080 -ENTRYPOINT [ "python", "email_server.py" ] +ENTRYPOINT [ "ddtrace-run", "python", "email_server.py" ] diff --git a/src/emailservice/requirements.in b/src/emailservice/requirements.in index bb60d5a..10c14ad 100644 --- a/src/emailservice/requirements.in +++ b/src/emailservice/requirements.in @@ -5,3 +5,4 @@ jinja2==2.10 opencensus[stackdriver]==0.1.10 python-json-logger==0.1.9 google-cloud-profiler==1.0.8 +ddtrace diff --git a/src/emailservice/requirements.txt b/src/emailservice/requirements.txt index e5df277..7625dfe 100644 --- a/src/emailservice/requirements.txt +++ b/src/emailservice/requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile # To update, run: # -# pip-compile --output-file requirements.txt requirements.in +# pip-compile --output-file=requirements.txt requirements.in # cachetools==3.0.0 # via google-auth certifi==2018.11.29 # via requests @@ -19,16 +19,23 @@ grpcio-health-checking==1.12.1 # via -r requirements.in grpcio==1.16.1 # via -r requirements.in, google-api-core, grpcio-health-checking httplib2==0.18.0 # via google-api-python-client, google-auth-httplib2 idna==2.8 # via requests +intervaltree==3.1.0 # via ddtrace jinja2==2.10 # via -r requirements.in markupsafe==1.1.0 # via jinja2 opencensus[stackdriver]==0.1.10 # via -r requirements.in -protobuf==3.6.1 # via google-api-core, google-cloud-profiler, googleapis-common-protos, grpcio-health-checking +protobuf==3.6.1 # via ddtrace, google-api-core, google-cloud-profiler, googleapis-common-protos, grpcio-health-checking pyasn1-modules==0.2.3 # via google-auth pyasn1==0.4.5 # via pyasn1-modules, rsa python-json-logger==0.1.9 # via -r requirements.in pytz==2018.9 # via google-api-core requests==2.21.0 # via google-api-core, google-cloud-profiler rsa==4.0 # via google-auth -six==1.12.0 # via google-api-core, google-api-python-client, google-auth, grpcio, protobuf +six==1.12.0 # via google-api-core, google-api-python-client, google-auth, grpcio, protobuf, tenacity +sortedcontainers==2.2.2 # via intervaltree +tenacity==6.2.0 # via ddtrace uritemplate==3.0.0 # via google-api-python-client urllib3==1.24.2 # via requests +ddtrace + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/src/frontend/Gopkg.lock b/src/frontend/Gopkg.lock index d4470cd..afb3e33 100644 --- a/src/frontend/Gopkg.lock +++ b/src/frontend/Gopkg.lock @@ -9,19 +9,19 @@ "internal/version", "monitoring/apiv3", "profiler", - "trace/apiv2" + "trace/apiv2", ] pruneopts = "UT" revision = "457ea5c15ccf3b87db582c450e80101989da35f7" version = "v0.40.0" [[projects]] - digest = "1:bcd1b2dd631e720b6129e801bf0766c50fb4d39455c0a255047e8fc71c31152f" + digest = "1:5baabd5f5d47219f2bbcd130b61376e1b2e641e0826157b017dab3f88f018827" name = "contrib.go.opencensus.io/exporter/jaeger" packages = ["."] pruneopts = "UT" - revision = "540daef1da72376e9b3e1d52e4f90403d72f5c00" - version = "v0.2.0" + revision = "30c8b0fe8ad9d0eac5785893f3941b2e72c5aaaa" + version = "v0.2.1" [[projects]] digest = "1:4b96dcd8534bc6450a922bd16a76360ba3381f0d1daf40abbaec91c053fbfeb5" @@ -32,9 +32,29 @@ version = "v0.5.0" [[projects]] - digest = "1:1d3ad0f6a57c08e2168089a64c34313930571fcbe5359d71c608a97ce504f7ca" + digest = "1:4f726c47cabd8cf517114ff99d0bc16d23ae4e1cfe50c94986c57d90fc66a941" + name = "github.com/DataDog/datadog-go" + packages = ["statsd"] + pruneopts = "UT" + revision = "b5f99e5a502785e43356d1f710e8ae1ee948503b" + version = "v4.0.0" + +[[projects]] + digest = "1:c4f0a05580fb5d27e1cc8f5723a8d33fd97590a931e845f23b104e05c02ea80b" + name = "github.com/GoogleCloudPlatform/microservices-demo" + packages = [ + "src/frontend/genproto", + "src/frontend/money", + ] + pruneopts = "UT" + revision = "c2095a7d4b8abd538251b705325d6a493a23e009" + version = "v0.2.0" + +[[projects]] + digest = "1:9d2705f9d2e7da697c24b2ab104567b155107b2aad26ca615973c0a8f02f757a" name = "github.com/golang/protobuf" packages = [ + "jsonpb", "proto", "protoc-gen-go/descriptor", "ptypes", @@ -43,19 +63,33 @@ "ptypes/empty", "ptypes/struct", "ptypes/timestamp", - "ptypes/wrappers" + "ptypes/wrappers", ] pruneopts = "UT" - revision = "b5d812f8a3706043e23a9cd5babf2e5423744d30" - version = "v1.3.1" + revision = "d04d7b157bb510b1e0c10132224b616ac0e26b17" + version = "v1.4.2" + +[[projects]] + digest = "1:85af59d73a44bd58f524cf05dee34a5021afe1fa4a852079b535c38ae2d1a2e8" + name = "github.com/google/go-cmp" + packages = [ + "cmp", + "cmp/internal/diff", + "cmp/internal/flags", + "cmp/internal/function", + "cmp/internal/value", + ] + pruneopts = "UT" + revision = "9680bfaf28748393e28e00238d94070fb9972fd8" + version = "v0.5.1" [[projects]] branch = "master" - digest = "1:dcb1edb161b1b1cac9aedf2a17b9b2c7829e242624968875a3c1b97dd9f4ef00" + digest = "1:7f49181edc3aa34ec3145a0050ce4af901a9c3238774f362784ce39227bc1f3a" name = "github.com/google/pprof" packages = ["profile"] pruneopts = "UT" - revision = "54271f7e092ff31b10b7626fee166cbc6304e350" + revision = "1a94d8640e99342fa76ae6296aaa921d08ac451f" [[projects]] digest = "1:582b704bebaa06b48c29b0cec224a6058a09c86883aaddabde889cd1a5f73e1b" @@ -74,20 +108,28 @@ version = "v2.0.5" [[projects]] - digest = "1:cbec35fe4d5a4fba369a656a8cd65e244ea2c743007d8f6c1ccb132acf9d1296" + digest = "1:6078383dbb7405bfa3ce16957f37564e3b716afa29b6eb45ffdb6674624d1e0d" name = "github.com/gorilla/mux" packages = ["."] pruneopts = "UT" - revision = "00bdffe0f3c77e27d2cf6f5c70232a2d3e4d9c15" - version = "v1.7.3" + revision = "98cb6bf42e086f6af920b965c38cacc07402d51b" + version = "v1.8.0" [[projects]] - digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" + digest = "1:09cb61dc19af93deae01587e2fdb1c081e0bf48f1a5ad5fa24f48750dc57dce8" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] pruneopts = "UT" - revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" - version = "v1.0.2" + revision = "edb144dfd453055e1e49a3d8b410a660b5a87613" + version = "v1.0.3" + +[[projects]] + digest = "1:5e73b34a27d827212102605789de00bd411b2e434812133c83935fe9897c75e1" + name = "github.com/philhofer/fwd" + packages = ["."] + pruneopts = "UT" + revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136" + version = "v1.0.0" [[projects]] digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b" @@ -98,25 +140,33 @@ version = "v0.8.1" [[projects]] - digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + digest = "1:05eebdd5727fea23083fce0d98d307d70c86baed644178e81608aaa9f09ea469" name = "github.com/sirupsen/logrus" packages = ["."] pruneopts = "UT" - revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" - version = "v1.4.2" + revision = "60c74ad9be0d874af0ab0daef6ab07c5c5911f0d" + version = "v1.6.0" [[projects]] - digest = "1:be83cecd5ba066751e3f789c1faecf5a3229031c7986eb486f593a6e32446ac0" + digest = "1:6636bfca29dde8561c03e98ccddbe36240f13a01ac770d7ea07f4fd019ed6e65" + name = "github.com/tinylib/msgp" + packages = ["msgp"] + pruneopts = "UT" + revision = "4253cdaa5267687e3b7612da7ff105d4414174da" + version = "v1.1.2" + +[[projects]] + digest = "1:a6175cb931f5b9da33e92f6057e0de28badbe6dfdc32f4bf378ffd9a2c461d03" name = "github.com/uber/jaeger-client-go" packages = [ "thrift", "thrift-gen/agent", "thrift-gen/jaeger", - "thrift-gen/zipkincore" + "thrift-gen/zipkincore", ] pruneopts = "UT" - revision = "f2e1f58485aacf2975cdde9c9f5396e6d98c35ba" - version = "v2.21.1" + revision = "121ee6fb26fd9617fc30d0d95569a39c30ca3b76" + version = "v2.25.0" [[projects]] digest = "1:1bb914cfb78f68f488a91cd7872d3d06a5f83c5bbacf0296dbef44e120b00a91" @@ -135,7 +185,7 @@ "trace", "trace/internal", "trace/propagation", - "trace/tracestate" + "trace/tracestate", ] pruneopts = "UT" revision = "b11f239c032624b045c4c2bfd3d1287b4012ce89" @@ -143,7 +193,7 @@ [[projects]] branch = "master" - digest = "1:2f357867bf425774d35beca5be718402a4488b8b23b1563ce8c5bb91d09285a7" + digest = "1:6a803f0f3ecbe7e804185a165b3e36eeb0a62f806e7fbe61e842966127991a64" name = "golang.org/x/net" packages = [ "context", @@ -153,43 +203,48 @@ "http2/hpack", "idna", "internal/timeseries", - "trace" + "trace", ] pruneopts = "UT" - revision = "da137c7871d730100384dbcf36e6f8fa493aef5b" + revision = "c89045814202410a2d67ec20ecf177ec77ceae7f" [[projects]] branch = "master" - digest = "1:31e33f76456ccf54819ab4a646cf01271d1a99d7712ab84bf1a9e7b61cd2031b" + digest = "1:79edde3241bb55de9f4143d5083bfcff722e550c3cb8db94084eab50d0e440b5" name = "golang.org/x/oauth2" packages = [ ".", "google", "internal", "jws", - "jwt" + "jwt", ] pruneopts = "UT" - revision = "0f29369cfe4552d0e4bcddc57cc75f4d7e672a33" + revision = "bf48bf16ab8d622ce64ec6ce98d2c98f916b6303" [[projects]] branch = "master" - digest = "1:382bb5a7fb4034db3b6a2d19e5a4a6bcf52f4750530603c01ca18a172fa3089b" + digest = "1:4692f916cb72b2c295f04841036d85a3f13e96d1cc9e8e4c2c30edebac518053" name = "golang.org/x/sync" packages = ["semaphore"] pruneopts = "UT" - revision = "112230192c580c3556b8cee6403af37a4fc5f28c" + revision = "6e8e738ad208923de99951fe0b48239bfd864f28" [[projects]] branch = "master" - digest = "1:730ba27cd66db3b98ec8f51a6f20d45ec277d490cca36b1f54e31d3fcaf4840e" + digest = "1:288524d218ffbd2adb8cf423f2afb863ccce0a000446a2b0d467931d1e517ba0" name = "golang.org/x/sys" - packages = ["unix"] + packages = [ + "internal/unsafeheader", + "unix", + "windows", + "windows/registry", + ] pruneopts = "UT" - revision = "04f50cda93cbb67f2afa353c52f342100e80e625" + revision = "c12d262b63d83031f2db2f528267f9a4f58e2775" [[projects]] - digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405" + digest = "1:fa940333c48808b0d86ef21f412ffcfd0e5084a82f13905c028a404803b1908f" name = "golang.org/x/text" packages = [ "collate", @@ -207,15 +262,34 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] pruneopts = "UT" - revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" - version = "v0.3.2" + revision = "23ae387dee1f90d29a23c0e87ee0b46038fbed0e" + version = "v0.3.3" [[projects]] branch = "master" - digest = "1:bc06b12d8436550fccc0212037e9281a7e4d53db25c2349eb3cc6c3457e0406b" + digest = "1:9a12483c63e8328a477280cd6855689af0f584eb580b66c0d113a1f5fe7791b0" + name = "golang.org/x/time" + packages = ["rate"] + pruneopts = "UT" + revision = "3af7569d3a1e776fc2a3c1cec133b43105ea9c2e" + +[[projects]] + branch = "master" + digest = "1:918a46e4a2fb83df33f668f5a6bd51b2996775d073fce1800d3ec01b0a5ddd2b" + name = "golang.org/x/xerrors" + packages = [ + ".", + "internal", + ] + pruneopts = "UT" + revision = "5ec99f83aff198f5fbd629d6c8d8eb38a04218ca" + +[[projects]] + branch = "master" + digest = "1:49329e5d3d686037e3255b4d555f3751d275771cb3e60f6fe6cfa47abf90110f" name = "google.golang.org/api" packages = [ "googleapi/transport", @@ -224,15 +298,16 @@ "option", "support/bundler", "transport", + "transport/cert", "transport/grpc", "transport/http", - "transport/http/internal/propagation" + "transport/http/internal/propagation", ] pruneopts = "UT" - revision = "aae1d1b89c27132abe4fa22731a2a61e7089079c" + revision = "b77a6912936dced70abf0869ccb1d02d802567de" [[projects]] - digest = "1:2c26b1c47556c0e5e73cdb05d8361c463737eee4baac35d38b40c728c3074a94" + digest = "1:9a3c550c85a5a62ccc4cadd8525497b99554094a1adecc560c97bebc231ca81b" name = "google.golang.org/appengine" packages = [ ".", @@ -246,15 +321,15 @@ "internal/socket", "internal/urlfetch", "socket", - "urlfetch" + "urlfetch", ] pruneopts = "UT" - revision = "b2f4a3cf3c67576a2ee09e1fe62656a5086ce880" - version = "v1.6.1" + revision = "553959209a20f3be281c16dd5be5c740a893978f" + version = "v1.6.6" [[projects]] branch = "master" - digest = "1:cb0f37e3cdf50a27abbf33a48797b30786239d4fd69dbfbbc63cfa19d400d3ce" + digest = "1:03c2b11b1e1f705b0f5cfc21a5e2b3e0e71456173cd52591c7478b3d1f2c9792" name = "google.golang.org/genproto" packages = [ "googleapis/api", @@ -268,20 +343,24 @@ "googleapis/monitoring/v3", "googleapis/rpc/errdetails", "googleapis/rpc/status", - "protobuf/field_mask" + "googleapis/type/calendarperiod", + "protobuf/field_mask", ] pruneopts = "UT" - revision = "3bdd9d9f5532d75d09efb230bd767d265245cfe5" + revision = "f69a88009b70a94c67e3910bf1663f5df9fbfc6d" [[projects]] - digest = "1:94dd3fb42315b97533bb74fe15498905734bc3a3c6e692dc7839fec749d44d26" + digest = "1:00072b631310111e6eadd21523f02d9f5d82e88d06672b72f56aace18f3864b8" name = "google.golang.org/grpc" packages = [ ".", + "attributes", + "backoff", "balancer", "balancer/base", "balancer/grpclb", "balancer/grpclb/grpc_lb_v1", + "balancer/grpclb/state", "balancer/roundrobin", "binarylog/grpc_binarylog_v1", "codes", @@ -304,27 +383,96 @@ "internal/backoff", "internal/balancerload", "internal/binarylog", + "internal/buffer", "internal/channelz", + "internal/credentials", "internal/envconfig", + "internal/grpclog", "internal/grpcrand", "internal/grpcsync", + "internal/grpcutil", + "internal/resolver/dns", + "internal/resolver/passthrough", + "internal/serviceconfig", + "internal/status", "internal/syscall", "internal/transport", "keepalive", "metadata", - "naming", "peer", "resolver", - "resolver/dns", - "resolver/passthrough", "serviceconfig", "stats", "status", - "tap" + "tap", ] pruneopts = "UT" - revision = "1d89a3c832915b2314551c1d2a506874d62e53f7" - version = "v1.22.0" + revision = "bde0263672f027525e2950992a4c7db7af572b59" + version = "v1.31.0" + +[[projects]] + digest = "1:4a0202ad403c5a9c79ae7d6673aabb8e4ae2163654167229a49cc0155687effa" + name = "google.golang.org/protobuf" + packages = [ + "encoding/protojson", + "encoding/prototext", + "encoding/protowire", + "internal/descfmt", + "internal/descopts", + "internal/detrand", + "internal/encoding/defval", + "internal/encoding/json", + "internal/encoding/messageset", + "internal/encoding/tag", + "internal/encoding/text", + "internal/errors", + "internal/fieldsort", + "internal/filedesc", + "internal/filetype", + "internal/flags", + "internal/genid", + "internal/impl", + "internal/mapsort", + "internal/pragma", + "internal/set", + "internal/strs", + "internal/version", + "proto", + "reflect/protoreflect", + "reflect/protoregistry", + "runtime/protoiface", + "runtime/protoimpl", + "types/descriptorpb", + "types/known/anypb", + "types/known/durationpb", + "types/known/emptypb", + "types/known/fieldmaskpb", + "types/known/structpb", + "types/known/timestamppb", + "types/known/wrapperspb", + ] + pruneopts = "UT" + revision = "3f7a61f89bb6813f89d981d1870ed68da0b3c3f1" + version = "v1.25.0" + +[[projects]] + digest = "1:c4d5c7382aa68038f57265590b6025bebb3d41fdd66bc8474f0644b422130890" + name = "gopkg.in/DataDog/dd-trace-go.v1" + packages = [ + "contrib/google.golang.org/grpc", + "contrib/google.golang.org/internal/grpcutil", + "ddtrace", + "ddtrace/ext", + "ddtrace/internal", + "ddtrace/tracer", + "internal", + "internal/globalconfig", + "internal/log", + "internal/version", + ] + pruneopts = "UT" + revision = "6d7c52cd8ab1ea309fd54c1a2ef472fadb84429c" + version = "v1.26.0" [solve-meta] analyzer-name = "dep" @@ -333,6 +481,8 @@ "cloud.google.com/go/profiler", "contrib.go.opencensus.io/exporter/jaeger", "contrib.go.opencensus.io/exporter/stackdriver", + "github.com/GoogleCloudPlatform/microservices-demo/src/frontend/genproto", + "github.com/GoogleCloudPlatform/microservices-demo/src/frontend/money", "github.com/golang/protobuf/proto", "github.com/google/uuid", "github.com/gorilla/mux", @@ -344,7 +494,9 @@ "go.opencensus.io/stats/view", "go.opencensus.io/trace", "golang.org/x/net/context", - "google.golang.org/grpc" + "google.golang.org/grpc", + "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc", + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/src/frontend/main.go b/src/frontend/main.go index 3084fdc..03ffc6d 100644 --- a/src/frontend/main.go +++ b/src/frontend/main.go @@ -33,6 +33,8 @@ import ( "go.opencensus.io/stats/view" "go.opencensus.io/trace" "google.golang.org/grpc" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + gt "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc" ) const ( @@ -93,7 +95,11 @@ func main() { TimestampFormat: time.RFC3339Nano, } log.Out = os.Stdout - + tracer.Start( + tracer.WithEnv("prod"), + tracer.WithService("frontend"), + ) + defer tracer.Stop() if os.Getenv("DISABLE_TRACING") == "" { log.Info("Tracing enabled.") go initTracing(log) @@ -263,11 +269,27 @@ func mustMapEnv(target *string, envKey string) { func mustConnGRPC(ctx context.Context, conn **grpc.ClientConn, addr string) { var err error - *conn, err = grpc.DialContext(ctx, addr, - grpc.WithInsecure(), - grpc.WithTimeout(time.Second*3), - grpc.WithStatsHandler(&ocgrpc.ClientHandler{})) - if err != nil { - panic(errors.Wrapf(err, "grpc: failed to connect %s", addr)) + + if os.Getenv("DATADOG_APM_ENABLED") == "true" { //datadog traces enabled + // Create the client interceptor using the grpc trace package. + si := gt.StreamClientInterceptor(gt.WithServiceName(os.Getenv("DD_SERVICE"))) + ui := gt.UnaryClientInterceptor(gt.WithServiceName(os.Getenv("DD_SERVICE"))) + *conn, err = grpc.DialContext(ctx, addr, + grpc.WithInsecure(), + grpc.WithTimeout(time.Second*3), + grpc.WithStatsHandler(&ocgrpc.ClientHandler{}), + grpc.WithStreamInterceptor(si), grpc.WithUnaryInterceptor(ui)) + if err != nil { + panic(errors.Wrapf(err, "grpc: failed to connect %s", addr)) + } + } else { + *conn, err = grpc.DialContext(ctx, addr, + grpc.WithInsecure(), + grpc.WithTimeout(time.Second*3), + grpc.WithStatsHandler(&ocgrpc.ClientHandler{}), + ) + if err != nil { + panic(errors.Wrapf(err, "grpc: failed to connect %s", addr)) + } } } diff --git a/src/loadgenerator/Dockerfile b/src/loadgenerator/Dockerfile index 49f5646..6f8f95f 100644 --- a/src/loadgenerator/Dockerfile +++ b/src/loadgenerator/Dockerfile @@ -22,7 +22,7 @@ RUN apt-get -qq update \ COPY requirements.txt . -RUN pip install --install-option="--prefix=/install" -r requirements.txt +RUN pip install --prefix=/install -r requirements.txt FROM base COPY --from=builder /install /usr/local diff --git a/src/productcatalogservice/Gopkg.lock b/src/productcatalogservice/Gopkg.lock index 6a797f0..e4f3a49 100644 --- a/src/productcatalogservice/Gopkg.lock +++ b/src/productcatalogservice/Gopkg.lock @@ -9,19 +9,19 @@ "internal/version", "monitoring/apiv3", "profiler", - "trace/apiv2" + "trace/apiv2", ] pruneopts = "UT" revision = "457ea5c15ccf3b87db582c450e80101989da35f7" version = "v0.40.0" [[projects]] - digest = "1:bcd1b2dd631e720b6129e801bf0766c50fb4d39455c0a255047e8fc71c31152f" + digest = "1:5baabd5f5d47219f2bbcd130b61376e1b2e641e0826157b017dab3f88f018827" name = "contrib.go.opencensus.io/exporter/jaeger" packages = ["."] pruneopts = "UT" - revision = "540daef1da72376e9b3e1d52e4f90403d72f5c00" - version = "v0.2.0" + revision = "30c8b0fe8ad9d0eac5785893f3941b2e72c5aaaa" + version = "v0.2.1" [[projects]] digest = "1:4b96dcd8534bc6450a922bd16a76360ba3381f0d1daf40abbaec91c053fbfeb5" @@ -32,7 +32,23 @@ version = "v0.5.0" [[projects]] - digest = "1:fd0a0705475581c7eb965259d417706cb49f42bde408502c3b53f139b7253d67" + digest = "1:4f726c47cabd8cf517114ff99d0bc16d23ae4e1cfe50c94986c57d90fc66a941" + name = "github.com/DataDog/datadog-go" + packages = ["statsd"] + pruneopts = "UT" + revision = "b5f99e5a502785e43356d1f710e8ae1ee948503b" + version = "v4.0.0" + +[[projects]] + digest = "1:9370265bab17bdc207051ccedc34535484a12622a329839e580059c79236c1e3" + name = "github.com/GoogleCloudPlatform/microservices-demo" + packages = ["src/productcatalogservice/genproto"] + pruneopts = "UT" + revision = "c2095a7d4b8abd538251b705325d6a493a23e009" + version = "v0.2.0" + +[[projects]] + digest = "1:9d2705f9d2e7da697c24b2ab104567b155107b2aad26ca615973c0a8f02f757a" name = "github.com/golang/protobuf" packages = [ "jsonpb", @@ -44,11 +60,11 @@ "ptypes/empty", "ptypes/struct", "ptypes/timestamp", - "ptypes/wrappers" + "ptypes/wrappers", ] pruneopts = "UT" - revision = "b5d812f8a3706043e23a9cd5babf2e5423744d30" - version = "v1.3.1" + revision = "d04d7b157bb510b1e0c10132224b616ac0e26b17" + version = "v1.4.2" [[projects]] digest = "1:2e3c336fc7fde5c984d2841455a658a6d626450b1754a854b3b32e7a8f49a07a" @@ -57,7 +73,7 @@ "cmp", "cmp/internal/diff", "cmp/internal/function", - "cmp/internal/value" + "cmp/internal/value", ] pruneopts = "UT" revision = "3af367b6b30c263d47e8895973edcca9a49cf029" @@ -65,11 +81,19 @@ [[projects]] branch = "master" - digest = "1:dcb1edb161b1b1cac9aedf2a17b9b2c7829e242624968875a3c1b97dd9f4ef00" + digest = "1:7f49181edc3aa34ec3145a0050ce4af901a9c3238774f362784ce39227bc1f3a" name = "github.com/google/pprof" packages = ["profile"] pruneopts = "UT" - revision = "54271f7e092ff31b10b7626fee166cbc6304e350" + revision = "1a94d8640e99342fa76ae6296aaa921d08ac451f" + +[[projects]] + digest = "1:582b704bebaa06b48c29b0cec224a6058a09c86883aaddabde889cd1a5f73e1b" + name = "github.com/google/uuid" + packages = ["."] + pruneopts = "UT" + revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4" + version = "v1.1.1" [[projects]] digest = "1:766102087520f9d54f2acc72bd6637045900ac735b4a419b128d216f0c5c4876" @@ -80,33 +104,49 @@ version = "v2.0.5" [[projects]] - digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" + digest = "1:09cb61dc19af93deae01587e2fdb1c081e0bf48f1a5ad5fa24f48750dc57dce8" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] pruneopts = "UT" - revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" - version = "v1.0.2" + revision = "edb144dfd453055e1e49a3d8b410a660b5a87613" + version = "v1.0.3" [[projects]] - digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + digest = "1:5e73b34a27d827212102605789de00bd411b2e434812133c83935fe9897c75e1" + name = "github.com/philhofer/fwd" + packages = ["."] + pruneopts = "UT" + revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136" + version = "v1.0.0" + +[[projects]] + digest = "1:05eebdd5727fea23083fce0d98d307d70c86baed644178e81608aaa9f09ea469" name = "github.com/sirupsen/logrus" packages = ["."] pruneopts = "UT" - revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" - version = "v1.4.2" + revision = "60c74ad9be0d874af0ab0daef6ab07c5c5911f0d" + version = "v1.6.0" [[projects]] - digest = "1:be83cecd5ba066751e3f789c1faecf5a3229031c7986eb486f593a6e32446ac0" + digest = "1:6636bfca29dde8561c03e98ccddbe36240f13a01ac770d7ea07f4fd019ed6e65" + name = "github.com/tinylib/msgp" + packages = ["msgp"] + pruneopts = "UT" + revision = "4253cdaa5267687e3b7612da7ff105d4414174da" + version = "v1.1.2" + +[[projects]] + digest = "1:a6175cb931f5b9da33e92f6057e0de28badbe6dfdc32f4bf378ffd9a2c461d03" name = "github.com/uber/jaeger-client-go" packages = [ "thrift", "thrift-gen/agent", "thrift-gen/jaeger", - "thrift-gen/zipkincore" + "thrift-gen/zipkincore", ] pruneopts = "UT" - revision = "f2e1f58485aacf2975cdde9c9f5396e6d98c35ba" - version = "v2.21.1" + revision = "121ee6fb26fd9617fc30d0d95569a39c30ca3b76" + version = "v2.25.0" [[projects]] digest = "1:1bb914cfb78f68f488a91cd7872d3d06a5f83c5bbacf0296dbef44e120b00a91" @@ -125,7 +165,7 @@ "trace", "trace/internal", "trace/propagation", - "trace/tracestate" + "trace/tracestate", ] pruneopts = "UT" revision = "b11f239c032624b045c4c2bfd3d1287b4012ce89" @@ -133,7 +173,7 @@ [[projects]] branch = "master" - digest = "1:2f357867bf425774d35beca5be718402a4488b8b23b1563ce8c5bb91d09285a7" + digest = "1:6a803f0f3ecbe7e804185a165b3e36eeb0a62f806e7fbe61e842966127991a64" name = "golang.org/x/net" packages = [ "context", @@ -143,43 +183,48 @@ "http2/hpack", "idna", "internal/timeseries", - "trace" + "trace", ] pruneopts = "UT" - revision = "da137c7871d730100384dbcf36e6f8fa493aef5b" + revision = "c89045814202410a2d67ec20ecf177ec77ceae7f" [[projects]] branch = "master" - digest = "1:31e33f76456ccf54819ab4a646cf01271d1a99d7712ab84bf1a9e7b61cd2031b" + digest = "1:79edde3241bb55de9f4143d5083bfcff722e550c3cb8db94084eab50d0e440b5" name = "golang.org/x/oauth2" packages = [ ".", "google", "internal", "jws", - "jwt" + "jwt", ] pruneopts = "UT" - revision = "0f29369cfe4552d0e4bcddc57cc75f4d7e672a33" + revision = "bf48bf16ab8d622ce64ec6ce98d2c98f916b6303" [[projects]] branch = "master" - digest = "1:382bb5a7fb4034db3b6a2d19e5a4a6bcf52f4750530603c01ca18a172fa3089b" + digest = "1:4692f916cb72b2c295f04841036d85a3f13e96d1cc9e8e4c2c30edebac518053" name = "golang.org/x/sync" packages = ["semaphore"] pruneopts = "UT" - revision = "112230192c580c3556b8cee6403af37a4fc5f28c" + revision = "6e8e738ad208923de99951fe0b48239bfd864f28" [[projects]] branch = "master" - digest = "1:730ba27cd66db3b98ec8f51a6f20d45ec277d490cca36b1f54e31d3fcaf4840e" + digest = "1:288524d218ffbd2adb8cf423f2afb863ccce0a000446a2b0d467931d1e517ba0" name = "golang.org/x/sys" - packages = ["unix"] + packages = [ + "internal/unsafeheader", + "unix", + "windows", + "windows/registry", + ] pruneopts = "UT" - revision = "04f50cda93cbb67f2afa353c52f342100e80e625" + revision = "c12d262b63d83031f2db2f528267f9a4f58e2775" [[projects]] - digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405" + digest = "1:fa940333c48808b0d86ef21f412ffcfd0e5084a82f13905c028a404803b1908f" name = "golang.org/x/text" packages = [ "collate", @@ -197,15 +242,34 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] pruneopts = "UT" - revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" - version = "v0.3.2" + revision = "23ae387dee1f90d29a23c0e87ee0b46038fbed0e" + version = "v0.3.3" [[projects]] branch = "master" - digest = "1:bc06b12d8436550fccc0212037e9281a7e4d53db25c2349eb3cc6c3457e0406b" + digest = "1:9a12483c63e8328a477280cd6855689af0f584eb580b66c0d113a1f5fe7791b0" + name = "golang.org/x/time" + packages = ["rate"] + pruneopts = "UT" + revision = "3af7569d3a1e776fc2a3c1cec133b43105ea9c2e" + +[[projects]] + branch = "master" + digest = "1:918a46e4a2fb83df33f668f5a6bd51b2996775d073fce1800d3ec01b0a5ddd2b" + name = "golang.org/x/xerrors" + packages = [ + ".", + "internal", + ] + pruneopts = "UT" + revision = "5ec99f83aff198f5fbd629d6c8d8eb38a04218ca" + +[[projects]] + branch = "master" + digest = "1:49329e5d3d686037e3255b4d555f3751d275771cb3e60f6fe6cfa47abf90110f" name = "google.golang.org/api" packages = [ "googleapi/transport", @@ -214,15 +278,16 @@ "option", "support/bundler", "transport", + "transport/cert", "transport/grpc", "transport/http", - "transport/http/internal/propagation" + "transport/http/internal/propagation", ] pruneopts = "UT" - revision = "aae1d1b89c27132abe4fa22731a2a61e7089079c" + revision = "b77a6912936dced70abf0869ccb1d02d802567de" [[projects]] - digest = "1:2c26b1c47556c0e5e73cdb05d8361c463737eee4baac35d38b40c728c3074a94" + digest = "1:9a3c550c85a5a62ccc4cadd8525497b99554094a1adecc560c97bebc231ca81b" name = "google.golang.org/appengine" packages = [ ".", @@ -236,15 +301,15 @@ "internal/socket", "internal/urlfetch", "socket", - "urlfetch" + "urlfetch", ] pruneopts = "UT" - revision = "b2f4a3cf3c67576a2ee09e1fe62656a5086ce880" - version = "v1.6.1" + revision = "553959209a20f3be281c16dd5be5c740a893978f" + version = "v1.6.6" [[projects]] branch = "master" - digest = "1:cb0f37e3cdf50a27abbf33a48797b30786239d4fd69dbfbbc63cfa19d400d3ce" + digest = "1:03c2b11b1e1f705b0f5cfc21a5e2b3e0e71456173cd52591c7478b3d1f2c9792" name = "google.golang.org/genproto" packages = [ "googleapis/api", @@ -258,20 +323,24 @@ "googleapis/monitoring/v3", "googleapis/rpc/errdetails", "googleapis/rpc/status", - "protobuf/field_mask" + "googleapis/type/calendarperiod", + "protobuf/field_mask", ] pruneopts = "UT" - revision = "3bdd9d9f5532d75d09efb230bd767d265245cfe5" + revision = "f69a88009b70a94c67e3910bf1663f5df9fbfc6d" [[projects]] - digest = "1:f379776e36e55e5b5cbf7187ea58280812785071de53046230006e47894650b6" + digest = "1:92f84847381cc2ee44933fa3cfd6d6f669596db21a22e122441ea6b8358afe3d" name = "google.golang.org/grpc" packages = [ ".", + "attributes", + "backoff", "balancer", "balancer/base", "balancer/grpclb", "balancer/grpclb/grpc_lb_v1", + "balancer/grpclb/state", "balancer/roundrobin", "binarylog/grpc_binarylog_v1", "codes", @@ -295,27 +364,96 @@ "internal/backoff", "internal/balancerload", "internal/binarylog", + "internal/buffer", "internal/channelz", + "internal/credentials", "internal/envconfig", + "internal/grpclog", "internal/grpcrand", "internal/grpcsync", + "internal/grpcutil", + "internal/resolver/dns", + "internal/resolver/passthrough", + "internal/serviceconfig", + "internal/status", "internal/syscall", "internal/transport", "keepalive", "metadata", - "naming", "peer", "resolver", - "resolver/dns", - "resolver/passthrough", "serviceconfig", "stats", "status", - "tap" + "tap", ] pruneopts = "UT" - revision = "1d89a3c832915b2314551c1d2a506874d62e53f7" - version = "v1.22.0" + revision = "bde0263672f027525e2950992a4c7db7af572b59" + version = "v1.31.0" + +[[projects]] + digest = "1:4a0202ad403c5a9c79ae7d6673aabb8e4ae2163654167229a49cc0155687effa" + name = "google.golang.org/protobuf" + packages = [ + "encoding/protojson", + "encoding/prototext", + "encoding/protowire", + "internal/descfmt", + "internal/descopts", + "internal/detrand", + "internal/encoding/defval", + "internal/encoding/json", + "internal/encoding/messageset", + "internal/encoding/tag", + "internal/encoding/text", + "internal/errors", + "internal/fieldsort", + "internal/filedesc", + "internal/filetype", + "internal/flags", + "internal/genid", + "internal/impl", + "internal/mapsort", + "internal/pragma", + "internal/set", + "internal/strs", + "internal/version", + "proto", + "reflect/protoreflect", + "reflect/protoregistry", + "runtime/protoiface", + "runtime/protoimpl", + "types/descriptorpb", + "types/known/anypb", + "types/known/durationpb", + "types/known/emptypb", + "types/known/fieldmaskpb", + "types/known/structpb", + "types/known/timestamppb", + "types/known/wrapperspb", + ] + pruneopts = "UT" + revision = "3f7a61f89bb6813f89d981d1870ed68da0b3c3f1" + version = "v1.25.0" + +[[projects]] + digest = "1:c4d5c7382aa68038f57265590b6025bebb3d41fdd66bc8474f0644b422130890" + name = "gopkg.in/DataDog/dd-trace-go.v1" + packages = [ + "contrib/google.golang.org/grpc", + "contrib/google.golang.org/internal/grpcutil", + "ddtrace", + "ddtrace/ext", + "ddtrace/internal", + "ddtrace/tracer", + "internal", + "internal/globalconfig", + "internal/log", + "internal/version", + ] + pruneopts = "UT" + revision = "6d7c52cd8ab1ea309fd54c1a2ef472fadb84429c" + version = "v1.26.0" [solve-meta] analyzer-name = "dep" @@ -324,6 +462,7 @@ "cloud.google.com/go/profiler", "contrib.go.opencensus.io/exporter/jaeger", "contrib.go.opencensus.io/exporter/stackdriver", + "github.com/GoogleCloudPlatform/microservices-demo/src/productcatalogservice/genproto", "github.com/golang/protobuf/jsonpb", "github.com/golang/protobuf/proto", "github.com/google/go-cmp/cmp", @@ -335,7 +474,9 @@ "google.golang.org/grpc", "google.golang.org/grpc/codes", "google.golang.org/grpc/health/grpc_health_v1", - "google.golang.org/grpc/status" + "google.golang.org/grpc/status", + "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc", + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/src/productcatalogservice/server.go b/src/productcatalogservice/server.go index 7732a5e..79d3561 100644 --- a/src/productcatalogservice/server.go +++ b/src/productcatalogservice/server.go @@ -28,6 +28,8 @@ import ( "syscall" "time" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + gt "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc" pb "github.com/GoogleCloudPlatform/microservices-demo/src/productcatalogservice/genproto" healthpb "google.golang.org/grpc/health/grpc_health_v1" @@ -75,6 +77,11 @@ func init() { } func main() { + tracer.Start( + tracer.WithEnv("prod"), + tracer.WithService("productcatalogservice"), + ) + defer tracer.Stop() if os.Getenv("DISABLE_TRACING") == "" { log.Info("Tracing enabled.") go initTracing() @@ -136,9 +143,18 @@ func run(port string) string { if os.Getenv("DISABLE_STATS") == "" { log.Info("Stats enabled.") srv = grpc.NewServer(grpc.StatsHandler(&ocgrpc.ServerHandler{})) + } else if os.Getenv("DATADOG_APM_ENABLED") == "true" { + log.Info("Datadog trace enabled.") + // Create the server interceptor using the grpc trace package. + grpc_option := gt.WithServiceName(os.Getenv("DD_SERVICE")) + unary_server_trace := gt.UnaryServerInterceptor(grpc_option) + stream_server_trace := gt.StreamServerInterceptor(grpc_option) + unary_trace := grpc.UnaryInterceptor(unary_server_trace) + stream_trace := grpc.StreamInterceptor(stream_server_trace) + srv = grpc.NewServer(unary_trace, stream_trace) } else { log.Info("Stats disabled.") - srv = grpc.NewServer() + srv = grpc.NewServer() } svc := &productCatalog{} diff --git a/src/recommendationservice/Dockerfile b/src/recommendationservice/Dockerfile index 7df60ce..4e0d44c 100644 --- a/src/recommendationservice/Dockerfile +++ b/src/recommendationservice/Dockerfile @@ -18,6 +18,9 @@ RUN apt-get update -qqy && \ rm -rf /var/lib/apt/lists/* # show python logs as they occur ENV PYTHONUNBUFFERED=0 +ENV DD_LOGS_INJECTION=true +ENV DD_ENV=prod +ENV DD_SERVICE=recommendationservice # download the grpc health probe RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ @@ -36,4 +39,4 @@ COPY . . ENV PORT "8080" EXPOSE 8080 -ENTRYPOINT ["python", "/recommendationservice/recommendation_server.py"] +ENTRYPOINT ["ddtrace-run", "python", "/recommendationservice/recommendation_server.py"] diff --git a/src/recommendationservice/requirements.in b/src/recommendationservice/requirements.in index bfc28a5..c12b89b 100644 --- a/src/recommendationservice/requirements.in +++ b/src/recommendationservice/requirements.in @@ -1,7 +1,8 @@ google-api-core==1.6.0 -google-python-cloud-debugger==2.9 +google-python-cloud-debugger==2.15 grpcio-health-checking==1.13.0 grpcio==1.16.1 opencensus[stackdriver]==0.1.10 python-json-logger==0.1.9 google-cloud-profiler==1.0.8 +ddtrace diff --git a/src/recommendationservice/requirements.txt b/src/recommendationservice/requirements.txt index 554b405..f0fc958 100644 --- a/src/recommendationservice/requirements.txt +++ b/src/recommendationservice/requirements.txt @@ -34,3 +34,4 @@ rsa==4.0 # via google-auth six==1.12.0 # via google-api-core, google-api-python-client, google-auth, google-python-cloud-debugger, grpcio, protobuf uritemplate==3.0.0 # via google-api-python-client urllib3==1.24.2 # via requests +ddtrace diff --git a/src/shippingservice/Gopkg.lock b/src/shippingservice/Gopkg.lock index ef4b7c1..00ec1df 100644 --- a/src/shippingservice/Gopkg.lock +++ b/src/shippingservice/Gopkg.lock @@ -9,19 +9,19 @@ "internal/version", "monitoring/apiv3", "profiler", - "trace/apiv2" + "trace/apiv2", ] pruneopts = "UT" revision = "457ea5c15ccf3b87db582c450e80101989da35f7" version = "v0.40.0" [[projects]] - digest = "1:bcd1b2dd631e720b6129e801bf0766c50fb4d39455c0a255047e8fc71c31152f" + digest = "1:5baabd5f5d47219f2bbcd130b61376e1b2e641e0826157b017dab3f88f018827" name = "contrib.go.opencensus.io/exporter/jaeger" packages = ["."] pruneopts = "UT" - revision = "540daef1da72376e9b3e1d52e4f90403d72f5c00" - version = "v0.2.0" + revision = "30c8b0fe8ad9d0eac5785893f3941b2e72c5aaaa" + version = "v0.2.1" [[projects]] digest = "1:4b96dcd8534bc6450a922bd16a76360ba3381f0d1daf40abbaec91c053fbfeb5" @@ -32,18 +32,26 @@ version = "v0.5.0" [[projects]] - branch = "master" - digest = "1:a85b0dc359de4812d383ee6670f0dae595cfcb8b13ff6b872bdb013a18c37b07" - name = "git.apache.org/thrift.git" - packages = ["lib/go/thrift"] + digest = "1:4f726c47cabd8cf517114ff99d0bc16d23ae4e1cfe50c94986c57d90fc66a941" + name = "github.com/DataDog/datadog-go" + packages = ["statsd"] pruneopts = "UT" - revision = "286eee16b147a302ddc7b10740c5e5401ebbec17" - source = "github.com/apache/thrift" + revision = "b5f99e5a502785e43356d1f710e8ae1ee948503b" + version = "v4.0.0" [[projects]] - digest = "1:1d3ad0f6a57c08e2168089a64c34313930571fcbe5359d71c608a97ce504f7ca" + digest = "1:f47f56c0975afe777b239cc03631011db2667a51e59b177bf318748724d4455b" + name = "github.com/GoogleCloudPlatform/microservices-demo" + packages = ["src/shippingservice/genproto"] + pruneopts = "UT" + revision = "c2095a7d4b8abd538251b705325d6a493a23e009" + version = "v0.2.0" + +[[projects]] + digest = "1:9d2705f9d2e7da697c24b2ab104567b155107b2aad26ca615973c0a8f02f757a" name = "github.com/golang/protobuf" packages = [ + "jsonpb", "proto", "protoc-gen-go/descriptor", "ptypes", @@ -52,19 +60,41 @@ "ptypes/empty", "ptypes/struct", "ptypes/timestamp", - "ptypes/wrappers" + "ptypes/wrappers", ] pruneopts = "UT" - revision = "b5d812f8a3706043e23a9cd5babf2e5423744d30" - version = "v1.3.1" + revision = "d04d7b157bb510b1e0c10132224b616ac0e26b17" + version = "v1.4.2" + +[[projects]] + digest = "1:85af59d73a44bd58f524cf05dee34a5021afe1fa4a852079b535c38ae2d1a2e8" + name = "github.com/google/go-cmp" + packages = [ + "cmp", + "cmp/internal/diff", + "cmp/internal/flags", + "cmp/internal/function", + "cmp/internal/value", + ] + pruneopts = "UT" + revision = "9680bfaf28748393e28e00238d94070fb9972fd8" + version = "v0.5.1" [[projects]] branch = "master" - digest = "1:dcb1edb161b1b1cac9aedf2a17b9b2c7829e242624968875a3c1b97dd9f4ef00" + digest = "1:7f49181edc3aa34ec3145a0050ce4af901a9c3238774f362784ce39227bc1f3a" name = "github.com/google/pprof" packages = ["profile"] pruneopts = "UT" - revision = "54271f7e092ff31b10b7626fee166cbc6304e350" + revision = "1a94d8640e99342fa76ae6296aaa921d08ac451f" + +[[projects]] + digest = "1:582b704bebaa06b48c29b0cec224a6058a09c86883aaddabde889cd1a5f73e1b" + name = "github.com/google/uuid" + packages = ["."] + pruneopts = "UT" + revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4" + version = "v1.1.1" [[projects]] digest = "1:766102087520f9d54f2acc72bd6637045900ac735b4a419b128d216f0c5c4876" @@ -75,41 +105,55 @@ version = "v2.0.5" [[projects]] - digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" + digest = "1:09cb61dc19af93deae01587e2fdb1c081e0bf48f1a5ad5fa24f48750dc57dce8" name = "github.com/konsorten/go-windows-terminal-sequences" packages = ["."] pruneopts = "UT" - revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" - version = "v1.0.2" + revision = "edb144dfd453055e1e49a3d8b410a660b5a87613" + version = "v1.0.3" [[projects]] - digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" + digest = "1:5e73b34a27d827212102605789de00bd411b2e434812133c83935fe9897c75e1" + name = "github.com/philhofer/fwd" + packages = ["."] + pruneopts = "UT" + revision = "bb6d471dc95d4fe11e432687f8b70ff496cf3136" + version = "v1.0.0" + +[[projects]] + digest = "1:05eebdd5727fea23083fce0d98d307d70c86baed644178e81608aaa9f09ea469" name = "github.com/sirupsen/logrus" packages = ["."] pruneopts = "UT" - revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" - version = "v1.4.2" + revision = "60c74ad9be0d874af0ab0daef6ab07c5c5911f0d" + version = "v1.6.0" [[projects]] - digest = "1:be83cecd5ba066751e3f789c1faecf5a3229031c7986eb486f593a6e32446ac0" + digest = "1:6636bfca29dde8561c03e98ccddbe36240f13a01ac770d7ea07f4fd019ed6e65" + name = "github.com/tinylib/msgp" + packages = ["msgp"] + pruneopts = "UT" + revision = "4253cdaa5267687e3b7612da7ff105d4414174da" + version = "v1.1.2" + +[[projects]] + digest = "1:a6175cb931f5b9da33e92f6057e0de28badbe6dfdc32f4bf378ffd9a2c461d03" name = "github.com/uber/jaeger-client-go" packages = [ "thrift", "thrift-gen/agent", "thrift-gen/jaeger", - "thrift-gen/zipkincore" + "thrift-gen/zipkincore", ] pruneopts = "UT" - revision = "f2e1f58485aacf2975cdde9c9f5396e6d98c35ba" - version = "v2.21.1" + revision = "121ee6fb26fd9617fc30d0d95569a39c30ca3b76" + version = "v2.25.0" [[projects]] - digest = "1:a5154dfd6b37bef5a3eab759e13296348e639dc8c7604f538368167782b08ccd" + digest = "1:1bb914cfb78f68f488a91cd7872d3d06a5f83c5bbacf0296dbef44e120b00a91" name = "go.opencensus.io" packages = [ ".", - "exporter/jaeger", - "exporter/jaeger/internal/gen-go/jaeger", "internal", "internal/tagencoding", "plugin/ocgrpc", @@ -122,7 +166,7 @@ "trace", "trace/internal", "trace/propagation", - "trace/tracestate" + "trace/tracestate", ] pruneopts = "UT" revision = "b11f239c032624b045c4c2bfd3d1287b4012ce89" @@ -130,7 +174,7 @@ [[projects]] branch = "master" - digest = "1:2f357867bf425774d35beca5be718402a4488b8b23b1563ce8c5bb91d09285a7" + digest = "1:6a803f0f3ecbe7e804185a165b3e36eeb0a62f806e7fbe61e842966127991a64" name = "golang.org/x/net" packages = [ "context", @@ -140,43 +184,48 @@ "http2/hpack", "idna", "internal/timeseries", - "trace" + "trace", ] pruneopts = "UT" - revision = "da137c7871d730100384dbcf36e6f8fa493aef5b" + revision = "c89045814202410a2d67ec20ecf177ec77ceae7f" [[projects]] branch = "master" - digest = "1:31e33f76456ccf54819ab4a646cf01271d1a99d7712ab84bf1a9e7b61cd2031b" + digest = "1:79edde3241bb55de9f4143d5083bfcff722e550c3cb8db94084eab50d0e440b5" name = "golang.org/x/oauth2" packages = [ ".", "google", "internal", "jws", - "jwt" + "jwt", ] pruneopts = "UT" - revision = "0f29369cfe4552d0e4bcddc57cc75f4d7e672a33" + revision = "bf48bf16ab8d622ce64ec6ce98d2c98f916b6303" [[projects]] branch = "master" - digest = "1:382bb5a7fb4034db3b6a2d19e5a4a6bcf52f4750530603c01ca18a172fa3089b" + digest = "1:4692f916cb72b2c295f04841036d85a3f13e96d1cc9e8e4c2c30edebac518053" name = "golang.org/x/sync" packages = ["semaphore"] pruneopts = "UT" - revision = "112230192c580c3556b8cee6403af37a4fc5f28c" + revision = "6e8e738ad208923de99951fe0b48239bfd864f28" [[projects]] branch = "master" - digest = "1:730ba27cd66db3b98ec8f51a6f20d45ec277d490cca36b1f54e31d3fcaf4840e" + digest = "1:c31c46ce6a973e860a444a8a64bd56e88fa83fbbf8791f4aab48d2da878de732" name = "golang.org/x/sys" - packages = ["unix"] + packages = [ + "internal/unsafeheader", + "unix", + "windows", + "windows/registry", + ] pruneopts = "UT" - revision = "04f50cda93cbb67f2afa353c52f342100e80e625" + revision = "fda516888d292084949c284313e463073fc40876" [[projects]] - digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405" + digest = "1:fa940333c48808b0d86ef21f412ffcfd0e5084a82f13905c028a404803b1908f" name = "golang.org/x/text" packages = [ "collate", @@ -194,15 +243,34 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] pruneopts = "UT" - revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" - version = "v0.3.2" + revision = "23ae387dee1f90d29a23c0e87ee0b46038fbed0e" + version = "v0.3.3" [[projects]] branch = "master" - digest = "1:bc06b12d8436550fccc0212037e9281a7e4d53db25c2349eb3cc6c3457e0406b" + digest = "1:9a12483c63e8328a477280cd6855689af0f584eb580b66c0d113a1f5fe7791b0" + name = "golang.org/x/time" + packages = ["rate"] + pruneopts = "UT" + revision = "3af7569d3a1e776fc2a3c1cec133b43105ea9c2e" + +[[projects]] + branch = "master" + digest = "1:918a46e4a2fb83df33f668f5a6bd51b2996775d073fce1800d3ec01b0a5ddd2b" + name = "golang.org/x/xerrors" + packages = [ + ".", + "internal", + ] + pruneopts = "UT" + revision = "5ec99f83aff198f5fbd629d6c8d8eb38a04218ca" + +[[projects]] + branch = "master" + digest = "1:915974b5a6bab2524bb29da168f660beef91eb5cdb314d4e23392f61b9d3956f" name = "google.golang.org/api" packages = [ "googleapi/transport", @@ -211,15 +279,16 @@ "option", "support/bundler", "transport", + "transport/cert", "transport/grpc", "transport/http", - "transport/http/internal/propagation" + "transport/http/internal/propagation", ] pruneopts = "UT" - revision = "aae1d1b89c27132abe4fa22731a2a61e7089079c" + revision = "2560edae6c50e363c98be06e7c2ce2dcb393aa63" [[projects]] - digest = "1:2c26b1c47556c0e5e73cdb05d8361c463737eee4baac35d38b40c728c3074a94" + digest = "1:9a3c550c85a5a62ccc4cadd8525497b99554094a1adecc560c97bebc231ca81b" name = "google.golang.org/appengine" packages = [ ".", @@ -233,15 +302,15 @@ "internal/socket", "internal/urlfetch", "socket", - "urlfetch" + "urlfetch", ] pruneopts = "UT" - revision = "b2f4a3cf3c67576a2ee09e1fe62656a5086ce880" - version = "v1.6.1" + revision = "553959209a20f3be281c16dd5be5c740a893978f" + version = "v1.6.6" [[projects]] branch = "master" - digest = "1:cb0f37e3cdf50a27abbf33a48797b30786239d4fd69dbfbbc63cfa19d400d3ce" + digest = "1:03c2b11b1e1f705b0f5cfc21a5e2b3e0e71456173cd52591c7478b3d1f2c9792" name = "google.golang.org/genproto" packages = [ "googleapis/api", @@ -255,20 +324,24 @@ "googleapis/monitoring/v3", "googleapis/rpc/errdetails", "googleapis/rpc/status", - "protobuf/field_mask" + "googleapis/type/calendarperiod", + "protobuf/field_mask", ] pruneopts = "UT" - revision = "3bdd9d9f5532d75d09efb230bd767d265245cfe5" + revision = "f69a88009b70a94c67e3910bf1663f5df9fbfc6d" [[projects]] - digest = "1:c68a5ee8060d988d82cd42bf0a53f5ec24d40ea20d341346b26dbf74b1d95a1c" + digest = "1:20f515b65fd0981c979f7f329677add92a6fc0f36c87d2ef07f664a43636a2ac" name = "google.golang.org/grpc" packages = [ ".", + "attributes", + "backoff", "balancer", "balancer/base", "balancer/grpclb", "balancer/grpclb/grpc_lb_v1", + "balancer/grpclb/state", "balancer/roundrobin", "binarylog/grpc_binarylog_v1", "codes", @@ -292,29 +365,98 @@ "internal/backoff", "internal/balancerload", "internal/binarylog", + "internal/buffer", "internal/channelz", + "internal/credentials", "internal/envconfig", + "internal/grpclog", "internal/grpcrand", "internal/grpcsync", + "internal/grpcutil", + "internal/resolver/dns", + "internal/resolver/passthrough", + "internal/serviceconfig", + "internal/status", "internal/syscall", "internal/transport", "keepalive", "metadata", - "naming", "peer", "reflection", "reflection/grpc_reflection_v1alpha", "resolver", - "resolver/dns", - "resolver/passthrough", "serviceconfig", "stats", "status", - "tap" + "tap", ] pruneopts = "UT" - revision = "1d89a3c832915b2314551c1d2a506874d62e53f7" - version = "v1.22.0" + revision = "bde0263672f027525e2950992a4c7db7af572b59" + version = "v1.31.0" + +[[projects]] + digest = "1:4a0202ad403c5a9c79ae7d6673aabb8e4ae2163654167229a49cc0155687effa" + name = "google.golang.org/protobuf" + packages = [ + "encoding/protojson", + "encoding/prototext", + "encoding/protowire", + "internal/descfmt", + "internal/descopts", + "internal/detrand", + "internal/encoding/defval", + "internal/encoding/json", + "internal/encoding/messageset", + "internal/encoding/tag", + "internal/encoding/text", + "internal/errors", + "internal/fieldsort", + "internal/filedesc", + "internal/filetype", + "internal/flags", + "internal/genid", + "internal/impl", + "internal/mapsort", + "internal/pragma", + "internal/set", + "internal/strs", + "internal/version", + "proto", + "reflect/protoreflect", + "reflect/protoregistry", + "runtime/protoiface", + "runtime/protoimpl", + "types/descriptorpb", + "types/known/anypb", + "types/known/durationpb", + "types/known/emptypb", + "types/known/fieldmaskpb", + "types/known/structpb", + "types/known/timestamppb", + "types/known/wrapperspb", + ] + pruneopts = "UT" + revision = "3f7a61f89bb6813f89d981d1870ed68da0b3c3f1" + version = "v1.25.0" + +[[projects]] + digest = "1:c4d5c7382aa68038f57265590b6025bebb3d41fdd66bc8474f0644b422130890" + name = "gopkg.in/DataDog/dd-trace-go.v1" + packages = [ + "contrib/google.golang.org/grpc", + "contrib/google.golang.org/internal/grpcutil", + "ddtrace", + "ddtrace/ext", + "ddtrace/internal", + "ddtrace/tracer", + "internal", + "internal/globalconfig", + "internal/log", + "internal/version", + ] + pruneopts = "UT" + revision = "6d7c52cd8ab1ea309fd54c1a2ef472fadb84429c" + version = "v1.26.0" [solve-meta] analyzer-name = "dep" @@ -323,9 +465,9 @@ "cloud.google.com/go/profiler", "contrib.go.opencensus.io/exporter/jaeger", "contrib.go.opencensus.io/exporter/stackdriver", + "github.com/GoogleCloudPlatform/microservices-demo/src/shippingservice/genproto", "github.com/golang/protobuf/proto", "github.com/sirupsen/logrus", - "go.opencensus.io/exporter/jaeger", "go.opencensus.io/plugin/ocgrpc", "go.opencensus.io/stats/view", "go.opencensus.io/trace", @@ -334,7 +476,9 @@ "google.golang.org/grpc/codes", "google.golang.org/grpc/health/grpc_health_v1", "google.golang.org/grpc/reflection", - "google.golang.org/grpc/status" + "google.golang.org/grpc/status", + "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc", + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/src/shippingservice/main.go b/src/shippingservice/main.go index a13e417..be9124b 100644 --- a/src/shippingservice/main.go +++ b/src/shippingservice/main.go @@ -32,7 +32,8 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" - + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + gt "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc" pb "github.com/GoogleCloudPlatform/microservices-demo/src/shippingservice/genproto" healthpb "google.golang.org/grpc/health/grpc_health_v1" ) @@ -58,6 +59,13 @@ func init() { } func main() { + + tracer.Start( + tracer.WithEnv("prod"), + tracer.WithService("shippingservice"), + ) + defer tracer.Stop() + if os.Getenv("DISABLE_TRACING") == "" { log.Info("Tracing enabled.") go initTracing() @@ -84,13 +92,24 @@ func main() { } var srv *grpc.Server + // Default stats/traces enabled if os.Getenv("DISABLE_STATS") == "" { log.Info("Stats enabled.") srv = grpc.NewServer(grpc.StatsHandler(&ocgrpc.ServerHandler{})) + } else if os.Getenv("DATADOG_APM_ENABLED") == "true" { //datadog traces enabled + // Create the server interceptor using the grpc trace package. + log.Info("Datadog tracing enabled.") + grpc_option := gt.WithServiceName(os.Getenv("DD_SERVICE")) + unary_server_trace := gt.UnaryServerInterceptor(grpc_option) + stream_server_trace := gt.StreamServerInterceptor(grpc_option) + unary_trace := grpc.UnaryInterceptor(unary_server_trace) + stream_trace := grpc.StreamInterceptor(stream_server_trace) + srv = grpc.NewServer(unary_trace, stream_trace) } else { - log.Info("Stats disabled.") - srv = grpc.NewServer() + log.Info("Stats disabled.") + srv = grpc.NewServer() } + svc := &server{} pb.RegisterShippingServiceServer(srv, svc) healthpb.RegisterHealthServer(srv, svc) From d04a5384a552de0d5890842a09d0bc9b30e121d5 Mon Sep 17 00:00:00 2001 From: Rahul Jagad Date: Mon, 24 Aug 2020 22:17:29 -0700 Subject: [PATCH 2/4] Kubernetes and Docker related changes for support environment variables --- kubernetes-manifests/checkoutservice.yaml | 4 + kubernetes-manifests/emailservice.yaml | 12 +- kubernetes-manifests/frontend.yaml | 6 +- .../productcatalogservice.yaml | 6 +- .../recommendationservice.yaml | 8 + kubernetes-manifests/shippingservice.yaml | 6 +- release/kubernetes-manifests.yaml | 181 +++++++++++++----- skaffold.yaml | 2 +- src/emailservice/Dockerfile | 3 - src/recommendationservice/Dockerfile | 3 - 10 files changed, 170 insertions(+), 61 deletions(-) diff --git a/kubernetes-manifests/checkoutservice.yaml b/kubernetes-manifests/checkoutservice.yaml index 25b6f60..912083e 100644 --- a/kubernetes-manifests/checkoutservice.yaml +++ b/kubernetes-manifests/checkoutservice.yaml @@ -58,10 +58,14 @@ spec: # Enable datadog tracing - name: DATADOG_APM_ENABLED value: "true" + - name: DD_LOGS_INJECTION + value: "true" - name: DD_ENV value: "prod" - name: DD_SERVICE value: "checkoutservice" + - name: DD_VERSION + value: "latest" - name: DD_LOG_LEVEL value: "debug" # Disable default opentracing ? diff --git a/kubernetes-manifests/emailservice.yaml b/kubernetes-manifests/emailservice.yaml index 5569009..b7873c4 100644 --- a/kubernetes-manifests/emailservice.yaml +++ b/kubernetes-manifests/emailservice.yaml @@ -36,10 +36,18 @@ spec: valueFrom: fieldRef: fieldPath: status.hostIP + - name: DD_ENV + value: "prod" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_SERVICE + value: "emailservice" + - name: DD_VERSION + value: "latest" - name: PORT value: "8080" - # - name: DISABLE_TRACING - # value: "1" + - name: DISABLE_TRACING + value: "1" - name: DISABLE_PROFILER value: "1" readinessProbe: diff --git a/kubernetes-manifests/frontend.yaml b/kubernetes-manifests/frontend.yaml index 2ef974b..e2b91a7 100644 --- a/kubernetes-manifests/frontend.yaml +++ b/kubernetes-manifests/frontend.yaml @@ -73,12 +73,16 @@ spec: fieldPath: status.hostIP - name: DATADOG_APM_ENABLED value: "true" + - name: DD_LOGS_INJECTION + value: "true" - name: DD_ENV value: "prod" - name: DD_SERVICE value: "frontend" + - name: DD_VERSION + value: "latest" - name: DD_LOG_LEVEL - value: "debug" + value: "info" - name: DISABLE_TRACING value: "1" - name: DISABLE_PROFILER diff --git a/kubernetes-manifests/productcatalogservice.yaml b/kubernetes-manifests/productcatalogservice.yaml index 69ec164..e8efd1e 100644 --- a/kubernetes-manifests/productcatalogservice.yaml +++ b/kubernetes-manifests/productcatalogservice.yaml @@ -42,10 +42,14 @@ spec: value: "true" - name: DD_ENV value: "prod" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_VERSION + value: "latest" - name: DD_SERVICE value: "productcatalogservice" - name: DD_LOG_LEVEL - value: "debug" + value: "info" - name: DISABLE_STATS value: "1" - name: DISABLE_TRACING diff --git a/kubernetes-manifests/recommendationservice.yaml b/kubernetes-manifests/recommendationservice.yaml index 7e71d80..6d74837 100644 --- a/kubernetes-manifests/recommendationservice.yaml +++ b/kubernetes-manifests/recommendationservice.yaml @@ -44,6 +44,14 @@ spec: valueFrom: fieldRef: fieldPath: status.hostIP + - name: DD_ENV + value: "prod" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_SERVICE + value: "recommendationservice" + - name: DD_VERSION + value: "latest" - name: PORT value: "8080" - name: PRODUCT_CATALOG_SERVICE_ADDR diff --git a/kubernetes-manifests/shippingservice.yaml b/kubernetes-manifests/shippingservice.yaml index aaa4dbf..29b54e6 100644 --- a/kubernetes-manifests/shippingservice.yaml +++ b/kubernetes-manifests/shippingservice.yaml @@ -39,12 +39,16 @@ spec: fieldPath: status.hostIP - name: DATADOG_APM_ENABLED value: "true" + - name: DD_LOGS_INJECTION + value: "true" - name: DD_ENV value: "prod" - name: DD_SERVICE value: "shippingservice" + - name: DD_VERSION + value: "latest" - name: DD_LOG_LEVEL - value: "debug" + value: "info" - name: DISABLE_STATS value: "1" - name: DISABLE_TRACING diff --git a/release/kubernetes-manifests.yaml b/release/kubernetes-manifests.yaml index eb29927..49b77ef 100644 --- a/release/kubernetes-manifests.yaml +++ b/release/kubernetes-manifests.yaml @@ -32,14 +32,27 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/emailservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/emailservice:latest ports: - containerPort: 8080 env: - name: PORT value: "8080" - # - name: DISABLE_TRACING - # value: "1" + # Enable datadog tracing + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DD_ENV + value: "prod" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_SERVICE + value: "emailservice" + - name: DD_VERSION + value: "latest" + - name: DISABLE_TRACING + value: "1" - name: DISABLE_PROFILER value: "1" readinessProbe: @@ -86,7 +99,7 @@ spec: spec: containers: - name: server - image: gcr.io/google-samples/microservices-demo/checkoutservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/checkoutservice:latest ports: - containerPort: 5050 readinessProbe: @@ -110,14 +123,29 @@ spec: value: "currencyservice:7000" - name: CART_SERVICE_ADDR value: "cartservice:7070" - # - name: DISABLE_STATS - # value: "1" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" - # - name: JAEGER_SERVICE_ADDR - # value: "jaeger-collector:14268" + # Enable datadog tracing + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "checkoutservice" + - name: DD_VERSION + value: "latest" + - name: DISABLE_STATS + value: "1" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" + - name: JAEGER_SERVICE_ADDR + value: "jaeger-collector:14268" resources: requests: cpu: 100m @@ -155,7 +183,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/recommendationservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/recommendationservice:latest ports: - containerPort: 8080 readinessProbe: @@ -171,12 +199,24 @@ spec: value: "8080" - name: PRODUCT_CATALOG_SERVICE_ADDR value: "productcatalogservice:3550" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" - # - name: DISABLE_DEBUGGER - # value: "1" + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DD_ENV + value: "prod" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_SERVICE + value: "recommendationservice" + - name: DD_VERSION + value: "latest" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" + - name: DISABLE_DEBUGGER + value: "1" resources: requests: cpu: 100m @@ -215,7 +255,7 @@ spec: spec: containers: - name: server - image: gcr.io/google-samples/microservices-demo/frontend:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/frontend:latest ports: - containerPort: 8080 readinessProbe: @@ -253,12 +293,25 @@ spec: value: "adservice:9555" - name: ENV_PLATFORM value: "gcp" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" - # - name: JAEGER_SERVICE_ADDR - # value: "jaeger-collector:14268" + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + # Enable datadog tracing + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "frontend" + - name: DD_VERSION + value: "latest" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" + - name: JAEGER_SERVICE_ADDR + value: "jaeger-collector:14268" resources: requests: cpu: 100m @@ -309,7 +362,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/paymentservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/paymentservice:latest ports: - containerPort: 50051 env: @@ -358,20 +411,35 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/productcatalogservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/productcatalogservice:latest ports: - containerPort: 3550 env: - name: PORT value: "3550" - # - name: DISABLE_STATS - # value: "1" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" - # - name: JAEGER_SERVICE_ADDR - # value: "jaeger-collector:14268" + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + # Enable datadog tracing + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "productcatalogservice" + - name: DD_VERSION + value: "latest" + - name: DISABLE_STATS + value: "1" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" + - name: JAEGER_SERVICE_ADDR + value: "jaeger-collector:14268" readinessProbe: exec: command: ["/bin/grpc_health_probe", "-addr=:3550"] @@ -415,7 +483,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/cartservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/cartservice:latest ports: - containerPort: 7070 env: @@ -475,7 +543,7 @@ spec: restartPolicy: Always containers: - name: main - image: gcr.io/google-samples/microservices-demo/loadgenerator:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/loadgenerator:latest env: - name: FRONTEND_ADDR value: "frontend:80" @@ -505,7 +573,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/currencyservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/currencyservice:latest ports: - name: grpc containerPort: 7000 @@ -560,20 +628,35 @@ spec: spec: containers: - name: server - image: gcr.io/google-samples/microservices-demo/shippingservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/shippingservice:latest ports: - containerPort: 50051 env: - name: PORT value: "50051" - # - name: DISABLE_STATS - # value: "1" - # - name: DISABLE_TRACING - # value: "1" - # - name: DISABLE_PROFILER - # value: "1" - # - name: JAEGER_SERVICE_ADDR - # value: "jaeger-collector:14268" + # Enable datadog tracing + - name: DD_AGENT_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: DATADOG_APM_ENABLED + value: "true" + - name: DD_LOGS_INJECTION + value: "true" + - name: DD_ENV + value: "prod" + - name: DD_SERVICE + value: "shippingservice" + - name: DD_VERSION + value: "latest" + - name: DISABLE_STATS + value: "1" + - name: DISABLE_TRACING + value: "1" + - name: DISABLE_PROFILER + value: "1" + - name: JAEGER_SERVICE_ADDR + value: "jaeger-collector:14268" readinessProbe: periodSeconds: 5 exec: @@ -671,7 +754,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/google-samples/microservices-demo/adservice:v0.2.0 + image: gcr.io/relyance-internal/boutique-app/adservice:latest ports: - containerPort: 9555 env: diff --git a/skaffold.yaml b/skaffold.yaml index dfd6aeb..127436c 100644 --- a/skaffold.yaml +++ b/skaffold.yaml @@ -43,7 +43,7 @@ build: - image: adservice context: src/adservice tagPolicy: - gitCommit: {} + sha256: {} # the sha256 always tags the images as `latest` (which points to sha256 of the image built) deploy: kubectl: manifests: diff --git a/src/emailservice/Dockerfile b/src/emailservice/Dockerfile index a3679fe..26be3de 100644 --- a/src/emailservice/Dockerfile +++ b/src/emailservice/Dockerfile @@ -49,8 +49,5 @@ COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/ # Add the application COPY . . -ENV DD_LOGS_INJECTION=true -ENV DD_ENV=prod -ENV DD_SERVICE=emailservice EXPOSE 8080 ENTRYPOINT [ "ddtrace-run", "python", "email_server.py" ] diff --git a/src/recommendationservice/Dockerfile b/src/recommendationservice/Dockerfile index 4e0d44c..e906745 100644 --- a/src/recommendationservice/Dockerfile +++ b/src/recommendationservice/Dockerfile @@ -18,9 +18,6 @@ RUN apt-get update -qqy && \ rm -rf /var/lib/apt/lists/* # show python logs as they occur ENV PYTHONUNBUFFERED=0 -ENV DD_LOGS_INJECTION=true -ENV DD_ENV=prod -ENV DD_SERVICE=recommendationservice # download the grpc health probe RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \ From c7f718a7f186b81e7c9ba6c4b4029da34bbf2c17 Mon Sep 17 00:00:00 2001 From: Rahul Jagad Date: Mon, 24 Aug 2020 22:58:24 -0700 Subject: [PATCH 3/4] Integrate datadog agent into the boutique app --- release/kubernetes-manifests.yaml | 246 ++++++++++++++++++++++++++++++ 1 file changed, 246 insertions(+) diff --git a/release/kubernetes-manifests.yaml b/release/kubernetes-manifests.yaml index 49b77ef..1de8402 100644 --- a/release/kubernetes-manifests.yaml +++ b/release/kubernetes-manifests.yaml @@ -16,6 +16,252 @@ # WARNING: This file is autogenerated. Do not manually edit. # ---------------------------------------------------------- +# Source: datadog/templates/daemonset.yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: datadog-agent + labels: {} +spec: + selector: + matchLabels: + app: datadog-agent + template: + metadata: + labels: + app: datadog-agent + name: datadog-agent + annotations: {} + spec: + containers: + - name: agent + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["agent", "run"] + resources: {} + ports: + - containerPort: 8125 + name: dogstatsdport + protocol: UDP + env: + - name: DD_CRI_SOCKET_PATH + value: "unix:///host/var/run/docker.sock" + - name: DD_KUBELET_TLS_VERIFY + value: "false" + # To pick the docker logs directly and submit it to the datadog server. + - name: DOCKER_HOST + value: "unix:///host/var/run/docker.sock" + #TODO : API key needs to be used from the "secrets" container above, but + # somehow its not working currently and so putting the secret directly here. + # The problem that i am facing is the "secrets" against is somehow adding the newline + # character to the key making the key invalid and hence not working. + - name: DD_API_KEY + value: "77ed0972ca94340f9db3fb78ee5e89cc" + # valueFrom: + # secretKeyRef: + # name: "datadog-agent" + # key: api-key + - name: DD_KUBERNETES_KUBELET_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: KUBERNETES + value: "yes" + - name: DD_CONTAINER_EXCLUDE + value: "image:datadog/agent" + - name: DD_AC_EXCLUDE + value: "name:datadog-agent" + - name: DD_LOG_LEVEL + value: "INFO" + - name: DD_DOGSTATSD_PORT + value: "8125" + - name: DD_LEADER_ELECTION + value: "true" + - name: DD_COLLECT_KUBERNETES_EVENTS + value: "true" + - name: DD_APM_ENABLED + value: "true" + - name: DD_LOGS_ENABLED + value: "true" + - name: DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL + value: "true" + - name: DD_LOGS_CONFIG_K8S_CONTAINER_USE_FILE + value: "true" + - name: DD_HEALTH_PORT + value: "5555" + volumeMounts: + - name: config + mountPath: /etc/datadog-agent + - name: runtimesocketdir + mountPath: /host/var/run + readOnly: true + - name: procdir + mountPath: /host/proc + readOnly: true + - name: cgroups + mountPath: /host/sys/fs/cgroup + readOnly: true + - name: pointerdir + mountPath: /opt/datadog-agent/run + - name: logpodpath + mountPath: /var/log/pods + readOnly: true + - name: logdockercontainerpath + mountPath: /var/lib/docker/containers + readOnly: true + # - name: dockersocketdir + # mountPath: /host/var/run + livenessProbe: + failureThreshold: 6 + httpGet: + path: /live + port: 5555 + initialDelaySeconds: 15 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 5 + readinessProbe: + failureThreshold: 6 + httpGet: + path: /ready + port: 5555 + initialDelaySeconds: 15 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 5 + - name: trace-agent + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["trace-agent", "-config=/etc/datadog-agent/datadog.yaml"] + resources: {} + ports: + - containerPort: 8126 + hostPort: 8126 + name: traceport + protocol: TCP + env: + #TODO : API key needs to be used from the "secrets" container above, but + # somehow its not working currently and so putting the secret directly here. + # The problem that i am facing is the "secrets" against is somehow adding the newline + # character to the key making the key invalid and hence not working. + - name: DD_API_KEY + value: "77ed0972ca94340f9db3fb78ee5e89cc" + # valueFrom: + # secretKeyRef: + # name: "datadog-agent" + # key: api-key + - name: DD_KUBERNETES_KUBELET_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: KUBERNETES + value: "yes" + - name: DD_CONTAINER_EXCLUDE + value: "image:datadog/agent" + - name: DOCKER_HOST + value: "unix:///host/var/run/docker.sock" + - name: DD_LOG_LEVEL + value: "debug" + - name: DD_APM_ENABLED + value: "true" + - name: DD_APM_NON_LOCAL_TRAFFIC + value: "true" + - name: DD_APM_RECEIVER_PORT + value: "8126" + volumeMounts: + - name: config + mountPath: /etc/datadog-agent + - name: runtimesocketdir + mountPath: /host/var/run + readOnly: true + livenessProbe: + initialDelaySeconds: 15 + periodSeconds: 15 + tcpSocket: + port: 8126 + timeoutSeconds: 5 + initContainers: + - name: init-volume + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["bash", "-c"] + args: + - cp -r /etc/datadog-agent /opt + volumeMounts: + - name: config + mountPath: /opt/datadog-agent + resources: {} + - name: init-config + image: "datadog/agent:7.21.1" + imagePullPolicy: IfNotPresent + command: ["bash", "-c"] + args: + - for script in $(find /etc/cont-init.d/ -type f -name '*.sh' | sort) ; do bash $script ; done + volumeMounts: + - name: config + mountPath: /etc/datadog-agent + - name: procdir + mountPath: /host/proc + readOnly: true + - name: runtimesocketdir + mountPath: /host/var/run + readOnly: true + env: + #TODO : API key needs to be used from the "secrets" container above, but + # somehow its not working currently and so putting the secret directly here. + # The problem that i am facing is the "secrets" against is somehow adding the newline + # character to the key making the key invalid and hence not working. + - name: DD_API_KEY + value: "77ed0972ca94340f9db3fb78ee5e89cc" + - name: DD_KUBERNETES_KUBELET_HOST + valueFrom: + fieldRef: + fieldPath: status.hostIP + - name: KUBERNETES + value: "yes" + - name: DD_AC_EXCLUDE + value: "name:datadog-agent" + - name: DOCKER_HOST + value: "unix:///host/var/run/docker.sock" + - name: DD_LEADER_ELECTION + value: "true" + resources: {} + volumes: + - name: config + emptyDir: {} + - hostPath: + path: /var/run + name: runtimesocketdir + - hostPath: + path: /proc + name: procdir + - hostPath: + path: /sys/fs/cgroup + name: cgroups + - name: s6-run + emptyDir: {} + - hostPath: + path: "/var/lib/datadog-agent/logs" + name: pointerdir + - hostPath: + path: /var/log/pods + name: logpodpath + - hostPath: + path: /var/lib/docker/containers + name: logdockercontainerpath + - hostPath: + path: /var/run + name: dockersocketdir + tolerations: + affinity: {} + serviceAccountName: "datadog-agent" + nodeSelector: + kubernetes.io/os: linux + updateStrategy: + rollingUpdate: + maxUnavailable: 10% + type: RollingUpdate +--- apiVersion: apps/v1 kind: Deployment metadata: From a426a799bde799f4ade0d552f4b7144b5b50ec75 Mon Sep 17 00:00:00 2001 From: Rahul Jagad Date: Mon, 31 Aug 2020 18:01:53 -0700 Subject: [PATCH 4/4] Programmatically include the tracing for datadog --- src/emailservice/Dockerfile | 2 +- src/emailservice/email_client.py | 4 ++++ src/emailservice/email_server.py | 5 +++++ src/recommendationservice/recommendation_server.py | 3 +++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/emailservice/Dockerfile b/src/emailservice/Dockerfile index 26be3de..80224ad 100644 --- a/src/emailservice/Dockerfile +++ b/src/emailservice/Dockerfile @@ -50,4 +50,4 @@ COPY --from=builder /usr/local/lib/python3.7/ /usr/local/lib/python3.7/ # Add the application COPY . . EXPOSE 8080 -ENTRYPOINT [ "ddtrace-run", "python", "email_server.py" ] +ENTRYPOINT [ "python", "email_server.py" ] diff --git a/src/emailservice/email_client.py b/src/emailservice/email_client.py index c31f4ef..7101512 100644 --- a/src/emailservice/email_client.py +++ b/src/emailservice/email_client.py @@ -25,6 +25,9 @@ logger = getJSONLogger('emailservice-client') from opencensus.trace.tracer import Tracer from opencensus.trace.exporters import stackdriver_exporter from opencensus.trace.ext.grpc import client_interceptor +from ddtrace import patch_all +patch_all() +from ddtrace import tracer try: exporter = stackdriver_exporter.StackdriverExporter() @@ -33,6 +36,7 @@ try: except: tracer_interceptor = client_interceptor.OpenCensusClientInterceptor() +@tracer.wrap('send_confirmation_email', service='emailservice') def send_confirmation_email(email, order): channel = grpc.insecure_channel('0.0.0.0:8080') channel = grpc.intercept_channel(channel, tracer_interceptor) diff --git a/src/emailservice/email_server.py b/src/emailservice/email_server.py index 9380ebb..ee5fc71 100644 --- a/src/emailservice/email_server.py +++ b/src/emailservice/email_server.py @@ -38,6 +38,10 @@ from opencensus.trace.samplers import always_on # import googleclouddebugger import googlecloudprofiler +from ddtrace import patch_all +patch_all() +from ddtrace import tracer + from logger import getJSONLogger logger = getJSONLogger('emailservice-server') @@ -118,6 +122,7 @@ class HealthCheck(): return health_pb2.HealthCheckResponse( status=health_pb2.HealthCheckResponse.SERVING) +@tracer.wrap('start', service='emailservice') def start(dummy_mode): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), interceptors=(tracer_interceptor,)) diff --git a/src/recommendationservice/recommendation_server.py b/src/recommendationservice/recommendation_server.py index 1219555..67d598a 100644 --- a/src/recommendationservice/recommendation_server.py +++ b/src/recommendationservice/recommendation_server.py @@ -38,6 +38,9 @@ from grpc_health.v1 import health_pb2_grpc from logger import getJSONLogger logger = getJSONLogger('recommendationservice-server') +from ddtrace import patch_all +patch_all() + def initStackdriverProfiling(): project_id = None try: