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 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 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 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})