Пример #1
0
    def test_single_request(self, mock_request):
        # mock http server
        Response = NamedTuple('Response',
                              status_code=int,
                              text=str,
                              url=str,
                              method=str)

        def fake_response(method, url):
            return Response(200, 'ok', url, method)

        mock_request.side_effect = fake_response

        # overwrite `Context` used by client
        ctx = Context()
        ctx.create_redis = lambda: self.redis_resource.rds

        # create routing record
        self.rtbl.set_routing(
            RoutingRecord('myservice', ['localhost:8000'], [1]))

        # make request
        response = single_request(ClientConfig('myservice'),
                                  ctx,
                                  router_type='SymmetryHostRouter')

        self.assertEqual(200, response.status_code)
Пример #2
0
def _init(module=None):
    from galileo.worker.context import Context
    from galileo.shell.shell import init_module
    import atexit
    import pymq

    ctx = Context()
    rds = ctx.create_redis()
    init_module(rds, name=module)

    atexit.register(pymq.shutdown)
Пример #3
0
def run(ctx: Context, trace_queue: Queue, description: ClientDescription):
    logger.info('starting new client process %s', description)

    bus = RedisEventBus(rds=ctx.create_redis())
    bus_thread = threading.Thread(target=bus.run)
    bus_thread.start()

    client = Client(ctx, trace_queue, description, eventbus=bus)

    def handler(signum, frame):
        logger.debug('client %s received signal %s', client.client_id, signum)
        client.close()
        raise KeyboardInterrupt

    signal.signal(signal.SIGINT, handler)
    signal.signal(signal.SIGTERM, handler)

    try:
        logger.info("%s starting", client)
        client.run()
    except KeyboardInterrupt:
        pass

    logger.debug('shutting down eventbus')
    bus.close()
    bus_thread.join(2)

    logger.info("%s exitting", client)
Пример #4
0
    def __init__(self,
                 ctx: Context,
                 trace_queue: Queue,
                 description: ClientDescription,
                 eventbus=None) -> None:
        super().__init__()
        self.ctx = ctx
        self.description = description
        self.client_id = description.client_id
        self.cfg = description.config
        self.traces = trace_queue
        self.eventbus = eventbus or pymq

        self.router = ctx.create_router()
        self.request_generator = RequestGenerator(
            self._create_request_factory(), self.ctx)

        # used for generating request ids
        self.client_uuid = util.uuid()[-10:]
        self.request_counter = 0

        # used for statistics
        self.failed_counter = 0

        # expose methods
        self.eventbus.subscribe(self._on_set_workload_command)
        self.eventbus.subscribe(self._on_stop_workload_command)
        self.eventbus.expose(self.get_info, 'Client.get_info')
        self.request_executor = ThreadPoolExecutor(max_workers=50)
Пример #5
0
    def test_debug_router(self):
        env = dict(os.environ)
        env['galileo_router_type'] = 'DebugRouter'

        client_id = 'unittest_client'
        ctx = Context(env)
        trace_queue = Queue()

        description = ClientDescription(client_id, 'unittest_worker',
                                        ClientConfig('aservice'))
        # ctx: Context, trace_queue: Queue, description: ClientDescription

        client = Client(ctx,
                        trace_queue,
                        description,
                        eventbus=SimpleEventBus())
        client.request_generator = StaticRequestGenerator(
            [ServiceRequest('aservice') for _ in range(self.n)])

        then = time.time()
        client.run()
        now = time.time()

        total = now - then

        print('DebugRouter: %.2f req/sec (%.4fs total)' %
              (self.n / total, total))
Пример #6
0
    def test_symmetry_router(self, mock_request):
        # mock http server
        Response = NamedTuple('Response',
                              status_code=int,
                              text=str,
                              url=str,
                              method=str)

        def fake_response(method, url):
            return Response(200, 'ok', url, method)

        mock_request.side_effect = fake_response

        self.rtbl.set_routing(
            RoutingRecord('aservice', ['host1', 'host2', 'host3'], [1, 2, 3]))

        env = dict(os.environ)
        env['galileo_router_type'] = 'CachingSymmetryHostRouter'

        client_id = 'unittest_client'
        ctx = Context(env)
        ctx.create_redis = lambda: self.rds
        trace_queue = Queue()

        description = ClientDescription(client_id, 'unittest_worker',
                                        ClientConfig('aservice'))
        # ctx: Context, trace_queue: Queue, description: ClientDescription

        client = Client(ctx,
                        trace_queue,
                        description,
                        eventbus=SimpleEventBus())
        client.request_generator = StaticRequestGenerator(
            [ServiceRequest('aservice') for _ in range(self.n)])

        then = time.time()
        client.run()
        now = time.time()

        total = now - then

        print('CachingSymmetryHostRouter: %.2f req/sec (%.4f total)' %
              (self.n / total, total))
Пример #7
0
def pre_recorded_profile(ctx: Context, list_key: str):
    rds = ctx.create_redis()
    start = time.time()
    values = rds.lrange(list_key, 0, rds.llen(list_key))
    rds.delete(list_key)
    # Values need to be reversed since we originally treated this like a stack
    values.reverse()
    end = time.time()
    logger.debug(
        f'loaded {len(values)} ia values in {end - start}s from redis')
    for value in values:
        yield float(value)
    logger.info('done')
Пример #8
0
    def test_with_router_fault(self):
        class FaultInjectingRouter(DebugRouter):
            def request(self, req: ServiceRequest) -> 'requests.Response':
                if req.path == '/api/nonexisting':
                    raise ValueError('some error')

                return super().request(req)

        router = FaultInjectingRouter()

        ctx = Context()
        ctx.create_router = lambda: router
        client_id = 'unittest_client'
        trace_queue = Queue()

        description = ClientDescription(client_id, 'unittest_worker',
                                        ClientConfig('aservice'))
        # ctx: Context, trace_queue: Queue, description: ClientDescription

        client = Client(ctx,
                        trace_queue,
                        description,
                        eventbus=SimpleEventBus())

        client.request_generator = StaticRequestGenerator([
            ServiceRequest('aservice', path='/api/nonexisting'),
            ServiceRequest('aservice', path='/api/unittest'),
        ])

        client.run()

        trace1 = trace_queue.get(timeout=2)
        trace2 = trace_queue.get(timeout=2)

        self.assertEqual(-1, trace1.sent)
        self.assertAlmostEqual(trace2.sent, time.time(), delta=2)
Пример #9
0
def single_request(cfg: ClientConfig,
                   ctx=None,
                   router_type=None) -> requests.Response:
    ctx = ctx or Context()

    if cfg.client:
        app_loader = ctx.create_app_loader()
        app = app_loader.load(cfg.client, cfg.parameters)
    else:
        app = DefaultAppClient(cfg.parameters)

    factory = AppClientRequestFactory(cfg.service, app)

    router = ctx.create_router(router_type)
    return router.request(factory.create_request())
Пример #10
0
    def test_client_integration(self):
        env = dict(os.environ)
        env['galileo_router_type'] = 'DebugRouter'

        client_id = 'unittest_client'
        ctx = Context(env)
        trace_queue = Queue()

        description = ClientDescription(client_id, 'unittest_worker',
                                        ClientConfig('aservice'))
        # ctx: Context, trace_queue: Queue, description: ClientDescription

        client = Client(ctx,
                        trace_queue,
                        description,
                        eventbus=SimpleEventBus())

        client.request_generator = StaticRequestGenerator([
            ServiceRequest('aservice'),
            ServiceRequest('aservice'),
        ])

        client.run()

        trace1 = trace_queue.get(timeout=2)
        trace2 = trace_queue.get(timeout=2)

        self.assertEqual('aservice', trace1.service)
        self.assertEqual('aservice', trace2.service)

        self.assertEqual('debughost', trace1.server)
        self.assertEqual('debughost', trace2.server)

        now = time.time()
        self.assertAlmostEqual(now, trace1.done, delta=2)
        self.assertAlmostEqual(now, trace2.done, delta=2)