TUN-528: Move cloudflared into a separate repo

This commit is contained in:
Areg Harutyunyan
2018-05-01 18:45:06 -05:00
parent e8c621a648
commit d06fc520c7
4726 changed files with 1763680 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
An example that demonstrates how the OpenTracing extensions work with
asynchronous and streaming RPC calls.
## Usage
```
python store_server.py &
python store_client.py
```

View File

@@ -0,0 +1,4 @@
from grpc_tools import protoc
protoc.main(('', '-I../protos', '--python_out=.', '--grpc_python_out=.',
'../protos/store.proto'))

View File

@@ -0,0 +1,211 @@
# A OpenTraced client for a Python service that implements the store interface.
from __future__ import print_function
import time
import argparse
from builtins import input, range
import grpc
from jaeger_client import Config
from grpc_opentracing import open_tracing_client_interceptor, \
SpanDecorator
from grpc_opentracing.grpcext import intercept_channel
import store_pb2
class CommandExecuter(object):
def __init__(self, stub):
self._stub = stub
def _execute_rpc(self, method, via, timeout, request_or_iterator):
if via == 'future':
result = getattr(self._stub, method).future(request_or_iterator,
timeout)
return result.result()
elif via == 'with_call':
return getattr(self._stub, method).with_call(request_or_iterator,
timeout)[0]
else:
return getattr(self._stub, method)(request_or_iterator, timeout)
def do_stock_item(self, via, timeout, arguments):
if len(arguments) != 1:
print('must input a single item')
return
request = store_pb2.AddItemRequest(name=arguments[0])
self._execute_rpc('AddItem', via, timeout, request)
def do_stock_items(self, via, timeout, arguments):
if not arguments:
print('must input at least one item')
return
requests = [store_pb2.AddItemRequest(name=name) for name in arguments]
self._execute_rpc('AddItems', via, timeout, iter(requests))
def do_sell_item(self, via, timeout, arguments):
if len(arguments) != 1:
print('must input a single item')
return
request = store_pb2.RemoveItemRequest(name=arguments[0])
response = self._execute_rpc('RemoveItem', via, timeout, request)
if not response.was_successful:
print('unable to sell')
def do_sell_items(self, via, timeout, arguments):
if not arguments:
print('must input at least one item')
return
requests = [
store_pb2.RemoveItemRequest(name=name) for name in arguments
]
response = self._execute_rpc('RemoveItems', via, timeout,
iter(requests))
if not response.was_successful:
print('unable to sell')
def do_inventory(self, via, timeout, arguments):
if arguments:
print('inventory does not take any arguments')
return
if via != 'functor':
print('inventory can only be called via functor')
return
request = store_pb2.Empty()
result = self._execute_rpc('ListInventory', via, timeout, request)
for query in result:
print(query.name, '\t', query.count)
def do_query_item(self, via, timeout, arguments):
if len(arguments) != 1:
print('must input a single item')
return
request = store_pb2.QueryItemRequest(name=arguments[0])
query = self._execute_rpc('QueryQuantity', via, timeout, request)
print(query.name, '\t', query.count)
def do_query_items(self, via, timeout, arguments):
if not arguments:
print('must input at least one item')
return
if via != 'functor':
print('query_items can only be called via functor')
return
requests = [store_pb2.QueryItemRequest(name=name) for name in arguments]
result = self._execute_rpc('QueryQuantities', via, timeout,
iter(requests))
for query in result:
print(query.name, '\t', query.count)
def execute_command(command_executer, command, arguments):
via = 'functor'
timeout = None
for argument_index in range(0, len(arguments), 2):
argument = arguments[argument_index]
if argument == '--via' and argument_index + 1 < len(arguments):
if via not in ('functor', 'with_call', 'future'):
print('invalid --via option')
return
via = arguments[argument_index + 1]
elif argument == '--timeout' and argument_index + 1 < len(arguments):
timeout = float(arguments[argument_index + 1])
else:
arguments = arguments[argument_index:]
break
try:
getattr(command_executer, 'do_' + command)(via, timeout, arguments)
except AttributeError:
print('unknown command: \"%s\"' % command)
INSTRUCTIONS = \
"""Enter commands to interact with the store service:
stock_item Stock a single item.
stock_items Stock one or more items.
sell_item Sell a single item.
sell_items Sell one or more items.
inventory List the store's inventory.
query_item Query the inventory for a single item.
query_items Query the inventory for one or more items.
You can also optionally provide a --via argument to instruct the RPC to be
initiated via either the functor, with_call, or future method; or provide a
--timeout argument to set a deadline for the RPC to be completed.
Example:
> stock_item apple
> stock_items --via future apple milk
> inventory
apple 2
milk 1
"""
def read_and_execute(command_executer):
print(INSTRUCTIONS)
while True:
try:
line = input('> ')
components = line.split()
if not components:
continue
command = components[0]
arguments = components[1:]
execute_command(command_executer, command, arguments)
except EOFError:
break
class StoreSpanDecorator(SpanDecorator):
def __call__(self, span, rpc_info):
span.set_tag('grpc.method', rpc_info.full_method)
span.set_tag('grpc.headers', str(rpc_info.metadata))
span.set_tag('grpc.deadline', str(rpc_info.timeout))
def run():
parser = argparse.ArgumentParser()
parser.add_argument(
'--log_payloads',
action='store_true',
help='log request/response objects to open-tracing spans')
parser.add_argument(
'--include_grpc_tags',
action='store_true',
help='set gRPC-specific tags on spans')
args = parser.parse_args()
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
},
service_name='store-client')
tracer = config.initialize_tracer()
span_decorator = None
if args.include_grpc_tags:
span_decorator = StoreSpanDecorator()
tracer_interceptor = open_tracing_client_interceptor(
tracer, log_payloads=args.log_payloads, span_decorator=span_decorator)
channel = grpc.insecure_channel('localhost:50051')
channel = intercept_channel(channel, tracer_interceptor)
stub = store_pb2.StoreStub(channel)
read_and_execute(CommandExecuter(stub))
time.sleep(2)
tracer.close()
time.sleep(2)
if __name__ == '__main__':
run()

View File

@@ -0,0 +1,523 @@
# Generated by the protocol buffer compiler. DO NOT EDIT!
# source: store.proto
import sys
_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor.FileDescriptor(
name='store.proto',
package='store',
syntax='proto3',
serialized_pb=_b('\n\x0bstore.proto\x12\x05store\"\x07\n\x05\x45mpty\"\x1e\n\x0e\x41\x64\x64ItemRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"!\n\x11RemoveItemRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\",\n\x12RemoveItemResponse\x12\x16\n\x0ewas_successful\x18\x01 \x01(\x08\" \n\x10QueryItemRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"/\n\x10QuantityResponse\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05\x63ount\x18\x02 \x01(\x05\x32\xc7\x03\n\x05Store\x12\x30\n\x07\x41\x64\x64Item\x12\x15.store.AddItemRequest\x1a\x0c.store.Empty\"\x00\x12\x33\n\x08\x41\x64\x64Items\x12\x15.store.AddItemRequest\x1a\x0c.store.Empty\"\x00(\x01\x12\x43\n\nRemoveItem\x12\x18.store.RemoveItemRequest\x1a\x19.store.RemoveItemResponse\"\x00\x12\x46\n\x0bRemoveItems\x12\x18.store.RemoveItemRequest\x1a\x19.store.RemoveItemResponse\"\x00(\x01\x12:\n\rListInventory\x12\x0c.store.Empty\x1a\x17.store.QuantityResponse\"\x00\x30\x01\x12\x43\n\rQueryQuantity\x12\x17.store.QueryItemRequest\x1a\x17.store.QuantityResponse\"\x00\x12I\n\x0fQueryQuantities\x12\x17.store.QueryItemRequest\x1a\x17.store.QuantityResponse\"\x00(\x01\x30\x01\x62\x06proto3')
)
_sym_db.RegisterFileDescriptor(DESCRIPTOR)
_EMPTY = _descriptor.Descriptor(
name='Empty',
full_name='store.Empty',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=22,
serialized_end=29,
)
_ADDITEMREQUEST = _descriptor.Descriptor(
name='AddItemRequest',
full_name='store.AddItemRequest',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='name', full_name='store.AddItemRequest.name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=31,
serialized_end=61,
)
_REMOVEITEMREQUEST = _descriptor.Descriptor(
name='RemoveItemRequest',
full_name='store.RemoveItemRequest',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='name', full_name='store.RemoveItemRequest.name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=63,
serialized_end=96,
)
_REMOVEITEMRESPONSE = _descriptor.Descriptor(
name='RemoveItemResponse',
full_name='store.RemoveItemResponse',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='was_successful', full_name='store.RemoveItemResponse.was_successful', index=0,
number=1, type=8, cpp_type=7, label=1,
has_default_value=False, default_value=False,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=98,
serialized_end=142,
)
_QUERYITEMREQUEST = _descriptor.Descriptor(
name='QueryItemRequest',
full_name='store.QueryItemRequest',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='name', full_name='store.QueryItemRequest.name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=144,
serialized_end=176,
)
_QUANTITYRESPONSE = _descriptor.Descriptor(
name='QuantityResponse',
full_name='store.QuantityResponse',
filename=None,
file=DESCRIPTOR,
containing_type=None,
fields=[
_descriptor.FieldDescriptor(
name='name', full_name='store.QuantityResponse.name', index=0,
number=1, type=9, cpp_type=9, label=1,
has_default_value=False, default_value=_b("").decode('utf-8'),
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
_descriptor.FieldDescriptor(
name='count', full_name='store.QuantityResponse.count', index=1,
number=2, type=5, cpp_type=1, label=1,
has_default_value=False, default_value=0,
message_type=None, enum_type=None, containing_type=None,
is_extension=False, extension_scope=None,
options=None),
],
extensions=[
],
nested_types=[],
enum_types=[
],
options=None,
is_extendable=False,
syntax='proto3',
extension_ranges=[],
oneofs=[
],
serialized_start=178,
serialized_end=225,
)
DESCRIPTOR.message_types_by_name['Empty'] = _EMPTY
DESCRIPTOR.message_types_by_name['AddItemRequest'] = _ADDITEMREQUEST
DESCRIPTOR.message_types_by_name['RemoveItemRequest'] = _REMOVEITEMREQUEST
DESCRIPTOR.message_types_by_name['RemoveItemResponse'] = _REMOVEITEMRESPONSE
DESCRIPTOR.message_types_by_name['QueryItemRequest'] = _QUERYITEMREQUEST
DESCRIPTOR.message_types_by_name['QuantityResponse'] = _QUANTITYRESPONSE
Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), dict(
DESCRIPTOR = _EMPTY,
__module__ = 'store_pb2'
# @@protoc_insertion_point(class_scope:store.Empty)
))
_sym_db.RegisterMessage(Empty)
AddItemRequest = _reflection.GeneratedProtocolMessageType('AddItemRequest', (_message.Message,), dict(
DESCRIPTOR = _ADDITEMREQUEST,
__module__ = 'store_pb2'
# @@protoc_insertion_point(class_scope:store.AddItemRequest)
))
_sym_db.RegisterMessage(AddItemRequest)
RemoveItemRequest = _reflection.GeneratedProtocolMessageType('RemoveItemRequest', (_message.Message,), dict(
DESCRIPTOR = _REMOVEITEMREQUEST,
__module__ = 'store_pb2'
# @@protoc_insertion_point(class_scope:store.RemoveItemRequest)
))
_sym_db.RegisterMessage(RemoveItemRequest)
RemoveItemResponse = _reflection.GeneratedProtocolMessageType('RemoveItemResponse', (_message.Message,), dict(
DESCRIPTOR = _REMOVEITEMRESPONSE,
__module__ = 'store_pb2'
# @@protoc_insertion_point(class_scope:store.RemoveItemResponse)
))
_sym_db.RegisterMessage(RemoveItemResponse)
QueryItemRequest = _reflection.GeneratedProtocolMessageType('QueryItemRequest', (_message.Message,), dict(
DESCRIPTOR = _QUERYITEMREQUEST,
__module__ = 'store_pb2'
# @@protoc_insertion_point(class_scope:store.QueryItemRequest)
))
_sym_db.RegisterMessage(QueryItemRequest)
QuantityResponse = _reflection.GeneratedProtocolMessageType('QuantityResponse', (_message.Message,), dict(
DESCRIPTOR = _QUANTITYRESPONSE,
__module__ = 'store_pb2'
# @@protoc_insertion_point(class_scope:store.QuantityResponse)
))
_sym_db.RegisterMessage(QuantityResponse)
try:
# THESE ELEMENTS WILL BE DEPRECATED.
# Please use the generated *_pb2_grpc.py files instead.
import grpc
from grpc.framework.common import cardinality
from grpc.framework.interfaces.face import utilities as face_utilities
from grpc.beta import implementations as beta_implementations
from grpc.beta import interfaces as beta_interfaces
class StoreStub(object):
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.AddItem = channel.unary_unary(
'/store.Store/AddItem',
request_serializer=AddItemRequest.SerializeToString,
response_deserializer=Empty.FromString,
)
self.AddItems = channel.stream_unary(
'/store.Store/AddItems',
request_serializer=AddItemRequest.SerializeToString,
response_deserializer=Empty.FromString,
)
self.RemoveItem = channel.unary_unary(
'/store.Store/RemoveItem',
request_serializer=RemoveItemRequest.SerializeToString,
response_deserializer=RemoveItemResponse.FromString,
)
self.RemoveItems = channel.stream_unary(
'/store.Store/RemoveItems',
request_serializer=RemoveItemRequest.SerializeToString,
response_deserializer=RemoveItemResponse.FromString,
)
self.ListInventory = channel.unary_stream(
'/store.Store/ListInventory',
request_serializer=Empty.SerializeToString,
response_deserializer=QuantityResponse.FromString,
)
self.QueryQuantity = channel.unary_unary(
'/store.Store/QueryQuantity',
request_serializer=QueryItemRequest.SerializeToString,
response_deserializer=QuantityResponse.FromString,
)
self.QueryQuantities = channel.stream_stream(
'/store.Store/QueryQuantities',
request_serializer=QueryItemRequest.SerializeToString,
response_deserializer=QuantityResponse.FromString,
)
class StoreServicer(object):
def AddItem(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def AddItems(self, request_iterator, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RemoveItem(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RemoveItems(self, request_iterator, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ListInventory(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def QueryQuantity(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def QueryQuantities(self, request_iterator, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_StoreServicer_to_server(servicer, server):
rpc_method_handlers = {
'AddItem': grpc.unary_unary_rpc_method_handler(
servicer.AddItem,
request_deserializer=AddItemRequest.FromString,
response_serializer=Empty.SerializeToString,
),
'AddItems': grpc.stream_unary_rpc_method_handler(
servicer.AddItems,
request_deserializer=AddItemRequest.FromString,
response_serializer=Empty.SerializeToString,
),
'RemoveItem': grpc.unary_unary_rpc_method_handler(
servicer.RemoveItem,
request_deserializer=RemoveItemRequest.FromString,
response_serializer=RemoveItemResponse.SerializeToString,
),
'RemoveItems': grpc.stream_unary_rpc_method_handler(
servicer.RemoveItems,
request_deserializer=RemoveItemRequest.FromString,
response_serializer=RemoveItemResponse.SerializeToString,
),
'ListInventory': grpc.unary_stream_rpc_method_handler(
servicer.ListInventory,
request_deserializer=Empty.FromString,
response_serializer=QuantityResponse.SerializeToString,
),
'QueryQuantity': grpc.unary_unary_rpc_method_handler(
servicer.QueryQuantity,
request_deserializer=QueryItemRequest.FromString,
response_serializer=QuantityResponse.SerializeToString,
),
'QueryQuantities': grpc.stream_stream_rpc_method_handler(
servicer.QueryQuantities,
request_deserializer=QueryItemRequest.FromString,
response_serializer=QuantityResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'store.Store', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
class BetaStoreServicer(object):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This class was generated
only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
def AddItem(self, request, context):
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def AddItems(self, request_iterator, context):
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def RemoveItem(self, request, context):
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def RemoveItems(self, request_iterator, context):
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def ListInventory(self, request, context):
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def QueryQuantity(self, request, context):
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
def QueryQuantities(self, request_iterator, context):
context.code(beta_interfaces.StatusCode.UNIMPLEMENTED)
class BetaStoreStub(object):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This class was generated
only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0."""
def AddItem(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
raise NotImplementedError()
AddItem.future = None
def AddItems(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
raise NotImplementedError()
AddItems.future = None
def RemoveItem(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
raise NotImplementedError()
RemoveItem.future = None
def RemoveItems(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
raise NotImplementedError()
RemoveItems.future = None
def ListInventory(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
raise NotImplementedError()
def QueryQuantity(self, request, timeout, metadata=None, with_call=False, protocol_options=None):
raise NotImplementedError()
QueryQuantity.future = None
def QueryQuantities(self, request_iterator, timeout, metadata=None, with_call=False, protocol_options=None):
raise NotImplementedError()
def beta_create_Store_server(servicer, pool=None, pool_size=None, default_timeout=None, maximum_timeout=None):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This function was
generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
request_deserializers = {
('store.Store', 'AddItem'): AddItemRequest.FromString,
('store.Store', 'AddItems'): AddItemRequest.FromString,
('store.Store', 'ListInventory'): Empty.FromString,
('store.Store', 'QueryQuantities'): QueryItemRequest.FromString,
('store.Store', 'QueryQuantity'): QueryItemRequest.FromString,
('store.Store', 'RemoveItem'): RemoveItemRequest.FromString,
('store.Store', 'RemoveItems'): RemoveItemRequest.FromString,
}
response_serializers = {
('store.Store', 'AddItem'): Empty.SerializeToString,
('store.Store', 'AddItems'): Empty.SerializeToString,
('store.Store', 'ListInventory'): QuantityResponse.SerializeToString,
('store.Store', 'QueryQuantities'): QuantityResponse.SerializeToString,
('store.Store', 'QueryQuantity'): QuantityResponse.SerializeToString,
('store.Store', 'RemoveItem'): RemoveItemResponse.SerializeToString,
('store.Store', 'RemoveItems'): RemoveItemResponse.SerializeToString,
}
method_implementations = {
('store.Store', 'AddItem'): face_utilities.unary_unary_inline(servicer.AddItem),
('store.Store', 'AddItems'): face_utilities.stream_unary_inline(servicer.AddItems),
('store.Store', 'ListInventory'): face_utilities.unary_stream_inline(servicer.ListInventory),
('store.Store', 'QueryQuantities'): face_utilities.stream_stream_inline(servicer.QueryQuantities),
('store.Store', 'QueryQuantity'): face_utilities.unary_unary_inline(servicer.QueryQuantity),
('store.Store', 'RemoveItem'): face_utilities.unary_unary_inline(servicer.RemoveItem),
('store.Store', 'RemoveItems'): face_utilities.stream_unary_inline(servicer.RemoveItems),
}
server_options = beta_implementations.server_options(request_deserializers=request_deserializers, response_serializers=response_serializers, thread_pool=pool, thread_pool_size=pool_size, default_timeout=default_timeout, maximum_timeout=maximum_timeout)
return beta_implementations.server(method_implementations, options=server_options)
def beta_create_Store_stub(channel, host=None, metadata_transformer=None, pool=None, pool_size=None):
"""The Beta API is deprecated for 0.15.0 and later.
It is recommended to use the GA API (classes and functions in this
file not marked beta) for all further purposes. This function was
generated only to ease transition from grpcio<0.15.0 to grpcio>=0.15.0"""
request_serializers = {
('store.Store', 'AddItem'): AddItemRequest.SerializeToString,
('store.Store', 'AddItems'): AddItemRequest.SerializeToString,
('store.Store', 'ListInventory'): Empty.SerializeToString,
('store.Store', 'QueryQuantities'): QueryItemRequest.SerializeToString,
('store.Store', 'QueryQuantity'): QueryItemRequest.SerializeToString,
('store.Store', 'RemoveItem'): RemoveItemRequest.SerializeToString,
('store.Store', 'RemoveItems'): RemoveItemRequest.SerializeToString,
}
response_deserializers = {
('store.Store', 'AddItem'): Empty.FromString,
('store.Store', 'AddItems'): Empty.FromString,
('store.Store', 'ListInventory'): QuantityResponse.FromString,
('store.Store', 'QueryQuantities'): QuantityResponse.FromString,
('store.Store', 'QueryQuantity'): QuantityResponse.FromString,
('store.Store', 'RemoveItem'): RemoveItemResponse.FromString,
('store.Store', 'RemoveItems'): RemoveItemResponse.FromString,
}
cardinalities = {
'AddItem': cardinality.Cardinality.UNARY_UNARY,
'AddItems': cardinality.Cardinality.STREAM_UNARY,
'ListInventory': cardinality.Cardinality.UNARY_STREAM,
'QueryQuantities': cardinality.Cardinality.STREAM_STREAM,
'QueryQuantity': cardinality.Cardinality.UNARY_UNARY,
'RemoveItem': cardinality.Cardinality.UNARY_UNARY,
'RemoveItems': cardinality.Cardinality.STREAM_UNARY,
}
stub_options = beta_implementations.stub_options(host=host, metadata_transformer=metadata_transformer, request_serializers=request_serializers, response_deserializers=response_deserializers, thread_pool=pool, thread_pool_size=pool_size)
return beta_implementations.dynamic_stub(channel, 'store.Store', cardinalities, options=stub_options)
except ImportError:
pass
# @@protoc_insertion_point(module_scope)

View File

@@ -0,0 +1,132 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
import grpc
from grpc.framework.common import cardinality
from grpc.framework.interfaces.face import utilities as face_utilities
import store_pb2 as store__pb2
class StoreStub(object):
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.AddItem = channel.unary_unary(
'/store.Store/AddItem',
request_serializer=store__pb2.AddItemRequest.SerializeToString,
response_deserializer=store__pb2.Empty.FromString,
)
self.AddItems = channel.stream_unary(
'/store.Store/AddItems',
request_serializer=store__pb2.AddItemRequest.SerializeToString,
response_deserializer=store__pb2.Empty.FromString,
)
self.RemoveItem = channel.unary_unary(
'/store.Store/RemoveItem',
request_serializer=store__pb2.RemoveItemRequest.SerializeToString,
response_deserializer=store__pb2.RemoveItemResponse.FromString,
)
self.RemoveItems = channel.stream_unary(
'/store.Store/RemoveItems',
request_serializer=store__pb2.RemoveItemRequest.SerializeToString,
response_deserializer=store__pb2.RemoveItemResponse.FromString,
)
self.ListInventory = channel.unary_stream(
'/store.Store/ListInventory',
request_serializer=store__pb2.Empty.SerializeToString,
response_deserializer=store__pb2.QuantityResponse.FromString,
)
self.QueryQuantity = channel.unary_unary(
'/store.Store/QueryQuantity',
request_serializer=store__pb2.QueryItemRequest.SerializeToString,
response_deserializer=store__pb2.QuantityResponse.FromString,
)
self.QueryQuantities = channel.stream_stream(
'/store.Store/QueryQuantities',
request_serializer=store__pb2.QueryItemRequest.SerializeToString,
response_deserializer=store__pb2.QuantityResponse.FromString,
)
class StoreServicer(object):
def AddItem(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def AddItems(self, request_iterator, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RemoveItem(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def RemoveItems(self, request_iterator, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ListInventory(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def QueryQuantity(self, request, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def QueryQuantities(self, request_iterator, context):
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_StoreServicer_to_server(servicer, server):
rpc_method_handlers = {
'AddItem': grpc.unary_unary_rpc_method_handler(
servicer.AddItem,
request_deserializer=store__pb2.AddItemRequest.FromString,
response_serializer=store__pb2.Empty.SerializeToString,
),
'AddItems': grpc.stream_unary_rpc_method_handler(
servicer.AddItems,
request_deserializer=store__pb2.AddItemRequest.FromString,
response_serializer=store__pb2.Empty.SerializeToString,
),
'RemoveItem': grpc.unary_unary_rpc_method_handler(
servicer.RemoveItem,
request_deserializer=store__pb2.RemoveItemRequest.FromString,
response_serializer=store__pb2.RemoveItemResponse.SerializeToString,
),
'RemoveItems': grpc.stream_unary_rpc_method_handler(
servicer.RemoveItems,
request_deserializer=store__pb2.RemoveItemRequest.FromString,
response_serializer=store__pb2.RemoveItemResponse.SerializeToString,
),
'ListInventory': grpc.unary_stream_rpc_method_handler(
servicer.ListInventory,
request_deserializer=store__pb2.Empty.FromString,
response_serializer=store__pb2.QuantityResponse.SerializeToString,
),
'QueryQuantity': grpc.unary_unary_rpc_method_handler(
servicer.QueryQuantity,
request_deserializer=store__pb2.QueryItemRequest.FromString,
response_serializer=store__pb2.QuantityResponse.SerializeToString,
),
'QueryQuantities': grpc.stream_stream_rpc_method_handler(
servicer.QueryQuantities,
request_deserializer=store__pb2.QueryItemRequest.FromString,
response_serializer=store__pb2.QuantityResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'store.Store', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))

View File

@@ -0,0 +1,122 @@
# A OpenTraced server for a Python service that implements the store interface.
from __future__ import print_function
import time
import argparse
from collections import defaultdict
from six import iteritems
import grpc
from concurrent import futures
from jaeger_client import Config
from grpc_opentracing import open_tracing_server_interceptor, \
SpanDecorator
from grpc_opentracing.grpcext import intercept_server
import store_pb2
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class Store(store_pb2.StoreServicer):
def __init__(self):
self._inventory = defaultdict(int)
def AddItem(self, request, context):
self._inventory[request.name] += 1
return store_pb2.Empty()
def AddItems(self, request_iter, context):
for request in request_iter:
self._inventory[request.name] += 1
return store_pb2.Empty()
def RemoveItem(self, request, context):
new_quantity = self._inventory[request.name] - 1
if new_quantity < 0:
return store_pb2.RemoveItemResponse(was_successful=False)
self._inventory[request.name] = new_quantity
return store_pb2.RemoveItemResponse(was_successful=True)
def RemoveItems(self, request_iter, context):
response = store_pb2.RemoveItemResponse(was_successful=True)
for request in request_iter:
response = self.RemoveItem(request, context)
if not response.was_successful:
break
return response
def ListInventory(self, request, context):
for name, count in iteritems(self._inventory):
if not count:
continue
else:
yield store_pb2.QuantityResponse(name=name, count=count)
def QueryQuantity(self, request, context):
count = self._inventory[request.name]
return store_pb2.QuantityResponse(name=request.name, count=count)
def QueryQuantities(self, request_iter, context):
for request in request_iter:
count = self._inventory[request.name]
yield store_pb2.QuantityResponse(name=request.name, count=count)
class StoreSpanDecorator(SpanDecorator):
def __call__(self, span, rpc_info):
span.set_tag('grpc.method', rpc_info.full_method)
span.set_tag('grpc.headers', str(rpc_info.metadata))
span.set_tag('grpc.deadline', str(rpc_info.timeout))
def serve():
parser = argparse.ArgumentParser()
parser.add_argument(
'--log_payloads',
action='store_true',
help='log request/response objects to open-tracing spans')
parser.add_argument(
'--include_grpc_tags',
action='store_true',
help='set gRPC-specific tags on spans')
args = parser.parse_args()
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
'logging': True,
},
service_name='store-server')
tracer = config.initialize_tracer()
span_decorator = None
if args.include_grpc_tags:
span_decorator = StoreSpanDecorator()
tracer_interceptor = open_tracing_server_interceptor(
tracer, log_payloads=args.log_payloads, span_decorator=span_decorator)
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
server = intercept_server(server, tracer_interceptor)
store_pb2.add_StoreServicer_to_server(Store(), server)
server.add_insecure_port('[::]:50051')
server.start()
try:
while True:
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt:
server.stop(0)
time.sleep(2)
tracer.close()
time.sleep(2)
if __name__ == '__main__':
serve()