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

Commit a3931d9

Browse files
authored
Extract byte size from proto-plus messages (#976)
1 parent 577b176 commit a3931d9

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

contrib/opencensus-ext-grpc/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
- Extract byte size from proto-plus messages
6+
([#976](https://github.com/census-instrumentation/opencensus-python/pull/976))
7+
58
## 0.7.1
69
Released 2019-08-05
710

contrib/opencensus-ext-grpc/opencensus/ext/grpc/utils.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@
66
from opencensus.trace import execution_context, time_event
77

88

9+
def extract_byte_size(proto_message):
10+
"""Gets the byte size from a google.protobuf or proto-plus message"""
11+
if hasattr(proto_message, "ByteSize"):
12+
# google.protobuf message
13+
return proto_message.ByteSize()
14+
if hasattr(type(proto_message), "pb"):
15+
# proto-plus message
16+
return type(proto_message).pb(proto_message).ByteSize()
17+
return None
18+
19+
920
def add_message_event(proto_message, span, message_event_type, message_id=1):
1021
"""Adds a MessageEvent to the span based off of the given protobuf
1122
message
@@ -15,7 +26,7 @@ def add_message_event(proto_message, span, message_event_type, message_id=1):
1526
datetime.utcnow(),
1627
message_id,
1728
type=message_event_type,
18-
uncompressed_size_bytes=proto_message.ByteSize()
29+
uncompressed_size_bytes=extract_byte_size(proto_message),
1930
)
2031
)
2132

contrib/opencensus-ext-grpc/tests/test_server_interceptor.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,20 @@ def test__wrap_rpc_behavior_none(self):
167167
new_handler = server_interceptor._wrap_rpc_behavior(None, lambda: None)
168168
self.assertEqual(new_handler, None)
169169

170+
def test_extract_byte_size(self):
171+
# should work with a google.protobuf message
172+
google_protobuf_mock = mock.Mock()
173+
google_protobuf_mock.ByteSize.return_value = 5
174+
self.assertEqual(grpc_utils.extract_byte_size(google_protobuf_mock), 5)
175+
176+
# should work with a proto-plus style message
177+
protoplus_protobuf_mock = mock.Mock(spec=[])
178+
type(protoplus_protobuf_mock).pb = mock.Mock()
179+
type(protoplus_protobuf_mock).pb.return_value.ByteSize.return_value = 5
180+
self.assertEqual(
181+
grpc_utils.extract_byte_size(protoplus_protobuf_mock), 5
182+
)
183+
170184

171185
class MockTracer(object):
172186
def __init__(self, *args, **kwargs):

0 commit comments

Comments
 (0)