Skip to content
This repository was archived by the owner on Jul 14, 2025. It is now read-only.

Commit 1549eac

Browse files
c24toplik0
authored andcommitted
Re-enable opencensus python (#103)
Enables tracing in the email and recommendation services, which was disabled in 316db88 because of a memory leak in the stackdriver exporter. We fixed the leak in googleapis/google-cloud-python#6856. The fix is included in the [0.1.10 release of opencensus-python](https://github.com/census-instrumentation/opencensus-python/releases/tag/v0.1.10). With this diff, traces show up as expected in stackdriver while running the demo on GKE. Using an `opencensus-python` package version before `0.1.10` causes the email and recommendation services to leak memory until they OOM. Memory use is back to normal (i.e. roughly constant) using the new package version.
1 parent 925e3f5 commit 1549eac

6 files changed

Lines changed: 47 additions & 52 deletions

File tree

src/emailservice/Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ RUN apk add --update --no-cache \
1313
# App Deps
1414
cairo-dev \
1515
cairo \
16-
openssl-dev \
16+
openssl-dev \
1717
gobject-introspection-dev
1818

1919
# get packages
@@ -42,4 +42,4 @@ RUN apk add --no-cache libstdc++
4242
COPY . .
4343

4444
EXPOSE 8080
45-
ENTRYPOINT [ "python", "email_server.py" ]
45+
ENTRYPOINT [ "python", "email_server.py" ]

src/emailservice/email_client.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,20 @@
2222
from logger import getJSONLogger
2323
logger = getJSONLogger('emailservice-client')
2424

25-
# from opencensus.trace.tracer import Tracer
26-
# from opencensus.trace.exporters import stackdriver_exporter
27-
# from opencensus.trace.ext.grpc import client_interceptor
25+
from opencensus.trace.tracer import Tracer
26+
from opencensus.trace.exporters import stackdriver_exporter
27+
from opencensus.trace.ext.grpc import client_interceptor
2828

29-
# try:
30-
# exporter = stackdriver_exporter.StackdriverExporter()
31-
# tracer = Tracer(exporter=exporter)
32-
# tracer_interceptor = client_interceptor.OpenCensusClientInterceptor(tracer, host_port='0.0.0.0:8080')
33-
# except:
34-
# tracer_interceptor = client_interceptor.OpenCensusClientInterceptor()
29+
try:
30+
exporter = stackdriver_exporter.StackdriverExporter()
31+
tracer = Tracer(exporter=exporter)
32+
tracer_interceptor = client_interceptor.OpenCensusClientInterceptor(tracer, host_port='0.0.0.0:8080')
33+
except:
34+
tracer_interceptor = client_interceptor.OpenCensusClientInterceptor()
3535

3636
def send_confirmation_email(email, order):
3737
channel = grpc.insecure_channel('0.0.0.0:8080')
38-
# channel = grpc.intercept_channel(channel, tracer_interceptor)
38+
channel = grpc.intercept_channel(channel, tracer_interceptor)
3939
stub = demo_pb2_grpc.EmailServiceStub(channel)
4040
try:
4141
response = stub.SendOrderConfirmation(demo_pb2.SendOrderConfirmationRequest(

src/emailservice/email_server.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,19 +28,18 @@
2828
from grpc_health.v1 import health_pb2
2929
from grpc_health.v1 import health_pb2_grpc
3030

31-
# from opencensus.trace.ext.grpc import server_interceptor
32-
# from opencensus.trace.samplers import always_on
33-
# from opencensus.trace.exporters import stackdriver_exporter
34-
# from opencensus.trace.exporters import print_exporter
31+
from opencensus.trace.exporters import stackdriver_exporter
32+
from opencensus.trace.ext.grpc import server_interceptor
33+
from opencensus.trace.samplers import always_on
3534

3635
# import googleclouddebugger
3736

38-
# try:
39-
# sampler = always_on.AlwaysOnSampler()
40-
# exporter = stackdriver_exporter.StackdriverExporter()
41-
# tracer_interceptor = server_interceptor.OpenCensusServerInterceptor(sampler, exporter)
42-
# except:
43-
# tracer_interceptor = server_interceptor.OpenCensusServerInterceptor()
37+
try:
38+
sampler = always_on.AlwaysOnSampler()
39+
exporter = stackdriver_exporter.StackdriverExporter()
40+
tracer_interceptor = server_interceptor.OpenCensusServerInterceptor(sampler, exporter)
41+
except:
42+
tracer_interceptor = server_interceptor.OpenCensusServerInterceptor()
4443

4544
# try:
4645
# googleclouddebugger.enable(
@@ -123,7 +122,8 @@ def Check(self, request, context):
123122
status=health_pb2.HealthCheckResponse.SERVING)
124123

125124
def start(dummy_mode):
126-
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))#, interceptors=(tracer_interceptor,))
125+
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10),
126+
interceptors=(tracer_interceptor,))
127127
service = None
128128
if dummy_mode:
129129
service = DummyEmailService()

src/emailservice/requirements.txt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ cryptography==2.3.1
88
entrypoints==0.2.3
99
enum34==1.1.6
1010
futures==3.1.1
11-
google-api-core==1.4.0
12-
google-auth==1.5.1
13-
google-cloud-core==0.28.1
14-
google-cloud-trace==0.19.0
11+
google-api-core==1.6.0
12+
google-auth==1.6.1
13+
google-cloud-core==0.29.0
1514
googleapis-common-protos==1.5.3
1615
grpc-google-iam-v1==0.11.4
17-
grpcio==1.12.1
16+
grpcio==1.16.1
1817
grpcio-health-checking==1.12.1
1918
grpcio-tools==1.12.1
2019
idna==2.7
@@ -24,7 +23,7 @@ Jinja2==2.10
2423
keyring==15.1.0
2524
keyrings.alt==3.1
2625
MarkupSafe==1.0
27-
opencensus==0.1.7
26+
opencensus[stackdriver]==0.1.10
2827
protobuf==3.6.1
2928
pyasn1==0.4.4
3029
pyasn1-modules==0.2.2

src/recommendationservice/recommendation_server.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@
1414
# See the License for the specific language governing permissions and
1515
# limitations under the License.
1616

17-
import grpc
18-
from concurrent import futures
19-
import time
20-
import traceback
2117
import os
2218
import random
19+
import time
20+
import traceback
21+
from concurrent import futures
22+
2323
import googleclouddebugger
24+
import grpc
25+
from opencensus.trace.exporters import print_exporter
26+
from opencensus.trace.exporters import stackdriver_exporter
27+
from opencensus.trace.ext.grpc import server_interceptor
28+
from opencensus.trace.samplers import always_on
2429

2530
import demo_pb2
2631
import demo_pb2_grpc
@@ -30,11 +35,6 @@
3035
from logger import getJSONLogger
3136
logger = getJSONLogger('recommendationservice-server')
3237

33-
# TODO(morganmclean,ahmetb) tracing currently disabled due to memory leak (see TODO below)
34-
# from opencensus.trace.ext.grpc import server_interceptor
35-
# from opencensus.trace.samplers import always_on
36-
# from opencensus.trace.exporters import stackdriver_exporter
37-
# from opencensus.trace.exporters import print_exporter
3838

3939
class RecommendationService(demo_pb2_grpc.RecommendationServiceServicer):
4040
def ListRecommendations(self, request, context):
@@ -63,15 +63,12 @@ def Check(self, request, context):
6363
if __name__ == "__main__":
6464
logger.info("initializing recommendationservice")
6565

66-
# TODO(morganmclean,ahmetb) enabling the tracing interceptor/sampler below
67-
# causes an unbounded memory leak eventually OOMing the container.
68-
# ----
69-
# try:
70-
# sampler = always_on.AlwaysOnSampler()
71-
# exporter = stackdriver_exporter.StackdriverExporter()
72-
# tracer_interceptor = server_interceptor.OpenCensusServerInterceptor(sampler, exporter)
73-
# except:
74-
# tracer_interceptor = server_interceptor.OpenCensusServerInterceptor()
66+
try:
67+
sampler = always_on.AlwaysOnSampler()
68+
exporter = stackdriver_exporter.StackdriverExporter()
69+
tracer_interceptor = server_interceptor.OpenCensusServerInterceptor(sampler, exporter)
70+
except:
71+
tracer_interceptor = server_interceptor.OpenCensusServerInterceptor()
7572

7673
try:
7774
googleclouddebugger.enable(

src/recommendationservice/requirements.txt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,19 @@ certifi==2018.4.16
33
chardet==3.0.4
44
enum34==1.1.6
55
futures==3.2.0
6-
google-api-core==1.2.1
6+
google-api-core==1.6.0
77
google-api-python-client==1.7.4
8-
google-auth==1.5.0
8+
google-auth==1.6.1
99
google-auth-httplib2==0.0.3
10-
google-cloud-core==0.28.1
11-
google-cloud-trace==0.19.0
10+
google-cloud-core==0.29.0
1211
google-python-cloud-debugger==2.8
1312
googleapis-common-protos==1.5.3
1413
grpcio==1.13.0
1514
grpcio-health-checking==1.13.0
1615
grpcio-tools==1.0.0
1716
httplib2==0.11.3
1817
idna==2.7
19-
opencensus==0.1.5
18+
opencensus[stackdriver]==0.1.10
2019
protobuf==3.5.2.post1
2120
pyasn1==0.4.3
2221
pyasn1-modules==0.2.2

0 commit comments

Comments
 (0)