Esempio n. 1
0
def test_all_events_serialized():
    es = EventSerializer(config_with_all_attrs_private)
    event0 = make_event(user, 'key0')
    event1 = make_event(user, 'key1')
    filtered0 = make_event(user_with_all_attrs_hidden, 'key0')
    filtered1 = make_event(user_with_all_attrs_hidden, 'key1')
    j = es.serialize_events([event0, event1])
    assert json.loads(j) == [filtered0, filtered1]
Esempio n. 2
0
 def __init__(self, event_queue, config):
     Thread.__init__(self)
     self._session = requests.Session()
     self.daemon = True
     self._config = config
     self._queue = event_queue
     self._serializer = EventSerializer(config)
     self._running = True
Esempio n. 3
0
class EventConsumerImpl(Thread, EventConsumer):
    def __init__(self, event_queue, config):
        Thread.__init__(self)
        self._session = requests.Session()
        self.daemon = True
        self._config = config
        self._queue = event_queue
        self._serializer = EventSerializer(config)
        self._running = True

    def run(self):
        log.info("Starting event consumer")
        self._running = True
        while self._running:
            try:
                self.send()
            except Exception:
                log.warning('Unhandled exception in event consumer')

    def stop(self):
        self._running = False

    def flush(self):
        self._queue.join()

    def send_batch(self, events):
        def do_send(should_retry):
            # noinspection PyBroadException
            try:
                json_body = self._serializer.serialize_events(events)
                log.debug('Sending events payload: ' + json_body)
                hdrs = _headers(self._config.sdk_key)
                uri = self._config.events_uri
                r = self._session.post(uri,
                                       headers=hdrs,
                                       timeout=(self._config.connect_timeout,
                                                self._config.read_timeout),
                                       data=json_body)
                if r.status_code == 401:
                    log.error(
                        'Received 401 error, no further events will be posted since SDK key is invalid'
                    )
                    self.stop()
                    return
                r.raise_for_status()
            except ProtocolError as e:
                if e.args is not None and len(
                        e.args) > 1 and e.args[1] is not None:
                    inner = e.args[1]
                    if inner.errno is not None and inner.errno == errno.ECONNRESET and should_retry:
                        log.warning(
                            'ProtocolError exception caught while sending events. Retrying.'
                        )
                        do_send(False)
                else:
                    log.warning(
                        'Unhandled exception in event consumer. Analytics events were not processed.',
                        exc_info=True)
            except:
                log.warning(
                    'Unhandled exception in event consumer. Analytics events were not processed.',
                    exc_info=True)

        try:
            do_send(True)
        finally:
            for _ in events:
                self._queue.task_done()

    def send(self):
        events = self.next()

        if len(events) == 0:
            return
        else:
            self.send_batch(events)

    def next(self):
        q = self._queue
        items = []

        item = self.next_item()
        if item is None:
            return items

        items.append(item)
        while len(
                items
        ) < self._config.events_upload_max_batch_size and not q.empty():
            item = self.next_item()
            if item:
                items.append(item)

        return items

    def next_item(self):
        q = self._queue
        # noinspection PyBroadException
        try:
            item = q.get(block=True, timeout=5)
            return item
        except Exception:
            return None
Esempio n. 4
0
def test_all_user_attrs_serialized():
    es = EventSerializer(base_config)
    event = make_event(user)
    j = es.serialize_events(event)
    assert json.loads(j) == [event]
Esempio n. 5
0
def test_leave_anonymous_attr_as_is():
    es = EventSerializer(config_with_all_attrs_private)
    event = make_event(anon_user)
    filtered_event = make_event(anon_user_with_all_attrs_hidden)
    j = es.serialize_events(event)
    assert json.loads(j) == [filtered_event]
Esempio n. 6
0
def test_unknown_top_level_attrs_stripped():
    es = EventSerializer(base_config)
    event = make_event(user_with_unknown_top_level_attrs)
    filtered_event = make_event(user)
    j = es.serialize_events(event)
    assert json.loads(j) == [filtered_event]
Esempio n. 7
0
def test_per_user_private_attr_plus_global_private_attrs():
    es = EventSerializer(config_with_some_attrs_private)
    event = make_event(user_specifying_own_private_attr)
    filtered_event = make_event(user_with_all_attrs_hidden)
    j = es.serialize_events(event)
    assert json.loads(j) == [filtered_event]
Esempio n. 8
0
def test_per_user_private_attr():
    es = EventSerializer(base_config)
    event = make_event(user_specifying_own_private_attr)
    filtered_event = make_event(user_with_own_specified_attr_hidden)
    j = es.serialize_events(event)
    assert json.loads(j) == [filtered_event]
Esempio n. 9
0
def test_some_user_attrs_private():
    es = EventSerializer(config_with_some_attrs_private)
    event = make_event(user)
    filtered_event = make_event(user_with_some_attrs_hidden)
    j = es.serialize_events(event)
    assert json.loads(j) == [filtered_event]