Skip to content

Commit 1866851

Browse files
authored
Merge branch 'master' into cmanallen/release-optimize-another-query
2 parents 9d114de + d8c0900 commit 1866851

File tree

199 files changed

+1565
-1304
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

199 files changed

+1565
-1304
lines changed

src/sentry/analytics/event.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,13 @@ def from_instance(cls, instance: Any, **kwargs: Any) -> Self:
113113
**{
114114
f.name: kwargs.get(f.name, getattr(instance, f.name, None))
115115
for f in fields(cls)
116-
if f.name not in ("type", "uuid_", "datetime_")
116+
if f.name
117+
not in (
118+
"type",
119+
"uuid_",
120+
"datetime_",
121+
"data", # TODO: remove this data field once migrated
122+
)
117123
}
118124
)
119125

src/sentry/api/endpoints/project_details.py

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@
3636
from sentry.deletions.models.scheduleddeletion import RegionScheduledDeletion
3737
from sentry.dynamic_sampling import get_supported_biases_ids, get_user_biases
3838
from sentry.dynamic_sampling.types import DynamicSamplingMode
39-
from sentry.dynamic_sampling.utils import (
40-
has_custom_dynamic_sampling,
41-
has_dynamic_sampling,
42-
has_dynamic_sampling_minimum_sample_rate,
43-
)
39+
from sentry.dynamic_sampling.utils import has_custom_dynamic_sampling, has_dynamic_sampling
4440
from sentry.grouping.enhancer import Enhancements
4541
from sentry.grouping.enhancer.exceptions import InvalidEnhancerConfig
4642
from sentry.grouping.fingerprinting import FingerprintingRules, InvalidFingerprintingConfig
@@ -131,7 +127,6 @@ class ProjectMemberSerializer(serializers.Serializer):
131127
"copy_from_project",
132128
"targetSampleRate",
133129
"dynamicSamplingBiases",
134-
"dynamicSamplingMinimumSampleRate",
135130
"tempestFetchScreenshots",
136131
"tempestFetchDumps",
137132
"autofixAutomationTuning",
@@ -225,7 +220,6 @@ class ProjectAdminSerializer(ProjectMemberSerializer):
225220
copy_from_project = serializers.IntegerField(required=False)
226221
targetSampleRate = serializers.FloatField(required=False, min_value=0, max_value=1)
227222
dynamicSamplingBiases = DynamicSamplingBiasSerializer(required=False, many=True)
228-
dynamicSamplingMinimumSampleRate = serializers.BooleanField(required=False)
229223
tempestFetchScreenshots = serializers.BooleanField(required=False)
230224
tempestFetchDumps = serializers.BooleanField(required=False)
231225
autofixAutomationTuning = serializers.ChoiceField(
@@ -434,15 +428,6 @@ def validate_targetSampleRate(self, value):
434428

435429
return value
436430

437-
def validate_dynamicSamplingMinimumSampleRate(self, value):
438-
organization = self.context["project"].organization
439-
actor = self.context["request"].user
440-
if not has_dynamic_sampling_minimum_sample_rate(organization, actor=actor):
441-
raise serializers.ValidationError(
442-
"Organization does not have the dynamic sampling minimum sample rate feature enabled."
443-
)
444-
return value
445-
446431
def validate_tempestFetchScreenshots(self, value):
447432
organization = self.context["project"].organization
448433
actor = self.context["request"].user
@@ -773,14 +758,6 @@ def put(self, request: Request, project) -> Response:
773758
changed_proj_settings["sentry:dynamic_sampling_biases"] = result[
774759
"dynamicSamplingBiases"
775760
]
776-
if result.get("dynamicSamplingMinimumSampleRate") is not None:
777-
if project.update_option(
778-
"sentry:dynamic_sampling_minimum_sample_rate",
779-
result["dynamicSamplingMinimumSampleRate"],
780-
):
781-
changed_proj_settings["sentry:dynamic_sampling_minimum_sample_rate"] = result[
782-
"dynamicSamplingMinimumSampleRate"
783-
]
784761

785762
if result.get("autofixAutomationTuning") is not None:
786763
if project.update_option(

src/sentry/api/serializers/models/project.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
from sentry.dynamic_sampling.utils import (
2626
has_custom_dynamic_sampling,
2727
has_dynamic_sampling,
28-
has_dynamic_sampling_minimum_sample_rate,
2928
is_project_mode_sampling,
3029
)
3130
from sentry.eventstore.models import DEFAULT_SUBJECT_TEMPLATE
@@ -950,7 +949,6 @@ class DetailedProjectResponse(ProjectWithTeamResponseDict):
950949
relayPiiConfig: str | None
951950
builtinSymbolSources: list[str]
952951
dynamicSamplingBiases: list[dict[str, str | bool]]
953-
dynamicSamplingMinimumSampleRate: bool
954952
eventProcessing: dict[str, bool]
955953
symbolSources: str
956954
isDynamicallySampled: bool
@@ -1101,9 +1099,6 @@ def serialize(
11011099
"dynamicSamplingBiases": self.get_value_with_default(
11021100
attrs, "sentry:dynamic_sampling_biases"
11031101
),
1104-
"dynamicSamplingMinimumSampleRate": self.get_value_with_default(
1105-
attrs, "sentry:dynamic_sampling_minimum_sample_rate"
1106-
),
11071102
"eventProcessing": {
11081103
"symbolicationDegraded": False,
11091104
},
@@ -1123,11 +1118,6 @@ def serialize(
11231118
)
11241119
data["tempestFetchDumps"] = attrs["options"].get("sentry:tempest_fetch_dumps", False)
11251120

1126-
if has_dynamic_sampling_minimum_sample_rate(obj.organization, user):
1127-
data["dynamicSamplingMinimumSampleRate"] = bool(
1128-
obj.get_option("sentry:dynamic_sampling_minimum_sample_rate")
1129-
)
1130-
11311121
return data
11321122

11331123
def format_options(self, attrs: Mapping[str, Any]) -> dict[str, Any]:

src/sentry/apidocs/examples/project_examples.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@
152152
"filters:releases": "",
153153
"filters:error_messages": "",
154154
"feedback:branding": True,
155-
"sentry:dynamic_sampling_minimum_sample_rate": True,
156155
},
157156
"digestsMinDelay": 180,
158157
"digestsMaxDelay": 600,
@@ -260,7 +259,6 @@
260259
{"id": "boostReplayId", "active": True},
261260
{"id": "recalibrationRule", "active": True},
262261
],
263-
"dynamicSamplingMinimumSampleRate": True,
264262
"eventProcessing": {"symbolicationDegraded": False},
265263
"symbolSources": "[]",
266264
"tempestFetchScreenshots": False,

src/sentry/conf/server.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,8 @@ def SOCIAL_AUTH_DEFAULT_USERNAME() -> str:
853853
"sentry.integrations.vsts.tasks.kickoff_subscription_check",
854854
"sentry.integrations.tasks",
855855
"sentry.demo_mode.tasks",
856+
"sentry.workflow_engine.tasks.workflows",
857+
"sentry.workflow_engine.tasks.actions",
856858
)
857859

858860
# Enable split queue routing
@@ -1023,6 +1025,7 @@ def SOCIAL_AUTH_DEFAULT_USERNAME() -> str:
10231025
Queue("release_registry", routing_key="release_registry"),
10241026
Queue("seer.seer_automation", routing_key="seer.seer_automation"),
10251027
Queue("workflow_engine.process_workflows", routing_key="workflow_engine.process_workflows"),
1028+
Queue("workflow_engine.trigger_action", routing_key="workflow_engine.trigger_action"),
10261029
]
10271030

10281031
from celery.schedules import crontab
@@ -1516,6 +1519,8 @@ def SOCIAL_AUTH_DEFAULT_USERNAME() -> str:
15161519
"sentry.uptime.rdap.tasks",
15171520
"sentry.uptime.subscriptions.tasks",
15181521
"sentry.workflow_engine.processors.delayed_workflow",
1522+
"sentry.workflow_engine.tasks.workflows",
1523+
"sentry.workflow_engine.tasks.actions",
15191524
# Used for tests
15201525
"sentry.taskworker.tasks.examples",
15211526
)

src/sentry/dynamic_sampling/utils.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,6 @@ def has_custom_dynamic_sampling(
2525
)
2626

2727

28-
def has_dynamic_sampling_minimum_sample_rate(
29-
organization: Organization | None, actor: User | RpcUser | AnonymousUser | None = None
30-
) -> bool:
31-
return (
32-
organization is not None
33-
and features.has(
34-
"organizations:dynamic-sampling-minimum-sample-rate", organization, actor=actor
35-
)
36-
and has_custom_dynamic_sampling(organization, actor=actor)
37-
)
38-
39-
4028
def is_project_mode_sampling(organization: Organization | None) -> bool:
4129
return (
4230
organization is not None

src/sentry/features/temporary.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,6 @@ def register_temporary_features(manager: FeatureManager):
161161
manager.add("organizations:issue-search-snuba", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
162162
# Enable the new issue category mapping
163163
manager.add("organizations:issue-taxonomy", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
164-
# When enabled, search bars in the application will immediately search the query is modified instead of waiting for the enter key
165-
manager.add("organizations:ui-search-on-change", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
166164
manager.add("organizations:metric-issue-poc", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
167165
manager.add("projects:metric-issue-creation", ProjectFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
168166
manager.add("organizations:issue-open-periods", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
@@ -515,6 +513,8 @@ def register_temporary_features(manager: FeatureManager):
515513
manager.add("organizations:workflow-engine-rule-serializers", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
516514
# Enable async processing of event workflows in a task rather than as part of post_process.
517515
manager.add("organizations:workflow-engine-post-process-async", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
516+
# Enable async processing of actions in a task rather than as part of post_process.
517+
manager.add("organizations:workflow-engine-action-trigger-async", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=False)
518518
# Enable EventUniqueUserFrequencyConditionWithConditions special alert condition
519519
manager.add("organizations:event-unique-user-frequency-condition-with-conditions", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
520520
# Use spans instead of transactions for dynamic sampling calculations. This will become the new default.

src/sentry/integrations/opsgenie/actions/form.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from sentry.integrations.opsgenie.utils import get_team
1212
from sentry.integrations.services.integration import integration_service
1313
from sentry.integrations.services.integration.model import RpcOrganizationIntegration
14+
from sentry.integrations.types import IntegrationProviderSlug
1415
from sentry.utils.forms import set_field_choices
1516

1617
INVALID_TEAM = 1
@@ -69,7 +70,7 @@ def _validate_team(self, team_id: str | None, integration_id: int | None) -> Non
6970
"team": dict(self._teams).get(team_id),
7071
}
7172
integration = integration_service.get_integration(
72-
integration_id=integration_id, provider="opsgenie"
73+
integration_id=integration_id, provider=IntegrationProviderSlug.OPSGENIE.value
7374
)
7475
org_integration = integration_service.get_organization_integration(
7576
integration_id=integration_id,

src/sentry/integrations/opsgenie/actions/notification.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
)
1414
from sentry.integrations.opsgenie.utils import get_team
1515
from sentry.integrations.services.integration import integration_service
16+
from sentry.integrations.types import IntegrationProviderSlug
1617
from sentry.rules.actions import IntegrationEventAction
1718
from sentry.shared_integrations.exceptions import ApiError
1819

@@ -25,7 +26,7 @@ class OpsgenieNotifyTeamAction(IntegrationEventAction):
2526
"Send a notification to Opsgenie account {account} and team {team} with {priority} priority"
2627
)
2728
prompt = "Send an Opsgenie notification"
28-
provider = "opsgenie"
29+
provider = IntegrationProviderSlug.OPSGENIE.value
2930
integration_key = "account"
3031

3132
def __init__(self, *args, **kwargs):

src/sentry/integrations/opsgenie/client.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from sentry.integrations.on_call.metrics import OnCallInteractionType
1010
from sentry.integrations.opsgenie.metrics import record_event, record_lifecycle_termination_level
1111
from sentry.integrations.services.integration.model import RpcIntegration
12+
from sentry.integrations.types import IntegrationProviderSlug
1213
from sentry.models.group import Group
1314
from sentry.notifications.utils.links import create_link_to_workflow
1415
from sentry.notifications.utils.rules import get_key_from_rule_data
@@ -22,7 +23,7 @@
2223

2324

2425
class OpsgenieClient(ApiClient):
25-
integration_name = "opsgenie"
26+
integration_name = IntegrationProviderSlug.OPSGENIE.value
2627

2728
def __init__(self, integration: RpcIntegration | Integration, integration_key: str) -> None:
2829
self.integration = integration
@@ -86,7 +87,7 @@ def build_issue_alert_payload(
8687
if group:
8788
payload["alias"] = f"sentry: {group.id}"
8889
payload["entity"] = group.culprit if group.culprit else ""
89-
group_params = {"referrer": "opsgenie"}
90+
group_params = {"referrer": IntegrationProviderSlug.OPSGENIE.value}
9091
if notification_uuid:
9192
group_params["notification_uuid"] = notification_uuid
9293
rule_workflow_context = {}

0 commit comments

Comments
 (0)