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

Commit b06ff68

Browse files
authored
Add integration for grpc channel from api_core (#131)
1 parent 44259f5 commit b06ff68

3 files changed

Lines changed: 51 additions & 1 deletion

File tree

opencensus/trace/config_integration.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
log = logging.getLogger(__name__)
1919

2020
SUPPORTED_INTEGRATIONS = ['httplib', 'mysql', 'postgresql', 'pymysql',
21-
'requests', 'sqlalchemy']
21+
'requests', 'sqlalchemy', 'google_cloud_clientlibs']
2222

2323
PATH_PREFIX = 'opencensus.trace.ext'
2424

opencensus/trace/ext/google_cloud_clientlibs/trace.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import grpc
1818

1919
from google.cloud import _helpers
20+
from google.api_core import grpc_helpers
2021

2122
from opencensus.trace import execution_context
2223
from opencensus.trace.ext.grpc.client_interceptor import (
@@ -31,6 +32,7 @@
3132

3233
MAKE_SECURE_CHANNEL = 'make_secure_channel'
3334
INSECURE_CHANNEL = 'insecure_channel'
35+
CREATE_CHANNEL = 'create_channel'
3436

3537

3638
def trace_integration():
@@ -66,6 +68,14 @@ def trace_grpc():
6668
INSECURE_CHANNEL,
6769
insecure_channel_wrapped)
6870

71+
# Wrap google.api_core.grpc_helpers.create_channel
72+
create_channel_func = getattr(grpc_helpers, CREATE_CHANNEL)
73+
create_channel_wrapped = wrap_create_channel(create_channel_func)
74+
setattr(
75+
grpc_helpers,
76+
CREATE_CHANNEL,
77+
create_channel_wrapped)
78+
6979

7080
def trace_http():
7181
"""Integrate with HTTP (requests library)."""
@@ -110,3 +120,23 @@ def call(*args, **kwargs):
110120
'clientlibs grpc calls not traced.')
111121
return channel
112122
return call
123+
124+
125+
def wrap_create_channel(create_channel_func):
126+
"""Wrap the google.api_core.grpc_helpers.create_channel."""
127+
def call(*args, **kwargs):
128+
channel = create_channel_func(*args, **kwargs)
129+
130+
try:
131+
target = kwargs.get('target')
132+
_tracer = execution_context.get_opencensus_tracer()
133+
tracer_interceptor = OpenCensusClientInterceptor(_tracer, target)
134+
intercepted_channel = grpc.intercept_channel(
135+
channel, tracer_interceptor)
136+
return intercepted_channel # pragma: NO COVER
137+
except Exception:
138+
log.warning(
139+
'Failed to wrap create_channel, '
140+
'clientlibs grpc calls not traced.')
141+
return channel
142+
return call

tests/unit/trace/ext/google_cloud_clientlibs/test_google_cloud_clientlibs_trace.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,23 @@ def test_wrap_insecure_channel(self):
112112
wrapped()
113113

114114
self.assertTrue(mock_interceptor.called)
115+
116+
def test_wrap_create_channel(self):
117+
mock_tracer = mock.Mock()
118+
mock_interceptor = mock.Mock()
119+
mock_func = mock.Mock()
120+
121+
patch_tracer = mock.patch(
122+
'opencensus.trace.ext.google_cloud_clientlibs.trace.execution_context.'
123+
'get_opencensus_tracer',
124+
return_value=mock_tracer)
125+
patch_interceptor = mock.patch(
126+
'opencensus.trace.ext.google_cloud_clientlibs.trace.OpenCensusClientInterceptor',
127+
mock_interceptor)
128+
129+
wrapped = trace.wrap_create_channel(mock_func)
130+
131+
with patch_tracer, patch_interceptor:
132+
wrapped()
133+
134+
self.assertTrue(mock_interceptor.called)

0 commit comments

Comments
 (0)