diff --git a/ee/billing/billing_manager.py b/ee/billing/billing_manager.py index e7c86c7733fc4..c9cb6ae087819 100644 --- a/ee/billing/billing_manager.py +++ b/ee/billing/billing_manager.py @@ -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 diff --git a/ee/billing/quota_limiting.py b/ee/billing/quota_limiting.py index ac04f5e72785c..38f8fb35dc6d2 100644 --- a/ee/billing/quota_limiting.py +++ b/ee/billing/quota_limiting.py @@ -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 diff --git a/ee/hogai/query_executor/nodes.py b/ee/hogai/query_executor/nodes.py index bcc97690b3d0a..46252313e833d 100644 --- a/ee/hogai/query_executor/nodes.py +++ b/ee/hogai/query_executor/nodes.py @@ -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, @@ -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"] diff --git a/ee/tasks/subscriptions/__init__.py b/ee/tasks/subscriptions/__init__.py index 7ca0e06e6d529..f0547414aa07c 100644 --- a/ee/tasks/subscriptions/__init__.py +++ b/ee/tasks/subscriptions/__init__.py @@ -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 diff --git a/posthog/api/authentication.py b/posthog/api/authentication.py index 96c3ede72332a..01566611c2e27 100644 --- a/posthog/api/authentication.py +++ b/posthog/api/authentication.py @@ -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 diff --git a/posthog/api/capture.py b/posthog/api/capture.py index eca3fb11cadc1..07338d265c25e 100644 --- a/posthog/api/capture.py +++ b/posthog/api/capture.py @@ -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 @@ -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, diff --git a/posthog/api/cohort.py b/posthog/api/cohort.py index f1bfa72ef0302..983e95c648a21 100644 --- a/posthog/api/cohort.py +++ b/posthog/api/cohort.py @@ -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 diff --git a/posthog/api/decide.py b/posthog/api/decide.py index 820179f93aa4c..bd9126497361f 100644 --- a/posthog/api/decide.py +++ b/posthog/api/decide.py @@ -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 diff --git a/posthog/api/email_verification.py b/posthog/api/email_verification.py index 796e4c616d97f..f2c36e91d6bde 100644 --- a/posthog/api/email_verification.py +++ b/posthog/api/email_verification.py @@ -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 diff --git a/posthog/api/event.py b/posthog/api/event.py index da044b10c7c42..4d1044de21ebd 100644 --- a/posthog/api/event.py +++ b/posthog/api/event.py @@ -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 diff --git a/posthog/api/feature_flag.py b/posthog/api/feature_flag.py index ee694246424b9..456ac20c8a78a 100644 --- a/posthog/api/feature_flag.py +++ b/posthog/api/feature_flag.py @@ -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 diff --git a/posthog/api/mixins.py b/posthog/api/mixins.py index b90af8aab7b57..da48d6d2d9060 100644 --- a/posthog/api/mixins.py +++ b/posthog/api/mixins.py @@ -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) diff --git a/posthog/api/query.py b/posthog/api/query.py index a16ec93001cf4..10549b1ff066d 100644 --- a/posthog/api/query.py +++ b/posthog/api/query.py @@ -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 diff --git a/posthog/api/signup.py b/posthog/api/signup.py index b0e78139e893b..2a2ada779357a 100644 --- a/posthog/api/signup.py +++ b/posthog/api/signup.py @@ -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 diff --git a/posthog/api/site_app.py b/posthog/api/site_app.py index ee43c9b14f61b..545dad8cc7cfb 100644 --- a/posthog/api/site_app.py +++ b/posthog/api/site_app.py @@ -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 diff --git a/posthog/async_migrations/migrations/0005_person_replacing_by_version.py b/posthog/async_migrations/migrations/0005_person_replacing_by_version.py index 8740456c5e1f7..6620d7bfb64c1 100644 --- a/posthog/async_migrations/migrations/0005_person_replacing_by_version.py +++ b/posthog/async_migrations/migrations/0005_person_replacing_by_version.py @@ -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, diff --git a/posthog/async_migrations/runner.py b/posthog/async_migrations/runner.py index 0108600baeb3d..d2f90a150e610 100644 --- a/posthog/async_migrations/runner.py +++ b/posthog/async_migrations/runner.py @@ -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 ( diff --git a/posthog/caching/insight_cache.py b/posthog/caching/insight_cache.py index 9339806ed8975..c55c4d614384d 100644 --- a/posthog/caching/insight_cache.py +++ b/posthog/caching/insight_cache.py @@ -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 diff --git a/posthog/caching/warming.py b/posthog/caching/warming.py index 4b0114f3952a3..08d5d6abc2742 100644 --- a/posthog/caching/warming.py +++ b/posthog/caching/warming.py @@ -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 diff --git a/posthog/cloud_utils.py b/posthog/cloud_utils.py index 0af4834187eb1..80db06fa82937 100644 --- a/posthog/cloud_utils.py +++ b/posthog/cloud_utils.py @@ -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 diff --git a/posthog/email.py b/posthog/email.py index 3590723f7084b..04bca9418ce7c 100644 --- a/posthog/email.py +++ b/posthog/email.py @@ -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 diff --git a/posthog/exceptions.py b/posthog/exceptions.py index 04cbc193646ab..b2e80364944f6 100644 --- a/posthog/exceptions.py +++ b/posthog/exceptions.py @@ -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 diff --git a/posthog/exceptions_capture.py b/posthog/exceptions_capture.py new file mode 100644 index 0000000000000..482500c565a63 --- /dev/null +++ b/posthog/exceptions_capture.py @@ -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) diff --git a/posthog/geoip.py b/posthog/geoip.py index 6c8911775eb1a..eddac68f5fd3e 100644 --- a/posthog/geoip.py +++ b/posthog/geoip.py @@ -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__) @@ -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 diff --git a/posthog/hogql/database/database.py b/posthog/hogql/database/database.py index 21cab9c3a7bb1..bb617a69985bf 100644 --- a/posthog/hogql/database/database.py +++ b/posthog/hogql/database/database.py @@ -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 diff --git a/posthog/hogql_queries/apply_dashboard_filters.py b/posthog/hogql_queries/apply_dashboard_filters.py index 9cb016eb48da9..6ed45bc023d00 100644 --- a/posthog/hogql_queries/apply_dashboard_filters.py +++ b/posthog/hogql_queries/apply_dashboard_filters.py @@ -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 diff --git a/posthog/hogql_queries/experiments/funnels_statistics.py b/posthog/hogql_queries/experiments/funnels_statistics.py index cdec48fa3c681..e77c9e88873e5 100644 --- a/posthog/hogql_queries/experiments/funnels_statistics.py +++ b/posthog/hogql_queries/experiments/funnels_statistics.py @@ -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, diff --git a/posthog/hogql_queries/experiments/trends_statistics.py b/posthog/hogql_queries/experiments/trends_statistics.py index 61b19d1486f72..07668e61149f0 100644 --- a/posthog/hogql_queries/experiments/trends_statistics.py +++ b/posthog/hogql_queries/experiments/trends_statistics.py @@ -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, diff --git a/posthog/hogql_queries/experiments/trends_statistics_v2_continuous.py b/posthog/hogql_queries/experiments/trends_statistics_v2_continuous.py index 6ae188398410e..eeb945f29a40e 100644 --- a/posthog/hogql_queries/experiments/trends_statistics_v2_continuous.py +++ b/posthog/hogql_queries/experiments/trends_statistics_v2_continuous.py @@ -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, diff --git a/posthog/hogql_queries/experiments/trends_statistics_v2_count.py b/posthog/hogql_queries/experiments/trends_statistics_v2_count.py index 7658e2622027a..2eca256d4308e 100644 --- a/posthog/hogql_queries/experiments/trends_statistics_v2_count.py +++ b/posthog/hogql_queries/experiments/trends_statistics_v2_count.py @@ -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, diff --git a/posthog/hogql_queries/legacy_compatibility/flagged_conversion_manager.py b/posthog/hogql_queries/legacy_compatibility/flagged_conversion_manager.py index 527187276b03c..e918b885b3d96 100644 --- a/posthog/hogql_queries/legacy_compatibility/flagged_conversion_manager.py +++ b/posthog/hogql_queries/legacy_compatibility/flagged_conversion_manager.py @@ -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 diff --git a/posthog/hogql_queries/query_runner.py b/posthog/hogql_queries/query_runner.py index efe0623567916..32196b0152c03 100644 --- a/posthog/hogql_queries/query_runner.py +++ b/posthog/hogql_queries/query_runner.py @@ -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 diff --git a/posthog/management/commands/migrate_experiments.py b/posthog/management/commands/migrate_experiments.py index 994c7f7aba525..9a44f8ffc082b 100644 --- a/posthog/management/commands/migrate_experiments.py +++ b/posthog/management/commands/migrate_experiments.py @@ -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 @@ -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()] diff --git a/posthog/metrics.py b/posthog/metrics.py index 726e22e6ab47f..b2a50a074d25f 100644 --- a/posthog/metrics.py +++ b/posthog/metrics.py @@ -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__) diff --git a/posthog/models/activity_logging/activity_log.py b/posthog/models/activity_logging/activity_log.py index 1ff8baafdfae8..86532b8a90f2b 100644 --- a/posthog/models/activity_logging/activity_log.py +++ b/posthog/models/activity_logging/activity_log.py @@ -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 @@ -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. diff --git a/posthog/models/cohort/cohort.py b/posthog/models/cohort/cohort.py index 45fab8edbea5b..418b1f90ad634 100644 --- a/posthog/models/cohort/cohort.py +++ b/posthog/models/cohort/cohort.py @@ -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 diff --git a/posthog/models/exported_asset.py b/posthog/models/exported_asset.py index 1d5e4e1c67596..949daefb11126 100644 --- a/posthog/models/exported_asset.py +++ b/posthog/models/exported_asset.py @@ -10,7 +10,7 @@ from django.utils.text import slugify from django.utils.timezone import now from rest_framework.exceptions import NotFound -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.jwt import PosthogJwtAudience, decode_jwt, encode_jwt from posthog.models.utils import UUIDT diff --git a/posthog/models/feature_flag/feature_flag.py b/posthog/models/feature_flag/feature_flag.py index c955fbfb90728..b56cba67e34d5 100644 --- a/posthog/models/feature_flag/feature_flag.py +++ b/posthog/models/feature_flag/feature_flag.py @@ -7,7 +7,7 @@ from django.db import models from django.db.models.signals import post_delete, post_save, pre_delete from django.utils import timezone -from sentry_sdk.api import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.constants import ( ENRICHED_DASHBOARD_INSIGHT_IDENTIFIER, diff --git a/posthog/models/feature_flag/flag_analytics.py b/posthog/models/feature_flag/flag_analytics.py index 6579aa92d1041..226681c9c8630 100644 --- a/posthog/models/feature_flag/flag_analytics.py +++ b/posthog/models/feature_flag/flag_analytics.py @@ -8,7 +8,7 @@ from posthog.models import Team from posthog.redis import redis, get_client import time -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from django.conf import settings from posthog.client import sync_execute from datetime import datetime diff --git a/posthog/models/feature_flag/flag_matching.py b/posthog/models/feature_flag/flag_matching.py index 05182a7f1fede..0a163663f96c6 100644 --- a/posthog/models/feature_flag/flag_matching.py +++ b/posthog/models/feature_flag/flag_matching.py @@ -12,9 +12,10 @@ from django.db.models.fields import BooleanField from django.db.models import Q, Func, F, CharField from django.db.models.query import QuerySet -from sentry_sdk.api import capture_exception, start_span +from sentry_sdk.api import start_span from posthog.metrics import LABEL_TEAM_ID +from posthog.exceptions_capture import capture_exception from posthog.models.filters import Filter from posthog.models.filters.mixins.utils import cached_property from posthog.models.group import Group @@ -368,9 +369,11 @@ def is_super_condition_match(self, feature_flag: FeatureFlag) -> tuple[bool, boo return ( True, is_match, - FeatureFlagMatchReason.SUPER_CONDITION_VALUE - if evaluation_reason == FeatureFlagMatchReason.CONDITION_MATCH - else evaluation_reason, + ( + FeatureFlagMatchReason.SUPER_CONDITION_VALUE + if evaluation_reason == FeatureFlagMatchReason.CONDITION_MATCH + else evaluation_reason + ), ) return False, False, FeatureFlagMatchReason.NO_CONDITION_MATCH diff --git a/posthog/models/insight.py b/posthog/models/insight.py index c8e5b0fbc7636..eb550f5ef3060 100644 --- a/posthog/models/insight.py +++ b/posthog/models/insight.py @@ -1,7 +1,7 @@ from functools import cached_property from typing import Optional -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception import structlog from django.contrib.postgres.fields import ArrayField from django.db import models diff --git a/posthog/models/integration.py b/posthog/models/integration.py index 62828ceed0463..7f8f2422cc5b4 100644 --- a/posthog/models/integration.py +++ b/posthog/models/integration.py @@ -10,7 +10,7 @@ import requests from rest_framework.exceptions import ValidationError from rest_framework.request import Request -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from slack_sdk import WebClient from google.oauth2 import service_account from google.auth.transport.requests import Request as GoogleRequest diff --git a/posthog/models/remote_config.py b/posthog/models/remote_config.py index eb35f6869bc6b..fd9b143bdf39f 100644 --- a/posthog/models/remote_config.py +++ b/posthog/models/remote_config.py @@ -7,7 +7,7 @@ from django.utils import timezone from prometheus_client import Counter import requests -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception import structlog from posthog.database_healthcheck import DATABASE_FOR_FLAG_MATCHING diff --git a/posthog/models/subscription.py b/posthog/models/subscription.py index ef0d25bd9d070..6dfd45dacd3d2 100644 --- a/posthog/models/subscription.py +++ b/posthog/models/subscription.py @@ -17,7 +17,7 @@ from django.db.models.signals import post_save from django.dispatch import receiver from django.utils import timezone -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.jwt import PosthogJwtAudience, decode_jwt, encode_jwt from posthog.utils import absolute_uri diff --git a/posthog/models/team/team_caching.py b/posthog/models/team/team_caching.py index 66309bd9399e2..d6dccc5d77ed0 100644 --- a/posthog/models/team/team_caching.py +++ b/posthog/models/team/team_caching.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional from django.core.cache import cache -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception if TYPE_CHECKING: from posthog.models.team import Team diff --git a/posthog/models/uploaded_media.py b/posthog/models/uploaded_media.py index 8810d13616ddc..4d8c63e925fe7 100644 --- a/posthog/models/uploaded_media.py +++ b/posthog/models/uploaded_media.py @@ -3,7 +3,7 @@ import structlog from django.conf import settings from django.db import models -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.models.team import Team from posthog.models.user import User diff --git a/posthog/rate_limit.py b/posthog/rate_limit.py index 650321f59c958..a1ffa3863f03f 100644 --- a/posthog/rate_limit.py +++ b/posthog/rate_limit.py @@ -7,7 +7,7 @@ from prometheus_client import Counter from rest_framework.throttling import SimpleRateThrottle, BaseThrottle, UserRateThrottle from rest_framework.request import Request -from sentry_sdk.api import capture_exception +from posthog.exceptions_capture import capture_exception from statshog.defaults.django import statsd from posthog.auth import PersonalAPIKeyAuthentication from posthog.metrics import LABEL_PATH, LABEL_TEAM_ID diff --git a/posthog/session_recordings/realtime_snapshots.py b/posthog/session_recordings/realtime_snapshots.py index c422cea935d42..9542e70f80de7 100644 --- a/posthog/session_recordings/realtime_snapshots.py +++ b/posthog/session_recordings/realtime_snapshots.py @@ -7,7 +7,7 @@ from posthog import settings from posthog.redis import get_client -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception logger = structlog.get_logger(__name__) diff --git a/posthog/session_recordings/session_recording_helpers.py b/posthog/session_recordings/session_recording_helpers.py index d9eb447492350..4f299b5b3304a 100644 --- a/posthog/session_recordings/session_recording_helpers.py +++ b/posthog/session_recordings/session_recording_helpers.py @@ -8,7 +8,7 @@ from dateutil.parser import parse from prometheus_client import Counter -from sentry_sdk.api import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.metrics import LABEL_RESOURCE_TYPE from posthog.session_recordings.models.metadata import ( diff --git a/posthog/storage/object_storage.py b/posthog/storage/object_storage.py index e073d6bf65dae..8db003e7ed1aa 100644 --- a/posthog/storage/object_storage.py +++ b/posthog/storage/object_storage.py @@ -5,7 +5,7 @@ from boto3 import client from botocore.client import Config from django.conf import settings -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception logger = structlog.get_logger(__name__) diff --git a/posthog/tasks/alerts/checks.py b/posthog/tasks/alerts/checks.py index 7c205e6010fd7..f244e80baea94 100644 --- a/posthog/tasks/alerts/checks.py +++ b/posthog/tasks/alerts/checks.py @@ -9,9 +9,10 @@ from celery.canvas import chain from django.db import transaction import structlog -from sentry_sdk import capture_exception, set_tag +from sentry_sdk import set_tag from posthog.errors import CHQueryErrorTooManySimultaneousQueries +from posthog.exceptions_capture import capture_exception from posthog.hogql_queries.legacy_compatibility.flagged_conversion_manager import ( conversion_to_query_based, ) diff --git a/posthog/tasks/calculate_cohort.py b/posthog/tasks/calculate_cohort.py index ae5880714aa47..b48d4084cb796 100644 --- a/posthog/tasks/calculate_cohort.py +++ b/posthog/tasks/calculate_cohort.py @@ -10,10 +10,11 @@ from django.db.models import F, ExpressionWrapper, DurationField, Q from django.utils import timezone from prometheus_client import Gauge -from sentry_sdk import capture_exception, set_tag +from sentry_sdk import set_tag from datetime import timedelta +from posthog.exceptions_capture import capture_exception from posthog.api.monitoring import Feature from posthog.models import Cohort from posthog.models.cohort import get_and_update_pending_version diff --git a/posthog/tasks/exports/csv_exporter.py b/posthog/tasks/exports/csv_exporter.py index 7657db26c203f..64023f340c828 100644 --- a/posthog/tasks/exports/csv_exporter.py +++ b/posthog/tasks/exports/csv_exporter.py @@ -9,9 +9,10 @@ import structlog from openpyxl import Workbook from django.http import QueryDict -from sentry_sdk import capture_exception, push_scope +from sentry_sdk import push_scope from requests.exceptions import HTTPError +from posthog.exceptions_capture import capture_exception from posthog.api.services.query import process_query_dict from posthog.hogql_queries.query_runner import ExecutionMode from posthog.jwt import PosthogJwtAudience, encode_jwt diff --git a/posthog/tasks/exports/image_exporter.py b/posthog/tasks/exports/image_exporter.py index 2af4c0d2582be..82aaad7253292 100644 --- a/posthog/tasks/exports/image_exporter.py +++ b/posthog/tasks/exports/image_exporter.py @@ -12,11 +12,12 @@ from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.wait import WebDriverWait -from sentry_sdk import capture_exception, configure_scope, push_scope +from sentry_sdk import configure_scope, push_scope from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.core.os_manager import ChromeType from posthog.api.services.query import process_query_dict +from posthog.exceptions_capture import capture_exception from posthog.hogql.constants import LimitContext from posthog.hogql_queries.legacy_compatibility.flagged_conversion_manager import conversion_to_query_based from posthog.hogql_queries.query_runner import ExecutionMode diff --git a/posthog/tasks/periodic_digest.py b/posthog/tasks/periodic_digest.py index d25054e9fabff..55dd6382283ac 100644 --- a/posthog/tasks/periodic_digest.py +++ b/posthog/tasks/periodic_digest.py @@ -9,7 +9,7 @@ from django.db.models import QuerySet from django.utils import timezone from posthoganalytics.client import Client -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.models.dashboard import Dashboard from posthog.models.event_definition import EventDefinition diff --git a/posthog/tasks/report_utils.py b/posthog/tasks/report_utils.py index 4957104b370b7..ea1c89ef86173 100644 --- a/posthog/tasks/report_utils.py +++ b/posthog/tasks/report_utils.py @@ -6,7 +6,7 @@ from dateutil import parser from django.conf import settings from posthoganalytics.client import Client -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.cloud_utils import is_cloud from posthog.models.organization import OrganizationMembership diff --git a/posthog/tasks/usage_report.py b/posthog/tasks/usage_report.py index 0bb7f92dafb3c..3d18eadef2bd5 100644 --- a/posthog/tasks/usage_report.py +++ b/posthog/tasks/usage_report.py @@ -15,7 +15,7 @@ from posthoganalytics.client import Client from psycopg import sql from retry import retry -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog import version_requirement from posthog.clickhouse.client.connection import Workload diff --git a/posthog/temporal/data_imports/pipelines/bigquery/__init__.py b/posthog/temporal/data_imports/pipelines/bigquery/__init__.py index 1519bf9e2abdd..801ffb41900ff 100644 --- a/posthog/temporal/data_imports/pipelines/bigquery/__init__.py +++ b/posthog/temporal/data_imports/pipelines/bigquery/__init__.py @@ -5,7 +5,7 @@ from google.cloud import bigquery from posthog.temporal.common.logger import FilteringBoundLogger from posthog.warehouse.types import IncrementalFieldType -from sentry_sdk.api import capture_exception +from posthog.exceptions_capture import capture_exception # Actual data ingestion happens via the `sql_database` source. This is more for BigQuery utils diff --git a/posthog/temporal/data_imports/pipelines/pipeline/delta_table_helper.py b/posthog/temporal/data_imports/pipelines/pipeline/delta_table_helper.py index 743c0db0bfdd2..33da46c8bc254 100644 --- a/posthog/temporal/data_imports/pipelines/pipeline/delta_table_helper.py +++ b/posthog/temporal/data_imports/pipelines/pipeline/delta_table_helper.py @@ -7,7 +7,7 @@ from dlt.common.normalizers.naming.snake_case import NamingConvention import deltalake as deltalake from django.conf import settings -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.settings.base_variables import TEST from posthog.temporal.common.logger import FilteringBoundLogger from posthog.warehouse.models import ExternalDataJob diff --git a/posthog/utils.py b/posthog/utils.py index 4daec7bec89a8..06efc214a354a 100644 --- a/posthog/utils.py +++ b/posthog/utils.py @@ -40,7 +40,7 @@ from rest_framework import serializers from rest_framework.request import Request from sentry_sdk import configure_scope -from sentry_sdk.api import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.cloud_utils import get_cached_instance_license, is_cloud from posthog.constants import AvailableFeature diff --git a/posthog/views.py b/posthog/views.py index 3c7bf8b787281..b68588581f3c6 100644 --- a/posthog/views.py +++ b/posthog/views.py @@ -3,7 +3,7 @@ from functools import partial, wraps from typing import Union -import sentry_sdk +from posthog.exceptions_capture import capture_exception from django.conf import settings from django.contrib.admin.sites import site as admin_site from django.contrib.admin.views.decorators import staff_member_required @@ -67,7 +67,7 @@ def health(request): status = 503 if plan else 200 if status == 503: err = Exception("Migrations are not up to date. If this continues migrations have failed") - sentry_sdk.capture_exception(err) + capture_exception(err) return HttpResponse("Migrations are not up to date", status=status, content_type="text/plain") if status == 200: return HttpResponse("ok", status=status, content_type="text/plain") diff --git a/posthog/warehouse/api/external_data_source.py b/posthog/warehouse/api/external_data_source.py index 9d0ecb4e19685..d13112916e0ab 100644 --- a/posthog/warehouse/api/external_data_source.py +++ b/posthog/warehouse/api/external_data_source.py @@ -10,7 +10,7 @@ from rest_framework import filters, serializers, status, viewsets 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 snowflake.connector.errors import DatabaseError, ForbiddenError, ProgrammingError from sshtunnel import BaseSSHTunnelForwarderError @@ -433,12 +433,14 @@ def create(self, request: Request, *args: Any, **kwargs: Any) -> Response: source=new_source_model, should_sync=schema.get("should_sync"), sync_type=sync_type, - sync_type_config={ - "incremental_field": incremental_field, - "incremental_field_type": incremental_field_type, - } - if is_incremental - else {}, + sync_type_config=( + { + "incremental_field": incremental_field, + "incremental_field_type": incremental_field_type, + } + if is_incremental + else {} + ), ) if schema.get("should_sync"): @@ -1029,9 +1031,11 @@ def database_schema(self, request: Request, *arg: Any, **kwargs: Any): return Response( status=status.HTTP_400_BAD_REQUEST, data={ - "message": auth_error_message - if len(auth_error_message) > 0 - else "Invalid SSH tunnel auth settings" + "message": ( + auth_error_message + if len(auth_error_message) > 0 + else "Invalid SSH tunnel auth settings" + ) }, ) @@ -1040,9 +1044,11 @@ def database_schema(self, request: Request, *arg: Any, **kwargs: Any): return Response( status=status.HTTP_400_BAD_REQUEST, data={ - "message": port_error_message - if len(port_error_message) > 0 - else "Invalid SSH tunnel auth settings" + "message": ( + port_error_message + if len(port_error_message) > 0 + else "Invalid SSH tunnel auth settings" + ) }, ) @@ -1256,9 +1262,9 @@ def database_schema(self, request: Request, *arg: Any, **kwargs: Any): for field in incremental_fields.get(row, []) ], "incremental_available": row in incremental_schemas, - "incremental_field": incremental_fields.get(row, [])[0]["field"] - if row in incremental_schemas - else None, + "incremental_field": ( + incremental_fields.get(row, [])[0]["field"] if row in incremental_schemas else None + ), "sync_type": None, } for row in schemas diff --git a/posthog/warehouse/models/table.py b/posthog/warehouse/models/table.py index aab579b1d39a1..36838d282c892 100644 --- a/posthog/warehouse/models/table.py +++ b/posthog/warehouse/models/table.py @@ -23,7 +23,7 @@ from django.db.models import Q from .credential import DataWarehouseCredential from uuid import UUID -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog.warehouse.util import database_sync_to_async from posthog.warehouse.models.util import CLICKHOUSE_HOGQL_MAPPING, clean_type, STR_TO_HOGQL_MAPPING from .external_table_definitions import external_tables diff --git a/posthog/year_in_posthog/year_in_posthog.py b/posthog/year_in_posthog/year_in_posthog.py index 7e622f5bab5b5..96bb596a0d44d 100644 --- a/posthog/year_in_posthog/year_in_posthog.py +++ b/posthog/year_in_posthog/year_in_posthog.py @@ -6,7 +6,7 @@ import structlog -from sentry_sdk import capture_exception +from posthog.exceptions_capture import capture_exception from posthog import settings from posthog.year_in_posthog.calculate_2024 import calculate_year_in_posthog_2024