Add more detailed telemetry for get_audience

This is still slow in some cases, despite #2723, so this information
should give useful data about how it could be optimized more.

This also adds some abstraction around getting the tracer, just to
follow the advice in the OpenTelemetry documentation not to use __name__
directly to set the tracer name. The advice is ignored in most of their
examples, so it probably doesn't matter, but IDK, seems reasonable to
try to follow it.

Related: #2720
This commit is contained in:
Wesley Aptekar-Cassels 2023-03-20 15:49:09 -04:00
parent ef64fedbd9
commit 7efbdb1865
2 changed files with 14 additions and 1 deletions

View file

@ -4,10 +4,15 @@ from django.dispatch import receiver
from django.db import transaction
from django.db.models import signals, Q
from django.utils import timezone
from opentelemetry import trace
from bookwyrm import models
from bookwyrm.redis_store import RedisStore, r
from bookwyrm.tasks import app, LOW, MEDIUM, HIGH
from bookwyrm.telemetry import open_telemetry
tracer = open_telemetry.tracer()
class ActivityStream(RedisStore):
@ -136,8 +141,10 @@ class ActivityStream(RedisStore):
)
return audience.distinct()
def get_audience(self, status): # pylint: disable=no-self-use
@tracer.start_as_current_span("ActivityStream.get_audience")
def get_audience(self, status):
"""given a status, what users should see it"""
trace.get_current_span().set_attribute("stream_id", self.key)
return [user.id for user in self._get_audience(status)]
def get_stores_for_object(self, obj):
@ -160,7 +167,9 @@ class HomeStream(ActivityStream):
key = "home"
@tracer.start_as_current_span("HomeStream.get_audience")
def get_audience(self, status):
trace.get_current_span().set_attribute("stream_id", self.key)
audience = super()._get_audience(status)
if not audience:
return []

View file

@ -29,3 +29,7 @@ def instrumentCelery():
@worker_process_init.connect(weak=False)
def init_celery_tracing(*args, **kwargs):
CeleryInstrumentor().instrument()
def tracer():
return trace.get_tracer(__name__)