class Gateway: name = "gateway" orders = RpcProxy("orders_service") statsd = init_statsd('simplebank-demo.gateway', 'statsd') @http('POST', '/shares/sell') @statsd.timer('sell_shares') def sell_shares(self, request): req_id = uuid.uuid4() res = u"{}".format(req_id) req = self.__sell_shares(res) return Response(json.dumps( {"ok": "sell order {} placed".format(req_id)}), mimetype='application/json') @rpc def __sell_shares(self, payload): print("[{}] rpc to orders service : sell_shares".format(payload)) res = u"{}".format(payload) return self.orders.sell_shares(res) @http('GET', '/health') @statsd.timer('health') def health(self, _request): return json.dumps({'ok': datetime.datetime.utcnow().__str__()})
class MarketService: name = "market_service" statsd = init_statsd('simplebank-demo.market', 'statsd') dispatch = EventDispatcher() @event_handler("orders_service", "order_created") @statsd.timer('request_reservation') def place_order(self, payload): print("service {} received: {} ... placing order to exchange".format( self.name, payload)) # place order in stock exchange exchange_resp = self.__place_order_exchange(payload) # event: emit order placed event self.__create_event("order_placed", payload) return json.dumps({'exchange_response': exchange_resp}) @rpc @statsd.timer('create_event') def __create_event(self, event, payload): print("[{}] {} emiting {} event".format(payload, self.name, event)) return self.dispatch(event, payload) @statsd.timer('place_order_stock_exchange') @circuit(failure_threshold=5, expected_exception=ConnectionError) def __place_order_exchange(self, request): print("[{}] {} placing order to stock exchange".format( request, self.name)) response = requests.get('https://jsonplaceholder.typicode.com/posts/1') return json.dumps({ 'code': response.status_code, 'body': response.text })
class Gateway: name = "gateway" orders = RpcProxy("orders_service") statsd = init_statsd('simplebank-demo.gateway', 'statsd') logger = init_logger() @http('POST', '/shares/sell') @statsd.timer('sell_shares') def sell_shares(self, request): req_id = uuid.uuid4() res = u"{}".format(req_id) self.logger.debug("this is a debug message from gateway", extra={"uuid": res}) self.logger.info("placing sell order", extra={"uuid": res}) self.__sell_shares(res) return Response(json.dumps( {"ok": "sell order {} placed".format(req_id)}), mimetype='application/json') @rpc def __sell_shares(self, uuid): self.logger.info("contacting orders service", extra={"uuid": uuid}) res = u"{}".format(uuid) return self.orders.sell_shares(res) @http('GET', '/health') @statsd.timer('health') def health(self, _request): return json.dumps({'ok': datetime.datetime.utcnow().__str__()})
class FeesService: name = "fees_service" statsd = init_statsd('simplebank-demo.fees', 'statsd') @event_handler("market_service", "order_placed") @statsd.timer('charge_fee') def charge_fee(self, payload): print("[{}] {} received order_placed event ... charging fee".format( payload, self.name))
class OrdersService: name = "orders_service" dispatch = EventDispatcher() accounts = RpcProxy("account_transactions_service") statsd = init_statsd('simplebank-demo.orders', 'statsd') logger = init_logger() @rpc @statsd.timer('sell_shares') def sell_shares(self, request): payload = request # introduce random sleep time to simulate processing time.sleep(randint(0, 9)) self.logger.info("sell request received", extra={"uuid": payload}) # event: emit order created event self.__create_event("order_created", payload) # rpc to accounts: reservation of x units of y shares against account z self.__request_reservation(payload) return json.dumps({"ok": "sell order placed"}) @statsd.timer('create_event') def __create_event(self, event, payload): self.logger.info("order created", extra={"uuid": payload}) return self.dispatch(event, payload) @rpc @statsd.timer('request_reservation') def __request_reservation(self, payload): self.logger.info("requesting reservation to accounts service", extra={"uuid": payload}) res = u"{}".format(payload) return self.accounts.request_reservation(res) @event_handler("market_service", "order_placed") @statsd.timer('place_order') def handle_place_order(self, payload): self.logger.info("updating the order status", extra={ "uuid": payload, "status": "placed" }) return payload @rpc @statsd.timer('health') def health(self, _request): return json.dumps({'ok': datetime.datetime.utcnow().__str__()})
class AccountTransactionsService: name = "account_transactions_service" statsd = init_statsd('simplebank-demo.account-transactions', 'statsd') @rpc @statsd.timer('request_reservation') def request_reservation(self, payload): print("[{}] {} received request to reserve stocks... reserving".format( payload, self.name)) @rpc @statsd.timer('health') def health(self, _request): return json.dumps({'ok': datetime.datetime.utcnow().__str__()})
class FeesService: name = "fees_service" statsd = init_statsd('simplebank-demo.fees', 'statsd') logger = init_logger() @event_handler("market_service", "order_placed") @statsd.timer('charge_fee') def charge_fee(self, payload): self.logger.debug( "this is a debug message from fees service", extra={"uuid": payload}) self.logger.info("charging fees", extra={ "uuid": payload}) return payload
class AccountTransactionsService: name = "account_transactions_service" statsd = init_statsd('simplebank-demo.account-transactions', 'statsd') logger = init_logger() @rpc @statsd.timer('request_reservation') def request_reservation(self, payload): # introduce random sleep time to simulate processing time.sleep(randint(0, 9)) self.logger.info("reserving position", extra={"uuid": payload}) return payload @rpc @statsd.timer('health') def health(self, _request): return json.dumps({'ok': datetime.datetime.utcnow().__str__()})
class OrdersService: name = "orders_service" dispatch = EventDispatcher() accounts = RpcProxy("account_transactions_service") statsd = init_statsd('simplebank-demo.orders', 'statsd') @rpc @statsd.timer('sell_shares') def sell_shares(self, request): payload = request # event: emit order created event self.__create_event("order_created", payload) # rpc to accounts: reservation of x units of y shares against account z self.__request_reservation(payload) return json.dumps({"ok": "sell order placed"}) @statsd.timer('create_event') def __create_event(self, event, payload): return self.dispatch(event, payload) @rpc @statsd.timer('request_reservation') def __request_reservation(self, payload): print("[{}] rpc to accounts service : request reservation".format( payload)) res = u"{}".format(payload) return self.accounts.request_reservation(res) @event_handler("market_service", "order_placed") @statsd.timer('place_order') def handle_place_order(self, payload): print( "[{}] {} received order_placed event ... updating order to placed". format(payload, self.name)) @rpc @statsd.timer('health') def health(self, _request): return json.dumps({'ok': datetime.datetime.utcnow().__str__()})
class MarketService: name = "market_service" statsd = init_statsd('simplebank-demo.market', 'statsd') logger = init_logger() dispatch = EventDispatcher() @event_handler("orders_service", "order_created") @statsd.timer('request_reservation') def place_order(self, uuid): self.logger.info("requesting reservation", extra={"uuid": uuid}) # place order in stock exchange exchange_resp = self.__place_order_exchange(uuid) # event: emit order placed event self.__create_event("order_placed", uuid) return json.dumps({'exchange_response': exchange_resp}) @rpc @statsd.timer('create_event') def __create_event(self, event, uuid): # introduce random sleep time to simulate processing time.sleep(randint(0, 9)) return self.dispatch(event, uuid) @statsd.timer('place_order_stock_exchange') @circuit(failure_threshold=5, expected_exception=ConnectionError) def __place_order_exchange(self, uuid): self.logger.info("placing order in the exchange", extra={"uuid": uuid}) response = requests.get('https://jsonplaceholder.typicode.com/posts/1') return json.dumps({ 'code': response.status_code, 'body': response.text })
from urlparse import urljoin import opentracing import requests from flask import Flask, jsonify, request from opentracing.ext import tags from opentracing.propagation import Format from opentracing_instrumentation.request_context import (get_current_span, span_in_context) from simplebank.chassis import init_logger, init_statsd, init_tracer app = Flask(__name__) tracer = init_tracer('simplebank-profile') statsd = init_statsd('simplebank.profile', 'statsd') logger = init_logger() @app.route('/profile/<uuid:uuid>') @statsd.timer('profile') def profile(uuid): logger.debug("this is a debug message from profile", extra={"uuid": uuid}) with tracer.start_span('settings') as span: span.set_tag('uuid', uuid) with span_in_context(span): ip = get_ip(uuid) settings = get_user_settings(uuid) return jsonify({'ip': ip, 'settings': settings})
import time from random import randint import requests from flask import Flask, jsonify, request from opentracing.ext import tags from opentracing.propagation import Format from opentracing_instrumentation.request_context import (get_current_span, span_in_context) from simplebank.chassis import init_logger, init_statsd, init_tracer app = Flask(__name__) tracer = init_tracer('simplebank-settings') statsd = init_statsd('simplebank.settings', 'statsd') logger = init_logger() @app.route('/settings/<uuid:uuid>') @statsd.timer('settings') def settings(uuid): logger.info("fetching user settings", extra={"uuid": uuid}) span_ctx = tracer.extract(Format.HTTP_HEADERS, request.headers) span_tags = {tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER, 'uuid': uuid} with tracer.start_span('settings', child_of=span_ctx, tags=span_tags): time.sleep(randint(0, 2)) return jsonify({'settings': {'name': 'demo user', 'uuid': uuid}}) if __name__ == "__main__":