示例#1
0
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__()})
示例#4
0
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))
示例#5
0
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__()})
示例#6
0
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
示例#8
0
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__()})
示例#10
0
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
        })
示例#11
0
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})

示例#12
0
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__":