diff --git a/requirements-base.txt b/requirements-base.txt index 519060224af0a7..143e22ca48efee 100644 --- a/requirements-base.txt +++ b/requirements-base.txt @@ -1,5 +1,6 @@ --index-url https://pypi.devinfra.sentry.io/simple +anton-testing-deleteme-123==3.0.0a1 beautifulsoup4>=4.7.1 boto3>=1.34.128 botocore>=1.34.8 diff --git a/requirements-dev-frozen.txt b/requirements-dev-frozen.txt index e0ee3093baa450..50c55683a9bec5 100644 --- a/requirements-dev-frozen.txt +++ b/requirements-dev-frozen.txt @@ -7,6 +7,7 @@ --index-url https://pypi.devinfra.sentry.io/simple amqp==5.3.1 +anton-testing-deleteme-123==3.0.0a1 anyio==3.7.1 asgiref==3.8.1 attrs==24.2.0 @@ -37,6 +38,7 @@ cryptography==44.0.1 cssselect==1.0.3 cssutils==2.9.0 datadog==0.49.1 +deprecated==1.2.18 devservices==1.1.5 distlib==0.3.8 distro==1.8.0 @@ -82,6 +84,7 @@ httpx==0.25.2 hyperframe==6.1.0 identify==2.6.1 idna==3.7 +importlib-metadata==8.6.1 inflection==0.5.1 iniconfig==1.1.1 iso3166==2.1.1 @@ -114,6 +117,9 @@ openapi-core==0.18.2 openapi-pydantic==0.4.0 openapi-schema-validator==0.6.2 openapi-spec-validator==0.7.1 +opentelemetry-api==1.33.1 +opentelemetry-sdk==1.33.1 +opentelemetry-semantic-conventions==0.54b1 orjson==3.10.10 outcome==1.2.0 packaging==24.1 @@ -248,6 +254,7 @@ wheel==0.38.4 wrapt==1.17.0 wsproto==1.1.0 xmlsec==1.3.14 +zipp==3.21.0 zstandard==0.18.0 # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements-frozen.txt b/requirements-frozen.txt index 16bc157de5f8a0..dd9f367852d07f 100644 --- a/requirements-frozen.txt +++ b/requirements-frozen.txt @@ -7,6 +7,7 @@ --index-url https://pypi.devinfra.sentry.io/simple amqp==5.3.1 +anton-testing-deleteme-123==3.0.0a1 anyio==3.7.1 asgiref==3.8.1 attrs==24.2.0 @@ -32,6 +33,7 @@ cryptography==44.0.1 cssselect==1.0.3 cssutils==2.9.0 datadog==0.49.1 +deprecated==1.2.18 distro==1.8.0 django==5.2.1 django-crispy-forms==1.14.0 @@ -67,6 +69,7 @@ httpcore==1.0.2 httpx==0.25.2 hyperframe==6.1.0 idna==3.7 +importlib-metadata==8.6.1 inflection==0.5.1 iso3166==2.1.1 isodate==0.6.1 @@ -82,6 +85,9 @@ mmh3==4.0.0 msgpack==1.1.0 oauthlib==3.1.0 openai==1.3.5 +opentelemetry-api==1.33.1 +opentelemetry-sdk==1.33.1 +opentelemetry-semantic-conventions==0.54b1 orjson==3.10.10 packaging==24.1 parsimonious==0.10.0 @@ -156,7 +162,9 @@ urllib3==2.2.2 vine==5.1.0 vroomrs==0.1.4 wcwidth==0.2.10 +wrapt==1.17.2 xmlsec==1.3.14 +zipp==3.21.0 zstandard==0.18.0 # The following packages are considered to be unsafe in a requirements file: diff --git a/src/sentry/api/endpoints/warmup.py b/src/sentry/api/endpoints/warmup.py index d33192376f9238..0a86017d18cdd5 100644 --- a/src/sentry/api/endpoints/warmup.py +++ b/src/sentry/api/endpoints/warmup.py @@ -1,24 +1,20 @@ -import django.contrib.messages.storage.fallback -import django.contrib.sessions.serializers -import django.db.models.sql.compiler # NOQA +import logging + +import sentry_sdk from django.conf import settings from django.urls import reverse from django.utils import translation from rest_framework.request import Request from rest_framework.response import Response +from sentry_sdk.consts import VERSION as SDK_VERSION -import sentry.identity.services.identity.impl # NOQA -import sentry.integrations.services.integration.impl # NOQA -import sentry.middleware.integrations.parsers.plugin # NOQA -import sentry.notifications.services.impl # NOQA -import sentry.sentry_apps.services.app.impl # NOQA -import sentry.users.services.user.impl # NOQA -import sentry.users.services.user_option.impl # NOQA from sentry.api.api_owners import ApiOwner from sentry.api.api_publish_status import ApiPublishStatus from sentry.api.base import Endpoint, all_silo_endpoint from sentry.ratelimits.config import RateLimitConfig +logger = logging.getLogger(__name__) + @all_silo_endpoint class WarmupEndpoint(Endpoint): @@ -30,6 +26,12 @@ class WarmupEndpoint(Endpoint): rate_limits = RateLimitConfig(group="INTERNAL") def get(self, request: Request) -> Response: + logger.warning("xxxxxxxxxxxxxxxxxx") + logger.warning(sentry_sdk) + logger.warning("yyyyyyyyyyyyyyyyyy") + logger.warning(SDK_VERSION) + logger.warning("zzzzzzzzzzzzzzzz") + languages = [lang for lang, _ in settings.LANGUAGES] languages.append(settings.LANGUAGE_CODE) diff --git a/src/sentry/metrics/minimetrics.py b/src/sentry/metrics/minimetrics.py index 446b878d002bbb..e83ed2673ab41d 100644 --- a/src/sentry/metrics/minimetrics.py +++ b/src/sentry/metrics/minimetrics.py @@ -2,7 +2,6 @@ from datetime import datetime, timedelta, timezone import sentry_sdk -from sentry_sdk.metrics import metrics_noop from sentry_sdk.tracing import Span from sentry.metrics.base import MetricsBackend, Tags @@ -14,7 +13,6 @@ def _attach_tags(span: Span, tags: Tags | None) -> None: span.set_data(tag_key, tag_value) -@metrics_noop def _set_metric_on_span(key: str, value: float | int, op: str, tags: Tags | None = None) -> None: span_or_tx = sentry_sdk.get_current_span() if span_or_tx is None: diff --git a/src/sentry/options/defaults.py b/src/sentry/options/defaults.py index 770ebea943c40f..dbfa94365ece92 100644 --- a/src/sentry/options/defaults.py +++ b/src/sentry/options/defaults.py @@ -2367,6 +2367,11 @@ default=False, flags=FLAG_AUTOMATOR_MODIFIABLE, ) +# Gradually roll out Python SDK alpha version for dogfooding +# TODO-anton: set to a sane value +register( + "sentry-sdk.use-python-sdk-alpha", default=1.0, type=Float, flags=FLAG_AUTOMATOR_MODIFIABLE +) register( # Lists the shared resource ids we want to account usage for. diff --git a/src/sentry/runner/commands/devserver.py b/src/sentry/runner/commands/devserver.py index 5f5f23427df00a..b7b35caf9ab8d2 100644 --- a/src/sentry/runner/commands/devserver.py +++ b/src/sentry/runner/commands/devserver.py @@ -7,7 +7,6 @@ from typing import NoReturn import click -import sentry_sdk from sentry.runner.commands.devservices import get_docker_client from sentry.runner.decorators import configuration, log_options @@ -174,6 +173,8 @@ def devserver( taskworker_scheduler: bool, ) -> NoReturn: "Starts a lightweight web server for development." + import sentry_sdk + sentry_sdk.init( dsn=os.environ.get("SENTRY_DEVSERVICES_DSN", ""), traces_sample_rate=1.0, diff --git a/src/sentry/runner/initializer.py b/src/sentry/runner/initializer.py index 2e5191fe35cd09..2f2e0ebf940b12 100644 --- a/src/sentry/runner/initializer.py +++ b/src/sentry/runner/initializer.py @@ -9,6 +9,7 @@ import click from django.conf import settings +from sentry.options.rollout import in_random_rollout from sentry.silo.patches.silo_aware_transaction_patch import patch_silo_aware_atomic from sentry.utils import warnings from sentry.utils.sdk import configure_sdk @@ -373,6 +374,8 @@ def initialize_app(config: dict[str, Any], skip_service_validation: bool = False bind_cache_to_option_store() + redirect_imports_for_sentry_sdk_alpha() + register_plugins(settings) initialize_receivers() @@ -701,3 +704,45 @@ def import_grouptype() -> None: from sentry.issues.grouptype import import_grouptype import_grouptype() + + +def redirect_imports_for_sentry_sdk_alpha(): + """ + Patch the Python import system to redirect imports of sentry_sdk to sentry_sdk_alpha based on a Sentry option. + This allows us to gradually roll out the alpha version of the SDK to a subset of users. + """ + + class ImportRedirector(importlib.abc.MetaPathFinder, importlib.abc.Loader): + def __init__(self, original_module, target_module): + self.original_module = original_module + self.target_module = target_module + + def find_spec(self, fullname, path, target=None): + if fullname == self.original_module: + # Create a spec for the target module + spec = importlib.machinery.ModuleSpec( + fullname, + self, + origin=f"redirected from {self.original_module} to {self.target_module}", + ) + return spec + return None + + def create_module(self, spec): + return importlib.import_module(self.target_module) + + def exec_module(self, module): + pass + + def redirect_import(original_module, target_module): + redirector = ImportRedirector(original_module, target_module) + sys.meta_path.insert(0, redirector) + # TODO: Not sure the original module should be deleted.... + # iterating over a copy to be able to delete from the original + for cached_module in sys.modules.copy(): + if cached_module.startswith(original_module): + # cleaning up cache if the module is already imported + del sys.modules[cached_module] + + if in_random_rollout("sentry-sdk.use-python-sdk-alpha"): + redirect_import("sentry_sdk", "sentry_sdk_alpha") diff --git a/src/sentry/utils/sdk.py b/src/sentry/utils/sdk.py index 278cffd88af1f9..3d49d5b97a8419 100644 --- a/src/sentry/utils/sdk.py +++ b/src/sentry/utils/sdk.py @@ -311,6 +311,8 @@ def configure_sdk(): """ Setup and initialize the Sentry SDK. """ + import sentry_sdk + sdk_options, dsns = _get_sdk_options() if settings.SPOTLIGHT: sdk_options["spotlight"] = ( @@ -486,7 +488,7 @@ def flush( LoggingIntegration(event_level=None, sentry_logs_level=logging.INFO), RustInfoIntegration(), RedisIntegration(), - ThreadingIntegration(propagate_hub=True), + ThreadingIntegration(), ], **sdk_options, )