Skip to content

Commit

Permalink
chore: posthog and sentry exception capture (#27836)
Browse files Browse the repository at this point in the history
  • Loading branch information
daibhin authored Feb 6, 2025
1 parent 0e2f236 commit bbc8047
Show file tree
Hide file tree
Showing 64 changed files with 126 additions and 96 deletions.
2 changes: 1 addition & 1 deletion ee/billing/billing_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from sentry_sdk import capture_message
from requests import JSONDecodeError # type: ignore[attr-defined]
from rest_framework.exceptions import NotAuthenticated
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from ee.billing.billing_types import BillingStatus
from ee.billing.quota_limiting import set_org_usage_summary, update_org_billing_quotas
Expand Down
2 changes: 1 addition & 1 deletion ee/billing/quota_limiting.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import posthoganalytics
from django.db.models import Q
from django.utils import timezone
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.cache_utils import cache_for
from posthog.event_usage import report_organization_action
Expand Down
10 changes: 6 additions & 4 deletions ee/hogai/query_executor/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.core.serializers.json import DjangoJSONEncoder
from langchain_core.runnables import RunnableConfig
from rest_framework.exceptions import APIException
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from ee.hogai.query_executor.format import (
compress_and_format_funnels_results,
Expand Down Expand Up @@ -54,9 +54,11 @@ def run(self, state: AssistantState, config: RunnableConfig) -> PartialAssistant
viz_message.answer.model_dump(mode="json"),
# Celery doesn't run in tests, so there we use force_blocking instead
# This does mean that the waiting logic is not tested
execution_mode=ExecutionMode.RECENT_CACHE_CALCULATE_ASYNC_IF_STALE
if not settings.TEST
else ExecutionMode.CALCULATE_BLOCKING_ALWAYS,
execution_mode=(
ExecutionMode.RECENT_CACHE_CALCULATE_ASYNC_IF_STALE
if not settings.TEST
else ExecutionMode.CALCULATE_BLOCKING_ALWAYS
),
).model_dump(mode="json")
if results_response.get("query_status") and not results_response["query_status"]["complete"]:
query_id = results_response["query_status"]["id"]
Expand Down
3 changes: 2 additions & 1 deletion ee/tasks/subscriptions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@
import structlog
from celery import shared_task
from prometheus_client import Counter
from sentry_sdk import capture_exception, capture_message
from sentry_sdk import capture_message

from ee.tasks.subscriptions.email_subscriptions import send_email_subscription_report
from ee.tasks.subscriptions.slack_subscriptions import send_slack_subscription_report
from ee.tasks.subscriptions.subscription_utils import generate_assets
from posthog import settings
from posthog.exceptions_capture import capture_exception
from posthog.models.subscription import Subscription
from posthog.tasks.utils import CeleryQueue

Expand Down
2 changes: 1 addition & 1 deletion posthog/api/authentication.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
from rest_framework.exceptions import APIException
from rest_framework.request import Request
from rest_framework.response import Response
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from social_django.views import auth
from two_factor.utils import default_device
from two_factor.views.core import REMEMBER_COOKIE_PREFIX
Expand Down
4 changes: 2 additions & 2 deletions posthog/api/capture.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@
from kafka.producer.future import FutureRecordMetadata
from prometheus_client import Counter, Gauge, Histogram
from rest_framework import status
from sentry_sdk import configure_scope
from sentry_sdk.api import capture_exception, start_span
from sentry_sdk import configure_scope, start_span
from statshog.defaults.django import statsd
from token_bucket import Limiter, MemoryStorage
from typing import Any, Optional, Literal
Expand All @@ -28,6 +27,7 @@
from posthog.api.utils import get_data, get_token, safe_clickhouse_string
from posthog.cache_utils import cache_for
from posthog.exceptions import generate_exception_response
from posthog.exceptions_capture import capture_exception
from posthog.kafka_client.client import KafkaProducer, session_recording_kafka_producer
from posthog.kafka_client.topics import (
KAFKA_EVENTS_PLUGIN_INGESTION_HISTORICAL,
Expand Down
2 changes: 1 addition & 1 deletion posthog/api/cohort.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
from rest_framework.response import Response
from rest_framework.settings import api_settings
from rest_framework_csv import renderers as csvrenderers
from sentry_sdk.api import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.api.forbid_destroy_model import ForbidDestroyModel
from posthog.api.person import get_funnel_actor_class
Expand Down
2 changes: 1 addition & 1 deletion posthog/api/decide.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from django.views.decorators.csrf import csrf_exempt
from prometheus_client import Counter
from rest_framework import status
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from statshog.defaults.django import statsd

from posthog.api.survey import SURVEY_TARGETING_FLAG_PREFIX
Expand Down
2 changes: 1 addition & 1 deletion posthog/api/email_verification.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from rest_framework import exceptions
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.models.user import User
from posthog.tasks.email import send_email_verification
Expand Down
2 changes: 1 addition & 1 deletion posthog/api/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.settings import api_settings
from rest_framework_csv import renderers as csvrenderers
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.api.documentation import PropertiesSerializer, extend_schema
from posthog.api.routing import TeamAndOrgViewSetMixin
Expand Down
2 changes: 1 addition & 1 deletion posthog/api/feature_flag.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from rest_framework.permissions import SAFE_METHODS, BasePermission
from rest_framework.request import Request
from rest_framework.response import Response
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from posthog.api.cohort import CohortSerializer
from posthog.rbac.access_control_api_mixin import AccessControlViewSetMixin
from posthog.rbac.user_access_control import UserAccessControlSerializerMixin
Expand Down
2 changes: 1 addition & 1 deletion posthog/api/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from pydantic import BaseModel, ValidationError

from rest_framework.exceptions import ParseError
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

T = TypeVar("T", bound=BaseModel)

Expand Down
4 changes: 3 additions & 1 deletion posthog/api/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@
from rest_framework.exceptions import NotAuthenticated, ValidationError
from rest_framework.request import Request
from rest_framework.response import Response
from sentry_sdk import capture_exception, set_tag
from sentry_sdk import set_tag
from asgiref.sync import sync_to_async

from posthog.exceptions_capture import capture_exception
from posthog.api.documentation import extend_schema
from posthog.api.mixins import PydanticModelMixin
from posthog.api.monitoring import Feature, monitor
Expand Down
2 changes: 1 addition & 1 deletion posthog/api/signup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.shortcuts import redirect
from django.urls.base import reverse
from rest_framework import exceptions, generics, permissions, response, serializers
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from social_core.pipeline.partial import partial
from social_django.strategy import DjangoStrategy

Expand Down
2 changes: 1 addition & 1 deletion posthog/api/site_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from django.http import HttpRequest, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from statshog.defaults.django import statsd

from posthog.exceptions import generate_exception_response
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import structlog
from django.conf import settings
from django.utils.timezone import now
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.async_migrations.definition import (
AsyncMigrationDefinition,
Expand Down
2 changes: 1 addition & 1 deletion posthog/async_migrations/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import structlog
from semantic_version.base import SimpleSpec
from sentry_sdk.api import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.async_migrations.definition import AsyncMigrationDefinition
from posthog.async_migrations.setup import (
Expand Down
2 changes: 1 addition & 1 deletion posthog/caching/insight_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from django.db import connection
from django.utils.timezone import now
from prometheus_client import Counter, Gauge
from sentry_sdk.api import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.api.services.query import process_query_dict
from posthog.clickhouse.query_tagging import tag_queries
Expand Down
2 changes: 1 addition & 1 deletion posthog/caching/warming.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from celery.canvas import chain
from django.db.models import Q
from prometheus_client import Counter, Gauge
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.api.services.query import process_query_dict
from posthog.caching.utils import largest_teams
Expand Down
2 changes: 1 addition & 1 deletion posthog/cloud_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from django.conf import settings
from django.db.utils import ProgrammingError
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

if TYPE_CHECKING:
from ee.models.license import License
Expand Down
2 changes: 1 addition & 1 deletion posthog/email.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.template.loader import get_template
from django.utils import timezone
from django.utils.module_loading import import_string
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.models.instance_setting import get_instance_setting
from posthog.models.messaging import MessagingRecord
Expand Down
2 changes: 1 addition & 1 deletion posthog/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.http.response import JsonResponse
from rest_framework import status
from rest_framework.exceptions import APIException
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.cloud_utils import is_cloud

Expand Down
8 changes: 8 additions & 0 deletions posthog/exceptions_capture.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
def capture_exception(error=None, sentry_scope=None, **sentry_scope_kwargs):
from sentry_sdk import capture_exception as sentry_capture_exception
from posthoganalytics import api_key, capture_exception as posthog_capture_exception

sentry_capture_exception(error, scope=sentry_scope, **sentry_scope_kwargs)

if api_key:
posthog_capture_exception(error)
4 changes: 2 additions & 2 deletions posthog/geoip.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import structlog
from django.contrib.gis.geoip2 import GeoIP2
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

logger = structlog.get_logger(__name__)

Expand All @@ -11,7 +11,7 @@
# Cache setting corresponds to MODE_MEMORY: Load database into memory. Pure Python.
# Provides faster performance but uses more memory.
except Exception as e:
# Inform Sentry, but don't bring down the app
# Inform error tracking, but don't bring down the app
capture_exception(e)
geoip = None

Expand Down
2 changes: 1 addition & 1 deletion posthog/hogql/database/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from django.db.models import Q, Prefetch
from pydantic import BaseModel, ConfigDict
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.hogql import ast
from posthog.hogql.context import HogQLContext
Expand Down
2 changes: 1 addition & 1 deletion posthog/hogql_queries/apply_dashboard_filters.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from posthog.hogql_queries.query_runner import get_query_runner
from posthog.models import Team
from posthog.schema import DashboardFilter, NodeKind
Expand Down
2 changes: 1 addition & 1 deletion posthog/hogql_queries/experiments/funnels_statistics.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from rest_framework.exceptions import ValidationError
from numpy.random import default_rng
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
import scipy.stats as stats
from posthog.hogql_queries.experiments import (
EXPECTED_LOSS_SIGNIFICANCE_LEVEL,
Expand Down
2 changes: 1 addition & 1 deletion posthog/hogql_queries/experiments/trends_statistics.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from numpy.random import default_rng
from rest_framework.exceptions import ValidationError
import scipy.stats as stats
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from ee.clickhouse.queries.experiments import (
FF_DISTRIBUTION_THRESHOLD,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from rest_framework.exceptions import ValidationError
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from posthog.hogql_queries.experiments import (
FF_DISTRIBUTION_THRESHOLD,
MIN_PROBABILITY_FOR_SIGNIFICANCE,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from rest_framework.exceptions import ValidationError
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
from posthog.hogql_queries.experiments import (
EXPECTED_LOSS_SIGNIFICANCE_LEVEL,
FF_DISTRIBUTION_THRESHOLD,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
from contextlib import contextmanager
from typing import TYPE_CHECKING

from sentry_sdk import capture_exception, set_tag
from sentry_sdk import set_tag
from posthog.exceptions_capture import capture_exception

from .filter_to_query import filter_to_query

Expand Down
3 changes: 2 additions & 1 deletion posthog/hogql_queries/query_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
import structlog
from prometheus_client import Counter
from pydantic import BaseModel, ConfigDict
from sentry_sdk import capture_exception, get_traceparent, push_scope, set_tag
from sentry_sdk import get_traceparent, push_scope, set_tag

from posthog.exceptions_capture import capture_exception
from posthog.caching.utils import ThresholdMode, cache_target_age, is_stale, last_refresh_from_cached_result
from posthog.clickhouse.client.execute_async import QueryNotFoundError, enqueue_process_query_task, get_query_status
from posthog.clickhouse.query_tagging import get_query_tag_value, tag_queries
Expand Down
8 changes: 4 additions & 4 deletions posthog/management/commands/migrate_experiments.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from posthog.hogql_queries.legacy_compatibility.filter_to_query import filter_to_query
from posthog.models import Experiment
from posthog.schema import ExperimentTrendsQuery, ExperimentFunnelsQuery
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
import logging
from datetime import datetime

Expand All @@ -27,9 +27,9 @@ def handle(self, *args, **options):
# Update main metric
main_experiment_query = self.create_experiment_query(
filters=experiment.filters,
custom_exposure_filter=experiment.parameters.get("custom_exposure_filter")
if experiment.parameters
else None,
custom_exposure_filter=(
experiment.parameters.get("custom_exposure_filter") if experiment.parameters else None
),
)
experiment.metrics = [main_experiment_query.model_dump()]

Expand Down
2 changes: 1 addition & 1 deletion posthog/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import structlog
from django.conf import settings
from prometheus_client import CollectorRegistry, Counter, push_to_gateway
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

logger = structlog.get_logger(__name__)

Expand Down
16 changes: 9 additions & 7 deletions posthog/models/activity_logging/activity_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

from django.db.models.signals import post_save
from django.dispatch.dispatcher import receiver
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception
import structlog
from django.core.paginator import Paginator
from django.core.exceptions import ObjectDoesNotExist
Expand Down Expand Up @@ -531,12 +531,14 @@ def activity_log_created(sender, instance: "ActivityLog", created, **kwargs):
distinct_id=user_data["distinct_id"] if user_data else f"team_{instance.team_id}",
properties=serialized_data,
),
person=InternalEventPerson(
id=user_data["id"],
properties=user_data,
)
if user_data
else None,
person=(
InternalEventPerson(
id=user_data["id"],
properties=user_data,
)
if user_data
else None
),
)
except Exception as e:
# We don't want to hard fail here.
Expand Down
2 changes: 1 addition & 1 deletion posthog/models/cohort/cohort.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from django.db.models.lookups import Exact

from django.utils import timezone
from sentry_sdk import capture_exception
from posthog.exceptions_capture import capture_exception

from posthog.constants import PropertyOperatorType
from posthog.models.filters.filter import Filter
Expand Down
Loading

0 comments on commit bbc8047

Please sign in to comment.