-
Notifications
You must be signed in to change notification settings - Fork 18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add listener for tracking event emitted signal #305
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
""" | ||
This module contains various configuration settings via | ||
waffle switches for the Certificates app. | ||
""" | ||
|
||
from edx_toggles.toggles import SettingToggle, WaffleSwitch | ||
|
||
# .. toggle_name: SEND_TRACKING_EVENT_EMITTED_SIGNAL | ||
# .. toggle_implementation: SettingToggle | ||
# .. toggle_default: False | ||
# .. toggle_description: When True, the system will publish `TRACKING_EVENT_EMITTED` signals to the event bus. The | ||
# `TRACKING_EVENT_EMITTED` signal is emit when a tracking log is emitted. | ||
# .. toggle_use_cases: publish | ||
SEND_TRACKING_EVENT_EMITTED_SIGNAL = SettingToggle('SEND_TRACKING_EVENT_EMITTED_SIGNAL', default=False, module_name=__name__) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
import json | ||
import logging | ||
|
||
from django.conf import settings | ||
from django.dispatch import receiver | ||
from django_redis import get_redis_connection | ||
from edx_django_utils.cache.utils import get_cache_key | ||
from openedx_events.analytics.signals import TRACKING_EVENT_EMITTED | ||
from openedx_events.event_bus import get_producer | ||
|
||
from event_routing_backends.config import SEND_TRACKING_EVENT_EMITTED_SIGNAL | ||
|
||
logger = logging.getLogger(__name__) | ||
|
||
TRANSFORMED_EVENT_KEY_NAME = "transformed_events" | ||
|
||
@receiver(TRACKING_EVENT_EMITTED) | ||
def listen_for_tracking_event_emitted_event(sender, signal, **kwargs): | ||
""" | ||
Publish `TRACKING_EVENT_EMITTED` events to the event bus. | ||
""" | ||
event = kwargs['tracking_log'] | ||
|
||
## TODO: Should we ignore events that we don't care about here or in the event routing backend config? | ||
|
||
redis = get_redis_connection("default") | ||
|
||
queue_size = redis.llen(TRANSFORMED_EVENT_KEY_NAME) | ||
if queue_size >= settings.EVENT_ROUTING_BATCH_SIZE: | ||
queued_events = redis.rpop(TRANSFORMED_EVENT_KEY_NAME, settings.EVENT_ROUTING_BATCH_SIZE) | ||
queued_events.append(event) | ||
## TODO: Send events to event bus in batch | ||
logger.info("Sending events to event bus in batch") | ||
|
||
#if SEND_TRACKING_EVENT_EMITTED_SIGNAL.is_enabled(): | ||
# get_producer().send( | ||
# signal=TRACKING_EVENT_EMITTED, | ||
# topic='analytics', | ||
# event_key_field='tracking_log.name', | ||
# event_data={'tracking_log': kwargs['tracking_log']}, | ||
# event_metadata=kwargs['metadata'] | ||
# ) | ||
Comment on lines
+35
to
+42
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @bmtcril I guess we would need to write the code for the event-bus consumer, but how will we send queued events in batch to the event bus? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think there's any additional code needed for the consumer. Running the You would need to create an EventsRouter with the processors defined in configuration just like the AsyncRouter does (note: not like the management command does, it does not use the processors). Then you can call bulk_send on that and it will find all of the configured LRSs and POST the batch to them. |
||
else: | ||
redis.lpush(TRANSFORMED_EVENT_KEY_NAME, json.dumps({ | ||
"name": event.name, | ||
"timestamp": event.timestamp, | ||
"data": event.data, | ||
"context": event.context, | ||
})) | ||
logger.info("Event pushed to the queue, current size: %s", queue_size + 1) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@bmtcril Please read my comments
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's possible to ignore events at the tracking log configuration level, which may be enough for this and is probably better for overall system performance.