diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index 84c4514e6496..1cd2ccc8f4b8 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -252,12 +252,22 @@ jobs: MATRIX_INSTANCE_TOTAL: ${{ needs.calculate-shards.outputs.shard-count }} TEST_GROUP_STRATEGY: roundrobin PYTHONHASHSEED: '0' - XDIST_PER_WORKER_SNUBA: '1' + # Full runs: shards [0, BACKEND_SNUBA_SHARDS) run the tests that need Snuba, + # Kafka or Symbolicator, the rest run without them. 0 runs every shard with + # every service and records what each test file uses. Pick-shard sets + # XDIST_PER_WORKER_SNUBA. See .github/workflows/scripts/backend-test-services.py. + BACKEND_SNUBA_SHARDS: '23' XDIST_WORKERS: '4' steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - name: Pick shard services + env: + SELECTIVE: ${{ needs.select-tests.outputs.has-selected-tests == 'true' }} + MATRIX_INSTANCE: ${{ matrix.instance }} + run: python3 .github/workflows/scripts/backend-test-services.py pick-shard + - name: Start resource monitor run: python3 .github/workflows/scripts/monitor-resources.py --start @@ -272,7 +282,7 @@ jobs: uses: ./.github/actions/setup-sentry id: setup with: - mode: backend-ci + mode: ${{ env.BACKEND_DEVSERVICES_MODE }} early-devservices: 'true' # Restart postgres with a Unix socket mount. Django's postgres driver uses TCP by @@ -404,6 +414,16 @@ jobs: .artifacts/resource-usage-summary.json retention-days: 30 + # backend-test-services.py builds backend-test-services.json from these. + - name: Upload service usage + if: ${{ !cancelled() && env.BACKEND_TEST_SERVICE_GUARD != '' && hashFiles('.artifacts/service-usage/*.json') != '' }} + continue-on-error: true + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: backend-service-usage-${{ github.run_id }}-${{ matrix.instance }} + path: .artifacts/service-usage/*.json + retention-days: 30 + - name: Report failures if: ${{ !cancelled() && github.event_name == 'pull_request' }} continue-on-error: true diff --git a/.github/workflows/scripts/backend-test-services.json b/.github/workflows/scripts/backend-test-services.json new file mode 100644 index 000000000000..c20db8a5b642 --- /dev/null +++ b/.github/workflows/scripts/backend-test-services.json @@ -0,0 +1,2916 @@ +{ + "files": { + "tests/apigw/test_circuitbreaker.py": [], + "tests/apigw/test_db.py": [], + "tests/apigw/test_proxy.py": [], + "tests/apigw/test_routing.py": [], + "tests/integration/test_api.py": ["snuba"], + "tests/integration/test_service.py": [], + "tests/integration/test_sso.py": [], + "tests/relay_integration/lang/java/test_plugin.py": [ + "kafka", + "snuba", + "symbolicator" + ], + "tests/relay_integration/lang/javascript/test_example.py": [ + "kafka", + "snuba", + "symbolicator" + ], + "tests/relay_integration/lang/javascript/test_plugin.py": [ + "kafka", + "snuba", + "symbolicator" + ], + "tests/relay_integration/test_integration.py": ["kafka", "snuba"], + "tests/relay_integration/test_message_filters.py": ["kafka", "snuba"], + "tests/relay_integration/test_sdk.py": ["kafka", "snuba"], + "tests/sentry/agent_handoff/endpoints/test_organization_agent_handoff.py": [], + "tests/sentry/agent_handoff/test_codes.py": [], + "tests/sentry/agent_handoff/test_runbook.py": [], + "tests/sentry/agent_handoff/test_views.py": [], + "tests/sentry/ai_monitoring/endpoints/test_project_code_explanation.py": [], + "tests/sentry/ai_monitoring/test_conversation_titles.py": [], + "tests/sentry/ai_monitoring/test_message_normalizer.py": [], + "tests/sentry/ai_monitoring/test_tasks.py": [], + "tests/sentry/ai_monitoring/test_utils.py": [], + "tests/sentry/analytics/test_base.py": [], + "tests/sentry/analytics/test_event.py": [], + "tests/sentry/api/bases/test_organization.py": [], + "tests/sentry/api/bases/test_organization_events.py": [], + "tests/sentry/api/bases/test_organizationmember.py": [], + "tests/sentry/api/bases/test_project.py": [], + "tests/sentry/api/bases/test_team.py": [], + "tests/sentry/api/endpoints/issues/test_organization_derive_code_mappings.py": [], + "tests/sentry/api/endpoints/release_thresholds/health_checks/test_is_crash_free_rate_healthy.py": [], + "tests/sentry/api/endpoints/release_thresholds/health_checks/test_is_error_count_healthy.py": [], + "tests/sentry/api/endpoints/release_thresholds/health_checks/test_is_new_issue_count_healthy.py": [], + "tests/sentry/api/endpoints/release_thresholds/test_release_threshold.py": [], + "tests/sentry/api/endpoints/release_thresholds/test_release_threshold_details.py": [], + "tests/sentry/api/endpoints/release_thresholds/test_release_threshold_status.py": [ + "snuba" + ], + "tests/sentry/api/endpoints/release_thresholds/test_release_thresholds_index.py": [], + "tests/sentry/api/endpoints/release_thresholds/utils/test_fetch_sessions_data.py": [], + "tests/sentry/api/endpoints/release_thresholds/utils/test_get_errors_counts_timeseries.py": [ + "snuba" + ], + "tests/sentry/api/endpoints/release_thresholds/utils/test_get_new_issue_counts.py": [ + "snuba" + ], + "tests/sentry/api/endpoints/secret_scanning/test_github.py": [], + "tests/sentry/api/endpoints/test_accept_organization_invite.py": [], + "tests/sentry/api/endpoints/test_accept_project_transfer.py": ["snuba"], + "tests/sentry/api/endpoints/test_admin_project_configs.py": [], + "tests/sentry/api/endpoints/test_api_application_details.py": [], + "tests/sentry/api/endpoints/test_api_application_rotate_secrets.py": [], + "tests/sentry/api/endpoints/test_api_applications.py": [], + "tests/sentry/api/endpoints/test_api_authorizations.py": [], + "tests/sentry/api/endpoints/test_api_token_details.py": [], + "tests/sentry/api/endpoints/test_api_tokens.py": [], + "tests/sentry/api/endpoints/test_artifact_bundles.py": [], + "tests/sentry/api/endpoints/test_assistant.py": [], + "tests/sentry/api/endpoints/test_auth.py": [], + "tests/sentry/api/endpoints/test_auth_config.py": [], + "tests/sentry/api/endpoints/test_auth_integration.py": [], + "tests/sentry/api/endpoints/test_auth_login.py": [], + "tests/sentry/api/endpoints/test_auth_organization_config.py": [], + "tests/sentry/api/endpoints/test_auth_validate.py": [], + "tests/sentry/api/endpoints/test_broadcast_details.py": [], + "tests/sentry/api/endpoints/test_broadcast_index.py": [], + "tests/sentry/api/endpoints/test_builtin_symbol_sources.py": [], + "tests/sentry/api/endpoints/test_catchall.py": [], + "tests/sentry/api/endpoints/test_chunk_upload.py": [], + "tests/sentry/api/endpoints/test_commit_filechange.py": [], + "tests/sentry/api/endpoints/test_debug_files.py": [], + "tests/sentry/api/endpoints/test_dif_assemble.py": [], + "tests/sentry/api/endpoints/test_dsn_lookup.py": [], + "tests/sentry/api/endpoints/test_email_capture.py": [], + "tests/sentry/api/endpoints/test_event_apple_crash_report.py": ["snuba"], + "tests/sentry/api/endpoints/test_event_attachment_details.py": ["snuba"], + "tests/sentry/api/endpoints/test_event_attachments.py": ["snuba"], + "tests/sentry/api/endpoints/test_event_committers.py": ["snuba"], + "tests/sentry/api/endpoints/test_frontend_version.py": [], + "tests/sentry/api/endpoints/test_group_external_issues.py": ["snuba"], + "tests/sentry/api/endpoints/test_index.py": [], + "tests/sentry/api/endpoints/test_internal_beacon.py": [], + "tests/sentry/api/endpoints/test_internal_feature_flags.py": [], + "tests/sentry/api/endpoints/test_oauth_authorize.py": [], + "tests/sentry/api/endpoints/test_oauth_authorize_context.py": [], + "tests/sentry/api/endpoints/test_oauth_device.py": [], + "tests/sentry/api/endpoints/test_oauth_device_context.py": [], + "tests/sentry/api/endpoints/test_oauth_userinfo.py": [], + "tests/sentry/api/endpoints/test_onboarding.py": [], + "tests/sentry/api/endpoints/test_organization_access_request_details.py": [], + "tests/sentry/api/endpoints/test_organization_access_requests.py": [], + "tests/sentry/api/endpoints/test_organization_agentic_onboarding.py": [], + "tests/sentry/api/endpoints/test_organization_agentic_onboarding_run_details.py": [], + "tests/sentry/api/endpoints/test_organization_ai_conversation_details.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_ai_conversations.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_api_key_details.py": [], + "tests/sentry/api/endpoints/test_organization_api_key_index.py": [], + "tests/sentry/api/endpoints/test_organization_artifactbundle_assemble.py": [], + "tests/sentry/api/endpoints/test_organization_attribute_mappings.py": [], + "tests/sentry/api/endpoints/test_organization_auth_provider_details.py": [], + "tests/sentry/api/endpoints/test_organization_auth_providers.py": [], + "tests/sentry/api/endpoints/test_organization_auth_token_details.py": [], + "tests/sentry/api/endpoints/test_organization_auth_tokens.py": [], + "tests/sentry/api/endpoints/test_organization_config_integrations.py": [], + "tests/sentry/api/endpoints/test_organization_events_validate.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_explore_formulas.py": [], + "tests/sentry/api/endpoints/test_organization_fork.py": [], + "tests/sentry/api/endpoints/test_organization_insights_tree.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_intercom_jwt.py": [], + "tests/sentry/api/endpoints/test_organization_invite_request_details.py": [], + "tests/sentry/api/endpoints/test_organization_invite_request_index.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_metrics.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_missing_org_members.py": [], + "tests/sentry/api/endpoints/test_organization_monitoring_provider_details.py": [], + "tests/sentry/api/endpoints/test_organization_monitoring_provider_index.py": [], + "tests/sentry/api/endpoints/test_organization_monitoring_provider_verify_connection.py": [], + "tests/sentry/api/endpoints/test_organization_on_demand_metrics_estimation_stats.py": [], + "tests/sentry/api/endpoints/test_organization_onboarding_continuation.py": [], + "tests/sentry/api/endpoints/test_organization_onboarding_tasks.py": [], + "tests/sentry/api/endpoints/test_organization_pipeline.py": [], + "tests/sentry/api/endpoints/test_organization_profiling_functions.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_profiling_profiles.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_project_keys.py": [], + "tests/sentry/api/endpoints/test_organization_projects_sent_first_event.py": [], + "tests/sentry/api/endpoints/test_organization_recent_searches.py": [], + "tests/sentry/api/endpoints/test_organization_relay_usage.py": [], + "tests/sentry/api/endpoints/test_organization_release_previous_commits.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_releases.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_sampling_effective_sample_rate.py": [ + "snuba" + ], + "tests/sentry/api/endpoints/test_organization_sdk_deprecations.py": [], + "tests/sentry/api/endpoints/test_organization_sdk_updates.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_stats.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_trace_item_attributes.py": [], + "tests/sentry/api/endpoints/test_organization_traces.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_unsubscribe.py": ["snuba"], + "tests/sentry/api/endpoints/test_organization_weekly_report_project_exclusion_details.py": [], + "tests/sentry/api/endpoints/test_organization_weekly_report_project_exclusions.py": [], + "tests/sentry/api/endpoints/test_project_artifact_bundle_file_details.py": [], + "tests/sentry/api/endpoints/test_project_artifact_bundle_files.py": [], + "tests/sentry/api/endpoints/test_project_artifact_lookup.py": [], + "tests/sentry/api/endpoints/test_project_commits.py": [], + "tests/sentry/api/endpoints/test_project_create_sample.py": ["snuba"], + "tests/sentry/api/endpoints/test_project_custom_inbound_filter_validate.py": [], + "tests/sentry/api/endpoints/test_project_custom_inbound_filters.py": [], + "tests/sentry/api/endpoints/test_project_filter_details.py": [], + "tests/sentry/api/endpoints/test_project_filters.py": [], + "tests/sentry/api/endpoints/test_project_member_index.py": [], + "tests/sentry/api/endpoints/test_project_overview.py": [], + "tests/sentry/api/endpoints/test_project_performance_general_settings.py": [], + "tests/sentry/api/endpoints/test_project_profiling_profile.py": [], + "tests/sentry/api/endpoints/test_project_proguard_artifact_releases.py": [], + "tests/sentry/api/endpoints/test_project_repo.py": [], + "tests/sentry/api/endpoints/test_project_repo_path_parsing.py": [], + "tests/sentry/api/endpoints/test_project_rules.py": [], + "tests/sentry/api/endpoints/test_project_servicehook_details.py": [], + "tests/sentry/api/endpoints/test_project_servicehooks.py": [], + "tests/sentry/api/endpoints/test_project_symbol_sources.py": [], + "tests/sentry/api/endpoints/test_project_tagkey_details.py": ["snuba"], + "tests/sentry/api/endpoints/test_project_tagkey_values.py": ["snuba"], + "tests/sentry/api/endpoints/test_project_trace_item_details.py": [], + "tests/sentry/api/endpoints/test_project_transaction_names.py": ["snuba"], + "tests/sentry/api/endpoints/test_project_transaction_threshold.py": [], + "tests/sentry/api/endpoints/test_project_transaction_threshold_override.py": [ + "snuba" + ], + "tests/sentry/api/endpoints/test_prompts_activity.py": [], + "tests/sentry/api/endpoints/test_relay_globalconfig_v3.py": [], + "tests/sentry/api/endpoints/test_relay_healthcheck.py": [], + "tests/sentry/api/endpoints/test_relay_projectconfigs.py": [], + "tests/sentry/api/endpoints/test_relay_projectconfigs_v2.py": [], + "tests/sentry/api/endpoints/test_relay_projectconfigs_v3.py": [], + "tests/sentry/api/endpoints/test_relay_publickeys.py": [], + "tests/sentry/api/endpoints/test_relay_register.py": [], + "tests/sentry/api/endpoints/test_rpc.py": [], + "tests/sentry/api/endpoints/test_seer_models.py": [], + "tests/sentry/api/endpoints/test_setup_wizard.py": [], + "tests/sentry/api/endpoints/test_source_map_debug.py": ["snuba"], + "tests/sentry/api/endpoints/test_sudo.py": [], + "tests/sentry/api/endpoints/test_system_health.py": [], + "tests/sentry/api/endpoints/test_system_options.py": [], + "tests/sentry/api/endpoints/test_timeseries_transformations.py": [], + "tests/sentry/api/endpoints/test_user_organizations.py": [], + "tests/sentry/api/endpoints/test_user_subscriptions.py": [], + "tests/sentry/api/endpoints/test_warmup.py": [], + "tests/sentry/api/fields/test_actor.py": [], + "tests/sentry/api/fields/test_serializedfile.py": [], + "tests/sentry/api/helpers/test_creator.py": [], + "tests/sentry/api/helpers/test_data_annotations.py": ["snuba"], + "tests/sentry/api/helpers/test_default_symbol_sources.py": [], + "tests/sentry/api/helpers/test_deprecation.py": [], + "tests/sentry/api/helpers/test_error_upsampling.py": [], + "tests/sentry/api/helpers/test_events.py": ["snuba"], + "tests/sentry/api/helpers/test_group_index.py": ["snuba"], + "tests/sentry/api/helpers/test_in_commit_validator.py": [], + "tests/sentry/api/helpers/test_oauth_authorize_transactions.py": [], + "tests/sentry/api/helpers/test_oauth_consent.py": [], + "tests/sentry/api/helpers/test_oauth_device.py": [], + "tests/sentry/api/helpers/test_projects.py": [], + "tests/sentry/api/helpers/test_timeseries_transformations.py": [], + "tests/sentry/api/serializers/rest_framework/test_base.py": [], + "tests/sentry/api/serializers/rest_framework/test_origin.py": [], + "tests/sentry/api/serializers/rest_framework/test_project.py": [], + "tests/sentry/api/serializers/rest_framework/test_project_key.py": [], + "tests/sentry/api/serializers/test_activity.py": ["snuba"], + "tests/sentry/api/serializers/test_activity_response_schemas.py": ["snuba"], + "tests/sentry/api/serializers/test_apitoken.py": [], + "tests/sentry/api/serializers/test_auditlogentry.py": [], + "tests/sentry/api/serializers/test_base.py": [], + "tests/sentry/api/serializers/test_commit.py": [], + "tests/sentry/api/serializers/test_commit_filechange.py": [], + "tests/sentry/api/serializers/test_debugfile.py": [], + "tests/sentry/api/serializers/test_event.py": ["snuba"], + "tests/sentry/api/serializers/test_fields.py": [], + "tests/sentry/api/serializers/test_group.py": ["snuba"], + "tests/sentry/api/serializers/test_group_stream.py": ["snuba"], + "tests/sentry/api/serializers/test_group_tombstone.py": ["snuba"], + "tests/sentry/api/serializers/test_groupactionlogentry.py": ["snuba"], + "tests/sentry/api/serializers/test_grouptagkey.py": [], + "tests/sentry/api/serializers/test_grouptagvalue.py": [], + "tests/sentry/api/serializers/test_organization.py": ["snuba"], + "tests/sentry/api/serializers/test_organization_member.py": [], + "tests/sentry/api/serializers/test_organization_member_invite.py": [], + "tests/sentry/api/serializers/test_project.py": ["snuba"], + "tests/sentry/api/serializers/test_projectcodeowners.py": [], + "tests/sentry/api/serializers/test_pull_request.py": [], + "tests/sentry/api/serializers/test_recent_searches.py": [], + "tests/sentry/api/serializers/test_release.py": ["snuba"], + "tests/sentry/api/serializers/test_snuba.py": [], + "tests/sentry/api/serializers/test_tagvalue.py": ["snuba"], + "tests/sentry/api/serializers/test_team.py": [], + "tests/sentry/api/test_api_owners.py": [], + "tests/sentry/api/test_api_pagination_check.py": [], + "tests/sentry/api/test_authentication.py": [], + "tests/sentry/api/test_base.py": [], + "tests/sentry/api/test_caller_scopes.py": [], + "tests/sentry/api/test_client.py": [], + "tests/sentry/api/test_client_kind.py": ["snuba"], + "tests/sentry/api/test_conditional_get.py": [], + "tests/sentry/api/test_data_secrecy.py": [], + "tests/sentry/api/test_endpoint_owners.py": [], + "tests/sentry/api/test_event_search.py": [], + "tests/sentry/api/test_handlers.py": [], + "tests/sentry/api/test_invite_helper.py": [], + "tests/sentry/api/test_negotiation.py": [], + "tests/sentry/api/test_organization_events.py": ["snuba"], + "tests/sentry/api/test_paginator.py": ["snuba"], + "tests/sentry/api/test_path_params.py": [], + "tests/sentry/api/test_permissions.py": [], + "tests/sentry/api/test_release_search.py": [], + "tests/sentry/api/test_utils.py": [], + "tests/sentry/apidocs/test_extensions.py": [], + "tests/sentry/apidocs/test_formats.py": [], + "tests/sentry/apidocs/test_generate_schema_types.py": [], + "tests/sentry/apidocs/test_json_schemas.py": [], + "tests/sentry/apidocs/test_omission_guard.py": [], + "tests/sentry/apidocs/test_omission_paths.py": [], + "tests/sentry/apidocs/test_omissions.py": [], + "tests/sentry/apidocs/test_parameters.py": [], + "tests/sentry/apidocs/test_response_coverage.py": [], + "tests/sentry/apidocs/test_response_literals.py": [], + "tests/sentry/apidocs/test_schema.py": [], + "tests/sentry/apidocs/test_spectacular_ports.py": [], + "tests/sentry/attachments/test_base.py": [], + "tests/sentry/audit_log/services/test_log.py": [], + "tests/sentry/audit_log/test_manager.py": [], + "tests/sentry/audit_log/test_register.py": [], + "tests/sentry/auth/authenticators/test_sms.py": [], + "tests/sentry/auth/authenticators/test_u2f.py": [], + "tests/sentry/auth/providers/fly/test_client.py": [], + "tests/sentry/auth/providers/fly/test_provider.py": [], + "tests/sentry/auth/providers/github/test_client.py": [], + "tests/sentry/auth/providers/github/test_views.py": [], + "tests/sentry/auth/providers/google/test_provider.py": [], + "tests/sentry/auth/providers/test_oauth2.py": [], + "tests/sentry/auth/providers/test_saml2.py": [], + "tests/sentry/auth/services/test_access_impl.py": [], + "tests/sentry/auth/services/test_model.py": [], + "tests/sentry/auth/test_access.py": [], + "tests/sentry/auth/test_deprecated_scope_translation.py": [], + "tests/sentry/auth/test_email.py": [], + "tests/sentry/auth/test_email_verification.py": [], + "tests/sentry/auth/test_helper.py": [], + "tests/sentry/auth/test_idpmigration.py": [], + "tests/sentry/auth/test_password_validation.py": [], + "tests/sentry/auth/test_principal.py": ["snuba"], + "tests/sentry/auth/test_staff.py": [], + "tests/sentry/auth/test_superuser.py": [], + "tests/sentry/auth/test_system.py": [], + "tests/sentry/auth/test_twofactor.py": [], + "tests/sentry/auth_v2/endpoints/test_auth_merge_user_accounts.py": [], + "tests/sentry/auth_v2/endpoints/test_auth_user_merge_verification_code.py": [], + "tests/sentry/auth_v2/endpoints/test_auth_v2_permissions.py": [], + "tests/sentry/auth_v2/endpoints/test_csrf.py": [], + "tests/sentry/auth_v2/utils/test_session.py": [], + "tests/sentry/autofix/test_utils.py": [], + "tests/sentry/autofix/test_webhooks.py": ["snuba"], + "tests/sentry/backup/test_comparators.py": [], + "tests/sentry/backup/test_coverage.py": [], + "tests/sentry/backup/test_exhaustive.py": [], + "tests/sentry/backup/test_exports.py": [], + "tests/sentry/backup/test_findings.py": [], + "tests/sentry/backup/test_imports.py": ["snuba"], + "tests/sentry/backup/test_invariants.py": [], + "tests/sentry/backup/test_models.py": [], + "tests/sentry/backup/test_rpc.py": [], + "tests/sentry/backup/test_sanitize.py": [], + "tests/sentry/backup/test_snapshots.py": [], + "tests/sentry/backup/test_validate.py": [], + "tests/sentry/backup/test_workflow_engine_datasource_import.py": ["snuba"], + "tests/sentry/billing/platform/core/test_service.py": [], + "tests/sentry/billing/platform/services/quota/test_quota_config_mapping.py": [], + "tests/sentry/billing/platform/services/usage/test_outcomes_query.py": [], + "tests/sentry/billing/platform/services/usage/test_service.py": ["snuba"], + "tests/sentry/buffer/test_base.py": ["snuba"], + "tests/sentry/buffer/test_redis.py": ["snuba"], + "tests/sentry/cache/test_cache.py": [], + "tests/sentry/cache/test_django.py": [], + "tests/sentry/cache/test_reconnectingmemcache.py": [], + "tests/sentry/cache/test_redis.py": [], + "tests/sentry/cadence/test_actions.py": [], + "tests/sentry/cadence/test_api.py": [], + "tests/sentry/cadence/test_registry.py": [], + "tests/sentry/cadence/test_schedule.py": [], + "tests/sentry/cadence/test_spread.py": [], + "tests/sentry/cadence/test_tasks.py": [], + "tests/sentry/charts/test_chartcuterie.py": [], + "tests/sentry/conduit/endpoints/test_organization_conduit_demo.py": [], + "tests/sentry/conduit/test_auth.py": [], + "tests/sentry/conduit/test_tasks.py": [], + "tests/sentry/conf/test_kafka_definition.py": [], + "tests/sentry/conf/test_scopes.py": [], + "tests/sentry/conf/test_server.py": [], + "tests/sentry/conf/types/test_imports.py": [], + "tests/sentry/consumers/test_dlq.py": [], + "tests/sentry/consumers/test_get_topic_definition.py": [], + "tests/sentry/consumers/test_profiler.py": [], + "tests/sentry/consumers/test_run.py": [], + "tests/sentry/consumers/test_synchronized.py": [], + "tests/sentry/consumers/test_validate_schema.py": [], + "tests/sentry/core/endpoints/scim/test_scim_resource_types.py": [], + "tests/sentry/core/endpoints/scim/test_scim_schema.py": [], + "tests/sentry/core/endpoints/scim/test_scim_service_provider_config.py": [], + "tests/sentry/core/endpoints/scim/test_scim_team_details.py": [], + "tests/sentry/core/endpoints/scim/test_scim_team_index.py": [], + "tests/sentry/core/endpoints/scim/test_scim_user_details.py": [], + "tests/sentry/core/endpoints/scim/test_scim_user_index.py": [], + "tests/sentry/core/endpoints/test_organization_auditlogs.py": [], + "tests/sentry/core/endpoints/test_organization_avatar.py": [], + "tests/sentry/core/endpoints/test_organization_details.py": ["snuba"], + "tests/sentry/core/endpoints/test_organization_environments.py": [], + "tests/sentry/core/endpoints/test_organization_index.py": [], + "tests/sentry/core/endpoints/test_organization_join_request.py": ["snuba"], + "tests/sentry/core/endpoints/test_organization_member_details.py": [], + "tests/sentry/core/endpoints/test_organization_member_index.py": [], + "tests/sentry/core/endpoints/test_organization_member_team_details.py": ["snuba"], + "tests/sentry/core/endpoints/test_organization_projects.py": ["snuba"], + "tests/sentry/core/endpoints/test_organization_projects_create.py": [], + "tests/sentry/core/endpoints/test_organization_request_project_creation.py": [], + "tests/sentry/core/endpoints/test_organization_teams.py": [], + "tests/sentry/core/endpoints/test_organization_user_details.py": [], + "tests/sentry/core/endpoints/test_organization_user_teams.py": [], + "tests/sentry/core/endpoints/test_organization_users.py": [], + "tests/sentry/core/endpoints/test_project_details.py": ["snuba"], + "tests/sentry/core/endpoints/test_project_environment_details.py": [], + "tests/sentry/core/endpoints/test_project_environments.py": [], + "tests/sentry/core/endpoints/test_project_index.py": [], + "tests/sentry/core/endpoints/test_project_key_details.py": [], + "tests/sentry/core/endpoints/test_project_key_stats.py": ["snuba"], + "tests/sentry/core/endpoints/test_project_keys.py": [], + "tests/sentry/core/endpoints/test_project_stats.py": ["snuba"], + "tests/sentry/core/endpoints/test_project_team_details.py": [], + "tests/sentry/core/endpoints/test_project_teams.py": [], + "tests/sentry/core/endpoints/test_project_transfer.py": [], + "tests/sentry/core/endpoints/test_project_users.py": ["snuba"], + "tests/sentry/core/endpoints/test_team_avatar.py": [], + "tests/sentry/core/endpoints/test_team_details.py": [], + "tests/sentry/core/endpoints/test_team_members.py": [], + "tests/sentry/core/endpoints/test_team_projects.py": [], + "tests/sentry/core/endpoints/test_team_release_count.py": [], + "tests/sentry/core/endpoints/test_team_stats.py": ["snuba"], + "tests/sentry/core/endpoints/test_team_time_to_resolution.py": ["snuba"], + "tests/sentry/core/endpoints/test_team_unresolved_issue_age.py": ["snuba"], + "tests/sentry/dashboards/endpoints/test_organization_dashboard_details.py": ["snuba"], + "tests/sentry/dashboards/endpoints/test_organization_dashboard_generate.py": [], + "tests/sentry/dashboards/endpoints/test_organization_dashboard_revision_details.py": [], + "tests/sentry/dashboards/endpoints/test_organization_dashboard_revision_restore.py": [], + "tests/sentry/dashboards/endpoints/test_organization_dashboard_revisions.py": [], + "tests/sentry/dashboards/endpoints/test_organization_dashboard_widget_details.py": [ + "snuba" + ], + "tests/sentry/dashboards/endpoints/test_organization_dashboards.py": [], + "tests/sentry/dashboards/endpoints/test_organization_dashboards_starred.py": [], + "tests/sentry/dashboards/test_on_completion_hook.py": [], + "tests/sentry/data/test_samples.py": [], + "tests/sentry/data_export/endpoints/test_data_export.py": ["snuba"], + "tests/sentry/data_export/endpoints/test_data_export_details.py": [], + "tests/sentry/data_export/processors/test_discover.py": ["snuba"], + "tests/sentry/data_export/processors/test_issues_by_tag.py": ["snuba"], + "tests/sentry/data_export/test_models.py": [], + "tests/sentry/data_export/test_tasks.py": ["snuba"], + "tests/sentry/data_export/test_writers.py": [], + "tests/sentry/data_secrecy/api/test_waive_data_secrecy.py": [], + "tests/sentry/data_secrecy/test_cache.py": [], + "tests/sentry/data_secrecy/test_logic.py": [], + "tests/sentry/data_secrecy/test_service.py": [], + "tests/sentry/data_secrecy/test_types.py": [], + "tests/sentry/db/models/fields/bitfield/test_bitfield.py": [], + "tests/sentry/db/models/fields/encryption/test_base.py": [], + "tests/sentry/db/models/fields/encryption/test_encrypted_char_field.py": [], + "tests/sentry/db/models/fields/encryption/test_encrypted_json_field.py": [], + "tests/sentry/db/models/fields/encryption/test_encrypted_text_field.py": [], + "tests/sentry/db/models/fields/test_bounded.py": [], + "tests/sentry/db/models/fields/test_hybrid_cloud_foreign_key.py": [], + "tests/sentry/db/models/fields/test_jsonfield.py": [], + "tests/sentry/db/models/fields/test_slug.py": [], + "tests/sentry/db/models/manager/test_base_query_set.py": ["snuba"], + "tests/sentry/db/models/test_base.py": [], + "tests/sentry/db/models/test_slug_concurrency.py": [], + "tests/sentry/db/models/test_utils.py": [], + "tests/sentry/db/postgres/schema/safe_migrations/integration/test_migrations.py": [], + "tests/sentry/db/postgres/test_base.py": [], + "tests/sentry/db/test_deletion.py": ["snuba"], + "tests/sentry/db/test_pending_deletion.py": [], + "tests/sentry/db/test_router.py": [], + "tests/sentry/db/test_silo_models.py": [], + "tests/sentry/db/test_transactions.py": [], + "tests/sentry/debug/utils/test_exception_reporter_filter.py": [], + "tests/sentry/debug/utils/test_packages.py": [], + "tests/sentry/debug_files/objectstore_migration/test_main.py": [], + "tests/sentry/debug_files/objectstore_migration/test_tasks.py": [], + "tests/sentry/debug_files/objectstore_migration/test_utils.py": [], + "tests/sentry/debug_files/test_artifact_bundles.py": [], + "tests/sentry/deletions/tasks/test_groups.py": ["snuba"], + "tests/sentry/deletions/tasks/test_hybrid_cloud.py": ["snuba"], + "tests/sentry/deletions/tasks/test_nodestore.py": ["snuba"], + "tests/sentry/deletions/tasks/test_scheduled.py": [], + "tests/sentry/deletions/tasks/test_seer_repository_deleted.py": [], + "tests/sentry/deletions/test_alert_rule.py": ["snuba"], + "tests/sentry/deletions/test_apiapplication.py": [], + "tests/sentry/deletions/test_artifactbundle.py": [], + "tests/sentry/deletions/test_commit.py": ["snuba"], + "tests/sentry/deletions/test_data_source.py": [], + "tests/sentry/deletions/test_debugfiles.py": [], + "tests/sentry/deletions/test_detector.py": [], + "tests/sentry/deletions/test_file.py": [], + "tests/sentry/deletions/test_group.py": ["snuba"], + "tests/sentry/deletions/test_grouphash.py": ["snuba"], + "tests/sentry/deletions/test_monitor.py": [], + "tests/sentry/deletions/test_monitor_checkin.py": [], + "tests/sentry/deletions/test_monitor_environment.py": [], + "tests/sentry/deletions/test_notebook.py": [], + "tests/sentry/deletions/test_organization.py": ["snuba"], + "tests/sentry/deletions/test_organizationmember.py": [], + "tests/sentry/deletions/test_preprod_artifact.py": [], + "tests/sentry/deletions/test_project.py": ["snuba"], + "tests/sentry/deletions/test_pullrequest.py": ["snuba"], + "tests/sentry/deletions/test_querysubscription.py": [], + "tests/sentry/deletions/test_release.py": [], + "tests/sentry/deletions/test_repository.py": [], + "tests/sentry/deletions/test_rule.py": [], + "tests/sentry/deletions/test_sentry_app.py": [], + "tests/sentry/deletions/test_sentry_app_installations.py": [], + "tests/sentry/deletions/test_sentry_installation_tokens.py": [], + "tests/sentry/deletions/test_team.py": [], + "tests/sentry/deletions/test_validate_group_related_models.py": [], + "tests/sentry/deletions/test_workflow.py": [], + "tests/sentry/demo_mode/test_tasks.py": [], + "tests/sentry/demo_mode/test_utils.py": [], + "tests/sentry/digests/backends/test_migrating.py": ["snuba"], + "tests/sentry/digests/backends/test_redis.py": ["snuba"], + "tests/sentry/digests/test_notifications.py": ["snuba"], + "tests/sentry/digests/test_types.py": [], + "tests/sentry/digests/test_utilities.py": ["snuba"], + "tests/sentry/discover/endpoints/test_discover_saved_query_starred.py": [], + "tests/sentry/discover/test_arithmetic.py": [], + "tests/sentry/discover/test_compare_tables.py": [], + "tests/sentry/discover/test_dashboard_widget_split.py": [], + "tests/sentry/discover/test_dataset_split.py": [], + "tests/sentry/discover/test_models.py": [], + "tests/sentry/discover/translation/test_mep_to_eap.py": [], + "tests/sentry/dynamic_sampling/models/test_base.py": [], + "tests/sentry/dynamic_sampling/models/test_projects_rebalancing.py": [], + "tests/sentry/dynamic_sampling/models/test_transactions_rebalancing.py": [], + "tests/sentry/dynamic_sampling/per_org/test_cache.py": [], + "tests/sentry/dynamic_sampling/per_org/test_calculations.py": [], + "tests/sentry/dynamic_sampling/per_org/test_configuration.py": ["snuba"], + "tests/sentry/dynamic_sampling/per_org/test_end_to_end.py": ["snuba"], + "tests/sentry/dynamic_sampling/per_org/test_feature_cache.py": [], + "tests/sentry/dynamic_sampling/per_org/test_queries.py": ["snuba"], + "tests/sentry/dynamic_sampling/per_org/test_scheduler.py": ["snuba"], + "tests/sentry/dynamic_sampling/per_org/test_serving.py": [], + "tests/sentry/dynamic_sampling/per_org/test_telemetry.py": [], + "tests/sentry/dynamic_sampling/rules/biases/test_boost_environments_bias.py": [], + "tests/sentry/dynamic_sampling/rules/biases/test_boost_latest_releases_bias.py": [], + "tests/sentry/dynamic_sampling/rules/biases/test_boost_low_volume_transactions_bias.py": [], + "tests/sentry/dynamic_sampling/rules/biases/test_boost_replay_id_bias.py": [], + "tests/sentry/dynamic_sampling/rules/biases/test_ignore_health_checks_bias.py": [], + "tests/sentry/dynamic_sampling/rules/biases/test_minimum_sample_rate_bias.py": [], + "tests/sentry/dynamic_sampling/test_generate_rules.py": [], + "tests/sentry/dynamic_sampling/test_utils.py": [], + "tests/sentry/event_manager/grouping/test_assign_to_group.py": ["snuba"], + "tests/sentry/event_manager/grouping/test_group_creation_lock.py": ["snuba"], + "tests/sentry/event_manager/grouping/test_grouphash_metadata.py": ["snuba"], + "tests/sentry/event_manager/grouping/test_seer_grouping.py": ["kafka", "snuba"], + "tests/sentry/event_manager/interfaces/test_breadcrumbs.py": [], + "tests/sentry/event_manager/interfaces/test_contexts.py": [], + "tests/sentry/event_manager/interfaces/test_csp.py": [], + "tests/sentry/event_manager/interfaces/test_debug_meta.py": [], + "tests/sentry/event_manager/interfaces/test_exception.py": [], + "tests/sentry/event_manager/interfaces/test_frame.py": [], + "tests/sentry/event_manager/interfaces/test_geo.py": [], + "tests/sentry/event_manager/interfaces/test_http.py": [], + "tests/sentry/event_manager/interfaces/test_mechanism.py": [], + "tests/sentry/event_manager/interfaces/test_message.py": [], + "tests/sentry/event_manager/interfaces/test_sdk.py": [], + "tests/sentry/event_manager/interfaces/test_single_exception.py": [], + "tests/sentry/event_manager/interfaces/test_spans.py": [], + "tests/sentry/event_manager/interfaces/test_stacktrace.py": [], + "tests/sentry/event_manager/interfaces/test_template.py": [], + "tests/sentry/event_manager/interfaces/test_threads.py": [], + "tests/sentry/event_manager/interfaces/test_user.py": [], + "tests/sentry/event_manager/test_auto_tags.py": [], + "tests/sentry/event_manager/test_ensure_has_ip.py": [], + "tests/sentry/event_manager/test_event_manager.py": ["kafka", "snuba"], + "tests/sentry/event_manager/test_event_manager_grouping.py": ["kafka", "snuba"], + "tests/sentry/event_manager/test_first_seen_action_log.py": ["snuba"], + "tests/sentry/event_manager/test_generate_culprit.py": [], + "tests/sentry/event_manager/test_normalization.py": [], + "tests/sentry/event_manager/test_priority.py": ["snuba"], + "tests/sentry/event_manager/test_project_platform_infer.py": ["snuba"], + "tests/sentry/event_manager/test_severity.py": ["snuba"], + "tests/sentry/event_manager/test_validate_data.py": [], + "tests/sentry/eventstream/kafka/test_dispatch.py": [], + "tests/sentry/eventstream/kafka/test_protocol.py": [], + "tests/sentry/eventstream/test_eap.py": [], + "tests/sentry/eventstream/test_eventstream.py": ["snuba"], + "tests/sentry/eventstream/test_item_helpers.py": ["snuba"], + "tests/sentry/eventtypes/test_default.py": [], + "tests/sentry/eventtypes/test_error.py": [], + "tests/sentry/eventtypes/test_feedback.py": [], + "tests/sentry/eventtypes/test_nel.py": [], + "tests/sentry/explore/endpoints/test_explore_saved_queries.py": [], + "tests/sentry/explore/endpoints/test_explore_saved_query_ai_conversations.py": [], + "tests/sentry/explore/endpoints/test_explore_saved_query_detail.py": ["snuba"], + "tests/sentry/explore/endpoints/test_explore_saved_query_starred.py": ["snuba"], + "tests/sentry/explore/endpoints/test_saved_queries.py": [], + "tests/sentry/explore/endpoints/test_saved_query_starred_order.py": [], + "tests/sentry/explore/migrations/test_0016_update_if_syntax_on_spans.py": [], + "tests/sentry/explore/test_models.py": [], + "tests/sentry/explore/test_utils.py": [], + "tests/sentry/explore/translation/test_alerts_translation.py": ["snuba"], + "tests/sentry/explore/translation/test_am1_metrics_to_transactions.py": ["snuba"], + "tests/sentry/explore/translation/test_dashboards_translation.py": [], + "tests/sentry/explore/translation/test_discover_translation.py": [], + "tests/sentry/features/test_flagpole_context.py": [], + "tests/sentry/features/test_manager.py": [], + "tests/sentry/feedback/endpoints/test_error_page_embed.py": ["kafka", "snuba"], + "tests/sentry/feedback/endpoints/test_organization_feedback_categories.py": [ + "kafka", + "snuba" + ], + "tests/sentry/feedback/endpoints/test_organization_feedback_summary.py": [ + "kafka", + "snuba" + ], + "tests/sentry/feedback/endpoints/test_organization_user_reports.py": [ + "kafka", + "snuba" + ], + "tests/sentry/feedback/endpoints/test_project_user_reports.py": ["kafka", "snuba"], + "tests/sentry/feedback/lib/test_feedback_utils.py": [], + "tests/sentry/feedback/lib/test_label_query.py": ["kafka", "snuba"], + "tests/sentry/feedback/tasks/test_update_user_reports.py": ["kafka", "snuba"], + "tests/sentry/feedback/usecases/ingest/test_create_feedback.py": ["kafka", "snuba"], + "tests/sentry/feedback/usecases/ingest/test_save_event_feedback.py": ["snuba"], + "tests/sentry/feedback/usecases/ingest/test_shim_to_feedback.py": ["kafka", "snuba"], + "tests/sentry/feedback/usecases/ingest/test_userreport.py": ["kafka", "snuba"], + "tests/sentry/feedback/usecases/test_label_generation.py": [], + "tests/sentry/feedback/usecases/test_spam_detection.py": [], + "tests/sentry/feedback/usecases/test_title_generation.py": [], + "tests/sentry/flags/endpoints/test_hooks.py": [], + "tests/sentry/flags/endpoints/test_logs.py": [], + "tests/sentry/flags/endpoints/test_secrets.py": [], + "tests/sentry/flags/providers/test_generic.py": [], + "tests/sentry/flags/providers/test_launchdarkly.py": [], + "tests/sentry/flags/providers/test_statsig.py": [], + "tests/sentry/flags/providers/test_unleash.py": [], + "tests/sentry/flags/test_audit_log_presenter.py": [], + "tests/sentry/grouping/enhancements/test_hints.py": [], + "tests/sentry/grouping/seer_similarity/test_get_seer_similar_issues.py": ["snuba"], + "tests/sentry/grouping/seer_similarity/test_seer.py": [], + "tests/sentry/grouping/seer_similarity/test_seer_eligibility.py": ["kafka", "snuba"], + "tests/sentry/grouping/seer_similarity/test_training_mode.py": ["snuba"], + "tests/sentry/grouping/test_benchmark.py": [], + "tests/sentry/grouping/test_builtin_fingerprinting.py": ["snuba"], + "tests/sentry/grouping/test_categorization.py": [], + "tests/sentry/grouping/test_components.py": [], + "tests/sentry/grouping/test_config.py": ["snuba"], + "tests/sentry/grouping/test_enhancer.py": [], + "tests/sentry/grouping/test_enhancer_dart_flutter_javascript.py": [], + "tests/sentry/grouping/test_enhancer_dart_flutter_native.py": [], + "tests/sentry/grouping/test_fingerprinting.py": [], + "tests/sentry/grouping/test_grouphash_metadata.py": ["kafka", "snuba"], + "tests/sentry/grouping/test_grouping_info.py": ["kafka", "snuba"], + "tests/sentry/grouping/test_hashing.py": ["snuba"], + "tests/sentry/grouping/test_parameterization.py": [], + "tests/sentry/grouping/test_strategies.py": ["snuba"], + "tests/sentry/grouping/test_variants.py": ["kafka", "snuba"], + "tests/sentry/hybridcloud/apigateway/test_apigateway.py": ["snuba"], + "tests/sentry/hybridcloud/apigateway/test_apigateway_helpers.py": [], + "tests/sentry/hybridcloud/apigateway/test_proxy.py": [], + "tests/sentry/hybridcloud/models/test_cacheversion.py": [], + "tests/sentry/hybridcloud/models/test_outbox.py": [], + "tests/sentry/hybridcloud/models/test_webhookpayload.py": [], + "tests/sentry/hybridcloud/outbox/test_category.py": [], + "tests/sentry/hybridcloud/rpc/test_caching.py": [], + "tests/sentry/hybridcloud/rpc/test_rpc_model.py": [], + "tests/sentry/hybridcloud/rpc/test_sig.py": [], + "tests/sentry/hybridcloud/services/test_cell_organization_provisioning.py": [], + "tests/sentry/hybridcloud/services/test_control_organization_provisioning.py": [], + "tests/sentry/hybridcloud/tasks/test_backfill_outboxes.py": [], + "tests/sentry/hybridcloud/tasks/test_deliver_from_outbox.py": [], + "tests/sentry/hybridcloud/tasks/test_deliver_webhooks.py": [], + "tests/sentry/hybridcloud/tasks/test_webhook_backlog_metrics.py": [], + "tests/sentry/hybridcloud/test_auth.py": [], + "tests/sentry/hybridcloud/test_cell.py": [], + "tests/sentry/hybridcloud/test_mailbox.py": [], + "tests/sentry/hybridcloud/test_organization.py": [], + "tests/sentry/hybridcloud/test_organizationmapping.py": [], + "tests/sentry/hybridcloud/test_organizationmembermapping.py": [], + "tests/sentry/hybridcloud/test_project.py": [], + "tests/sentry/hybridcloud/test_project_key.py": [], + "tests/sentry/hybridcloud/test_replica.py": [], + "tests/sentry/hybridcloud/test_rpc.py": [], + "tests/sentry/hybridcloud/test_team.py": [], + "tests/sentry/hybridcloud/test_tombstone.py": [], + "tests/sentry/hybridcloud/test_webhook_mailbox_sizing.py": [], + "tests/sentry/identity/datadog/test_provider.py": [], + "tests/sentry/identity/gcp/test_provider.py": [], + "tests/sentry/identity/github/test_provider.py": [], + "tests/sentry/identity/services/test_identity.py": [], + "tests/sentry/identity/test_oauth2.py": [], + "tests/sentry/identity/test_pipeline.py": [], + "tests/sentry/inbox/endpoints/test_organization_inbox.py": ["snuba"], + "tests/sentry/inbox/endpoints/test_organization_inbox_count.py": [], + "tests/sentry/inbox/endpoints/test_organization_inbox_item_events.py": [], + "tests/sentry/inbox/test_issue.py": ["snuba"], + "tests/sentry/inbox/test_serializers.py": ["snuba"], + "tests/sentry/inbox/test_types.py": ["snuba"], + "tests/sentry/incidents/endpoints/serializers/test_query_subscription.py": [], + "tests/sentry/incidents/endpoints/test_organization_detector_anomaly_data.py": [ + "snuba" + ], + "tests/sentry/incidents/endpoints/validators/test_validators.py": ["snuba"], + "tests/sentry/incidents/handlers/condition/test_anomaly_detection_handler.py": [ + "snuba" + ], + "tests/sentry/incidents/models/test_alert_rule.py": [], + "tests/sentry/incidents/serializers/test_workflow_engine_action.py": ["snuba"], + "tests/sentry/incidents/serializers/test_workflow_engine_data_condition.py": [ + "snuba" + ], + "tests/sentry/incidents/serializers/test_workflow_engine_detector.py": ["snuba"], + "tests/sentry/incidents/serializers/test_workflow_engine_incident.py": ["snuba"], + "tests/sentry/incidents/subscription_processor/test_subscription_processor_aci.py": [ + "snuba" + ], + "tests/sentry/incidents/subscription_processor/test_subscription_processor_base.py": [ + "snuba" + ], + "tests/sentry/incidents/test_charts.py": ["snuba"], + "tests/sentry/incidents/test_logic.py": ["snuba"], + "tests/sentry/incidents/test_metric_issue_detector_handler.py": ["snuba"], + "tests/sentry/incidents/test_metric_issue_post_process.py": ["snuba"], + "tests/sentry/incidents/utils/test_format_duration.py": [], + "tests/sentry/incidents/utils/test_process_update_helpers.py": [], + "tests/sentry/incidents/utils/test_subscription_limits.py": [], + "tests/sentry/ingest/ingest_consumer/test_attachment_event.py": [], + "tests/sentry/ingest/ingest_consumer/test_dlq.py": [], + "tests/sentry/ingest/ingest_consumer/test_ingest_consumer_kafka.py": [ + "kafka", + "snuba" + ], + "tests/sentry/ingest/ingest_consumer/test_ingest_consumer_processing.py": [ + "kafka", + "snuba", + "symbolicator" + ], + "tests/sentry/ingest/ingest_consumer/test_ingest_consumer_transactions.py": [ + "kafka", + "snuba" + ], + "tests/sentry/ingest/test_inbound_filters.py": [], + "tests/sentry/ingest/test_legacy_filter_lists.py": [], + "tests/sentry/ingest/test_transaction_clusterer.py": [], + "tests/sentry/ingest/test_transaction_rule_validator.py": [], + "tests/sentry/ingestion_delay/test_activity.py": ["snuba"], + "tests/sentry/ingestion_delay/test_query.py": ["snuba"], + "tests/sentry/ingestion_delay/test_status.py": [], + "tests/sentry/insights/endpoints/test_insights_starred_segment.py": ["snuba"], + "tests/sentry/insights/test_filter_span.py": [], + "tests/sentry/integrations/api/bases/test_integration.py": [], + "tests/sentry/integrations/api/endpoints/test_data_forwarding.py": [], + "tests/sentry/integrations/api/endpoints/test_data_forwarding_details.py": [], + "tests/sentry/integrations/api/endpoints/test_doc_integration_avatar.py": [], + "tests/sentry/integrations/api/endpoints/test_doc_integration_details.py": [], + "tests/sentry/integrations/api/endpoints/test_doc_integrations.py": [], + "tests/sentry/integrations/api/endpoints/test_external_team.py": [], + "tests/sentry/integrations/api/endpoints/test_external_team_details.py": [], + "tests/sentry/integrations/api/endpoints/test_external_user.py": [], + "tests/sentry/integrations/api/endpoints/test_external_user_details.py": [], + "tests/sentry/integrations/api/endpoints/test_integration_features.py": [], + "tests/sentry/integrations/api/endpoints/test_integration_proxy.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_code_mapping_codeowners.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_code_mapping_details.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_code_mappings.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_code_mappings_bulk.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_coding_agents.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_channel_validate.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_channels.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_details.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_direct_enable.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_issues.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_repo_sync.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_repos.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_request.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integration_serverless_functions.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_integrations.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_pull_request_files.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_repositories.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_repository_commits.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_repository_details.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_repository_platforms.py": [], + "tests/sentry/integrations/api/endpoints/test_organization_repository_settings.py": [], + "tests/sentry/integrations/api/endpoints/test_user_organizationintegration.py": [], + "tests/sentry/integrations/api/serializers/models/test_integration.py": [], + "tests/sentry/integrations/api/serializers/models/test_integration_provider_types.py": [], + "tests/sentry/integrations/api/serializers/rest_framework/test_data_forwarder.py": [], + "tests/sentry/integrations/api/serializers/test_external_actor.py": [], + "tests/sentry/integrations/api/serializers/test_external_issue.py": ["snuba"], + "tests/sentry/integrations/aws_lambda/test_client.py": [], + "tests/sentry/integrations/aws_lambda/test_integration.py": [], + "tests/sentry/integrations/aws_lambda/test_utils.py": [], + "tests/sentry/integrations/bitbucket/test_client.py": [], + "tests/sentry/integrations/bitbucket/test_descriptor.py": [], + "tests/sentry/integrations/bitbucket/test_installed.py": [], + "tests/sentry/integrations/bitbucket/test_integration.py": [], + "tests/sentry/integrations/bitbucket/test_issues.py": ["snuba"], + "tests/sentry/integrations/bitbucket/test_repository.py": [], + "tests/sentry/integrations/bitbucket/test_search.py": [], + "tests/sentry/integrations/bitbucket/test_uninstalled.py": [], + "tests/sentry/integrations/bitbucket/test_webhook.py": [], + "tests/sentry/integrations/bitbucket_server/test_client.py": [], + "tests/sentry/integrations/bitbucket_server/test_integration.py": [], + "tests/sentry/integrations/bitbucket_server/test_repository.py": [], + "tests/sentry/integrations/bitbucket_server/test_tasks.py": [], + "tests/sentry/integrations/bitbucket_server/test_webhook.py": [], + "tests/sentry/integrations/claude_code/test_integration.py": [], + "tests/sentry/integrations/cursor/test_client.py": [], + "tests/sentry/integrations/cursor/test_integration.py": [], + "tests/sentry/integrations/cursor/test_webhook.py": [], + "tests/sentry/integrations/cursor_origin/test_client.py": [], + "tests/sentry/integrations/cursor_origin/test_client_reads.py": [], + "tests/sentry/integrations/cursor_origin/test_code_review.py": [], + "tests/sentry/integrations/cursor_origin/test_handlers.py": [], + "tests/sentry/integrations/cursor_origin/test_integration.py": [], + "tests/sentry/integrations/cursor_origin/test_keys.py": [], + "tests/sentry/integrations/cursor_origin/test_languages.py": [], + "tests/sentry/integrations/cursor_origin/test_pipeline.py": [], + "tests/sentry/integrations/cursor_origin/test_provider.py": [], + "tests/sentry/integrations/cursor_origin/test_pull_request.py": [], + "tests/sentry/integrations/cursor_origin/test_push.py": [], + "tests/sentry/integrations/cursor_origin/test_repository.py": [], + "tests/sentry/integrations/cursor_origin/test_repository_events.py": [], + "tests/sentry/integrations/cursor_origin/test_utils.py": [], + "tests/sentry/integrations/cursor_origin/test_webhook.py": ["snuba"], + "tests/sentry/integrations/data_forwarding/amazon_sqs/test_forwarder.py": ["snuba"], + "tests/sentry/integrations/data_forwarding/segment/test_forwarder.py": ["snuba"], + "tests/sentry/integrations/data_forwarding/splunk/test_forwarder.py": ["snuba"], + "tests/sentry/integrations/data_forwarding/test_base.py": ["snuba"], + "tests/sentry/integrations/data_forwarding/test_tasks.py": ["snuba"], + "tests/sentry/integrations/datadog/test_client.py": [], + "tests/sentry/integrations/datadog/test_integration.py": [], + "tests/sentry/integrations/discord/message_builder/test_action_row.py": [], + "tests/sentry/integrations/discord/message_builder/test_builder.py": [], + "tests/sentry/integrations/discord/message_builder/test_button.py": [], + "tests/sentry/integrations/discord/message_builder/test_embed.py": [], + "tests/sentry/integrations/discord/message_builder/test_flags.py": [], + "tests/sentry/integrations/discord/message_builder/test_select_menu.py": [], + "tests/sentry/integrations/discord/test_client.py": [], + "tests/sentry/integrations/discord/test_integration.py": [], + "tests/sentry/integrations/discord/test_issue_alert.py": ["snuba"], + "tests/sentry/integrations/discord/test_requests.py": [], + "tests/sentry/integrations/discord/test_uninstall.py": [], + "tests/sentry/integrations/discord/test_utils.py": [], + "tests/sentry/integrations/discord/test_views.py": [], + "tests/sentry/integrations/discord/webhooks/test_command.py": [], + "tests/sentry/integrations/discord/webhooks/test_endpoint.py": [], + "tests/sentry/integrations/discord/webhooks/test_message_component.py": ["snuba"], + "tests/sentry/integrations/example/test_integration.py": [], + "tests/sentry/integrations/gcp/test_integration.py": [], + "tests/sentry/integrations/github/tasks/test_link_all_repos.py": [], + "tests/sentry/integrations/github/tasks/test_pr_comment.py": ["snuba"], + "tests/sentry/integrations/github/tasks/test_sync_repos_on_install_change.py": [], + "tests/sentry/integrations/github/test_check_payloads.py": [], + "tests/sentry/integrations/github/test_client.py": [], + "tests/sentry/integrations/github/test_identity_external_actor.py": [], + "tests/sentry/integrations/github/test_installation.py": [], + "tests/sentry/integrations/github/test_integration.py": ["snuba"], + "tests/sentry/integrations/github/test_issues.py": ["snuba"], + "tests/sentry/integrations/github/test_multi_platform_detection.py": [], + "tests/sentry/integrations/github/test_platform_registry.py": [], + "tests/sentry/integrations/github/test_post_install.py": [], + "tests/sentry/integrations/github/test_pull_request_status.py": [], + "tests/sentry/integrations/github/test_repository.py": [], + "tests/sentry/integrations/github/test_search.py": [], + "tests/sentry/integrations/github/test_ticket_action.py": ["snuba"], + "tests/sentry/integrations/github/test_utils.py": [], + "tests/sentry/integrations/github/test_webhook.py": ["snuba"], + "tests/sentry/integrations/github_copilot/test_client.py": [], + "tests/sentry/integrations/github_copilot/test_integration.py": [], + "tests/sentry/integrations/github_enterprise/test_client.py": [], + "tests/sentry/integrations/github_enterprise/test_integration.py": ["snuba"], + "tests/sentry/integrations/github_enterprise/test_issues.py": [], + "tests/sentry/integrations/github_enterprise/test_repository.py": [], + "tests/sentry/integrations/github_enterprise/test_search.py": [], + "tests/sentry/integrations/github_enterprise/test_ticket_action.py": ["snuba"], + "tests/sentry/integrations/github_enterprise/test_webhooks.py": ["snuba"], + "tests/sentry/integrations/gitlab/tasks/test_pr_comment.py": ["snuba"], + "tests/sentry/integrations/gitlab/tasks/test_update_all_project_webhooks.py": [], + "tests/sentry/integrations/gitlab/test_client.py": [], + "tests/sentry/integrations/gitlab/test_integration.py": ["snuba"], + "tests/sentry/integrations/gitlab/test_issues.py": ["snuba"], + "tests/sentry/integrations/gitlab/test_repository.py": [], + "tests/sentry/integrations/gitlab/test_search.py": [], + "tests/sentry/integrations/gitlab/test_webhook.py": ["snuba"], + "tests/sentry/integrations/grafana/test_client.py": [], + "tests/sentry/integrations/grafana/test_integration.py": [], + "tests/sentry/integrations/jira/forge/test_invocation_token.py": [], + "tests/sentry/integrations/jira/models/test_jira_schema.py": [], + "tests/sentry/integrations/jira/test_client.py": [], + "tests/sentry/integrations/jira/test_csp.py": [], + "tests/sentry/integrations/jira/test_forge_installation.py": [], + "tests/sentry/integrations/jira/test_forge_issue_updated.py": ["snuba"], + "tests/sentry/integrations/jira/test_installed.py": [], + "tests/sentry/integrations/jira/test_integration.py": ["snuba"], + "tests/sentry/integrations/jira/test_notify_action.py": ["snuba"], + "tests/sentry/integrations/jira/test_search_endpoint.py": [], + "tests/sentry/integrations/jira/test_sentry_installation.py": [], + "tests/sentry/integrations/jira/test_sentry_issue_details.py": ["snuba"], + "tests/sentry/integrations/jira/test_tasks.py": [], + "tests/sentry/integrations/jira/test_ticket_action.py": ["snuba"], + "tests/sentry/integrations/jira/test_uninstalled.py": [], + "tests/sentry/integrations/jira/test_utils.py": [], + "tests/sentry/integrations/jira/test_webhooks.py": ["snuba"], + "tests/sentry/integrations/jira/utils/test_create_issue_schema_transformers.py": [], + "tests/sentry/integrations/jira_server/test_client.py": [], + "tests/sentry/integrations/jira_server/test_installation.py": [], + "tests/sentry/integrations/jira_server/test_integration.py": ["snuba"], + "tests/sentry/integrations/jira_server/test_search.py": [], + "tests/sentry/integrations/jira_server/test_ticket_action.py": ["snuba"], + "tests/sentry/integrations/jira_server/test_utils.py": [], + "tests/sentry/integrations/jira_server/test_webhooks.py": ["snuba"], + "tests/sentry/integrations/linear/test_client.py": [], + "tests/sentry/integrations/linear/test_integration.py": [], + "tests/sentry/integrations/middleware/hybrid_cloud/test_base.py": [], + "tests/sentry/integrations/models/deletions/test_organizationintegration.py": [], + "tests/sentry/integrations/models/test_integrationfeature.py": [], + "tests/sentry/integrations/msteams/notifications/test_assigned.py": ["snuba"], + "tests/sentry/integrations/msteams/notifications/test_deploy.py": [], + "tests/sentry/integrations/msteams/notifications/test_escalating.py": ["snuba"], + "tests/sentry/integrations/msteams/notifications/test_issue_alert.py": ["snuba"], + "tests/sentry/integrations/msteams/notifications/test_note.py": ["snuba"], + "tests/sentry/integrations/msteams/notifications/test_regression.py": ["snuba"], + "tests/sentry/integrations/msteams/notifications/test_resolved.py": ["snuba"], + "tests/sentry/integrations/msteams/notifications/test_unassigned.py": ["snuba"], + "tests/sentry/integrations/msteams/test_action_state_change.py": ["snuba"], + "tests/sentry/integrations/msteams/test_client.py": [], + "tests/sentry/integrations/msteams/test_integration.py": [], + "tests/sentry/integrations/msteams/test_link_identity.py": [], + "tests/sentry/integrations/msteams/test_message_builder.py": ["snuba"], + "tests/sentry/integrations/msteams/test_notifications.py": ["snuba"], + "tests/sentry/integrations/msteams/test_notify_action.py": ["snuba"], + "tests/sentry/integrations/msteams/test_parsing.py": [], + "tests/sentry/integrations/msteams/test_unlink_identity.py": [], + "tests/sentry/integrations/msteams/test_utils.py": ["snuba"], + "tests/sentry/integrations/msteams/test_webhook.py": [], + "tests/sentry/integrations/msteams/webhook/test_ms_teams_events.py": [], + "tests/sentry/integrations/msteams/webhook/test_ms_teams_webhook_endpoint.py": [], + "tests/sentry/integrations/msteams/webhook/test_ms_teams_webhook_parsing.py": [], + "tests/sentry/integrations/opsgenie/test_client.py": ["snuba"], + "tests/sentry/integrations/opsgenie/test_integration.py": [], + "tests/sentry/integrations/opsgenie/test_notify_action.py": ["snuba"], + "tests/sentry/integrations/pagerduty/test_client.py": ["snuba"], + "tests/sentry/integrations/pagerduty/test_integration.py": [], + "tests/sentry/integrations/pagerduty/test_notification.py": ["snuba"], + "tests/sentry/integrations/perforce/test_client.py": [], + "tests/sentry/integrations/perforce/test_code_mapping.py": [], + "tests/sentry/integrations/perforce/test_integration.py": [], + "tests/sentry/integrations/perforce/test_stacktrace_link.py": [], + "tests/sentry/integrations/repository/base/test_base_new_notification_message.py": [], + "tests/sentry/integrations/repository/notification_action/test_notification_action_notification_message_repository.py": [ + "snuba" + ], + "tests/sentry/integrations/services/repository/test_impl.py": ["snuba"], + "tests/sentry/integrations/services/test_assignment_source.py": [], + "tests/sentry/integrations/services/test_integration.py": [], + "tests/sentry/integrations/slack/actions/notification/test_slack_notify_service_action.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/message_builder/test_routing.py": [], + "tests/sentry/integrations/slack/notifications/test_assigned.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_deploy.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_escalating.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_issue_alert.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_note.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_nudge.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_regression.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_resolved.py": ["snuba"], + "tests/sentry/integrations/slack/notifications/test_resolved_in_pull_request.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/notifications/test_resolved_in_release.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/notifications/test_unassigned.py": ["snuba"], + "tests/sentry/integrations/slack/service/test_slack_service.py": ["snuba"], + "tests/sentry/integrations/slack/staging/test_feature_flag.py": [], + "tests/sentry/integrations/slack/tasks/test_send_notifications_on_activity.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/tasks/test_tasks.py": ["snuba"], + "tests/sentry/integrations/slack/test_integration.py": [], + "tests/sentry/integrations/slack/test_link_identity.py": [], + "tests/sentry/integrations/slack/test_link_team.py": [], + "tests/sentry/integrations/slack/test_message_builder.py": ["snuba"], + "tests/sentry/integrations/slack/test_notifications.py": ["snuba"], + "tests/sentry/integrations/slack/test_notify_action.py": ["snuba"], + "tests/sentry/integrations/slack/test_requests.py": [], + "tests/sentry/integrations/slack/test_sdk_client.py": [], + "tests/sentry/integrations/slack/test_unfurl.py": ["snuba"], + "tests/sentry/integrations/slack/threads/activity_notifications/test_asana_external_issue_created_activity.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/threads/activity_notifications/test_assigned_activity_notification.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/threads/activity_notifications/test_external_issue_created_activity.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/threads/activity_notifications/test_external_issue_created_activity_notification.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/utils/test_channel.py": ["snuba"], + "tests/sentry/integrations/slack/utils/test_nudge.py": [], + "tests/sentry/integrations/slack/utils/test_slack_errors.py": [], + "tests/sentry/integrations/slack/webhooks/actions/test_enable_notifications.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/webhooks/actions/test_investigation.py": ["snuba"], + "tests/sentry/integrations/slack/webhooks/actions/test_link_clicked.py": ["snuba"], + "tests/sentry/integrations/slack/webhooks/actions/test_link_identity.py": ["snuba"], + "tests/sentry/integrations/slack/webhooks/actions/test_seer_agent.py": ["snuba"], + "tests/sentry/integrations/slack/webhooks/actions/test_seer_autofix.py": ["snuba"], + "tests/sentry/integrations/slack/webhooks/actions/test_seer_request_credits.py": [ + "snuba" + ], + "tests/sentry/integrations/slack/webhooks/actions/test_status.py": ["snuba"], + "tests/sentry/integrations/slack/webhooks/actions/test_tracked_clicks.py": ["snuba"], + "tests/sentry/integrations/slack/webhooks/commands/test_get.py": [], + "tests/sentry/integrations/slack/webhooks/commands/test_help.py": [], + "tests/sentry/integrations/slack/webhooks/commands/test_link_team.py": [], + "tests/sentry/integrations/slack/webhooks/commands/test_link_user.py": [], + "tests/sentry/integrations/slack/webhooks/commands/test_post.py": [], + "tests/sentry/integrations/slack/webhooks/commands/test_set_default_org.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_app_mention.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_assistant_thread_started.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_direct_message.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_discover_link_shared.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_explore_link_shared.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_link_shared.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_message_im.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_reaction_added.py": [], + "tests/sentry/integrations/slack/webhooks/events/test_url_verification.py": [], + "tests/sentry/integrations/slack/webhooks/options_load/test_dynamic_assignment_dropdown.py": [ + "snuba" + ], + "tests/sentry/integrations/source_code_management/test_auto_link_repos.py": [], + "tests/sentry/integrations/source_code_management/test_commit_context.py": ["snuba"], + "tests/sentry/integrations/source_code_management/test_path.py": [], + "tests/sentry/integrations/source_code_management/test_pull_request_status_batch.py": [], + "tests/sentry/integrations/source_code_management/test_repo_trees.py": [], + "tests/sentry/integrations/source_code_management/test_sync_repos.py": [], + "tests/sentry/integrations/source_code_management/test_url.py": [], + "tests/sentry/integrations/tasks/test_create_comment.py": ["snuba"], + "tests/sentry/integrations/tasks/test_migrate_repo.py": [], + "tests/sentry/integrations/tasks/test_sync_assignee_outbound.py": ["snuba"], + "tests/sentry/integrations/tasks/test_sync_status_inbound.py": ["snuba"], + "tests/sentry/integrations/tasks/test_sync_status_outbound.py": ["snuba"], + "tests/sentry/integrations/tasks/test_update_comment.py": ["snuba"], + "tests/sentry/integrations/test_base.py": [], + "tests/sentry/integrations/test_client.py": [], + "tests/sentry/integrations/test_issues.py": ["snuba"], + "tests/sentry/integrations/test_metric_alerts.py": ["snuba"], + "tests/sentry/integrations/test_model.py": [], + "tests/sentry/integrations/test_notification_utilities.py": [], + "tests/sentry/integrations/test_pipeline.py": [], + "tests/sentry/integrations/utils/test_assignee_sync.py": ["snuba"], + "tests/sentry/integrations/utils/test_atlassian_connect.py": [], + "tests/sentry/integrations/utils/test_external_issue_key.py": ["snuba"], + "tests/sentry/integrations/utils/test_external_issues.py": ["snuba"], + "tests/sentry/integrations/utils/test_feature_flags.py": [], + "tests/sentry/integrations/utils/test_github_permission_tiers.py": [], + "tests/sentry/integrations/utils/test_github_permissions.py": [], + "tests/sentry/integrations/utils/test_hostname.py": [], + "tests/sentry/integrations/utils/test_jira.py": [], + "tests/sentry/integrations/utils/test_lifecycle_metrics.py": [], + "tests/sentry/integrations/utils/test_scope.py": [], + "tests/sentry/integrations/utils/test_source_context.py": [], + "tests/sentry/integrations/utils/test_status_sync.py": [], + "tests/sentry/integrations/utils/test_sync.py": ["snuba"], + "tests/sentry/integrations/utils/test_webhook_viewer_context.py": [], + "tests/sentry/integrations/vsts/test_client.py": [], + "tests/sentry/integrations/vsts/test_integration.py": [], + "tests/sentry/integrations/vsts/test_issues.py": ["snuba"], + "tests/sentry/integrations/vsts/test_kickoff_vsts_subscription_check.py": [], + "tests/sentry/integrations/vsts/test_notify_action.py": ["snuba"], + "tests/sentry/integrations/vsts/test_provider.py": [], + "tests/sentry/integrations/vsts/test_repository.py": [], + "tests/sentry/integrations/vsts/test_search.py": [], + "tests/sentry/integrations/vsts/test_webhooks.py": ["snuba"], + "tests/sentry/investigations/endpoints/test_organization_investigation_base.py": [], + "tests/sentry/investigations/endpoints/test_organization_investigation_candidates.py": [ + "snuba" + ], + "tests/sentry/investigations/endpoints/test_organization_investigation_orchestration.py": [], + "tests/sentry/investigations/endpoints/test_organization_investigation_start.py": [ + "snuba" + ], + "tests/sentry/investigations/endpoints/validators/test_investigation.py": [], + "tests/sentry/investigations/services/test_connect_telemetry.py": [], + "tests/sentry/investigations/services/test_connect_telemetry_contract.py": [], + "tests/sentry/investigations/services/test_investigations.py": [], + "tests/sentry/investigations/services/test_issue_links.py": ["snuba"], + "tests/sentry/investigations/services/test_orchestration.py": ["snuba"], + "tests/sentry/investigations/services/test_orchestration_dispatch.py": [], + "tests/sentry/investigations/services/test_orchestration_events.py": [], + "tests/sentry/investigations/services/test_queued_commands.py": [], + "tests/sentry/investigations/services/test_update_detector_changes.py": [ + "kafka", + "snuba" + ], + "tests/sentry/investigations/services/test_update_detector_contract.py": [], + "tests/sentry/investigations/test_contracts.py": [], + "tests/sentry/investigations/test_seer_client.py": [], + "tests/sentry/investigations/test_seer_contract.py": [], + "tests/sentry/issue_detection/span_first/test_run_detectors.py": [], + "tests/sentry/issue_detection/span_first/test_span_first_slow_db_query_detector.py": [], + "tests/sentry/issue_detection/test_consecutive_db_detector.py": [], + "tests/sentry/issue_detection/test_consecutive_http_detector.py": [], + "tests/sentry/issue_detection/test_db_main_thread_detector.py": [], + "tests/sentry/issue_detection/test_file_io_on_main_thread_detector.py": [], + "tests/sentry/issue_detection/test_http_overhead_detector.py": [], + "tests/sentry/issue_detection/test_large_http_payload_detector.py": [], + "tests/sentry/issue_detection/test_m_n_plus_one_db_detector.py": [], + "tests/sentry/issue_detection/test_n_plus_one_api_calls_detector.py": [], + "tests/sentry/issue_detection/test_n_plus_one_db_span_detector.py": [], + "tests/sentry/issue_detection/test_performance_detection.py": [], + "tests/sentry/issue_detection/test_query_injection_detector.py": [], + "tests/sentry/issue_detection/test_render_blocking_asset_detector.py": [], + "tests/sentry/issue_detection/test_slow_db_span_detector.py": [], + "tests/sentry/issue_detection/test_sql_injection_detector.py": [], + "tests/sentry/issue_detection/test_uncompressed_asset_detector.py": [], + "tests/sentry/issue_detection/test_utils.py": [], + "tests/sentry/issues/action_log/test_backfill.py": ["snuba"], + "tests/sentry/issues/action_log/test_types.py": [], + "tests/sentry/issues/auto_source_code_config/test_code_mapping.py": [], + "tests/sentry/issues/auto_source_code_config/test_directory_prefixes.py": [], + "tests/sentry/issues/auto_source_code_config/test_frame_info.py": [], + "tests/sentry/issues/auto_source_code_config/test_process_event.py": ["snuba"], + "tests/sentry/issues/auto_source_code_config/test_stack_filename_sample.py": [], + "tests/sentry/issues/auto_source_code_config/test_stacktraces.py": [], + "tests/sentry/issues/derived/test_aggregators.py": [], + "tests/sentry/issues/derived/test_check.py": ["snuba"], + "tests/sentry/issues/derived/test_framework.py": [], + "tests/sentry/issues/derived/test_processing.py": ["snuba"], + "tests/sentry/issues/derived/test_promote.py": ["snuba"], + "tests/sentry/issues/derived/test_reconcile.py": ["snuba"], + "tests/sentry/issues/derived/test_tasks.py": ["snuba"], + "tests/sentry/issues/endpoints/test_actionable_items.py": ["snuba"], + "tests/sentry/issues/endpoints/test_debug_group_derived_data.py": ["snuba"], + "tests/sentry/issues/endpoints/test_event_grouping_info.py": ["snuba"], + "tests/sentry/issues/endpoints/test_event_owners.py": ["kafka", "snuba"], + "tests/sentry/issues/endpoints/test_event_reprocessable.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_activities.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_attachments.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_current_release.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_details.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_event_details.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_events.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_first_last_release.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_hashes.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_impact_assessment.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_integration_details.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_integrations.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_notes.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_notes_details.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_pull_requests.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_related.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_reprocessing.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_similar_issues_embeddings.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_stats.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_tagkey_details.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_tagkey_values.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_tags.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_tombstone.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_tombstone_details.py": ["snuba"], + "tests/sentry/issues/endpoints/test_group_user_reports.py": ["snuba"], + "tests/sentry/issues/endpoints/test_organization_code_mapping_repo_prefixes.py": [], + "tests/sentry/issues/endpoints/test_organization_codeowners_associations.py": [], + "tests/sentry/issues/endpoints/test_organization_group_index.py": ["kafka", "snuba"], + "tests/sentry/issues/endpoints/test_organization_group_index_stats.py": ["snuba"], + "tests/sentry/issues/endpoints/test_organization_group_search_view_details.py": [], + "tests/sentry/issues/endpoints/test_organization_group_search_view_details_starred.py": [], + "tests/sentry/issues/endpoints/test_organization_group_search_view_starred_order.py": [], + "tests/sentry/issues/endpoints/test_organization_group_search_view_visit.py": [], + "tests/sentry/issues/endpoints/test_organization_group_search_views.py": [], + "tests/sentry/issues/endpoints/test_organization_group_search_views_starred.py": [], + "tests/sentry/issues/endpoints/test_organization_issue_metrics.py": ["snuba"], + "tests/sentry/issues/endpoints/test_organization_issue_timeseries.py": ["snuba"], + "tests/sentry/issues/endpoints/test_organization_issues_count.py": ["snuba"], + "tests/sentry/issues/endpoints/test_organization_issues_with_supergroups.py": [ + "snuba" + ], + "tests/sentry/issues/endpoints/test_organization_shortid.py": ["snuba"], + "tests/sentry/issues/endpoints/test_project_code_mapping_stack_prefixes.py": [], + "tests/sentry/issues/endpoints/test_project_codeowners_details.py": [], + "tests/sentry/issues/endpoints/test_project_codeowners_index.py": [], + "tests/sentry/issues/endpoints/test_project_group_stats.py": ["snuba"], + "tests/sentry/issues/endpoints/test_project_issues_resolved_in_release.py": ["snuba"], + "tests/sentry/issues/endpoints/test_project_ownership.py": ["snuba"], + "tests/sentry/issues/endpoints/test_project_performance_issue_settings.py": [], + "tests/sentry/issues/endpoints/test_project_stacktrace_link.py": [], + "tests/sentry/issues/endpoints/test_project_stacktrace_source_context.py": [], + "tests/sentry/issues/endpoints/test_project_user_issue.py": [], + "tests/sentry/issues/endpoints/test_related_issues.py": ["snuba"], + "tests/sentry/issues/endpoints/test_shared_group_details.py": ["snuba"], + "tests/sentry/issues/endpoints/test_team_all_unresolved_issues.py": ["snuba"], + "tests/sentry/issues/endpoints/test_team_groups_old.py": ["snuba"], + "tests/sentry/issues/endpoints/test_team_issue_breakdown.py": ["snuba"], + "tests/sentry/issues/escalating/test_escalating.py": ["snuba"], + "tests/sentry/issues/escalating/test_escalating_issues_alg.py": [], + "tests/sentry/issues/escalating/test_issue_velocity.py": ["snuba"], + "tests/sentry/issues/formatting/test_adapter.py": [], + "tests/sentry/issues/formatting/test_autofix.py": [], + "tests/sentry/issues/formatting/test_formatter.py": [], + "tests/sentry/issues/formatting/test_mixin.py": [], + "tests/sentry/issues/formatting/test_sections.py": [], + "tests/sentry/issues/impact/test_assessment.py": ["snuba"], + "tests/sentry/issues/impact/test_delivery.py": ["snuba"], + "tests/sentry/issues/impact/test_types.py": [], + "tests/sentry/issues/models/test_groupactionlogentry.py": ["snuba"], + "tests/sentry/issues/ownership/test_grammar.py": [], + "tests/sentry/issues/related/test_trace_connected.py": ["snuba"], + "tests/sentry/issues/services/issue/test_impl.py": ["snuba"], + "tests/sentry/issues/test_action_log.py": ["snuba"], + "tests/sentry/issues/test_attributes.py": ["snuba"], + "tests/sentry/issues/test_group_attributes_dataset.py": ["snuba"], + "tests/sentry/issues/test_grouptype.py": [], + "tests/sentry/issues/test_ignored.py": ["snuba"], + "tests/sentry/issues/test_ingest.py": ["snuba"], + "tests/sentry/issues/test_ingest_incident_integration.py": ["snuba"], + "tests/sentry/issues/test_issue_occurrence.py": [], + "tests/sentry/issues/test_issue_search.py": [], + "tests/sentry/issues/test_json_schemas.py": [], + "tests/sentry/issues/test_merge.py": ["snuba"], + "tests/sentry/issues/test_occurrence_consumer.py": ["snuba"], + "tests/sentry/issues/test_ongoing.py": ["snuba"], + "tests/sentry/issues/test_priority.py": ["snuba"], + "tests/sentry/issues/test_producer.py": ["snuba"], + "tests/sentry/issues/test_run.py": [], + "tests/sentry/issues/test_search_issues_dataset.py": ["snuba"], + "tests/sentry/issues/test_status_change.py": ["snuba"], + "tests/sentry/issues/test_status_change_consumer.py": ["snuba"], + "tests/sentry/issues/test_update_inbox.py": ["snuba"], + "tests/sentry/lang/dart/test_utils.py": [], + "tests/sentry/lang/java/test_exceptions.py": [], + "tests/sentry/lang/javascript/test_cache.py": [], + "tests/sentry/lang/javascript/test_errorlocale.py": [], + "tests/sentry/lang/javascript/test_errormapping.py": [], + "tests/sentry/lang/javascript/test_processing.py": [], + "tests/sentry/lang/javascript/test_sourcemaps.py": [], + "tests/sentry/lang/javascript/test_utils.py": [], + "tests/sentry/lang/native/test_applecrashreport.py": [], + "tests/sentry/lang/native/test_processing.py": [], + "tests/sentry/lang/native/test_sources.py": [], + "tests/sentry/lang/native/test_symbolicator.py": [], + "tests/sentry/lang/native/test_teapot.py": [], + "tests/sentry/lang/native/test_utils.py": [], + "tests/sentry/loader/test_browsersdkversion.py": [], + "tests/sentry/loader/test_dynamic_sdk_options.py": [], + "tests/sentry/logging/test_handler.py": [], + "tests/sentry/mail/activity/test_note.py": ["snuba"], + "tests/sentry/mail/activity/test_release.py": [], + "tests/sentry/mail/test_actions.py": ["snuba"], + "tests/sentry/mail/test_adapter.py": ["snuba"], + "tests/sentry/management/commands/test_api_endpoint_owners.py": [], + "tests/sentry/management/commands/test_generate_controlsilo_urls.py": [], + "tests/sentry/manager/test_external_issue_manager.py": ["snuba"], + "tests/sentry/manager/test_group_manager.py": ["snuba"], + "tests/sentry/manager/test_organization_manager.py": [], + "tests/sentry/manager/test_project_manager.py": [], + "tests/sentry/manager/test_projectteam_manager.py": [], + "tests/sentry/manager/test_team_manager.py": [], + "tests/sentry/metrics/test_datadog.py": [], + "tests/sentry/metrics/test_dualwrite.py": [], + "tests/sentry/metrics/test_middleware.py": [], + "tests/sentry/metrics/test_precise.py": [], + "tests/sentry/metrics/test_sentry_sdk.py": [], + "tests/sentry/metrics/test_statsd.py": [], + "tests/sentry/middleware/integrations/parsers/test_bitbucket.py": [], + "tests/sentry/middleware/integrations/parsers/test_bitbucket_server.py": [], + "tests/sentry/middleware/integrations/parsers/test_cursor_origin.py": [], + "tests/sentry/middleware/integrations/parsers/test_discord.py": [], + "tests/sentry/middleware/integrations/parsers/test_github.py": [], + "tests/sentry/middleware/integrations/parsers/test_github_enterprise.py": [], + "tests/sentry/middleware/integrations/parsers/test_gitlab.py": [], + "tests/sentry/middleware/integrations/parsers/test_google.py": [], + "tests/sentry/middleware/integrations/parsers/test_jira.py": [], + "tests/sentry/middleware/integrations/parsers/test_jira_server.py": [], + "tests/sentry/middleware/integrations/parsers/test_msteams.py": [], + "tests/sentry/middleware/integrations/parsers/test_slack.py": [], + "tests/sentry/middleware/integrations/parsers/test_vsts.py": [], + "tests/sentry/middleware/integrations/test_classifications.py": [], + "tests/sentry/middleware/integrations/test_integration_control.py": [], + "tests/sentry/middleware/integrations/test_parsers_defined.py": [], + "tests/sentry/middleware/integrations/test_tasks.py": [], + "tests/sentry/middleware/test_access_log_middleware.py": [], + "tests/sentry/middleware/test_ai_agent.py": [], + "tests/sentry/middleware/test_auth.py": [], + "tests/sentry/middleware/test_customer_domain.py": [], + "tests/sentry/middleware/test_demo_mode_guard.py": [], + "tests/sentry/middleware/test_devtoolbar.py": ["snuba"], + "tests/sentry/middleware/test_health.py": [], + "tests/sentry/middleware/test_notification_tracking.py": [], + "tests/sentry/middleware/test_proxy.py": [], + "tests/sentry/middleware/test_ratelimit_middleware.py": [], + "tests/sentry/middleware/test_request_memory.py": [], + "tests/sentry/middleware/test_security.py": [], + "tests/sentry/middleware/test_staff.py": [], + "tests/sentry/middleware/test_stats.py": [], + "tests/sentry/middleware/test_subdomain.py": [], + "tests/sentry/middleware/test_superuser.py": [], + "tests/sentry/middleware/test_suspended.py": [], + "tests/sentry/middleware/test_viewer_context.py": [], + "tests/sentry/migrations/test_0004_generalize_investigation_sources.py": [], + "tests/sentry/migrations/test_0015_backfill_notificationthread_object.py": [], + "tests/sentry/migrations/test_0019_move_saved_query_range_to_stats_period.py": [], + "tests/sentry/migrations/test_0020_backfill_checkin_config.py": [], + "tests/sentry/migrations/test_0117_backfill_all_project_detectors.py": [], + "tests/sentry/migrations/test_0118_repair_latest_adopted_release_environments.py": [], + "tests/sentry/migrations/test_0120_replace_boolean_deescalation_comparisons.py": [], + "tests/sentry/migrations/test_0122_sync_cron_detector_enabled.py": [], + "tests/sentry/migrations/test_1126_transactions_to_spans_widgets_self_hosted.py": [], + "tests/sentry/migrations/test_1127_discover_to_explore_queries_self_hosted.py": [], + "tests/sentry/migrations/test_1155_backfill_organizationmemberteam_new_id.py": [], + "tests/sentry/migrations/test_1178_backfill_release_new_last_deploy_id.py": [], + "tests/sentry/migrations/test_1185_backfill_release_new_id.py": [], + "tests/sentry/migrations/test_1186_backfill_custominboundfilter_data_type.py": [], + "tests/sentry/migrations/test_1189_backfill_pullrequest_external_id_str.py": [], + "tests/sentry/migrations/test_1199_backfill_custominboundfilter_legacy_lists.py": [], + "tests/sentry/migrations/test_1209_update_if_syntax_on_dashboard_spans.py": [], + "tests/sentry/migrations/test_1210_release_validate_foreign_keys.py": [], + "tests/sentry/migrations/test_1232_backfill_commit_new_repository_id.py": [], + "tests/sentry/migrations/test_1234_backfill_grouprelease_new_release_id.py": [], + "tests/sentry/migrations/test_1260_backfill_projectartifactbundle_has_debug_ids.py": [], + "tests/sentry/migrations/test_noop.py": [], + "tests/sentry/migrations/test_notebooks_0002_copy_from_investigations.py": [], + "tests/sentry/models/releases/test_release_project.py": [], + "tests/sentry/models/test_activity.py": ["snuba"], + "tests/sentry/models/test_apiapplication.py": [], + "tests/sentry/models/test_apigrant.py": [], + "tests/sentry/models/test_apikey.py": [], + "tests/sentry/models/test_apitoken.py": [], + "tests/sentry/models/test_authidentity.py": [], + "tests/sentry/models/test_base.py": [], + "tests/sentry/models/test_commit.py": ["snuba"], + "tests/sentry/models/test_commitauthor.py": [], + "tests/sentry/models/test_commitfilechange.py": ["snuba"], + "tests/sentry/models/test_dashboard.py": [], + "tests/sentry/models/test_debugfile.py": [], + "tests/sentry/models/test_deploy.py": [], + "tests/sentry/models/test_environment.py": [], + "tests/sentry/models/test_eventattachment.py": ["kafka"], + "tests/sentry/models/test_eventerror.py": [], + "tests/sentry/models/test_featureadoption.py": [], + "tests/sentry/models/test_file.py": [], + "tests/sentry/models/test_group.py": ["snuba"], + "tests/sentry/models/test_groupassignee.py": ["snuba"], + "tests/sentry/models/test_grouphash.py": ["snuba"], + "tests/sentry/models/test_grouphistory.py": ["snuba"], + "tests/sentry/models/test_groupinbox.py": ["snuba"], + "tests/sentry/models/test_groupmeta.py": ["snuba"], + "tests/sentry/models/test_groupowner.py": ["snuba"], + "tests/sentry/models/test_groupreaction.py": ["snuba"], + "tests/sentry/models/test_grouprelease.py": ["snuba"], + "tests/sentry/models/test_groupresolution.py": ["snuba"], + "tests/sentry/models/test_groupsnooze.py": ["snuba"], + "tests/sentry/models/test_groupsubscription.py": ["snuba"], + "tests/sentry/models/test_manager.py": ["snuba"], + "tests/sentry/models/test_organization.py": [], + "tests/sentry/models/test_organization_avatar.py": [], + "tests/sentry/models/test_organizationaccessrequest.py": [], + "tests/sentry/models/test_organizationcontributors.py": [], + "tests/sentry/models/test_organizationmember.py": [], + "tests/sentry/models/test_organizationmemberteam.py": [], + "tests/sentry/models/test_organizationoption.py": [], + "tests/sentry/models/test_orgauthtoken.py": [], + "tests/sentry/models/test_project.py": ["snuba"], + "tests/sentry/models/test_projectcodeowners.py": [], + "tests/sentry/models/test_projectcounter.py": ["snuba"], + "tests/sentry/models/test_projectkey.py": [], + "tests/sentry/models/test_projectkeymapping.py": [], + "tests/sentry/models/test_projectoption.py": [], + "tests/sentry/models/test_projectownership.py": ["snuba"], + "tests/sentry/models/test_projectredirect.py": [], + "tests/sentry/models/test_projectrepository.py": [], + "tests/sentry/models/test_projectsdk.py": [], + "tests/sentry/models/test_pullrequest.py": ["snuba"], + "tests/sentry/models/test_recentsearch.py": [], + "tests/sentry/models/test_release.py": ["snuba"], + "tests/sentry/models/test_releaseenvironment.py": [], + "tests/sentry/models/test_releasefile.py": [], + "tests/sentry/models/test_releaseprojectenvironment.py": [], + "tests/sentry/models/test_repository.py": [], + "tests/sentry/models/test_repositorysettings.py": [], + "tests/sentry/models/test_rule.py": [], + "tests/sentry/models/test_statistical_detectors.py": [], + "tests/sentry/models/test_team.py": [], + "tests/sentry/models/test_teamkeytransaction.py": [], + "tests/sentry/monitors/clock_tasks/test_check_missed.py": ["snuba"], + "tests/sentry/monitors/clock_tasks/test_check_timeout.py": ["snuba"], + "tests/sentry/monitors/clock_tasks/test_mark_unknown.py": [], + "tests/sentry/monitors/clock_tasks/test_producer.py": [], + "tests/sentry/monitors/consumers/test_clock_tasks_consumer.py": ["snuba"], + "tests/sentry/monitors/consumers/test_clock_tick_consumer.py": ["kafka"], + "tests/sentry/monitors/consumers/test_end_to_end.py": ["kafka"], + "tests/sentry/monitors/consumers/test_incident_occurrence_consumer.py": [], + "tests/sentry/monitors/consumers/test_monitor_consumer.py": ["kafka"], + "tests/sentry/monitors/endpoints/test_organization_detector_details.py": [], + "tests/sentry/monitors/endpoints/test_organization_detector_index.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_checkin_index.py": [ + "snuba" + ], + "tests/sentry/monitors/endpoints/test_organization_monitor_details.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_environment_details.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_index.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_index_count.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_index_stats.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_processing_errors_index.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_schedule_sample_buckets.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_schedule_sample_data.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_schedule_sample_window.py": [], + "tests/sentry/monitors/endpoints/test_organization_monitor_stats.py": [], + "tests/sentry/monitors/endpoints/test_project_monitor_checkin_index.py": ["snuba"], + "tests/sentry/monitors/endpoints/test_project_monitor_details.py": [], + "tests/sentry/monitors/endpoints/test_project_monitor_environment_details.py": [], + "tests/sentry/monitors/endpoints/test_project_monitor_processing_errors_index.py": [], + "tests/sentry/monitors/endpoints/test_project_monitor_stats.py": [], + "tests/sentry/monitors/endpoints/test_project_processing_errors_details.py": [], + "tests/sentry/monitors/endpoints/test_project_processing_errors_index.py": [], + "tests/sentry/monitors/logic/test_checkin_config.py": [], + "tests/sentry/monitors/logic/test_incident_occurrence.py": [], + "tests/sentry/monitors/logic/test_mark_failed.py": ["snuba"], + "tests/sentry/monitors/logic/test_mark_ok.py": ["snuba"], + "tests/sentry/monitors/logic/test_monitor_environment.py": [], + "tests/sentry/monitors/processing_errors/test_errors.py": [], + "tests/sentry/monitors/processing_errors/test_manager.py": [], + "tests/sentry/monitors/tasks/test_clock_pulse.py": [], + "tests/sentry/monitors/tasks/test_detect_broken_monitor_envs.py": [], + "tests/sentry/monitors/test_clock_dispatch.py": [], + "tests/sentry/monitors/test_models.py": [], + "tests/sentry/monitors/test_rate_limit.py": [], + "tests/sentry/monitors/test_schedule.py": [], + "tests/sentry/monitors/test_serializers.py": [], + "tests/sentry/monitors/test_system_incidents.py": [], + "tests/sentry/monitors/test_types.py": [], + "tests/sentry/monitors/test_utils.py": ["snuba"], + "tests/sentry/monitors/test_validators.py": [], + "tests/sentry/net/test_socket.py": [], + "tests/sentry/new_migrations/monkey/test_executor.py": [], + "tests/sentry/new_migrations/monkey/test_models.py": [], + "tests/sentry/new_migrations/monkey/test_monkey.py": [], + "tests/sentry/new_migrations/test_drop_pending_deletions.py": [], + "tests/sentry/new_migrations/test_migrations.py": [], + "tests/sentry/newsletter/test_base.py": [], + "tests/sentry/newsletter/test_dummy.py": [], + "tests/sentry/notebooks/endpoints/serializers/test_block.py": [], + "tests/sentry/notebooks/endpoints/serializers/test_notebook.py": [], + "tests/sentry/notebooks/endpoints/test_base.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_action_request_apply.py": [ + "kafka", + "snuba" + ], + "tests/sentry/notebooks/endpoints/test_organization_notebook_block_details.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_block_execution_details.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_block_execution_index.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_block_index.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_block_order.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_comment_counts.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_comment_details.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_comment_index.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_details.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_duplicate.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_favorite.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_index.py": [], + "tests/sentry/notebooks/endpoints/test_organization_notebook_presence.py": [], + "tests/sentry/notebooks/endpoints/validators/test_base.py": [], + "tests/sentry/notebooks/endpoints/validators/test_block.py": [], + "tests/sentry/notebooks/endpoints/validators/test_notebook.py": [], + "tests/sentry/notebooks/models/test_notebook.py": [], + "tests/sentry/notebooks/services/test_auto_run.py": [], + "tests/sentry/notebooks/services/test_executions.py": [], + "tests/sentry/notebooks/services/test_notebooks.py": [], + "tests/sentry/notebooks/services/test_producer.py": [], + "tests/sentry/notebooks/services/test_producer_sources.py": [], + "tests/sentry/notebooks/services/test_producer_writes.py": [], + "tests/sentry/notebooks/test_access.py": [], + "tests/sentry/notebooks/test_agent.py": [], + "tests/sentry/notebooks/test_contracts.py": [], + "tests/sentry/notebooks/test_presence.py": [], + "tests/sentry/notifications/api/endpoints/test_notification_actions_available.py": [], + "tests/sentry/notifications/api/endpoints/test_notification_actions_details.py": [], + "tests/sentry/notifications/api/endpoints/test_notification_actions_index.py": [], + "tests/sentry/notifications/api/endpoints/test_notification_defaults.py": [], + "tests/sentry/notifications/api/endpoints/test_user_notification_details.py": [], + "tests/sentry/notifications/api/endpoints/test_user_notification_email.py": [], + "tests/sentry/notifications/api/endpoints/test_user_notification_settings_options.py": [], + "tests/sentry/notifications/api/endpoints/test_user_notification_settings_options_details.py": [], + "tests/sentry/notifications/api/endpoints/test_user_notification_settings_providers.py": [], + "tests/sentry/notifications/models/test_notificationaction.py": [], + "tests/sentry/notifications/models/test_notificationsettingoption.py": [], + "tests/sentry/notifications/models/test_notificationsettingprovider.py": [], + "tests/sentry/notifications/notification_action/action_handler_registry/test_plugin_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/action_handler_registry/test_webhook_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_base.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_discord.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_email.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_msteams.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_sentry_app.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_slack.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_ticketing.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/activity_registry/test_unsupported.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/metric_alert_registry/test_discord_metric_alert_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/metric_alert_registry/test_email_metric_alert_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/metric_alert_registry/test_msteams_metric_alert_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/metric_alert_registry/test_opsgenie_metric_alert_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/metric_alert_registry/test_pagerduty_metric_alert_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/metric_alert_registry/test_sentry_app_metric_alert_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/metric_alert_registry/test_slack_metric_alert_handler.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/test_activity_handler.py": ["snuba"], + "tests/sentry/notifications/notification_action/test_group_type_notification_registry_handlers.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/test_grouptype.py": ["snuba"], + "tests/sentry/notifications/notification_action/test_issue_alert_registry_handlers.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/test_metric_alert_registry_handlers.py": [ + "snuba" + ], + "tests/sentry/notifications/notification_action/test_platform_dispatch.py": ["snuba"], + "tests/sentry/notifications/notifications/organization_request/test_integration_request.py": [], + "tests/sentry/notifications/notifications/organization_request/test_invite_request.py": [], + "tests/sentry/notifications/notifications/test_assigned.py": ["snuba"], + "tests/sentry/notifications/notifications/test_digests.py": ["snuba"], + "tests/sentry/notifications/notifications/test_organization_request.py": [], + "tests/sentry/notifications/notifications/test_suspect_commits_activity.py": [ + "snuba" + ], + "tests/sentry/notifications/platform/api/endpoints/test_internal_registered_templates.py": [], + "tests/sentry/notifications/platform/discord/renderers/test_issue.py": ["snuba"], + "tests/sentry/notifications/platform/discord/renderers/test_metric_alert.py": [ + "snuba" + ], + "tests/sentry/notifications/platform/discord/test_provider.py": [], + "tests/sentry/notifications/platform/email/test_provider.py": ["snuba"], + "tests/sentry/notifications/platform/msteams/renderers/test_issue.py": ["snuba"], + "tests/sentry/notifications/platform/msteams/renderers/test_issue_parity.py": [ + "snuba" + ], + "tests/sentry/notifications/platform/msteams/renderers/test_metric_alert_parity.py": [ + "snuba" + ], + "tests/sentry/notifications/platform/msteams/test_provider.py": [], + "tests/sentry/notifications/platform/shadow/test_capture.py": ["snuba"], + "tests/sentry/notifications/platform/shadow/test_compare.py": ["snuba"], + "tests/sentry/notifications/platform/shadow/test_shadow_read.py": ["snuba"], + "tests/sentry/notifications/platform/slack/renderers/test_issue.py": ["snuba"], + "tests/sentry/notifications/platform/slack/renderers/test_metric_alert.py": ["snuba"], + "tests/sentry/notifications/platform/slack/renderers/test_seer.py": ["snuba"], + "tests/sentry/notifications/platform/slack/test_provider.py": [], + "tests/sentry/notifications/platform/strategies/test_actor_routing.py": [], + "tests/sentry/notifications/platform/strategies/test_deploy_release.py": [], + "tests/sentry/notifications/platform/strategies/test_issue_owners.py": ["snuba"], + "tests/sentry/notifications/platform/strategies/test_issue_subscribers.py": ["snuba"], + "tests/sentry/notifications/platform/strategies/test_utils.py": [], + "tests/sentry/notifications/platform/templates/test_activity.py": ["snuba"], + "tests/sentry/notifications/platform/templates/test_deploy.py": [], + "tests/sentry/notifications/platform/templates/test_metric_alert.py": ["snuba"], + "tests/sentry/notifications/platform/templates/test_seer.py": [], + "tests/sentry/notifications/platform/templates/test_sentry_app_webhook_disabled.py": [], + "tests/sentry/notifications/platform/test_inbox.py": ["snuba"], + "tests/sentry/notifications/platform/test_link_tracking.py": ["snuba"], + "tests/sentry/notifications/platform/test_provider.py": [], + "tests/sentry/notifications/platform/test_registry.py": [], + "tests/sentry/notifications/platform/test_rollout.py": [], + "tests/sentry/notifications/platform/test_service.py": [], + "tests/sentry/notifications/platform/test_target.py": [], + "tests/sentry/notifications/platform/test_threading.py": [], + "tests/sentry/notifications/platform/test_tracking.py": [], + "tests/sentry/notifications/test_apps.py": [], + "tests/sentry/notifications/test_class_manager.py": [], + "tests/sentry/notifications/test_helpers.py": ["snuba"], + "tests/sentry/notifications/test_notificationcontroller.py": [], + "tests/sentry/notifications/test_notifications.py": ["snuba"], + "tests/sentry/notifications/test_utils.py": [], + "tests/sentry/notifications/utils/test_issue_notification_context.py": ["snuba"], + "tests/sentry/notifications/utils/test_open_period.py": ["snuba"], + "tests/sentry/notifications/utils/test_participants.py": ["snuba"], + "tests/sentry/notifications/utils/test_rules.py": [], + "tests/sentry/notifications/utils/test_tasks.py": [], + "tests/sentry/objectstore/endpoints/test_organization.py": [], + "tests/sentry/onboarding/agentic_progress/test_model.py": [], + "tests/sentry/onboarding/agentic_progress/test_service.py": [], + "tests/sentry/onboarding_tasks/backends/test_organization_onboarding_tasks.py": [], + "tests/sentry/options/test_legacy_options.py": [], + "tests/sentry/options/test_manager.py": [], + "tests/sentry/options/test_rollout.py": [], + "tests/sentry/options/test_store.py": [], + "tests/sentry/options/test_update_channels.py": [], + "tests/sentry/organizations/services/test_organization.py": [], + "tests/sentry/organizations/test_absolute_url.py": [], + "tests/sentry/partnerships/test_base.py": [], + "tests/sentry/pipeline/test_pipeline.py": [], + "tests/sentry/plugins/interfaces/test_releasehook.py": [], + "tests/sentry/plugins/test_integration_repository.py": [], + "tests/sentry/post_process_forwarder/test_post_process_forwarder.py": ["kafka"], + "tests/sentry/pr_metrics/test_activity_doc.py": [], + "tests/sentry/pr_metrics/test_attribution.py": ["snuba"], + "tests/sentry/pr_metrics/test_emit.py": ["snuba"], + "tests/sentry/pr_metrics/test_judge.py": [], + "tests/sentry/pr_metrics/test_lifecycle_mapping.py": [], + "tests/sentry/pr_metrics/test_metrics_sample_rates.py": [], + "tests/sentry/pr_metrics/test_readers_activity_doc.py": ["snuba"], + "tests/sentry/pr_metrics/test_stale.py": [], + "tests/sentry/pr_metrics/test_tasks.py": [], + "tests/sentry/pr_metrics/test_utils.py": [], + "tests/sentry/pr_metrics/test_webhooks.py": ["snuba"], + "tests/sentry/pr_metrics/test_webhooks_activity_doc.py": [], + "tests/sentry/preprod/api/bases/test_preprod_artifact_endpoint.py": [], + "tests/sentry/preprod/api/endpoints/public/test_organization_preprod_artifact_install_details.py": [], + "tests/sentry/preprod/api/endpoints/public/test_organization_preprod_size_analysis.py": [], + "tests/sentry/preprod/api/endpoints/public/test_project_preprod_build_distribution_latest.py": [], + "tests/sentry/preprod/api/endpoints/public/test_project_preprod_size_analysis_status_check_rules.py": [], + "tests/sentry/preprod/api/endpoints/public/test_project_preprod_skip_status_check.py": [], + "tests/sentry/preprod/api/endpoints/public/test_project_preprod_snapshot_status_check_rules.py": [], + "tests/sentry/preprod/api/endpoints/size_analysis/test_project_preprod_size_analysis_compare.py": [], + "tests/sentry/preprod/api/endpoints/size_analysis/test_project_preprod_size_analysis_compare_download.py": [], + "tests/sentry/preprod/api/endpoints/size_analysis/test_project_preprod_size_analysis_comparisons.py": [], + "tests/sentry/preprod/api/endpoints/size_analysis/test_project_preprod_size_analysis_download.py": [], + "tests/sentry/preprod/api/endpoints/snapshots/test_preprod_artifact_snapshot_archive.py": [], + "tests/sentry/preprod/api/endpoints/snapshots/test_preprod_artifact_snapshot_image_detail.py": [], + "tests/sentry/preprod/api/endpoints/snapshots/test_preprod_artifact_snapshot_latest_base.py": [], + "tests/sentry/preprod/api/endpoints/test_builds.py": [], + "tests/sentry/preprod/api/endpoints/test_builds_export.py": [], + "tests/sentry/preprod/api/endpoints/test_organization_preprod_artifact_assemble.py": [], + "tests/sentry/preprod/api/endpoints/test_organization_preprod_quota.py": [], + "tests/sentry/preprod/api/endpoints/test_organization_preprod_retention.py": [], + "tests/sentry/preprod/api/endpoints/test_preprod_artifact_approve.py": [], + "tests/sentry/preprod/api/endpoints/test_preprod_artifact_image.py": [], + "tests/sentry/preprod/api/endpoints/test_preprod_artifact_rerun_analysis.py": [], + "tests/sentry/preprod/api/endpoints/test_preprod_artifact_rerun_status_checks.py": [], + "tests/sentry/preprod/api/endpoints/test_preprod_artifact_snapshot.py": [], + "tests/sentry/preprod/api/endpoints/test_project_installable_preprod_artifact_download.py": [ + "kafka" + ], + "tests/sentry/preprod/api/endpoints/test_project_preprod_artifact_assemble_generic.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_artifact_delete.py": [ + "snuba" + ], + "tests/sentry/preprod/api/endpoints/test_project_preprod_artifact_download.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_artifact_install_details.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_artifact_update.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_build_details.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_check_for_updates.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_distribution.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_size.py": [], + "tests/sentry/preprod/api/endpoints/test_project_preprod_upload_options.py": [], + "tests/sentry/preprod/api/models/test_project_preprod_build_details_models.py": [], + "tests/sentry/preprod/api/models/test_public_enum_names.py": [], + "tests/sentry/preprod/api/models/test_size_analysis_insight_types.py": [], + "tests/sentry/preprod/api/models/test_snapshot_status.py": [], + "tests/sentry/preprod/eap/test_read.py": [], + "tests/sentry/preprod/eap/test_write.py": [], + "tests/sentry/preprod/helpers/test_deletion.py": [], + "tests/sentry/preprod/pull_request/test_comment_types.py": [], + "tests/sentry/preprod/size_analysis/test_compare.py": [], + "tests/sentry/preprod/size_analysis/test_comparison_run.py": [], + "tests/sentry/preprod/size_analysis/test_comparison_utils.py": [], + "tests/sentry/preprod/size_analysis/test_grouptype.py": [], + "tests/sentry/preprod/size_analysis/test_monitors.py": [], + "tests/sentry/preprod/size_analysis/test_webhooks.py": [], + "tests/sentry/preprod/snapshots/image_diff/test_image_diff.py": [], + "tests/sentry/preprod/snapshots/test_auto_approve.py": [], + "tests/sentry/preprod/snapshots/test_categorize.py": [], + "tests/sentry/preprod/snapshots/test_compare_snapshots.py": [], + "tests/sentry/preprod/snapshots/test_comparison_categorizer.py": [], + "tests/sentry/preprod/snapshots/test_manifest.py": [], + "tests/sentry/preprod/snapshots/test_precompute.py": [], + "tests/sentry/preprod/snapshots/test_reconstruction.py": [], + "tests/sentry/preprod/snapshots/test_storage.py": [], + "tests/sentry/preprod/snapshots/test_tasks.py": [], + "tests/sentry/preprod/snapshots/test_utils.py": [], + "tests/sentry/preprod/snapshots/test_zip_builder.py": [], + "tests/sentry/preprod/snapshots/test_zip_tasks.py": [], + "tests/sentry/preprod/test_artifact_search.py": [], + "tests/sentry/preprod/test_build_distribution_utils.py": [], + "tests/sentry/preprod/test_build_distribution_webhooks.py": [], + "tests/sentry/preprod/test_models.py": [], + "tests/sentry/preprod/test_models_size_metrics.py": [], + "tests/sentry/preprod/test_parse_build_number.py": [], + "tests/sentry/preprod/test_quotas.py": [], + "tests/sentry/preprod/test_tasks.py": ["kafka"], + "tests/sentry/preprod/vcs/pr_comments/test_size_tasks.py": [], + "tests/sentry/preprod/vcs/pr_comments/test_snapshot_tasks.py": [], + "tests/sentry/preprod/vcs/pr_comments/test_snapshot_templates.py": [], + "tests/sentry/preprod/vcs/pr_comments/test_tasks.py": [], + "tests/sentry/preprod/vcs/pr_comments/test_templates.py": [], + "tests/sentry/preprod/vcs/status_checks/size/test_metric_selection_helpers.py": [], + "tests/sentry/preprod/vcs/status_checks/size/test_status_check_filters.py": [], + "tests/sentry/preprod/vcs/status_checks/size/test_status_checks_tasks.py": [], + "tests/sentry/preprod/vcs/status_checks/size/test_templates.py": [], + "tests/sentry/preprod/vcs/status_checks/snapshots/test_tasks.py": [], + "tests/sentry/preprod/vcs/status_checks/snapshots/test_templates.py": [], + "tests/sentry/preprod/vcs/test_markdown_utils.py": [], + "tests/sentry/preprod/vcs/test_repo_utils.py": [], + "tests/sentry/preprod/vcs/webhooks/test_github_check_run.py": [], + "tests/sentry/processing/backpressure/test_checking.py": [], + "tests/sentry/processing/backpressure/test_monitoring.py": [], + "tests/sentry/processing/backpressure/test_redis.py": [], + "tests/sentry/processing/eventstore/test_processing.py": [], + "tests/sentry/processing_errors/eap/test_producer.py": [], + "tests/sentry/processing_errors/test_detection.py": [], + "tests/sentry/processing_errors/test_grouptype.py": [], + "tests/sentry/processing_errors/test_provisioning.py": [], + "tests/sentry/processing_errors/test_tasks.py": [], + "tests/sentry/profiles/test_flamegraph.py": [], + "tests/sentry/profiles/test_java.py": [], + "tests/sentry/profiles/test_task.py": ["kafka", "symbolicator"], + "tests/sentry/profiles/test_utils.py": [], + "tests/sentry/profiling/test_utils.py": [], + "tests/sentry/projectoptions/test_basic.py": [], + "tests/sentry/quotas/test_base.py": [], + "tests/sentry/quotas/test_redis.py": [], + "tests/sentry/ratelimits/test_config.py": [], + "tests/sentry/ratelimits/test_leaky_bucket.py": [], + "tests/sentry/ratelimits/test_redis.py": [], + "tests/sentry/ratelimits/test_redis_cluster.py": [], + "tests/sentry/ratelimits/test_redis_concurrent.py": [], + "tests/sentry/ratelimits/test_sliding_windows.py": [], + "tests/sentry/ratelimits/utils/test_above_rate_limit_check.py": [], + "tests/sentry/ratelimits/utils/test_enforce_rate_limit.py": [], + "tests/sentry/ratelimits/utils/test_get_rate_limit_value.py": [], + "tests/sentry/ratelimits/utils/test_get_ratelimit_key.py": [], + "tests/sentry/receivers/outbox/test_cell.py": [], + "tests/sentry/receivers/outbox/test_control.py": [], + "tests/sentry/receivers/test_analytics.py": [], + "tests/sentry/receivers/test_core.py": [], + "tests/sentry/receivers/test_data_forwarding.py": [], + "tests/sentry/receivers/test_featureadoption.py": ["snuba"], + "tests/sentry/receivers/test_onboarding.py": ["snuba"], + "tests/sentry/receivers/test_releases.py": ["snuba"], + "tests/sentry/receivers/test_seer.py": ["snuba"], + "tests/sentry/receivers/test_sentry_apps.py": ["snuba"], + "tests/sentry/receivers/test_signals.py": ["snuba"], + "tests/sentry/receivers/test_staff.py": [], + "tests/sentry/receivers/test_superuser.py": [], + "tests/sentry/receivers/test_transactions.py": ["snuba"], + "tests/sentry/receivers/test_users.py": [], + "tests/sentry/relay/config/test_experimental.py": [], + "tests/sentry/relay/config/test_metric_extraction.py": [], + "tests/sentry/relay/test_config.py": [], + "tests/sentry/relay/test_datascrubbing.py": [], + "tests/sentry/relay/test_projectconfig_cache.py": [], + "tests/sentry/relay/test_projectconfig_debounce_cache.py": [], + "tests/sentry/release_health/release_monitor/test_metrics.py": ["snuba"], + "tests/sentry/release_health/test_eap_sessions_rollout.py": [], + "tests/sentry/release_health/test_metrics_sessions_v2.py": [], + "tests/sentry/release_health/test_tasks.py": ["snuba"], + "tests/sentry/releases/endpoints/test_organization_release_assemble.py": [], + "tests/sentry/releases/endpoints/test_organization_release_commits.py": [], + "tests/sentry/releases/endpoints/test_organization_release_details.py": ["snuba"], + "tests/sentry/releases/endpoints/test_organization_release_file_details.py": [], + "tests/sentry/releases/endpoints/test_organization_release_files.py": [], + "tests/sentry/releases/endpoints/test_organization_release_health_data.py": ["snuba"], + "tests/sentry/releases/endpoints/test_organization_release_meta.py": [], + "tests/sentry/releases/endpoints/test_project_release_commits.py": [], + "tests/sentry/releases/endpoints/test_project_release_details.py": ["snuba"], + "tests/sentry/releases/endpoints/test_project_release_file_details.py": [], + "tests/sentry/releases/endpoints/test_project_release_files.py": [], + "tests/sentry/releases/endpoints/test_project_release_setup.py": ["snuba"], + "tests/sentry/releases/endpoints/test_project_release_stats.py": ["snuba"], + "tests/sentry/releases/endpoints/test_project_releases.py": ["snuba"], + "tests/sentry/releases/endpoints/test_project_releases_token.py": [], + "tests/sentry/releases/endpoints/test_release_deploys.py": [], + "tests/sentry/releases/use_cases/test_release_serializer.py": ["snuba"], + "tests/sentry/relocation/api/endpoints/artifacts/test_details.py": [], + "tests/sentry/relocation/api/endpoints/artifacts/test_index.py": [], + "tests/sentry/relocation/api/endpoints/test_abort.py": [], + "tests/sentry/relocation/api/endpoints/test_cancel.py": [], + "tests/sentry/relocation/api/endpoints/test_details.py": [], + "tests/sentry/relocation/api/endpoints/test_index.py": [], + "tests/sentry/relocation/api/endpoints/test_pause.py": [], + "tests/sentry/relocation/api/endpoints/test_public_key.py": [], + "tests/sentry/relocation/api/endpoints/test_recover.py": [], + "tests/sentry/relocation/api/endpoints/test_retry.py": [], + "tests/sentry/relocation/api/endpoints/test_unpause.py": [], + "tests/sentry/relocation/api/serializers/test_relocation.py": [], + "tests/sentry/relocation/tasks/test_process.py": [], + "tests/sentry/relocation/tasks/test_transfer.py": [], + "tests/sentry/relocation/test_utils.py": [], + "tests/sentry/replays/consumers/test_recording.py": ["kafka"], + "tests/sentry/replays/endpoints/test_organization_replay_count.py": ["snuba"], + "tests/sentry/replays/endpoints/test_organization_replay_details.py": ["snuba"], + "tests/sentry/replays/endpoints/test_organization_replay_events_meta.py": ["snuba"], + "tests/sentry/replays/endpoints/test_organization_replay_index.py": ["snuba"], + "tests/sentry/replays/endpoints/test_organization_selector_index.py": ["snuba"], + "tests/sentry/replays/endpoints/test_project_replay_clicks_index.py": ["snuba"], + "tests/sentry/replays/endpoints/test_project_replay_details.py": ["kafka", "snuba"], + "tests/sentry/replays/endpoints/test_project_replay_jobs_delete.py": [], + "tests/sentry/replays/endpoints/test_project_replay_recording_segment_details.py": [ + "snuba" + ], + "tests/sentry/replays/endpoints/test_project_replay_recording_segment_index.py": [ + "snuba" + ], + "tests/sentry/replays/endpoints/test_project_replay_summary.py": ["snuba"], + "tests/sentry/replays/endpoints/test_project_replay_video_details.py": ["snuba"], + "tests/sentry/replays/endpoints/test_project_replay_viewed_by.py": ["snuba"], + "tests/sentry/replays/endpoints/test_query_replay_instance_eap.py": ["snuba"], + "tests/sentry/replays/endpoints/test_replay_granular_permissions.py": ["snuba"], + "tests/sentry/replays/integration/consumers/test_recording.py": [], + "tests/sentry/replays/integration/test_data_export.py": ["snuba"], + "tests/sentry/replays/integration/test_ingest_cache.py": [], + "tests/sentry/replays/integration/test_ingest_options.py": [], + "tests/sentry/replays/lib/test_cache.py": [], + "tests/sentry/replays/lib/test_event_linking.py": ["snuba"], + "tests/sentry/replays/scripts/test_delete_replays.py": ["kafka", "snuba"], + "tests/sentry/replays/scripts/test_expire_replay_deletion_jobs.py": [], + "tests/sentry/replays/tasks/test_delete_replays_bulk.py": ["kafka", "snuba"], + "tests/sentry/replays/tasks/test_delete_replays_script_async.py": [], + "tests/sentry/replays/test_data_export.py": ["snuba"], + "tests/sentry/replays/test_post_process.py": [], + "tests/sentry/replays/unit/consumers/test_recording.py": [], + "tests/sentry/replays/unit/lib/eap/test_snuba_transpiler.py": [], + "tests/sentry/replays/unit/lib/test_http.py": [], + "tests/sentry/replays/unit/test_data_export.py": [], + "tests/sentry/replays/unit/test_event_logger.py": ["kafka"], + "tests/sentry/replays/unit/test_event_parser.py": [], + "tests/sentry/replays/unit/test_ingest.py": [], + "tests/sentry/replays/unit/test_issue_creation.py": [], + "tests/sentry/replays/unit/test_retry.py": [], + "tests/sentry/replays/unit/usecases/test_delete_seer_replay_data.py": [], + "tests/sentry/replays/unit/usecases/test_events.py": [], + "tests/sentry/replays/unit/usecases/test_pack.py": [], + "tests/sentry/replays/unit/usecases/test_query.py": [], + "tests/sentry/replays/unit/usecases/test_replay_existence.py": [], + "tests/sentry/replays/usecases/test_summarize.py": ["kafka", "snuba"], + "tests/sentry/roles/test_manager.py": [], + "tests/sentry/rules/actions/base/test_event_action.py": [], + "tests/sentry/rules/actions/test_create_ticket_utils.py": ["snuba"], + "tests/sentry/rules/actions/test_notify_event.py": ["snuba"], + "tests/sentry/rules/actions/test_notify_event_sentry_app.py": ["snuba"], + "tests/sentry/rules/actions/test_notify_event_service.py": ["snuba"], + "tests/sentry/rules/conditions/test_event_attribute.py": [], + "tests/sentry/rules/conditions/test_level_event.py": [], + "tests/sentry/rules/conditions/test_tagged_event.py": [], + "tests/sentry/rules/filters/test_assigned_to.py": [], + "tests/sentry/runner/commands/presenters/test_presenterdelegator.py": [], + "tests/sentry/runner/commands/presenters/test_webhookpresenter.py": [], + "tests/sentry/runner/commands/test_backup.py": [], + "tests/sentry/runner/commands/test_cleanup.py": ["snuba"], + "tests/sentry/runner/commands/test_config.py": [], + "tests/sentry/runner/commands/test_configoptions.py": [], + "tests/sentry/runner/commands/test_createflag.py": [], + "tests/sentry/runner/commands/test_createorg.py": [], + "tests/sentry/runner/commands/test_createproject.py": [], + "tests/sentry/runner/commands/test_createuser.py": [], + "tests/sentry/runner/commands/test_deletions.py": [], + "tests/sentry/runner/commands/test_devserver.py": [], + "tests/sentry/runner/commands/test_init.py": [], + "tests/sentry/runner/commands/test_migrate_debugfiles_to_objectstore.py": [], + "tests/sentry/runner/commands/test_migrations.py": [], + "tests/sentry/runner/commands/test_run.py": [], + "tests/sentry/runner/test_boot_gc.py": [], + "tests/sentry/runner/test_gc_metrics.py": [], + "tests/sentry/runner/test_initializer.py": [], + "tests/sentry/runner/test_main.py": [], + "tests/sentry/runner/test_settings.py": [], + "tests/sentry/scm/endpoints/test_scm_git.py": [], + "tests/sentry/scm/endpoints/test_scm_rpc.py": [], + "tests/sentry/scm/integration/test_helpers_integration.py": [], + "tests/sentry/scm/integration/test_ipc_integration.py": [], + "tests/sentry/scm/integration/test_rate_limit_integration.py": [], + "tests/sentry/scm/unit/private/test_ipc.py": [], + "tests/sentry/scm/unit/test_rate_limit.py": [], + "tests/sentry/scm/unit/test_stream.py": [], + "tests/sentry/scm/unit/test_stream_producer.py": [], + "tests/sentry/search/eap/test_columns.py": [], + "tests/sentry/search/eap/test_occurrences.py": [], + "tests/sentry/search/eap/test_ourlogs.py": [], + "tests/sentry/search/eap/test_processing_errors.py": [], + "tests/sentry/search/eap/test_search_executor.py": ["snuba"], + "tests/sentry/search/eap/test_spans.py": ["snuba"], + "tests/sentry/search/eap/test_uptime_results.py": [], + "tests/sentry/search/eap/test_utils.py": [], + "tests/sentry/search/events/builder/test_discover.py": ["snuba"], + "tests/sentry/search/events/builder/test_errors.py": [], + "tests/sentry/search/events/builder/test_metrics.py": [], + "tests/sentry/search/events/builder/test_profile_functions.py": [], + "tests/sentry/search/events/test_fields.py": [], + "tests/sentry/search/events/test_filter.py": ["snuba"], + "tests/sentry/search/test_detector_filter.py": [], + "tests/sentry/search/test_utils.py": ["snuba"], + "tests/sentry/security/test_csp.py": [], + "tests/sentry/security/test_utils.py": [], + "tests/sentry/seer/agent/test_agent_client.py": ["snuba"], + "tests/sentry/seer/agent/test_agent_utils.py": [], + "tests/sentry/seer/agent/test_client_models_failure_reason.py": [], + "tests/sentry/seer/agent/test_client_models_pr_id.py": [], + "tests/sentry/seer/agent/test_client_models_structured_content.py": [], + "tests/sentry/seer/agent/test_client_models_turns.py": [], + "tests/sentry/seer/agent/test_client_utils.py": [], + "tests/sentry/seer/agent/test_coding_agent_handoff.py": [], + "tests/sentry/seer/agent/test_context_engine_utils.py": [], + "tests/sentry/seer/agent/test_custom_tool_utils.py": [], + "tests/sentry/seer/agent/test_embed_widgets.py": [], + "tests/sentry/seer/agent/test_index_data.py": ["snuba"], + "tests/sentry/seer/agent/test_monitoring_providers.py": [], + "tests/sentry/seer/agent/test_on_completion_hook.py": [], + "tests/sentry/seer/agent/test_service_map_utils.py": ["snuba"], + "tests/sentry/seer/agent/test_tools.py": ["snuba"], + "tests/sentry/seer/agentic_triage/test_delivery.py": ["snuba"], + "tests/sentry/seer/anomaly_detection/test_anomaly_detection_utils.py": [], + "tests/sentry/seer/anomaly_detection/test_get_anomaly_data.py": [], + "tests/sentry/seer/anomaly_detection/test_store_data.py": ["snuba"], + "tests/sentry/seer/assisted_query/test_discover_tools.py": ["snuba"], + "tests/sentry/seer/assisted_query/test_issues_tools.py": ["snuba"], + "tests/sentry/seer/assisted_query/test_metrics_tools.py": ["snuba"], + "tests/sentry/seer/assisted_query/test_traces_tools.py": [], + "tests/sentry/seer/autofix/feature/test_delivery.py": ["snuba"], + "tests/sentry/seer/autofix/feature/test_dispatch.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_bot_identity.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_cap_exhausted.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_check_suite.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_emit.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_errors.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_feedback_queue.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_iterations.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_logs.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_mention.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_missing_permissions.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_out_of_credits.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_pause.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_pr_state.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_ready_for_review.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_review_request.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_reviewer_candidates.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_run_markers.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_sweep.py": ["snuba"], + "tests/sentry/seer/autofix/pr_iteration/test_tracing.py": [], + "tests/sentry/seer/autofix/pr_iteration/test_types.py": [], + "tests/sentry/seer/autofix/test_autofix.py": ["snuba"], + "tests/sentry/seer/autofix/test_autofix_agent.py": ["snuba"], + "tests/sentry/seer/autofix/test_autofix_on_completion_hook.py": ["snuba"], + "tests/sentry/seer/autofix/test_autofix_utils.py": ["snuba"], + "tests/sentry/seer/autofix/test_coding_agent.py": [], + "tests/sentry/seer/autofix/test_coding_agent_handoffs.py": ["snuba"], + "tests/sentry/seer/autofix/test_commit_author.py": [], + "tests/sentry/seer/autofix/test_github_perms.py": [], + "tests/sentry/seer/autofix/test_issue_search.py": ["snuba"], + "tests/sentry/seer/autofix/test_issue_summary.py": ["snuba"], + "tests/sentry/seer/autofix/test_on_completion_hook.py": ["snuba"], + "tests/sentry/seer/autofix/test_pr_iteration_review.py": ["snuba"], + "tests/sentry/seer/autofix/test_pr_iteration_webhook.py": ["snuba"], + "tests/sentry/seer/autofix/test_prompt_redaction.py": [], + "tests/sentry/seer/code_review/test_contributor_seats.py": [], + "tests/sentry/seer/code_review/test_metrics.py": [], + "tests/sentry/seer/code_review/test_preflight.py": [], + "tests/sentry/seer/code_review/test_utils.py": [], + "tests/sentry/seer/code_review/test_webhooks.py": [], + "tests/sentry/seer/code_review/webhooks/test_check_run.py": [], + "tests/sentry/seer/code_review/webhooks/test_handlers.py": [], + "tests/sentry/seer/code_review/webhooks/test_issue_comment.py": [], + "tests/sentry/seer/code_review/webhooks/test_merge_request.py": [], + "tests/sentry/seer/code_review/webhooks/test_pull_request.py": [], + "tests/sentry/seer/code_review/webhooks/test_review_request.py": [], + "tests/sentry/seer/code_review/webhooks/test_seat_tracking.py": [], + "tests/sentry/seer/code_review/webhooks/test_webhook_task.py": [], + "tests/sentry/seer/endpoints/test_admin_agentic_triage_trigger.py": [], + "tests/sentry/seer/endpoints/test_admin_autofix_retry.py": ["snuba"], + "tests/sentry/seer/endpoints/test_admin_autofix_single_run.py": ["snuba"], + "tests/sentry/seer/endpoints/test_group_ai_autofix.py": ["snuba"], + "tests/sentry/seer/endpoints/test_group_ai_summary.py": ["snuba"], + "tests/sentry/seer/endpoints/test_group_autofix_repos.py": ["snuba"], + "tests/sentry/seer/endpoints/test_group_autofix_setup_check.py": ["snuba"], + "tests/sentry/seer/endpoints/test_issue_view_title_generate.py": [], + "tests/sentry/seer/endpoints/test_organization_agent_approve.py": [], + "tests/sentry/seer/endpoints/test_organization_agent_token.py": ["kafka", "snuba"], + "tests/sentry/seer/endpoints/test_organization_events_anomalies.py": [], + "tests/sentry/seer/endpoints/test_organization_seer_agent_chat.py": ["snuba"], + "tests/sentry/seer/endpoints/test_organization_seer_agent_update.py": [], + "tests/sentry/seer/endpoints/test_organization_seer_autofix_overview.py": ["snuba"], + "tests/sentry/seer/endpoints/test_organization_seer_autofix_scm_info.py": ["snuba"], + "tests/sentry/seer/endpoints/test_organization_seer_chat_suggestions.py": [], + "tests/sentry/seer/endpoints/test_organization_seer_credit_check.py": [], + "tests/sentry/seer/endpoints/test_organization_seer_monitoring_providers.py": [], + "tests/sentry/seer/endpoints/test_organization_seer_onboarding_check.py": [], + "tests/sentry/seer/endpoints/test_organization_seer_rpc.py": ["snuba"], + "tests/sentry/seer/endpoints/test_organization_seer_runs.py": ["snuba"], + "tests/sentry/seer/endpoints/test_organization_seer_setup_check.py": ["snuba"], + "tests/sentry/seer/endpoints/test_organization_seer_workflow_configs.py": [], + "tests/sentry/seer/endpoints/test_organization_seer_workflow_runs.py": ["snuba"], + "tests/sentry/seer/endpoints/test_project_seer_agentic_triage.py": [], + "tests/sentry/seer/endpoints/test_project_seer_preferences.py": [], + "tests/sentry/seer/endpoints/test_project_seer_repos.py": [], + "tests/sentry/seer/endpoints/test_project_seer_settings.py": [], + "tests/sentry/seer/endpoints/test_search_agent_start.py": [], + "tests/sentry/seer/endpoints/test_search_agent_state.py": [], + "tests/sentry/seer/endpoints/test_seer_rpc.py": ["snuba"], + "tests/sentry/seer/endpoints/test_superuser_viewer_context.py": [], + "tests/sentry/seer/endpoints/test_trace_explorer_ai_translate_agentic.py": [], + "tests/sentry/seer/endpoints/test_utils.py": [], + "tests/sentry/seer/entrypoints/slack/test_investigation_status.py": [], + "tests/sentry/seer/entrypoints/slack/test_mention.py": [], + "tests/sentry/seer/entrypoints/slack/test_slack.py": ["snuba"], + "tests/sentry/seer/entrypoints/slack/test_tasks.py": [], + "tests/sentry/seer/entrypoints/test_cache.py": [], + "tests/sentry/seer/entrypoints/test_operator.py": ["snuba"], + "tests/sentry/seer/fetch_issues/test_by_error_type.py": ["snuba"], + "tests/sentry/seer/fetch_issues/test_by_function_name.py": ["snuba"], + "tests/sentry/seer/fetch_issues/test_by_text_query.py": ["snuba"], + "tests/sentry/seer/fetch_issues/test_utils.py": ["snuba"], + "tests/sentry/seer/models/test_workflow.py": [], + "tests/sentry/seer/similarity/test_config.py": [], + "tests/sentry/seer/similarity/test_grouping_records.py": [], + "tests/sentry/seer/similarity/test_similar_issues.py": ["snuba"], + "tests/sentry/seer/similarity/test_types.py": ["snuba"], + "tests/sentry/seer/similarity/test_utils.py": [], + "tests/sentry/seer/smart_assignment/test_completion.py": ["snuba"], + "tests/sentry/seer/smart_assignment/test_delivery.py": ["snuba"], + "tests/sentry/seer/smart_assignment/test_scoring.py": ["snuba"], + "tests/sentry/seer/smart_assignment/test_trigger.py": ["snuba"], + "tests/sentry/seer/supergroups/endpoints/test_organization_supergroup_details.py": [], + "tests/sentry/seer/supergroups/endpoints/test_organization_supergroups_by_group.py": [ + "snuba" + ], + "tests/sentry/seer/supergroups/test_lightweight_rca_cluster.py": ["snuba"], + "tests/sentry/seer/test_agent_token.py": [], + "tests/sentry/seer/test_breakpoints.py": [], + "tests/sentry/seer/test_credits.py": [], + "tests/sentry/seer/test_issue_detection.py": [], + "tests/sentry/seer/test_milestones.py": [], + "tests/sentry/seer/test_pull_requests.py": ["snuba"], + "tests/sentry/seer/test_run_questions.py": [], + "tests/sentry/seer/test_seer_setup.py": [], + "tests/sentry/seer/test_signed_seer_api.py": [], + "tests/sentry/seer/test_webhooks.py": [], + "tests/sentry/seer/workflows/test_breached_metrics.py": ["snuba"], + "tests/sentry/seer/workflows/test_definitions.py": [], + "tests/sentry/seer/workflows/test_runs.py": [], + "tests/sentry/seer/workflows/test_scheduled.py": [], + "tests/sentry/seer/workflows/test_workflow.py": [], + "tests/sentry/seer_workflow_outputs/test_tasks.py": [], + "tests/sentry/sentry_apps/api/bases/test_disabled_sentry_app.py": [], + "tests/sentry/sentry_apps/api/bases/test_sentryapps.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_group_external_issue_details.py": [ + "snuba" + ], + "tests/sentry/sentry_apps/api/endpoints/test_installation_service_hook_projects.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_organization_legacy_webhooks.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_organization_sentry_app_installation_details.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_organization_sentry_app_installations.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_organization_sentry_apps.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_project_legacy_webhooks.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_authorizations.py": ["snuba"], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_avatar.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_components.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_details.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_features.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_installation_external_issue_actions.py": [ + "snuba" + ], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_installation_external_issue_details.py": [ + "snuba" + ], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_installation_external_issues.py": [ + "snuba" + ], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_installation_external_requests.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_publish_request.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_rotate_secret.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_stats.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_app_webhook_requests.py": [ + "snuba" + ], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_apps.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_apps_stats.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_internal_app_token_details.py": [], + "tests/sentry/sentry_apps/api/endpoints/test_sentry_internal_app_tokens.py": [], + "tests/sentry/sentry_apps/api/parsers/test_alert_rule_action.py": [], + "tests/sentry/sentry_apps/api/parsers/test_header.py": [], + "tests/sentry/sentry_apps/api/parsers/test_image.py": [], + "tests/sentry/sentry_apps/api/parsers/test_issue_link.py": [], + "tests/sentry/sentry_apps/api/parsers/test_issue_media.py": [], + "tests/sentry/sentry_apps/api/parsers/test_markdown.py": [], + "tests/sentry/sentry_apps/api/parsers/test_schema.py": [], + "tests/sentry/sentry_apps/api/parsers/test_select.py": [], + "tests/sentry/sentry_apps/api/parsers/test_stacktrace_link.py": [], + "tests/sentry/sentry_apps/api/parsers/test_text.py": [], + "tests/sentry/sentry_apps/api/parsers/test_textarea.py": [], + "tests/sentry/sentry_apps/api/parsers/test_video.py": [], + "tests/sentry/sentry_apps/api/serializers/test_app_platform_event.py": [], + "tests/sentry/sentry_apps/api/serializers/test_response_schemas.py": [], + "tests/sentry/sentry_apps/api/serializers/test_sentry_app.py": [], + "tests/sentry/sentry_apps/api/serializers/test_sentry_app_avatar.py": [], + "tests/sentry/sentry_apps/external_issues/test_external_issue_creator.py": ["snuba"], + "tests/sentry/sentry_apps/external_issues/test_issue_link_creator.py": ["snuba"], + "tests/sentry/sentry_apps/external_requests/test_alert_rule_action_requester.py": [ + "snuba" + ], + "tests/sentry/sentry_apps/external_requests/test_issue_link_requester.py": ["snuba"], + "tests/sentry/sentry_apps/external_requests/test_select_requester.py": [], + "tests/sentry/sentry_apps/models/test_sentryapp.py": [], + "tests/sentry/sentry_apps/models/test_sentryappinstallation.py": [], + "tests/sentry/sentry_apps/models/test_sentryappinstallationtoken.py": [], + "tests/sentry/sentry_apps/services/legacy_webhook/test_client.py": ["snuba"], + "tests/sentry/sentry_apps/services/legacy_webhook/test_service.py": ["snuba"], + "tests/sentry/sentry_apps/services/legacy_webhook/test_tasks.py": ["snuba"], + "tests/sentry/sentry_apps/services/test_app.py": [], + "tests/sentry/sentry_apps/services/test_app_request.py": [], + "tests/sentry/sentry_apps/services/test_cell_service.py": ["snuba"], + "tests/sentry/sentry_apps/services/test_hook_service.py": [], + "tests/sentry/sentry_apps/services/test_model.py": [], + "tests/sentry/sentry_apps/services/test_serial.py": [], + "tests/sentry/sentry_apps/tasks/test_sentry_apps.py": ["snuba"], + "tests/sentry/sentry_apps/tasks/test_servicehooks.py": ["snuba"], + "tests/sentry/sentry_apps/test_sentry_app_component_preparer.py": [], + "tests/sentry/sentry_apps/test_sentry_app_creator.py": [], + "tests/sentry/sentry_apps/test_sentry_app_installation_creator.py": [], + "tests/sentry/sentry_apps/test_sentry_app_installation_notifier.py": [], + "tests/sentry/sentry_apps/test_sentry_app_installation_token_creator.py": [], + "tests/sentry/sentry_apps/test_sentry_app_updater.py": [], + "tests/sentry/sentry_apps/test_webhooks.py": [], + "tests/sentry/sentry_apps/token_exchange/test_grant_exchanger.py": [], + "tests/sentry/sentry_apps/token_exchange/test_manual_refresher.py": [], + "tests/sentry/sentry_apps/token_exchange/test_refresher.py": [], + "tests/sentry/sentry_apps/token_exchange/test_validator.py": [], + "tests/sentry/sentry_apps/utils/test_errors.py": [], + "tests/sentry/sentry_apps/utils/test_webhook_subjects.py": [], + "tests/sentry/sentry_apps/web/test_sentryapp_avatar.py": [], + "tests/sentry/sentry_metrics/consumers/test_last_seen_updater.py": [], + "tests/sentry/sentry_metrics/consumers/test_schema_validator.py": [], + "tests/sentry/sentry_metrics/consumers/test_tags_validator.py": [], + "tests/sentry/sentry_metrics/limiters/test_writes_limiter.py": [], + "tests/sentry/sentry_metrics/querying/data/test_api.py": [], + "tests/sentry/sentry_metrics/querying/data/test_query.py": [], + "tests/sentry/sentry_metrics/test_all_indexers.py": [], + "tests/sentry/sentry_metrics/test_base_indexer.py": [], + "tests/sentry/sentry_metrics/test_batch.py": [], + "tests/sentry/sentry_metrics/test_configuration.py": [], + "tests/sentry/sentry_metrics/test_indexer.py": [], + "tests/sentry/sentry_metrics/test_indexer_cache.py": [], + "tests/sentry/sentry_metrics/test_parallel_indexer.py": ["kafka"], + "tests/sentry/sentry_metrics/test_postgres_indexer.py": [], + "tests/sentry/sentry_metrics/test_prevent_modifications_to_indexer_strings.py": [], + "tests/sentry/sentry_metrics/test_rh_metrics_multiprocess_steps.py": [], + "tests/sentry/sentry_metrics/test_strings.py": [], + "tests/sentry/service_accounts/endpoints/test_organization_service_account_tokens.py": [], + "tests/sentry/service_accounts/endpoints/test_organization_service_account_viewer_context.py": [], + "tests/sentry/service_accounts/endpoints/test_organization_service_accounts.py": [], + "tests/sentry/service_accounts/services/test_service_account.py": [], + "tests/sentry/service_accounts/test_auth.py": [], + "tests/sentry/service_accounts/test_models.py": [], + "tests/sentry/service_accounts/test_principal.py": [], + "tests/sentry/service_accounts/test_tokens.py": [], + "tests/sentry/services/eventstore/processing/test_redis_cluster.py": [], + "tests/sentry/services/eventstore/snuba/test_backend.py": ["snuba"], + "tests/sentry/services/eventstore/test_base.py": ["snuba"], + "tests/sentry/services/eventstore/test_models.py": ["snuba"], + "tests/sentry/services/eventstore/test_query_preprocessing.py": ["snuba"], + "tests/sentry/services/filestore/test_gcs.py": [], + "tests/sentry/services/nodestore/bigtable/test_backend.py": [], + "tests/sentry/services/nodestore/django/test_backend.py": [], + "tests/sentry/services/nodestore/test_common.py": [], + "tests/sentry/services/test_http.py": [], + "tests/sentry/services/test_organization_actions.py": [], + "tests/sentry/shared_integrations/client/test_base.py": [], + "tests/sentry/shared_integrations/client/test_proxy.py": [], + "tests/sentry/silo/test_base.py": [], + "tests/sentry/silo/test_client.py": [], + "tests/sentry/silo/test_silo_aware_transaction_patch.py": [], + "tests/sentry/silo/test_util.py": [], + "tests/sentry/similarity/backends/test_redis.py": [], + "tests/sentry/similarity/test_encoder.py": [], + "tests/sentry/similarity/test_signatures.py": [], + "tests/sentry/snuba/metrics/fields/test_base.py": [], + "tests/sentry/snuba/metrics/fields/test_histogram.py": [], + "tests/sentry/snuba/metrics/test_datasource.py": [], + "tests/sentry/snuba/metrics/test_extraction.py": [], + "tests/sentry/snuba/metrics/test_metrics_layer/test_release_health.py": ["snuba"], + "tests/sentry/snuba/metrics/test_naming_layer.py": [], + "tests/sentry/snuba/metrics/test_query.py": [], + "tests/sentry/snuba/metrics/test_query_builder.py": [], + "tests/sentry/snuba/metrics/test_snql.py": [], + "tests/sentry/snuba/metrics/test_utils.py": [], + "tests/sentry/snuba/test_discover_facets_query.py": ["snuba"], + "tests/sentry/snuba/test_discover_query.py": ["snuba"], + "tests/sentry/snuba/test_discover_timeseries_query.py": ["snuba"], + "tests/sentry/snuba/test_entity_subscriptions.py": ["snuba"], + "tests/sentry/snuba/test_errors.py": ["snuba"], + "tests/sentry/snuba/test_models.py": [], + "tests/sentry/snuba/test_occurrences_rpc.py": ["snuba"], + "tests/sentry/snuba/test_outcomes.py": [], + "tests/sentry/snuba/test_profiles.py": [], + "tests/sentry/snuba/test_query_subscription_consumer.py": ["snuba"], + "tests/sentry/snuba/test_rpc_dataset_common.py": [], + "tests/sentry/snuba/test_subscriptions.py": ["kafka", "snuba"], + "tests/sentry/snuba/test_tasks.py": ["snuba"], + "tests/sentry/snuba/test_transactions.py": ["snuba"], + "tests/sentry/snuba/test_transactions_timeseries_query.py": ["snuba"], + "tests/sentry/snuba/test_utils.py": [], + "tests/sentry/snuba/test_validators.py": ["snuba"], + "tests/sentry/spans/consumers/process/test_consumer.py": [], + "tests/sentry/spans/consumers/process/test_factory.py": [], + "tests/sentry/spans/consumers/process/test_flusher.py": [], + "tests/sentry/spans/consumers/process_segments/test_convert.py": [], + "tests/sentry/spans/consumers/process_segments/test_enrichment.py": [], + "tests/sentry/spans/consumers/process_segments/test_message.py": ["snuba"], + "tests/sentry/spans/consumers/process_segments/test_shim.py": [], + "tests/sentry/spans/consumers/process_segments/test_tasks.py": [], + "tests/sentry/spans/grouping/test_strategy.py": [], + "tests/sentry/spans/grouping/test_utils.py": [], + "tests/sentry/spans/log_analyzer/test_analyzer.py": [], + "tests/sentry/spans/log_analyzer/test_fetchers.py": [], + "tests/sentry/spans/test_add_buffer_lua.py": [], + "tests/sentry/spans/test_buffer.py": [], + "tests/sentry/spans/test_buffer_logger.py": [], + "tests/sentry/spans/test_buffer_store.py": [], + "tests/sentry/spans/test_buffer_types.py": [], + "tests/sentry/spans/test_debug_trace_logger.py": [], + "tests/sentry/spans/test_gcp_log_analyzer.py": [], + "tests/sentry/spans/test_log_analyzer.py": [], + "tests/sentry/stacktraces/test_context_line.py": [], + "tests/sentry/stacktraces/test_filename.py": [], + "tests/sentry/stacktraces/test_functions.py": [], + "tests/sentry/stacktraces/test_in_app_normalization.py": [], + "tests/sentry/stacktraces/test_platform.py": [], + "tests/sentry/statistical_detectors/test_algorithm.py": [], + "tests/sentry/statistical_detectors/test_issue_platform_adapter.py": [], + "tests/sentry/sudo/test_middleware.py": [], + "tests/sentry/sudo/test_signals.py": [], + "tests/sentry/sudo/test_utils.py": [], + "tests/sentry/synapse/endpoints/test_org_cell_mappings.py": [], + "tests/sentry/synapse/endpoints/test_project_key_cell_mappings.py": [], + "tests/sentry/synapse/test_paginator.py": [], + "tests/sentry/tagstore/test_types.py": [], + "tests/sentry/tasks/scim/test_privilege_sync.py": [], + "tests/sentry/tasks/seer/agentic_triage/test_simple_triage.py": ["snuba"], + "tests/sentry/tasks/seer/agentic_triage/test_skip_cache.py": [], + "tests/sentry/tasks/seer/agentic_triage/test_tweaks.py": [], + "tests/sentry/tasks/seer/test_agentic_triage.py": ["snuba"], + "tests/sentry/tasks/seer/test_autofix.py": ["snuba"], + "tests/sentry/tasks/seer/test_backfill_supergroups_lightweight.py": ["snuba"], + "tests/sentry/tasks/seer/test_context_engine_index.py": [], + "tests/sentry/tasks/seer/test_delete_seer_grouping_records.py": ["snuba"], + "tests/sentry/tasks/seer/test_explorer_index.py": [], + "tests/sentry/tasks/seer/test_pr_iteration.py": ["snuba"], + "tests/sentry/tasks/test_activity.py": ["snuba"], + "tests/sentry/tasks/test_ai_agent_monitoring.py": [], + "tests/sentry/tasks/test_assemble.py": [], + "tests/sentry/tasks/test_auth.py": [], + "tests/sentry/tasks/test_auto_ongoing_issues.py": ["snuba"], + "tests/sentry/tasks/test_auto_remove_inbox.py": ["snuba"], + "tests/sentry/tasks/test_auto_resolve_issues.py": ["snuba"], + "tests/sentry/tasks/test_backfill_group_action_log.py": ["snuba"], + "tests/sentry/tasks/test_backfill_pr_lifecycle_action_log.py": ["snuba"], + "tests/sentry/tasks/test_base.py": [], + "tests/sentry/tasks/test_beacon.py": ["snuba"], + "tests/sentry/tasks/test_check_auth.py": [], + "tests/sentry/tasks/test_cleanup_pending_users.py": [], + "tests/sentry/tasks/test_clear_expired_resolutions.py": ["snuba"], + "tests/sentry/tasks/test_clear_expired_snoozes.py": ["snuba"], + "tests/sentry/tasks/test_code_owners.py": [], + "tests/sentry/tasks/test_collect_project_platforms.py": ["snuba"], + "tests/sentry/tasks/test_commit_context.py": ["snuba"], + "tests/sentry/tasks/test_commits.py": [], + "tests/sentry/tasks/test_console_platform_cleanup.py": [], + "tests/sentry/tasks/test_delete_pending_groups.py": ["snuba"], + "tests/sentry/tasks/test_digests.py": ["snuba"], + "tests/sentry/tasks/test_email.py": ["snuba"], + "tests/sentry/tasks/test_gpu_crash.py": [], + "tests/sentry/tasks/test_groupowner.py": ["snuba"], + "tests/sentry/tasks/test_llm_issue_detection.py": ["snuba"], + "tests/sentry/tasks/test_merge.py": ["snuba"], + "tests/sentry/tasks/test_on_demand_metrics.py": [], + "tests/sentry/tasks/test_options.py": [], + "tests/sentry/tasks/test_organization_contributors.py": [], + "tests/sentry/tasks/test_post_process.py": ["kafka", "snuba"], + "tests/sentry/tasks/test_process_buffer.py": [], + "tests/sentry/tasks/test_relay.py": [], + "tests/sentry/tasks/test_reprocessing2.py": ["snuba", "symbolicator"], + "tests/sentry/tasks/test_statistical_detectors.py": ["snuba"], + "tests/sentry/tasks/test_store.py": ["snuba"], + "tests/sentry/tasks/test_symbolication.py": [], + "tests/sentry/tasks/test_update_code_owners_schema.py": [], + "tests/sentry/tasks/test_user_report.py": [], + "tests/sentry/tasks/test_web_vitals_issue_detection.py": ["snuba"], + "tests/sentry/tasks/test_weekly_escalating_forecast.py": ["snuba"], + "tests/sentry/tasks/test_weekly_report_cache.py": [], + "tests/sentry/tasks/test_weekly_report_utils.py": ["snuba"], + "tests/sentry/tasks/test_weekly_reports.py": ["snuba"], + "tests/sentry/taskworker/tasks/test_examples.py": [], + "tests/sentry/taskworker/test_adapters.py": [], + "tests/sentry/taskworker/test_config.py": [], + "tests/sentry/taskworker/test_runtime.py": [], + "tests/sentry/taskworker/test_selfchain_idempotency.py": [], + "tests/sentry/taskworker/test_timeout.py": [], + "tests/sentry/telemetry_classifiers/datasets/test_conversations.py": ["snuba"], + "tests/sentry/telemetry_classifiers/eap/test_producer.py": [], + "tests/sentry/telemetry_classifiers/endpoints/test_organization_prebuilt_telemetry_classifiers.py": [], + "tests/sentry/telemetry_classifiers/endpoints/test_organization_telemetry_classifier_details.py": [], + "tests/sentry/telemetry_classifiers/endpoints/test_organization_telemetry_classifiers.py": [], + "tests/sentry/telemetry_classifiers/test_definitions.py": [], + "tests/sentry/telemetry_classifiers/test_inference.py": [], + "tests/sentry/telemetry_classifiers/test_inputs.py": [], + "tests/sentry/telemetry_classifiers/test_poc_tasks.py": ["snuba"], + "tests/sentry/telemetry_classifiers/test_prebuilt.py": [], + "tests/sentry/telemetry_classifiers/test_results.py": [], + "tests/sentry/telemetry_classifiers/test_tasks.py": [], + "tests/sentry/tempest/endpoints/test_tempest_credentials.py": [], + "tests/sentry/tempest/endpoints/test_tempest_credentials_details.py": [], + "tests/sentry/tempest/endpoints/test_tempest_ips.py": [], + "tests/sentry/tempest/test_tempest.py": [], + "tests/sentry/templatetags/test_sentry_api.py": [], + "tests/sentry/templatetags/test_sentry_assets.py": [], + "tests/sentry/templatetags/test_sentry_features.py": [], + "tests/sentry/templatetags/test_sentry_helpers.py": [], + "tests/sentry/test_constants.py": [], + "tests/sentry/test_culprit.py": [], + "tests/sentry/test_dependencies.py": [], + "tests/sentry/test_devimports.py": [], + "tests/sentry/test_event_preprocessors.py": [], + "tests/sentry/test_http.py": [], + "tests/sentry/test_killswitches.py": [], + "tests/sentry/test_mypy_stronglist.py": [], + "tests/sentry/test_reprocessing2.py": [], + "tests/sentry/test_sdk_updates.py": [], + "tests/sentry/test_stacktraces.py": [], + "tests/sentry/test_unmerge.py": [], + "tests/sentry/test_viewer_context.py": [], + "tests/sentry/test_viewer_context_jwt.py": [], + "tests/sentry/test_wsgi.py": [], + "tests/sentry/testutils/helpers/test_action_log.py": ["snuba"], + "tests/sentry/testutils/helpers/test_eap.py": [], + "tests/sentry/testutils/helpers/test_features.py": [], + "tests/sentry/testutils/pytest/mocking/test_mocking.py": [], + "tests/sentry/testutils/pytest/test_json_report_reruns.py": [], + "tests/sentry/testutils/pytest/test_pytest_sentry_reruns.py": [], + "tests/sentry/testutils/pytest/test_redis_transaction_violations.py": [], + "tests/sentry/testutils/pytest/test_relay.py": [], + "tests/sentry/testutils/pytest/test_sentry.py": [], + "tests/sentry/testutils/pytest/test_transactional_flush.py": [], + "tests/sentry/testutils/test_abstract.py": [], + "tests/sentry/testutils/test_cases.py": [], + "tests/sentry/testutils/test_silo.py": [], + "tests/sentry/testutils/thread_leaks/test_assertion.py": [], + "tests/sentry/testutils/thread_leaks/test_diff.py": [], + "tests/sentry/testutils/thread_leaks/test_pytest.py": [], + "tests/sentry/testutils/thread_leaks/test_sentry.py": [], + "tests/sentry/toolbar/utils/test_url.py": [], + "tests/sentry/toolbar/views/test_iframe_view.py": [], + "tests/sentry/toolbar/views/test_login_success_view.py": [], + "tests/sentry/tsdb/test_base.py": [], + "tests/sentry/tsdb/test_resolve_backend.py": [], + "tests/sentry/tsdb/test_snuba.py": ["snuba"], + "tests/sentry/types/test_actor.py": [], + "tests/sentry/types/test_cell.py": [], + "tests/sentry/types/test_superuser.py": [], + "tests/sentry/uptime/autodetect/test_detector.py": [], + "tests/sentry/uptime/autodetect/test_ranking.py": [], + "tests/sentry/uptime/autodetect/test_tasks.py": [], + "tests/sentry/uptime/autodetect/test_url_extraction.py": [], + "tests/sentry/uptime/consumers/test_eap_converter.py": [], + "tests/sentry/uptime/consumers/test_eap_producer.py": [], + "tests/sentry/uptime/consumers/test_results_consumer.py": ["kafka", "snuba"], + "tests/sentry/uptime/consumers/test_tasks.py": ["kafka"], + "tests/sentry/uptime/endpoints/test_detector.py": [], + "tests/sentry/uptime/endpoints/test_organization_uptime_alert_index.py": [], + "tests/sentry/uptime/endpoints/test_organization_uptime_alert_index_count.py": [], + "tests/sentry/uptime/endpoints/test_organization_uptime_alert_preview.py": [], + "tests/sentry/uptime/endpoints/test_organization_uptime_stats.py": ["snuba"], + "tests/sentry/uptime/endpoints/test_organization_uptime_summary.py": ["snuba"], + "tests/sentry/uptime/endpoints/test_project_uptime_alert_check_index.py": ["snuba"], + "tests/sentry/uptime/endpoints/test_project_uptime_alert_details.py": [], + "tests/sentry/uptime/endpoints/test_project_uptime_alert_index.py": [], + "tests/sentry/uptime/endpoints/test_project_uptime_response_capture.py": [], + "tests/sentry/uptime/endpoints/test_project_uptime_response_captures_index.py": [], + "tests/sentry/uptime/endpoints/test_serializers.py": [], + "tests/sentry/uptime/endpoints/test_uptime_ips.py": [], + "tests/sentry/uptime/endpoints/test_utils.py": [], + "tests/sentry/uptime/endpoints/test_validators.py": [], + "tests/sentry/uptime/rdap/test_query.py": [], + "tests/sentry/uptime/rdap/test_tasks.py": [], + "tests/sentry/uptime/subscriptions/test_regions.py": [], + "tests/sentry/uptime/subscriptions/test_subscriptions.py": ["kafka"], + "tests/sentry/uptime/subscriptions/test_tasks.py": ["kafka"], + "tests/sentry/uptime/test_config_drift.py": [], + "tests/sentry/uptime/test_grouptype.py": ["snuba"], + "tests/sentry/uptime/test_models.py": [], + "tests/sentry/uptime/test_utils.py": [], + "tests/sentry/usage_accountant/test_accountant.py": [], + "tests/sentry/users/api/bases/test_user.py": [], + "tests/sentry/users/api/endpoints/test_auth_index.py": [], + "tests/sentry/users/api/endpoints/test_user_authenticator_details.py": [], + "tests/sentry/users/api/endpoints/test_user_authenticator_enroll.py": [], + "tests/sentry/users/api/endpoints/test_user_authenticator_index.py": [], + "tests/sentry/users/api/endpoints/test_user_authenticators_index.py": [], + "tests/sentry/users/api/endpoints/test_user_avatar.py": [], + "tests/sentry/users/api/endpoints/test_user_details.py": [], + "tests/sentry/users/api/endpoints/test_user_details_analytics.py": [], + "tests/sentry/users/api/endpoints/test_user_display_preferences.py": [], + "tests/sentry/users/api/endpoints/test_user_emails.py": [], + "tests/sentry/users/api/endpoints/test_user_emails_confirm.py": [], + "tests/sentry/users/api/endpoints/test_user_identity.py": [], + "tests/sentry/users/api/endpoints/test_user_identity_config.py": [], + "tests/sentry/users/api/endpoints/test_user_identity_details.py": [], + "tests/sentry/users/api/endpoints/test_user_index.py": [], + "tests/sentry/users/api/endpoints/test_user_ips.py": [], + "tests/sentry/users/api/endpoints/test_user_password.py": [], + "tests/sentry/users/api/endpoints/test_user_permission_details.py": [], + "tests/sentry/users/api/endpoints/test_user_permissions.py": [], + "tests/sentry/users/api/endpoints/test_user_permissions_config.py": [], + "tests/sentry/users/api/endpoints/test_user_regions.py": [], + "tests/sentry/users/api/serializers/test_user.py": [], + "tests/sentry/users/api/serializers/test_user_identity_config.py": [], + "tests/sentry/users/models/test_authenticator.py": [], + "tests/sentry/users/models/test_identity.py": [], + "tests/sentry/users/models/test_lostpasswordhash.py": [], + "tests/sentry/users/models/test_user.py": ["snuba"], + "tests/sentry/users/models/test_user_avatar.py": [], + "tests/sentry/users/models/test_user_merge_verification_code.py": [], + "tests/sentry/users/models/test_user_option.py": [], + "tests/sentry/users/models/test_useremail.py": [], + "tests/sentry/users/models/test_userpermission.py": [], + "tests/sentry/users/models/test_userrole.py": [], + "tests/sentry/users/services/test_user.py": [], + "tests/sentry/users/services/test_user_impl.py": [], + "tests/sentry/users/services/test_user_option.py": [], + "tests/sentry/users/services/test_user_serial.py": [], + "tests/sentry/users/web/test_account_identity.py": [], + "tests/sentry/users/web/test_accounts.py": [], + "tests/sentry/users/web/test_accounts_form.py": [], + "tests/sentry/users/web/test_user_avatar.py": [], + "tests/sentry/utils/action_log/test_activity_translator.py": ["snuba"], + "tests/sentry/utils/email/test_address.py": [], + "tests/sentry/utils/email/test_backend.py": [], + "tests/sentry/utils/email/test_list_resolver.py": ["snuba"], + "tests/sentry/utils/email/test_message_builder.py": ["snuba"], + "tests/sentry/utils/email/test_sanitize.py": [], + "tests/sentry/utils/email/test_send_mail.py": [], + "tests/sentry/utils/email/test_signer.py": [], + "tests/sentry/utils/kafka/test_rebalance_delay.py": [], + "tests/sentry/utils/kvstore/test_bigtable.py": [], + "tests/sentry/utils/kvstore/test_common.py": [], + "tests/sentry/utils/kvstore/test_compat.py": [], + "tests/sentry/utils/kvstore/test_encoding.py": [], + "tests/sentry/utils/kvstore/test_redis.py": [], + "tests/sentry/utils/locking/backends/test_migration.py": [], + "tests/sentry/utils/locking/backends/test_redis.py": [], + "tests/sentry/utils/locking/test_lock.py": [], + "tests/sentry/utils/mockdata/test_core.py": ["kafka", "snuba"], + "tests/sentry/utils/sdk_crashes/test_build_sdk_crash_detection_configs.py": [], + "tests/sentry/utils/sdk_crashes/test_event_stripper.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_path_replacer.py": [], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detection.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detection_cocoa.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detection_dart.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detection_dotnet.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detection_java.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detection_native.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detection_react_native.py": ["snuba"], + "tests/sentry/utils/sdk_crashes/test_sdk_crash_detector.py": [], + "tests/sentry/utils/security/test_encrypted_field_key_store.py": [], + "tests/sentry/utils/security/test_orgauthtoken_token.py": [], + "tests/sentry/utils/sentry_apps/test_webhook_timeout.py": [], + "tests/sentry/utils/sentry_apps/test_webhooks.py": [], + "tests/sentry/utils/test_arroyo.py": [], + "tests/sentry/utils/test_arroyo_producer.py": [], + "tests/sentry/utils/test_assets.py": [], + "tests/sentry/utils/test_attributes.py": [], + "tests/sentry/utils/test_audit.py": [], + "tests/sentry/utils/test_auth.py": [], + "tests/sentry/utils/test_avatar.py": [], + "tests/sentry/utils/test_circuit_breaker.py": [], + "tests/sentry/utils/test_circuit_breaker2.py": [], + "tests/sentry/utils/test_codecs.py": [], + "tests/sentry/utils/test_committers.py": ["snuba"], + "tests/sentry/utils/test_concurrent.py": [], + "tests/sentry/utils/test_confluent_producer.py": ["kafka"], + "tests/sentry/utils/test_csv.py": [], + "tests/sentry/utils/test_cursored_scheduler.py": [], + "tests/sentry/utils/test_cursors.py": [], + "tests/sentry/utils/test_datastructures.py": [], + "tests/sentry/utils/test_dates.py": [], + "tests/sentry/utils/test_display_name_filter.py": [], + "tests/sentry/utils/test_eap.py": [], + "tests/sentry/utils/test_event.py": [], + "tests/sentry/utils/test_event_frames.py": ["snuba"], + "tests/sentry/utils/test_event_tracker.py": [], + "tests/sentry/utils/test_eventuser.py": ["snuba"], + "tests/sentry/utils/test_exceptions.py": [], + "tests/sentry/utils/test_function_cache.py": [], + "tests/sentry/utils/test_geo.py": [], + "tests/sentry/utils/test_github.py": [], + "tests/sentry/utils/test_glob.py": [], + "tests/sentry/utils/test_groupreference.py": ["snuba"], + "tests/sentry/utils/test_hashlib.py": [], + "tests/sentry/utils/test_http.py": [], + "tests/sentry/utils/test_integrationdocs.py": [], + "tests/sentry/utils/test_iterators.py": [], + "tests/sentry/utils/test_json.py": [], + "tests/sentry/utils/test_jwt.py": [], + "tests/sentry/utils/test_kafka_config.py": [], + "tests/sentry/utils/test_letter_avatar.py": [], + "tests/sentry/utils/test_linksign.py": [], + "tests/sentry/utils/test_local_cache.py": [], + "tests/sentry/utils/test_math.py": [], + "tests/sentry/utils/test_meta.py": [], + "tests/sentry/utils/test_metrics.py": [], + "tests/sentry/utils/test_not_set.py": [], + "tests/sentry/utils/test_numbers.py": [], + "tests/sentry/utils/test_outcome_aggregator.py": [], + "tests/sentry/utils/test_outcomes.py": [], + "tests/sentry/utils/test_patch_set.py": [], + "tests/sentry/utils/test_payload_comparison.py": [], + "tests/sentry/utils/test_projectflags.py": [], + "tests/sentry/utils/test_query.py": ["snuba"], + "tests/sentry/utils/test_ratelimits.py": [], + "tests/sentry/utils/test_redis.py": [], + "tests/sentry/utils/test_registry.py": [], + "tests/sentry/utils/test_retries.py": [], + "tests/sentry/utils/test_rollout.py": [], + "tests/sentry/utils/test_rust.py": [], + "tests/sentry/utils/test_safe.py": [], + "tests/sentry/utils/test_samples.py": ["snuba"], + "tests/sentry/utils/test_sdk.py": [], + "tests/sentry/utils/test_sentryappwebhookrequests.py": [], + "tests/sentry/utils/test_services.py": [], + "tests/sentry/utils/test_session_store.py": [], + "tests/sentry/utils/test_signing.py": [], + "tests/sentry/utils/test_snowflake.py": [], + "tests/sentry/utils/test_snuba.py": ["snuba"], + "tests/sentry/utils/test_snuba_rpc.py": ["snuba"], + "tests/sentry/utils/test_strings.py": [], + "tests/sentry/utils/test_tag_normalization.py": [], + "tests/sentry/utils/test_time_window.py": [], + "tests/sentry/utils/test_types.py": [], + "tests/sentry/utils/test_urls.py": [], + "tests/sentry/utils/test_validators.py": [], + "tests/sentry/utils/test_zip.py": [], + "tests/sentry/web/frontend/generic/test_service_worker.py": [], + "tests/sentry/web/frontend/generic/test_static_media.py": [], + "tests/sentry/web/frontend/test_auth_channel_login.py": [], + "tests/sentry/web/frontend/test_auth_close.py": [], + "tests/sentry/web/frontend/test_auth_login.py": [], + "tests/sentry/web/frontend/test_auth_logout.py": [], + "tests/sentry/web/frontend/test_auth_oauth2.py": [], + "tests/sentry/web/frontend/test_auth_organization_login.py": [], + "tests/sentry/web/frontend/test_auth_saml2.py": [], + "tests/sentry/web/frontend/test_base.py": [], + "tests/sentry/web/frontend/test_cli.py": [], + "tests/sentry/web/frontend/test_csrf_failure.py": [], + "tests/sentry/web/frontend/test_data_secrecy_error.py": [], + "tests/sentry/web/frontend/test_disabled_member_view.py": [], + "tests/sentry/web/frontend/test_doc_integration_avatar.py": [], + "tests/sentry/web/frontend/test_error_404.py": [], + "tests/sentry/web/frontend/test_error_500.py": [], + "tests/sentry/web/frontend/test_group_event_json.py": ["snuba"], + "tests/sentry/web/frontend/test_group_tag_export.py": ["snuba"], + "tests/sentry/web/frontend/test_home.py": [], + "tests/sentry/web/frontend/test_js_sdk_loader.py": [], + "tests/sentry/web/frontend/test_mailgun_inbound_webhook.py": ["snuba"], + "tests/sentry/web/frontend/test_oauth_authorize.py": [], + "tests/sentry/web/frontend/test_oauth_device.py": [], + "tests/sentry/web/frontend/test_oauth_device_authorization.py": [], + "tests/sentry/web/frontend/test_oauth_token.py": [], + "tests/sentry/web/frontend/test_openidtoken.py": [], + "tests/sentry/web/frontend/test_organization_auth_settings.py": [], + "tests/sentry/web/frontend/test_organization_avatar.py": [], + "tests/sentry/web/frontend/test_project_event.py": ["snuba"], + "tests/sentry/web/frontend/test_react_page.py": [], + "tests/sentry/web/frontend/test_reactivate_account.py": [], + "tests/sentry/web/frontend/test_release_webhook.py": [], + "tests/sentry/web/frontend/test_security_txt.py": [], + "tests/sentry/web/frontend/test_setup_wizard.py": [], + "tests/sentry/web/frontend/test_shared_group_details.py": ["snuba"], + "tests/sentry/web/frontend/test_signup_email_verification.py": [], + "tests/sentry/web/frontend/test_signup_verification_pending.py": [], + "tests/sentry/web/frontend/test_sso_signup_verification.py": [], + "tests/sentry/web/frontend/test_team_avatar.py": [], + "tests/sentry/web/frontend/test_twofactor.py": [], + "tests/sentry/web/frontend/test_vsts_extension_configuration.py": [], + "tests/sentry/web/test_api.py": [], + "tests/sentry/web/test_client_config.py": [], + "tests/sentry/web/test_urls.py": [], + "tests/sentry/workflow_engine/buffer/test_batch_client.py": [], + "tests/sentry/workflow_engine/buffer/test_redis_hash_sorted_set_buffer.py": [], + "tests/sentry/workflow_engine/caches/test_action_filters.py": [], + "tests/sentry/workflow_engine/caches/test_data_source.py": [], + "tests/sentry/workflow_engine/caches/test_mapping.py": [], + "tests/sentry/workflow_engine/caches/test_workflow.py": [], + "tests/sentry/workflow_engine/defaults/test_detectors.py": [], + "tests/sentry/workflow_engine/defaults/test_workflows.py": [], + "tests/sentry/workflow_engine/detectors/test_error_detector.py": [], + "tests/sentry/workflow_engine/endpoints/serializers/test_action_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/serializers/test_data_condition_group_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/serializers/test_data_condition_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/serializers/test_data_source_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/serializers/test_detector_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/serializers/test_response_schemas.py": [], + "tests/sentry/workflow_engine/endpoints/serializers/test_timeseries_value_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/serializers/test_workflow_group_history_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/serializers/test_workflow_serializer.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_alertrule_detector.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_alertrule_workflow.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_available_action_index.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_data_condition_index.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_deduplicate_workflows.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_detector_count.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_detector_details.py": [ + "kafka", + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py": [ + "kafka", + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_detector_types.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_incident_groupopenperiod.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_open_periods.py": ["snuba"], + "tests/sentry/workflow_engine/endpoints/test_organization_project_detector_index.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_test_fire_action.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_workflow_details.py": [], + "tests/sentry/workflow_engine/endpoints/test_organization_workflow_group_history.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_workflow_index.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_workflow_preview.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_organization_workflow_stats.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/test_validators.py": [], + "tests/sentry/workflow_engine/endpoints/utils/test_sortby.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_discord.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_email_validator.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_msteams.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_opsgenie.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_pagerduty.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_sentry_app.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_slack.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_ticketing.py": [], + "tests/sentry/workflow_engine/endpoints/validators/actions/test_webhook.py": [], + "tests/sentry/workflow_engine/endpoints/validators/test_base_action.py": [], + "tests/sentry/workflow_engine/endpoints/validators/test_base_data_condition.py": [], + "tests/sentry/workflow_engine/endpoints/validators/test_base_data_condition_group.py": [], + "tests/sentry/workflow_engine/endpoints/validators/test_base_workflow.py": [], + "tests/sentry/workflow_engine/endpoints/validators/test_metric_data_source_schema.py": [], + "tests/sentry/workflow_engine/endpoints/validators/test_utils.py": [], + "tests/sentry/workflow_engine/handlers/action/test_action_handlers.py": ["snuba"], + "tests/sentry/workflow_engine/handlers/condition/test_age_comparison_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_assigned_to_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_event_attribute_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_event_frequency_handlers.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_event_frequency_query_handlers.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_every_event_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_existing_high_priority_issue_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_first_seen_event_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_category_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_occurrences_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_open_duration_handler.py": [], + "tests/sentry/workflow_engine/handlers/condition/test_issue_priority_deescalating_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_priority_equals.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_priority_greater_or_equal.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_resolution_condition_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_resolved_trigger_condition.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_issue_type_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_latest_adopted_release_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_latest_release_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_level_handler.py": ["snuba"], + "tests/sentry/workflow_engine/handlers/condition/test_new_high_priority_issue_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_reappeared_event_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_regression_event_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_seer_activity_trigger_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/test_tagged_event_handler.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/handlers/condition/utils/test_match.py": [], + "tests/sentry/workflow_engine/handlers/detector/test_base.py": [], + "tests/sentry/workflow_engine/handlers/detector/test_stateful.py": [], + "tests/sentry/workflow_engine/handlers/registry/test_invoke_activities.py": ["snuba"], + "tests/sentry/workflow_engine/handlers/workflow/test_workflow_activity_handlers.py": [ + "snuba" + ], + "tests/sentry/workflow_engine/migration_helpers/test_issue_alert_deletion.py": [], + "tests/sentry/workflow_engine/models/test_action.py": ["snuba"], + "tests/sentry/workflow_engine/models/test_data_condition.py": [], + "tests/sentry/workflow_engine/models/test_data_source.py": [], + "tests/sentry/workflow_engine/models/test_detector.py": [], + "tests/sentry/workflow_engine/models/test_detector_state.py": [], + "tests/sentry/workflow_engine/models/test_json_config_base.py": [], + "tests/sentry/workflow_engine/models/test_workflow.py": ["snuba"], + "tests/sentry/workflow_engine/processors/contexts/test_workflow_event_context.py": [], + "tests/sentry/workflow_engine/processors/evaluations/test_base.py": [], + "tests/sentry/workflow_engine/processors/evaluations/test_detector.py": [], + "tests/sentry/workflow_engine/processors/evaluations/test_workflow.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_action.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_action_deduplication.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_data_condition.py": [], + "tests/sentry/workflow_engine/processors/test_data_condition_group.py": [], + "tests/sentry/workflow_engine/processors/test_data_packet.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_data_sources.py": [], + "tests/sentry/workflow_engine/processors/test_delayed_workflow.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_detector.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_log_util.py": [], + "tests/sentry/workflow_engine/processors/test_preview.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_schedule.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_workflow.py": ["snuba"], + "tests/sentry/workflow_engine/processors/test_workflow_fire_history.py": ["snuba"], + "tests/sentry/workflow_engine/receivers/test_data_condition.py": [], + "tests/sentry/workflow_engine/receivers/test_data_condition_group.py": [], + "tests/sentry/workflow_engine/receivers/test_data_source.py": [], + "tests/sentry/workflow_engine/receivers/test_data_source_detector.py": [], + "tests/sentry/workflow_engine/receivers/test_detector.py": [], + "tests/sentry/workflow_engine/receivers/test_detector_workflow.py": [], + "tests/sentry/workflow_engine/receivers/test_organization_detectors.py": [], + "tests/sentry/workflow_engine/receivers/test_organization_workflows.py": [], + "tests/sentry/workflow_engine/receivers/test_project_detectors.py": [], + "tests/sentry/workflow_engine/receivers/test_workflow.py": [], + "tests/sentry/workflow_engine/receivers/test_workflow_data_condition_group.py": [], + "tests/sentry/workflow_engine/service/test_action_service.py": [], + "tests/sentry/workflow_engine/tasks/test_actions.py": ["snuba"], + "tests/sentry/workflow_engine/tasks/test_delayed_workflows.py": ["snuba"], + "tests/sentry/workflow_engine/tasks/test_health_check.py": [], + "tests/sentry/workflow_engine/tasks/test_utils.py": ["snuba"], + "tests/sentry/workflow_engine/tasks/test_workflows.py": [], + "tests/sentry/workflow_engine/test_integration.py": ["kafka", "snuba"], + "tests/sentry/workflow_engine/test_task.py": ["snuba"], + "tests/sentry/workflow_engine/test_task_integration.py": ["snuba"], + "tests/sentry/workflow_engine/test_transformers.py": [], + "tests/sentry/workflow_engine/utils/test_dictpath.py": [], + "tests/sentry/workflow_engine/utils/test_log_context.py": [], + "tests/sentry/workflow_engine/utils/test_scopedstats.py": [], + "tests/sentry/workflow_engine/utils/test_workflow_metrics.py": [], + "tests/snuba/api/endpoints/test_discover_homepage_query.py": ["snuba"], + "tests/snuba/api/endpoints/test_discover_key_transactions.py": ["snuba"], + "tests/snuba/api/endpoints/test_discover_saved_queries.py": ["snuba"], + "tests/snuba/api/endpoints/test_discover_saved_query_detail.py": ["snuba"], + "tests/snuba/api/endpoints/test_group_details.py": ["snuba"], + "tests/snuba/api/endpoints/test_group_event_details.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_event_details.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_eventid.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_cross_trace.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_dropped.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_facets.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_heatmap_spans.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_heatmap_trace_metrics.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_occurrences.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_ourlogs.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_preprod_size.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_profile_functions.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_span_indexed.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_stats.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_stats_ourlogs.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_stats_preprod_size.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_stats_processing_errors.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_stats_profile_functions.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_stats_span_indexed.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_stats_trace_metrics.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_timeseries.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_timeseries_cross_trace.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_timeseries_enrichment_attributes.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_timeseries_logs.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_timeseries_occurrences.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_timeseries_spans.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_timeseries_trace_metrics.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_events_trace_metrics.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_events_uptime_results.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_group_index_stats.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_issues_resolved_in_release.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_sessions.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_stats_summary.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_stats_v2.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_tagkey_values.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_tags.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_timeseries_transformations.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_trace.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_trace_item_attribute_context.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_trace_item_attribute_details.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_trace_item_attributes.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_trace_item_attributes_merged.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_trace_item_attributes_ranked.py": [ + "snuba" + ], + "tests/snuba/api/endpoints/test_organization_trace_item_metric_context.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_trace_item_metrics.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_trace_item_stats.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_trace_logs.py": ["snuba"], + "tests/snuba/api/endpoints/test_organization_trace_meta.py": ["snuba"], + "tests/snuba/api/endpoints/test_project_event_details.py": ["snuba"], + "tests/snuba/api/endpoints/test_project_events.py": ["snuba"], + "tests/snuba/api/endpoints/test_project_group_index.py": ["snuba"], + "tests/snuba/api/endpoints/test_project_tags.py": ["snuba"], + "tests/snuba/api/endpoints/test_project_trace_item_details.py": ["snuba"], + "tests/snuba/api/endpoints/test_seer_attributes.py": ["snuba"], + "tests/snuba/api/serializers/test_group.py": ["snuba"], + "tests/snuba/api/serializers/test_group_stream.py": ["snuba"], + "tests/snuba/billing/platform/services/usage/test_outcomes_integration.py": ["snuba"], + "tests/snuba/incidents/test_tasks.py": ["snuba"], + "tests/snuba/metrics/naming_layer/test_mri.py": [], + "tests/snuba/metrics/test_units.py": [], + "tests/snuba/models/test_group.py": ["snuba"], + "tests/snuba/preprod/eap/test_preprod_eap_integration.py": ["snuba"], + "tests/snuba/processing_errors/eap/test_producer.py": ["snuba"], + "tests/snuba/search/test_backend.py": ["snuba"], + "tests/snuba/search/test_eap_occurrences.py": ["snuba"], + "tests/snuba/search/test_postgres_sort_framework.py": ["snuba"], + "tests/snuba/sessions/test_sessions.py": ["snuba"], + "tests/snuba/sessions/test_sessions_v2.py": [], + "tests/snuba/tagstore/test_tagstore_backend.py": ["snuba"], + "tests/snuba/tasks/test_unmerge.py": ["snuba"], + "tests/snuba/test_metrics_layer.py": ["snuba"], + "tests/snuba/test_outcomes.py": [], + "tests/snuba/test_referrer.py": [], + "tests/snuba/test_rpc_dataset_common.py": ["snuba"], + "tests/snuba/test_snql_snuba.py": ["snuba"], + "tests/snuba/test_snuba.py": ["snuba"], + "tests/snuba/test_util.py": ["snuba"], + "tests/snuba/tsdb/test_tsdb_backend.py": ["snuba"], + "tests/social_auth/test_utils.py": [], + "tests/symbolicator/test_minidump_full.py": ["kafka", "snuba", "symbolicator"], + "tests/symbolicator/test_payload_full.py": ["kafka", "snuba", "symbolicator"], + "tests/symbolicator/test_unreal_full.py": ["kafka", "snuba", "symbolicator"] + } +} diff --git a/.github/workflows/scripts/backend-test-services.py b/.github/workflows/scripts/backend-test-services.py new file mode 100644 index 000000000000..0198e1aba025 --- /dev/null +++ b/.github/workflows/scripts/backend-test-services.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +"""Service-colored full backend runs: which shards start Snuba, and which tests need it. + +Full runs put the test files that use Snuba, ClickHouse, Kafka or Symbolicator +on the first BACKEND_SNUBA_SHARDS shards (devservices mode `backend-ci`) and +every other file on "lite" shards (`backend-ci-lite`: no Snuba, ClickHouse, +Kafka or Symbolicator, and no per-worker Snuba bootstrap). pytest-selected.py +plans the split from `backend-test-services.json`; pytest_service_guard.py +records service use on Snuba shards and fails any test that tries one on a lite +shard. Selective PR runs keep every service. + + pick-shard Write this matrix shard's devservices mode and guard mode to + $GITHUB_ENV (backend.yml). + inventory Every shard's `backend-service-usage-*` artifacts -> + backend-test-services.json. Refresh it from a green full run: + + gh run download RUN_ID --repo getsentry/sentry \\ + --pattern 'backend-service-usage-*' --dir /tmp/usage + python3 .github/workflows/scripts/backend-test-services.py inventory \\ + .github/workflows/scripts/backend-test-services.json /tmp/usage/*/*.json + + Files used services if any shard saw them do so. Files that no + shard ran (new, renamed, or from a failed shard) drop out and + go to Snuba shards until the next refresh. + suggest Predicted per-shard test-seconds for each BACKEND_SNUBA_SHARDS. +""" + +from __future__ import annotations + +import argparse +import importlib +import json +import os +import sys +from pathlib import Path + + +def pick_shard(env: dict[str, str]) -> dict[str, str]: + selective = env["SELECTIVE"] == "true" + snuba_shards = int(env["BACKEND_SNUBA_SHARDS"]) + instance = int(env["MATRIX_INSTANCE"]) + if selective: + color, guard = "", "" + elif snuba_shards == 0: + # Not colored yet, but measure, to build backend-test-services.json. + color, guard = "", "record" + elif instance < snuba_shards: + color, guard = "snuba", "record" + else: + color, guard = "lite", "enforce" + return { + "BACKEND_TEST_SERVICE_COLOR": color, + "BACKEND_TEST_SERVICE_GUARD": guard, + "BACKEND_DEVSERVICES_MODE": "backend-ci-lite" if color == "lite" else "backend-ci", + "XDIST_PER_WORKER_SNUBA": "" if color == "lite" else "1", + } + + +def inventory(usages: list[dict[str, object]]) -> dict[str, object]: + files: dict[str, set[str]] = {} + for usage in usages: + for path, services in usage["files"].items(): # type: ignore[attr-defined] + files.setdefault(path, set()).update(services) + return {"files": {path: sorted(files[path]) for path in sorted(files)}} + + +def suggest(total: int) -> None: + sys.path.insert(0, str(Path(__file__).parent)) + planner = importlib.import_module("pytest-selected") + files = planner.list_test_files( + ["tests", *(f"--ignore=tests/{d}" for d in ("acceptance", "apidocs", "js", "tools"))] + ) + services = json.loads(planner.SERVICES_FILE.read_text())["files"] + snuba_files = {path for path in files if planner.needs_snuba(path, services)} + weights = planner.file_weights(files) + snuba = sum(weights[path] for path in snuba_files) + print(f"{len(snuba_files)}/{len(files)} files, {snuba:.0f}/{sum(weights.values()):.0f}s") + print("snuba_shards max_snuba_shard_s max_lite_shard_s") + for k in range(1, total): + try: + plan = planner.plan_colored_shards(weights, total, k, snuba_files) + except ValueError: + continue + loads = [ + sum(weights[path] / shard.parts.get(path, (0, 1))[1] for path in shard.files) + for shard in plan + ] + print(f"{k:12} {max(loads[:k]):17.0f} {max(loads[k:]):16.0f}") + + +def main() -> int: + parser = argparse.ArgumentParser(description=__doc__.split("\n", 1)[0]) + sub = parser.add_subparsers(dest="command", required=True) + sub.add_parser("pick-shard", help="this shard's services -> $GITHUB_ENV") + p = sub.add_parser("inventory", help="service-usage artifacts -> the checked-in file") + p.add_argument("output", type=Path) + p.add_argument("inputs", type=Path, nargs="+") + p = sub.add_parser("suggest", help="predicted shard loads per BACKEND_SNUBA_SHARDS") + p.add_argument("--total", type=int, default=30) + args = parser.parse_args() + + if args.command == "pick-shard": + picked = pick_shard(dict(os.environ)) + with open(os.environ["GITHUB_ENV"], "a") as f: + f.writelines(f"{key}={value}\n" for key, value in picked.items()) + print(picked) + elif args.command == "inventory": + result = inventory([json.loads(path.read_text()) for path in args.inputs]) + args.output.write_text(json.dumps(result, indent=2) + "\n") + else: + suggest(args.total) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/.github/workflows/scripts/pytest-selected.py b/.github/workflows/scripts/pytest-selected.py index 489cae854a01..42006618b445 100644 --- a/.github/workflows/scripts/pytest-selected.py +++ b/.github/workflows/scripts/pytest-selected.py @@ -17,6 +17,10 @@ durations file, each shard gets whole selected files, balanced by the per-file test counts in `selected-tests.counts.json`, and a file too big for one shard gets several shards, which split it by test. +- Service-colored full runs (BACKEND_TEST_SERVICE_COLOR set): the first + BACKEND_SNUBA_SHARDS shards run the files that need Snuba, Kafka or + Symbolicator, and the rest run every other file on "lite" shards without + those services. See backend-test-services.py. """ from __future__ import annotations @@ -33,6 +37,14 @@ import pytest DURATIONS_FILE = Path(__file__).parent / "backend-test-durations.json" +# Which services each test file used in the last measured full run. +SERVICES_FILE = Path(__file__).parent / "backend-test-services.json" +# Puts a file on Snuba shards whatever SERVICES_FILE says, e.g. while a new +# Snuba dependency waits for the file to be measured again. +SNUBA_PRAGMA = "# backend-ci: snuba" +# Relay (which produces to Kafka) and Symbolicator run in containers, so +# pytest_service_guard can't see them being used. These mark their tests. +SNUBA_HINTS = ("RelayStoreHelper", "relay_server", "requires_symbolicator", ".mark.symbolicator") # Full runs split files slower than 1/PIECES_PER_SHARD of a shard by test. # Files run in collection order, so a big file that starts late on an xdist # worker holds up the whole shard; this bounds how big that can be. @@ -122,6 +134,31 @@ def plan_full_shards( ] +def needs_snuba(path: str, services: dict[str, list[str]]) -> bool: + """Whether a file must run on a shard with Snuba, Kafka and Symbolicator. + + Only files measured as using none of them go to lite shards, so new and + renamed files start on Snuba shards until the next measurement. + """ + if services.get(path) != []: + return True + source = Path(path).read_text() + return SNUBA_PRAGMA in source or any(hint in source for hint in SNUBA_HINTS) + + +def plan_colored_shards( + weights: dict[str, float], total: int, snuba_shards: int, snuba_files: set[str] +) -> list[Shard]: + """Snuba files on shards [0, snuba_shards), the rest on the others.""" + snuba = {path: w for path, w in weights.items() if path in snuba_files} + lite = {path: w for path, w in weights.items() if path not in snuba_files} + snuba_plan = plan_full_shards(snuba, snuba_shards) + lite_plan = plan_full_shards(lite, total - snuba_shards) + if snuba_plan is None or lite_plan is None: + raise ValueError(f"BACKEND_SNUBA_SHARDS={snuba_shards} leaves a shard with no files") + return snuba_plan + lite_plan + + def list_test_files(args: list[str]) -> list[str]: """Every .py file pytest could collect from the paths in `args`, minus --ignore. @@ -207,6 +244,58 @@ def run_full_shard(args: list[str], total: int, group: int) -> int: ) +def run_colored_shard(args: list[str], total: int, group: int, color: str) -> int: + """Like run_full_shard, but no fallback: a lite shard can't run Snuba tests.""" + try: + snuba_shards = int(os.environ.get("BACKEND_SNUBA_SHARDS", "0")) + if not 0 < snuba_shards < total or not 0 <= group < total: + raise ValueError(f"BACKEND_SNUBA_SHARDS={snuba_shards} must be in (0, {total})") + expected = "snuba" if group < snuba_shards else "lite" + if color != expected: + raise ValueError(f"shard {group} is a {expected} shard, got color {color}") + if color == "lite" and os.environ.get("BACKEND_TEST_SERVICE_GUARD") != "enforce": + raise ValueError("lite shards need BACKEND_TEST_SERVICE_GUARD=enforce") + files = list_test_files(args) + if not files or not per_file_plan_applies(args, files): + raise ValueError("needs test files under the working directory, and no -m/-k") + services = json.loads(SERVICES_FILE.read_text())["files"] + snuba_files = {path for path in files if needs_snuba(path, services)} + weights = file_weights(files) + plan = plan_colored_shards(weights, total, snuba_shards, snuba_files) + except (OSError, ValueError, KeyError) as exc: + print(f"pytest-selected: cannot plan service-colored shards: {exc}", file=sys.stderr) + return int(pytest.ExitCode.USAGE_ERROR) + + snuba_seconds = sum(weights[path] for path in snuba_files) + print( + f"pytest-selected: {color} shard; {len(snuba_files)} of {len(files)} files and " + f"{snuba_seconds:.0f} of {sum(weights.values()):.0f} test-seconds need Snuba", + file=sys.stderr, + ) + # Like TOTAL_TEST_GROUPS below: tests that run pytest-selected.py + # themselves must not inherit this shard's plan. + os.environ.pop("BACKEND_TEST_SERVICE_COLOR") + os.environ.pop("BACKEND_SNUBA_SHARDS", None) + if color == "lite": + # A guard failure is deterministic, so don't rerun it. + os.environ["PYTEST_ADDOPTS"] = ( + f"{os.environ.get('PYTEST_ADDOPTS', '')} --rerun-except=ServiceGuardError" + ) + artifacts = Path(".artifacts") + artifacts.mkdir(exist_ok=True) + return run_planned_shard( + args, plan, group, len(files), artifacts / f"full-tests.shard-{group}.txt" + ) + + +def add_plugin(name: str) -> None: + """Load a plugin from this directory in pytest and its xdist workers.""" + os.environ["PYTHONPATH"] = os.pathsep.join( + filter(None, [str(Path(__file__).parent), os.environ.get("PYTHONPATH")]) + ) + os.environ["PYTEST_PLUGINS"] = ",".join(filter(None, [os.environ.get("PYTEST_PLUGINS"), name])) + + def run_planned_shard( args: list[str], plan: list[Shard], group: int, file_count: int, shard_file: Path ) -> int: @@ -227,12 +316,7 @@ def run_planned_shard( os.environ["TOTAL_TEST_GROUPS"] = "1" os.environ["TEST_GROUP"] = "0" os.environ["PYTEST_SHARD_PARTS"] = str(parts_file) - os.environ["PYTHONPATH"] = os.pathsep.join( - filter(None, [str(Path(__file__).parent), os.environ.get("PYTHONPATH")]) - ) - os.environ["PYTEST_PLUGINS"] = ",".join( - filter(None, [os.environ.get("PYTEST_PLUGINS"), "pytest_shard_plugin"]) - ) + add_plugin("pytest_shard_plugin") start_assert_rewrite_prewarm(shard_file) return int(pytest.main(args)) @@ -241,6 +325,16 @@ def main(args: list[str]) -> int: selected_file = os.environ.get("SELECTED_TESTS_FILE") total = int(os.environ.get("TOTAL_TEST_GROUPS", 1)) group = int(os.environ.get("TEST_GROUP", 0)) + color = os.environ.get("BACKEND_TEST_SERVICE_COLOR", "") + if os.environ.get("BACKEND_TEST_SERVICE_GUARD"): + # Ahead of tests/conftest.py, so it can wrap Kafka clients before + # sentry imports them. + add_plugin("pytest_service_guard") + if color: + if selected_file: + print("pytest-selected: service colors are for full runs only", file=sys.stderr) + return int(pytest.ExitCode.USAGE_ERROR) + return run_colored_shard(args, total, group, color) if not selected_file and total > 1 and DURATIONS_FILE.is_file(): return run_full_shard(args, total, group) if not selected_file or not os.path.isfile(selected_file) or total <= 1: diff --git a/.github/workflows/scripts/pytest_service_guard.py b/.github/workflows/scripts/pytest_service_guard.py new file mode 100644 index 000000000000..76b43e70c982 --- /dev/null +++ b/.github/workflows/scripts/pytest_service_guard.py @@ -0,0 +1,264 @@ +"""pytest plugin that tracks which tests use Snuba, ClickHouse, Kafka or Symbolicator. + +Loaded by pytest-selected.py (in xdist workers too) when +BACKEND_TEST_SERVICE_GUARD is set: + +- `record`: services are up. Note which test files connect to them and write + .artifacts/service-usage/.json, which backend-test-services.py turns + into backend-test-services.json. +- `enforce`: services are down ("lite" shards). Any connection attempt fails + that test phase with ServiceGuardError, even if the code under test catches + the connection error, so a test can never pass on a lite shard by silently + skipping its Snuba work. + +Snuba, ClickHouse and Symbolicator are reached over Python sockets, so a +socket.connect hook sees every one of them, including the urllib3 pool in +sentry.utils.snuba and the `_requires_*` port probes. librdkafka opens its own +sockets, so Kafka clients count as used when they are constructed. Mocked +traffic (`responses`, `mock.patch`) never reaches a socket and doesn't count. +""" + +from __future__ import annotations + +import json +import os +import socket +import sys +import threading +import weakref +from collections.abc import Generator +from pathlib import Path +from typing import Any + +import pytest + +MODE = os.environ.get("BACKEND_TEST_SERVICE_GUARD", "") +# Loopback ports of the services that lite shards don't start (devservices +# backend-ci vs backend-ci-lite). 1230-1236 are the per-worker Snuba APIs from +# bootstrap-snuba.py and sentry.testutils.pytest.xdist. +SERVICE_PORTS = { + 1218: "snuba", + **{port: "snuba" for port in range(1230, 1237)}, + 8123: "clickhouse", + 9000: "clickhouse", + 9092: "kafka", + 9093: "kafka", + 3021: "symbolicator", +} +LOOPBACK = {"127.0.0.1", "::1", "localhost"} +# Fixtures that start containers needing those services (Relay produces to Kafka). +SERVICE_FIXTURES = {"relay_server", "relay_server_setup", "_requires_symbolicator"} + + +class ServiceGuardError(ConnectionRefusedError): + pass + + +_current: str = "" +_current_test: str = _current +_hits: list[tuple[str, str]] = [] +_ran: set[str] = set() +# For debugging attribution: per test, services used, and the thread when it +# isn't the main one (a thread can outlive the test that started it). +_test_hits: dict[str, set[str]] = {} + + +def _hit(service: str) -> None: + _hits.append((_current, service)) + thread = threading.current_thread() + where = "" if thread is threading.main_thread() else f" (thread {thread.name})" + _test_hits.setdefault(_current_test, set()).add(service + where) + if MODE == "enforce": + raise ServiceGuardError(f"{service} is not available on this shard") + + +def _service_for(address: Any) -> str | None: + if isinstance(address, tuple) and len(address) >= 2 and address[0] in LOOPBACK: + return SERVICE_PORTS.get(address[1]) + return None + + +# Sockets connected to a service. Clients pool connections across tests (the +# urllib3 pool in sentry.utils.snuba), so every send counts, not just connects. +_service_sockets: weakref.WeakKeyDictionary[socket.socket, str] = weakref.WeakKeyDictionary() + + +def _install_socket_hook() -> None: + connect, connect_ex = socket.socket.connect, socket.socket.connect_ex + send, sendall = socket.socket.send, socket.socket.sendall + + def guarded_connect(self: socket.socket, address: Any) -> None: + if service := _service_for(address): + _hit(service) + _service_sockets[self] = service + return connect(self, address) + + def guarded_connect_ex(self: socket.socket, address: Any) -> int: + if service := _service_for(address): + _hit(service) + _service_sockets[self] = service + return connect_ex(self, address) + + def guarded_send(self: socket.socket, *args: Any) -> int: + if service := _service_sockets.get(self): + _hit(service) + return send(self, *args) + + def guarded_sendall(self: socket.socket, *args: Any) -> None: + if service := _service_sockets.get(self): + _hit(service) + return sendall(self, *args) + + socket.socket.connect = guarded_connect # type: ignore[method-assign,assignment] + socket.socket.connect_ex = guarded_connect_ex # type: ignore[method-assign,assignment] + socket.socket.send = guarded_send # type: ignore[method-assign,assignment] + socket.socket.sendall = guarded_sendall # type: ignore[method-assign,assignment] + + +def _install_kafka_hook() -> None: + # Before sentry or arroyo import these names: PYTEST_PLUGINS loads this + # plugin ahead of tests/conftest.py. pytest_configure checks it worked. + import confluent_kafka + import confluent_kafka.admin + + # Clients are often per-process singletons, so count the calls that talk + # to the broker too. Not Producer.poll: arroyo polls from its own thread. + calls = { + "Producer": ("produce", "flush", "list_topics"), + "Consumer": ("poll", "consume", "subscribe", "assign", "commit", "list_topics"), + } + + def counted(method: Any) -> Any: + def wrapper(self: Any, *args: Any, **kwargs: Any) -> Any: + _hit("kafka") + return method(self, *args, **kwargs) + + return wrapper + + def guarded(base: type) -> type: + class Guarded(base): # type: ignore[misc] + def __init__(self, *args: Any, **kwargs: Any) -> None: + _hit("kafka") + super().__init__(*args, **kwargs) + + for name in calls[base.__name__]: + setattr(Guarded, name, counted(getattr(base, name))) + Guarded._guarded = True + Guarded.__name__ = Guarded.__qualname__ = base.__name__ + Guarded.__module__ = base.__module__ + return Guarded + + # Producer and Consumer are C types, so wrap them in subclasses. + for name in calls: + setattr(confluent_kafka, name, guarded(getattr(confluent_kafka, name))) + + # AdminClient.__init__ calls super(AdminClient, self) by its module global + # name, so a subclass under that name would recurse. Wrap it in place. + admin = confluent_kafka.admin.AdminClient + admin_init = admin.__init__ + + def guarded_admin_init(self: Any, *args: Any, **kwargs: Any) -> None: + _hit("kafka") + admin_init(self, *args, **kwargs) + + admin.__init__ = guarded_admin_init # type: ignore[method-assign] + for name in ("create_topics", "delete_topics", "list_topics", "describe_topics"): + setattr(admin, name, counted(getattr(admin, name))) + admin._guarded = True # type: ignore[attr-defined] + + +if MODE: + if MODE not in ("record", "enforce"): + raise ValueError(f"BACKEND_TEST_SERVICE_GUARD must be record or enforce, got {MODE!r}") + _install_socket_hook() + _install_kafka_hook() + + +def _file(item: pytest.Item) -> str: + return item.nodeid.split("::", 1)[0] + + +# Modules that bind confluent_kafka classes at import time. +KAFKA_IMPORTERS = { + "arroyo.backends.kafka.consumer": ("ConfluentKafkaProducer", "ConfluentConsumer"), + "sentry.utils.confluent_producer": ("Producer",), + "sentry.testutils.pytest.kafka": ("Producer", "AdminClient"), +} + + +def pytest_configure(config: pytest.Config) -> None: + if not MODE: + return + for module, names in KAFKA_IMPORTERS.items(): + for name in names: + if module in sys.modules and not hasattr( + getattr(sys.modules[module], name), "_guarded" + ): + raise pytest.UsageError( + f"pytest_service_guard: {module}.{name} was imported before the Kafka " + "hook, so Kafka use can't be tracked; load this plugin earlier" + ) + + +def pytest_collection_modifyitems(config: pytest.Config, items: list[pytest.Item]) -> None: + if MODE != "enforce": + return + for item in items: + needed = SERVICE_FIXTURES.intersection(getattr(item, "fixturenames", ())) + if needed: + raise pytest.UsageError( + f"pytest_service_guard: {item.nodeid} needs {sorted(needed)}, which lite " + "shards don't run. Add '# backend-ci: snuba' to that test file." + ) + + +def _guard_phase(item: pytest.Item) -> Generator[None, Any, Any]: + global _current, _current_test + _current, _current_test = _file(item), item.nodeid + _ran.add(_current) + start = len(_hits) + try: + result = yield + except BaseException as exc: + if MODE == "enforce" and len(_hits) > start: + raise ServiceGuardError(_message(item, start)) from exc + raise + # The code under test may have caught the connection error and passed. + if MODE == "enforce" and len(_hits) > start: + raise ServiceGuardError(_message(item, start)) + return result + + +def _message(item: pytest.Item, start: int) -> str: + services = sorted({service for _, service in _hits[start:]}) + return ( + f"{item.nodeid} used {', '.join(services)} on a lite shard, which doesn't run " + f"it. Add '# backend-ci: snuba' to {_file(item)}, or mark it [\"snuba\"] in " + ".github/workflows/scripts/backend-test-services.json." + ) + + +if MODE: + pytest_runtest_setup = pytest.hookimpl(wrapper=True)(_guard_phase) + pytest_runtest_call = pytest.hookimpl(wrapper=True)(_guard_phase) + pytest_runtest_teardown = pytest.hookimpl(wrapper=True)(_guard_phase) + + +def pytest_sessionfinish(session: pytest.Session) -> None: + if not MODE or not (_ran or _hits): + return + used: dict[str, set[str]] = {path: set() for path in _ran} + for path, service in _hits: + used.setdefault(path, set()).add(service) + out = Path(".artifacts/service-usage") + out.mkdir(parents=True, exist_ok=True) + worker = os.environ.get("PYTEST_XDIST_WORKER", "main") + (out / f"{worker}.json").write_text( + json.dumps( + { + "mode": MODE, + "files": {p: sorted(s) for p, s in sorted(used.items())}, + "tests": {t: sorted(s) for t, s in sorted(_test_hits.items())}, + } + ) + ) diff --git a/.github/workflows/scripts/test_backend_test_services.py b/.github/workflows/scripts/test_backend_test_services.py new file mode 100644 index 000000000000..9e045d894c27 --- /dev/null +++ b/.github/workflows/scripts/test_backend_test_services.py @@ -0,0 +1,152 @@ +from __future__ import annotations + +import importlib +import json +import subprocess +import sys +from pathlib import Path + +import pytest + +# Module has hyphens in its name, so use importlib. +_mod = importlib.import_module("backend-test-services") + +SCRIPTS = Path(__file__).parent + + +@pytest.mark.parametrize( + ("selective", "snuba_shards", "instance", "color", "guard", "mode", "per_worker"), + [ + ("true", "10", "20", "", "", "backend-ci", "1"), + ("false", "0", "20", "", "record", "backend-ci", "1"), + ("false", "10", "9", "snuba", "record", "backend-ci", "1"), + ("false", "10", "10", "lite", "enforce", "backend-ci-lite", ""), + ], +) +def test_pick_shard( + selective: str, + snuba_shards: str, + instance: str, + color: str, + guard: str, + mode: str, + per_worker: str, +) -> None: + env = { + "SELECTIVE": selective, + "BACKEND_SNUBA_SHARDS": snuba_shards, + "MATRIX_INSTANCE": instance, + } + assert _mod.pick_shard(env) == { + "BACKEND_TEST_SERVICE_COLOR": color, + "BACKEND_TEST_SERVICE_GUARD": guard, + "BACKEND_DEVSERVICES_MODE": mode, + "XDIST_PER_WORKER_SNUBA": per_worker, + } + + +def test_inventory_unions_every_workers_usage() -> None: + usages = [ + {"mode": "record", "files": {"b.py": [], "split.py": []}}, + {"mode": "record", "files": {"a.py": ["snuba"], "split.py": ["kafka"]}}, + {"mode": "enforce", "files": {"c.py": []}}, + ] + assert _mod.inventory(usages) == { + "files": {"a.py": ["snuba"], "b.py": [], "c.py": [], "split.py": ["kafka"]} + } + + +GUARDED_TESTS = """ +import socket + +import confluent_kafka +import confluent_kafka.admin + + +def test_swallowed_snuba_error(): + try: + socket.create_connection(("127.0.0.1", 1218), timeout=1) + except OSError: + pass + + +def test_kafka_client(): + confluent_kafka.Producer({"bootstrap.servers": "127.0.0.1:9092"}) + + +def test_kafka_admin_client(): + confluent_kafka.admin.AdminClient({"bootstrap.servers": "127.0.0.1:9092"}) + + +def test_other_port(): + try: + socket.create_connection(("127.0.0.1", 5432), timeout=1) + except OSError: + pass +""" + + +@pytest.mark.parametrize("mode", ["record", "enforce"]) +def test_guard(tmp_path: Path, mode: str) -> None: + (tmp_path / "test_guarded.py").write_text(GUARDED_TESTS) + result = subprocess.run( + [sys.executable, "-m", "pytest", "-p", "no:cacheprovider", "-p", "pytest_service_guard"], + cwd=tmp_path, + env={"PYTHONPATH": str(SCRIPTS), "BACKEND_TEST_SERVICE_GUARD": mode, "PATH": ""}, + capture_output=True, + text=True, + ) + usage = (tmp_path / ".artifacts/service-usage/main.json").read_text() + assert '"test_guarded.py": ["kafka", "snuba"]' in usage + if mode == "record": + assert result.returncode == 0, result.stdout + else: + assert result.returncode == 1, result.stdout + assert "3 failed, 1 passed" in result.stdout + assert "test_swallowed_snuba_error used snuba on a lite shard" in result.stdout + assert "test_kafka_client used kafka on a lite shard" in result.stdout + assert "test_kafka_admin_client used kafka on a lite shard" in result.stdout + + +POOL_CONFTEST = """ +import socket + +import pytest +import pytest_service_guard + +server = socket.create_server(("127.0.0.1", 0)) +pytest_service_guard.SERVICE_PORTS[server.getsockname()[1]] = "snuba" + + +@pytest.fixture(scope="session") +def pool(): + return {} + + +@pytest.fixture +def snuba(pool): + if "conn" not in pool: + pool["conn"] = socket.create_connection(server.getsockname()) + return pool["conn"] +""" + + +def test_record_counts_requests_on_pooled_connections(tmp_path: Path) -> None: + (tmp_path / "conftest.py").write_text(POOL_CONFTEST) + (tmp_path / "test_a_connects.py").write_text("def test_a(snuba): pass\n") + (tmp_path / "test_b_reuses.py").write_text("def test_b(snuba): snuba.sendall(b'q')\n") + (tmp_path / "test_c_idle.py").write_text("def test_c(): pass\n") + result = subprocess.run( + [sys.executable, "-m", "pytest", "-p", "no:cacheprovider", "-p", "pytest_service_guard"], + cwd=tmp_path, + env={"PYTHONPATH": str(SCRIPTS), "BACKEND_TEST_SERVICE_GUARD": "record", "PATH": ""}, + capture_output=True, + text=True, + ) + assert result.returncode == 0, result.stdout + usage = json.loads((tmp_path / ".artifacts/service-usage/main.json").read_text()) + assert usage["files"] == { + "test_a_connects.py": ["snuba"], + "test_b_reuses.py": ["snuba"], + "test_c_idle.py": [], + } diff --git a/.github/workflows/scripts/test_pytest_selected.py b/.github/workflows/scripts/test_pytest_selected.py index f64500e66fd1..8828e69f00d6 100644 --- a/.github/workflows/scripts/test_pytest_selected.py +++ b/.github/workflows/scripts/test_pytest_selected.py @@ -355,3 +355,112 @@ def test_per_file_plan_applies( ) -> None: with mock.patch.dict(os.environ, {"PYTEST_ADDOPTS": addopts}): assert _mod.per_file_plan_applies(args, files) is applies + + +def run_colored_main( + tmp_path: Path, + sources: dict[str, str], + services: dict[str, list[str]] | None, + group: int, + color: str, + guard: str = "enforce", +) -> tuple[int, list[str], str]: + """Run shard `group` of 3, with shard 0 the only Snuba shard.""" + for path, source in sources.items(): + (tmp_path / path).parent.mkdir(parents=True, exist_ok=True) + (tmp_path / path).write_text(source) + durations_file = tmp_path / "durations.json" + durations_file.write_text( + json.dumps({"seconds_per_test": 1.0, "files": {path: 1.0 for path in sources}}) + ) + services_file = tmp_path / "services.json" + if services is not None: + services_file.write_text(json.dumps({"files": services})) + addopts: list[str] = [] + + def fake_main(args: list[str]) -> pytest.ExitCode: + addopts.append(os.environ["PYTEST_ADDOPTS"]) + # Tests that run pytest-selected.py themselves mustn't inherit the plan. + assert "BACKEND_TEST_SERVICE_COLOR" not in os.environ + assert "BACKEND_SNUBA_SHARDS" not in os.environ + return pytest.ExitCode.OK + + env = { + "SELECTED_TESTS_FILE": "", + "TOTAL_TEST_GROUPS": "3", + "TEST_GROUP": str(group), + "BACKEND_SNUBA_SHARDS": "1", + "BACKEND_TEST_SERVICE_COLOR": color, + "BACKEND_TEST_SERVICE_GUARD": guard, + "PYTEST_ADDOPTS": "", + } + with ( + contextlib.chdir(tmp_path), + mock.patch.dict(os.environ, env), + mock.patch.object(_mod, "DURATIONS_FILE", durations_file), + mock.patch.object(_mod, "SERVICES_FILE", services_file), + mock.patch.object(pytest, "main", fake_main), + ): + exit_code = main(["tests"]) + shard_file = tmp_path / f".artifacts/full-tests.shard-{group}.txt" + files = shard_file.read_text().split() if shard_file.exists() else [] + return exit_code, files, "".join(addopts) + + +class TestServiceColoredMain: + sources = { + "tests/test_lite_a.py": "def test_a(): pass\n", + "tests/test_lite_b.py": "def test_b(): pass\n", + "tests/test_snuba.py": "def test_s(): pass\n", + "tests/test_new.py": "def test_n(): pass\n", + "tests/test_pragma.py": "# backend-ci: snuba\ndef test_p(): pass\n", + "tests/test_relay.py": "def test_r(relay_server): pass\n", + } + services = { + "tests/test_lite_a.py": [], + "tests/test_lite_b.py": [], + "tests/test_snuba.py": ["snuba"], + "tests/test_pragma.py": [], + "tests/test_relay.py": [], + } + + def test_snuba_shard_gets_measured_new_and_marked_files(self, tmp_path: Path) -> None: + exit_code, files, addopts = run_colored_main( + tmp_path, self.sources, self.services, 0, "snuba", "record" + ) + assert exit_code == 0 + assert files == [ + "tests/test_new.py", + "tests/test_pragma.py", + "tests/test_relay.py", + "tests/test_snuba.py", + ] + assert "--rerun-except" not in addopts + + def test_lite_shards_get_only_files_measured_without_services(self, tmp_path: Path) -> None: + runs = [run_colored_main(tmp_path, self.sources, self.services, g, "lite") for g in (1, 2)] + assert [exit_code for exit_code, _, _ in runs] == [0, 0] + # Both are split across both lite shards. + assert {f for _, files, _ in runs for f in files} == { + "tests/test_lite_a.py", + "tests/test_lite_b.py", + } + assert all("--rerun-except=ServiceGuardError" in addopts for _, _, addopts in runs) + + @pytest.mark.parametrize( + ("group", "color", "guard"), + [(0, "lite", "enforce"), (1, "snuba", "record"), (1, "lite", "record"), (1, "lite", "")], + ) + def test_refuses_mismatched_shard_setup( + self, tmp_path: Path, group: int, color: str, guard: str + ) -> None: + exit_code, files, _ = run_colored_main( + tmp_path, self.sources, self.services, group, color, guard + ) + assert exit_code == pytest.ExitCode.USAGE_ERROR + assert files == [] + + def test_refuses_a_missing_inventory(self, tmp_path: Path) -> None: + exit_code, files, _ = run_colored_main(tmp_path, self.sources, None, 1, "lite") + assert exit_code == pytest.ExitCode.USAGE_ERROR + assert files == [] diff --git a/devservices/config.yml b/devservices/config.yml index 06ef79c8e80c..c7078f98f44c 100644 --- a/devservices/config.yml +++ b/devservices/config.yml @@ -209,6 +209,10 @@ x-sentry-service-config: ] backend-ci: [snuba, postgres, redis, bigtable, redis-cluster, symbolicator, objectstore] + # backend-ci without Snuba, ClickHouse, Kafka or Symbolicator, for full-run + # backend test shards whose tests use none of them (see + # .github/workflows/scripts/backend-test-services.py). + backend-ci-lite: [postgres, redis, bigtable, redis-cluster, objectstore] symbolicator: [postgres, snuba, symbolicator, spotlight, objectstore] memcached: [postgres, snuba, memcached, spotlight] tracing: