Add metrics and logs for the event sending

This commit is contained in:
Adrià Casajús 2024-09-02 16:28:55 +02:00
parent d49f6b88a9
commit 728f9bf1f8
No known key found for this signature in database
GPG Key ID: F0033226A5AFC9B9
3 changed files with 26 additions and 0 deletions

View File

@ -1,8 +1,12 @@
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
import newrelic.agent
from app import config from app import config
from app.db import Session from app.db import Session
from app.errors import ProtonPartnerNotSetUp from app.errors import ProtonPartnerNotSetUp
from app.events.generated import event_pb2 from app.events.generated import event_pb2
from app.log import LOG
from app.models import User, PartnerUser, SyncEvent from app.models import User, PartnerUser, SyncEvent
from app.proton.utils import get_proton_partner from app.proton.utils import get_proton_partner
from typing import Optional from typing import Optional
@ -35,9 +39,13 @@ class EventDispatcher:
skip_if_webhook_missing: bool = True, skip_if_webhook_missing: bool = True,
): ):
if config.EVENT_WEBHOOK_DISABLE: if config.EVENT_WEBHOOK_DISABLE:
LOG.i("Not sending events because webhook is disabled")
return return
if not config.EVENT_WEBHOOK and skip_if_webhook_missing: if not config.EVENT_WEBHOOK and skip_if_webhook_missing:
LOG.i(
"Not sending events because webhook is not configured and allowed to be empty"
)
return return
if config.EVENT_WEBHOOK_ENABLED_USER_IDS is not None: if config.EVENT_WEBHOOK_ENABLED_USER_IDS is not None:
@ -46,6 +54,9 @@ class EventDispatcher:
partner_user = EventDispatcher.__partner_user(user.id) partner_user = EventDispatcher.__partner_user(user.id)
if not partner_user: if not partner_user:
LOG.i(
f"Not sending events because there's no partner user for user {user}"
)
return return
event = event_pb2.Event( event = event_pb2.Event(
@ -57,6 +68,8 @@ class EventDispatcher:
serialized = event.SerializeToString() serialized = event.SerializeToString()
dispatcher.send(serialized) dispatcher.send(serialized)
newrelic.agent.record_custom_event("event_stored")
LOG.i("Sent event to the dispatcher")
@staticmethod @staticmethod
def __partner_user(user_id: int) -> Optional[PartnerUser]: def __partner_user(user_id: int) -> Optional[PartnerUser]:

View File

@ -1,3 +1,5 @@
import newrelic.agent
from app.events.event_dispatcher import EventDispatcher, Dispatcher from app.events.event_dispatcher import EventDispatcher, Dispatcher
from app.events.generated.event_pb2 import EventContent, AliasCreated, AliasCreatedList from app.events.generated.event_pb2 import EventContent, AliasCreated, AliasCreatedList
from app.log import LOG from app.log import LOG
@ -12,6 +14,7 @@ def send_alias_creation_events_for_user(
return return
chunk_size = min(chunk_size, 50) chunk_size = min(chunk_size, 50)
event_list = [] event_list = []
LOG.i("Sending alias create events for user {user}")
for alias in ( for alias in (
Alias.yield_per_query(chunk_size) Alias.yield_per_query(chunk_size)
.filter_by(user_id=user.id) .filter_by(user_id=user.id)
@ -26,15 +29,23 @@ def send_alias_creation_events_for_user(
) )
) )
if len(event_list) >= chunk_size: if len(event_list) >= chunk_size:
LOG.i(f"Sending {len(event_list)} alias create event for {user}")
EventDispatcher.send_event( EventDispatcher.send_event(
user, user,
EventContent(alias_create_list=AliasCreatedList(events=event_list)), EventContent(alias_create_list=AliasCreatedList(events=event_list)),
dispatcher=dispatcher, dispatcher=dispatcher,
) )
newrelic.agent.record_custom_metric(
"Custom/event_alias_created_event", len(event_list)
)
event_list = [] event_list = []
if len(event_list) > 0: if len(event_list) > 0:
LOG.i(f"Sending {len(event_list)} alias create event for {user}")
EventDispatcher.send_event( EventDispatcher.send_event(
user, user,
EventContent(alias_create_list=AliasCreatedList(events=event_list)), EventContent(alias_create_list=AliasCreatedList(events=event_list)),
dispatcher=dispatcher, dispatcher=dispatcher,
) )
newrelic.agent.record_custom_metric(
"Custom/event_alias_created_event", len(event_list)
)

View File

@ -1,4 +1,5 @@
import requests import requests
import newrelic.agent
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from app.config import EVENT_WEBHOOK, EVENT_WEBHOOK_SKIP_VERIFY_SSL from app.config import EVENT_WEBHOOK, EVENT_WEBHOOK_SKIP_VERIFY_SSL
@ -26,6 +27,7 @@ class HttpEventSink(EventSink):
headers={"Content-Type": "application/x-protobuf"}, headers={"Content-Type": "application/x-protobuf"},
verify=not EVENT_WEBHOOK_SKIP_VERIFY_SSL, verify=not EVENT_WEBHOOK_SKIP_VERIFY_SSL,
) )
newrelic.agent.record_custom_event("event_sent", {"http_code": res.status_code})
if res.status_code != 200: if res.status_code != 200:
LOG.warning( LOG.warning(
f"Failed to send event to webhook: {res.status_code} {res.text}" f"Failed to send event to webhook: {res.status_code} {res.text}"