Пример #1
0
def test_requests_size(port_generator, executor):
    port0 = port_generator()
    port1 = port_generator()

    with Flow(monitoring=True,
              port_monitoring=port0).add(uses=executor,
                                         port_monitoring=port1) as f:

        f.post('/foo', inputs=DocumentArray.empty(size=1))

        resp = req.get(f'http://localhost:{port1}/')  # enable on port0
        assert resp.status_code == 200

        assert (
            f'jina_request_size_bytes_count{{executor="DummyExecutor",executor_endpoint="/foo",runtime_name="executor0/rep-0"}} 1.0'
            in str(resp.content))

        def _get_request_bytes_size():
            resp = req.get(f'http://localhost:{port1}/')  # enable on port0

            resp_lines = str(resp.content).split('\\n')
            byte_line = [
                line for line in resp_lines if
                'jina_request_size_bytes_sum{executor="DummyExecutor"' in line
            ]

            return float(byte_line[0][-5:])

        measured_request_bytes_sum_init = _get_request_bytes_size()
        f.post('/foo', inputs=DocumentArray.empty(size=1))
        measured_request_bytes_sum = _get_request_bytes_size()

        assert measured_request_bytes_sum > measured_request_bytes_sum_init
Пример #2
0
def test_document_processed_total(port_generator, executor):
    port0 = port_generator()
    port1 = port_generator()

    with Flow(monitoring=True,
              port_monitoring=port0).add(uses=executor,
                                         port_monitoring=port1) as f:

        resp = req.get(f'http://localhost:{port1}/')
        assert resp.status_code == 200

        f.post(
            f'/foo',
            inputs=DocumentArray.empty(size=4))  # process 4 documents on foo

        resp = req.get(f'http://localhost:{port1}/')
        assert (
            f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/foo",runtime_name="executor0/rep-0"}} 4.0'  # check that we count 4 documents on foo
            in str(resp.content))

        assert not (
            f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/bar",runtime_name="executor0/rep-0"}}'  # check that we does not start counting documents on bar as it has not been called yet
            in str(resp.content))

        f.post(
            f'/bar',
            inputs=DocumentArray.empty(size=5))  # process 5 documents on bar

        assert not (
            f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/bar",runtime_name="executor0/rep-0"}} 5.0'  # check that we count 5 documents on foo
            in str(resp.content))

        assert (
            f'jina_document_processed_total{{executor="DummyExecutor",executor_endpoint="/foo",runtime_name="executor0/rep-0"}} 4.0'  # check that we nothing change on bar count
            in str(resp.content))
Пример #3
0
def test_client_on_error_call(protocol, exception):

    with pytest.raises(exception):
        Client(host='0.0.0.0', protocol=protocol, port=12345).post(
            '/blah',
            inputs=DocumentArray.empty(10),
        )
Пример #4
0
def test_decorator_interface(port_generator):
    class DummyExecutor(Executor):
        @requests(on='/foo')
        def foo(self, docs, **kwargs):
            self._proces(docs)
            self.proces_2(docs)

        @monitor(name='metrics_name', documentation='metrics description')
        def _proces(self, docs):
            ...

        @monitor()
        def proces_2(self, docs):
            ...

    port = port_generator()
    with Flow(monitoring=True,
              port_monitoring=port_generator()).add(uses=DummyExecutor,
                                                    monitoring=True,
                                                    port_monitoring=port) as f:
        f.post('/foo', inputs=DocumentArray.empty(4))

        resp = req.get(f'http://localhost:{port}/')
        assert f'jina_metrics_name_count{{runtime_name="executor0/rep-0"}} 1.0' in str(
            resp.content)
        assert (
            f'jina_proces_2_seconds_count{{runtime_name="executor0/rep-0"}} 1.0'
            in str(resp.content))
Пример #5
0
def test_client_host_scheme(protocol):
    port = random_port()
    f = Flow(protocol='websocket' if protocol == 'ws' else protocol,
             port=port).add()
    with f:
        c = Client(host=f'{protocol}://localhost:{port}')
        c.post('/', inputs=DocumentArray.empty(2))
Пример #6
0
def test_healthcheck_logs_websocket_with_env(capfd, health_check_env):
    f = Flow(protocol='websocket', port=12345).add()
    with f:
        f.post('/', inputs=DocumentArray.empty())
        req.get('http://localhost:12345/')

    out, _ = capfd.readouterr()
    assert '"GET / HTTP/1.1" 200 OK' not in out
Пример #7
0
def test_empty_arrays(linear_flow):
    docs = DocumentArray.empty(5)

    with linear_flow as f:
        resp = f.post(on='/foo', inputs=docs)
    for doc in resp:
        assert not doc.tags['listcheck_embedding']
        assert not doc.tags['listcheck_tensor']
        assert not doc.tags['nparraycheck_embedding']
        assert not doc.tags['nparraycheck_tensor']
Пример #8
0
async def test_async_apply():
    class AsyncExecutor(Executor):
        @requests
        async def foo(self, docs: DocumentArray, **kwargs):
            docs.apply(set_hello)
            return docs

    N = 2
    da = DocumentArray.empty(N)
    exec = AsyncExecutor()
    da1 = await exec.foo(da)
    assert da1.texts == ['hello'] * N
Пример #9
0
def test_array_conversion(linear_flow):
    docs = DocumentArray.empty(5)
    for doc in docs:
        doc.embedding = torch.tensor(np.random.randn(5))
        doc.tensor = torch.tensor(np.random.randn(3, 3))

    with linear_flow as f:
        resp = f.post(on='/foo', inputs=docs)
    for doc in resp:
        assert doc.tags['nparraycheck_embedding']
        assert doc.tags['nparraycheck_tensor']
        assert doc.tags['listcheck_embedding']
        assert doc.tags['listcheck_tensor']
Пример #10
0
def test_map_nested():
    class NestedExecutor(Executor):
        @requests
        def foo(self, docs: DocumentArray, **kwargs):
            def bar(d: Document):
                d.text = 'hello'
                return d

            docs.apply(bar)
            return docs

    N = 2
    da = DocumentArray.empty(N)
    exec = NestedExecutor()
    da1 = exec.foo(da)
    assert da1.texts == ['hello'] * N
Пример #11
0
def test_client_on_always_after_exception(protocol):
    class OnAlways:
        def __init__(self):
            self.is_called = False

        def __call__(self, response):
            self.is_called = True

    on_always = OnAlways()

    Client(host='0.0.0.0', protocol=protocol, port=12345).post(
        '/blah',
        inputs=DocumentArray.empty(10),
        on_always=on_always,
    )

    assert on_always.is_called
Пример #12
0
def test_client_on_error_deprecation(protocol):
    class OnError:
        def __init__(self):
            self.is_called = False

        def __call__(self, response):  # this is deprecated
            self.is_called = True

    on_error = OnError()

    Client(host='0.0.0.0', protocol=protocol, port=12345).post(
        '/blah',
        inputs=DocumentArray.empty(10),
        on_error=on_error,
    )

    assert on_error.is_called
Пример #13
0
def test_sorted_response(tmpdir, shuffle_flow):
    tag_list = ['first', 'second', 'third', 'fourth', 'fifth']
    inputs = DocumentArray.empty(6)
    for i in range(5):  # no tag for last doc
        inputs[i].tags[tag_list[i]] = 1  # one-hot encoding

    with shuffle_flow as f:
        ret = f.post(on='/index', inputs=inputs)

    assert len(ret) == 5

    for i, doc in enumerate(ret):
        assert doc.tags[tag_list[i]] == 1

    inputs = inputs[:5]
    for og, returned in zip(inputs, ret):
        assert og.id == returned.id
Пример #14
0
def test_client_on_error_raise_exception(protocol, exception):
    class OnError:
        def __init__(self):
            self.is_called = False

        def __call__(self,
                     response,
                     exception_param: Optional[Exception] = None):
            self.is_called = True
            assert type(exception_param) == exception

    on_error = OnError()

    Client(host='0.0.0.0', protocol=protocol, port=12345).post(
        '/blah',
        inputs=DocumentArray.empty(10),
        on_error=on_error,
    )

    assert on_error.is_called
Пример #15
0
def test_prometheus_interface(port_generator):
    class DummyExecutor(Executor):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.summary = Summary('a',
                                   'A',
                                   registry=self.runtime_args.metrics_registry)

        @requests(on='/foo')
        def foo(self, docs, **kwargs):
            with self.summary.time():
                ...

    port = port_generator()
    with Flow(monitoring=True,
              port_monitoring=port_generator()).add(uses=DummyExecutor,
                                                    monitoring=True,
                                                    port_monitoring=port) as f:
        f.post('/foo', inputs=DocumentArray.empty(4))

        resp = req.get(f'http://localhost:{port}/')
        assert f'a_count 1.0' in str(  # check that we count 4 documents on foo
            resp.content)
Пример #16
0
def test_executor_dataclass():
    @dataclasses.dataclass
    class MyDataClassExecutor(Executor):
        my_field: str

        @requests(on=['/search'])
        def baz(self, docs, **kwargs):
            for doc in docs:
                doc.tags['metas_name'] = self.metas.name
                doc.tags['my_field'] = self.my_field

    f = Flow().add(
        uses=MyDataClassExecutor,
        uses_with={'my_field': 'this is my field'},
        uses_metas={'name': 'test-name-updated'},
        uses_requests={'/foo': 'baz'},
    )
    with f:
        res = f.post(on='/foo', inputs=DocumentArray.empty(2))
    assert len(res) == 2
    for r in res:
        assert r.tags['metas_name'] == 'test-name-updated'
        assert r.tags['my_field'] == 'this is my field'
Пример #17
0
import os

import pytest

from docarray import DocumentArray
from jina import Flow


@pytest.mark.parametrize('inputs', [None, DocumentArray.empty(10)])
def test_grpc_census(inputs):
    assert int(os.environ.get('JINA_GRPC_SEND_BYTES', 0)) == 0
    assert int(os.environ.get('JINA_GRPC_RECV_BYTES', 0)) == 0
    with Flow().add().add() as f:
        f.post(
            on='/',
            inputs=inputs,
        )
    assert int(os.environ['JINA_GRPC_SEND_BYTES']) > 0
    assert int(os.environ['JINA_GRPC_RECV_BYTES']) > 0
    # add some route info, so size must be larger
    assert int(os.environ['JINA_GRPC_SEND_BYTES']) < int(
        os.environ['JINA_GRPC_RECV_BYTES'])
    del os.environ['JINA_GRPC_SEND_BYTES']
    del os.environ['JINA_GRPC_RECV_BYTES']
Пример #18
0
def test_serve(served_exec):
    docs = Client(port=PORT).post(on='/foo', inputs=DocumentArray.empty(5))

    assert docs.texts == ['foo' for _ in docs]
Пример #19
0
 def _send_request():
     f.search(inputs=DocumentArray.empty(size=1))