Skip to content

Commit

Permalink
Merge branch 'master' into scttcper/streamline-routes
Browse files Browse the repository at this point in the history
  • Loading branch information
scttcper committed Sep 27, 2024
2 parents 7b68bb4 + 540274c commit b91e127
Show file tree
Hide file tree
Showing 126 changed files with 1,690 additions and 1,340 deletions.
18 changes: 0 additions & 18 deletions fixtures/backup/model_dependencies/detailed.json
Original file line number Diff line number Diff line change
Expand Up @@ -6427,24 +6427,6 @@
]
]
},
"workflow_engine.workflowaction": {
"dangling": false,
"foreign_keys": {
"workflow": {
"kind": "FlexibleForeignKey",
"model": "workflow_engine.workflow",
"nullable": false
}
},
"model": "workflow_engine.workflowaction",
"relocation_dependencies": [],
"relocation_scope": "Organization",
"silos": [
"Region"
],
"table_name": "workflow_engine_workflowaction",
"uniques": []
},
"workflow_engine.workflowdataconditiongroup": {
"dangling": false,
"foreign_keys": {
Expand Down
3 changes: 0 additions & 3 deletions fixtures/backup/model_dependencies/flat.json
Original file line number Diff line number Diff line change
Expand Up @@ -888,9 +888,6 @@
"sentry.organization",
"workflow_engine.dataconditiongroup"
],
"workflow_engine.workflowaction": [
"workflow_engine.workflow"
],
"workflow_engine.workflowdataconditiongroup": [
"workflow_engine.dataconditiongroup",
"workflow_engine.workflow"
Expand Down
1 change: 0 additions & 1 deletion fixtures/backup/model_dependencies/sorted.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@
"workflow_engine.datasource",
"workflow_engine.detector",
"workflow_engine.workflow",
"workflow_engine.workflowaction",
"workflow_engine.workflowdataconditiongroup",
"workflow_engine.detectorworkflow",
"workflow_engine.datasourcedetector",
Expand Down
1 change: 0 additions & 1 deletion fixtures/backup/model_dependencies/truncate.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@
"workflow_engine_datasource",
"workflow_engine_detector",
"workflow_engine_workflow",
"workflow_engine_workflowaction",
"workflow_engine_workflowdataconditiongroup",
"workflow_engine_detectorworkflow",
"workflow_engine_datasourcedetector",
Expand Down
7 changes: 0 additions & 7 deletions jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,8 @@ const {
GITHUB_PR_REF,
GITHUB_RUN_ID,
GITHUB_RUN_ATTEMPT,
USING_YARN_TEST,
} = process.env;

if (USING_YARN_TEST === undefined) {
// eslint-disable-next-line no-console
console.error('Do not run `jest` directly, use `yarn test` instead!');
process.exit();
}

const IS_MASTER_BRANCH = GITHUB_PR_REF === 'refs/heads/master';

const BALANCE_RESULTS_PATH = path.resolve(
Expand Down
2 changes: 1 addition & 1 deletion migrations_lockfile.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ replays: 0004_index_together
sentry: 0768_fix_old_group_first_seen_dates
social_auth: 0002_default_auto_field
uptime: 0013_uptime_subscription_new_unique
workflow_engine: 0006_data_conditions
workflow_engine: 0007_loosen_workflow_action_relationship
3 changes: 0 additions & 3 deletions scripts/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ process.env.NODE_ENV = 'test';
process.env.PUBLIC_URL = '';
process.env.TZ = 'America/New_York';

// Marker to indicate that we've correctly ran with `yarn test`.
process.env.USING_YARN_TEST = true;

// Makes the script crash on unhandled rejections instead of silently
// ignoring them. In the future, promise rejections that are not handled will
// terminate the Node.js process with a non-zero exit code.
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/group_external_issue_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import region_silo_endpoint
from sentry.api.bases.group import GroupEndpoint
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue


@region_silo_endpoint
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/endpoints/group_external_issues.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from sentry.api.base import region_silo_endpoint
from sentry.api.bases.group import GroupEndpoint
from sentry.api.serializers import serialize
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue


@region_silo_endpoint
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/serializers/models/group.py
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,7 @@ def _resolve_resolutions(

@staticmethod
def _resolve_external_issue_annotations(groups: Sequence[Group]) -> Mapping[int, Sequence[Any]]:
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue

# find the external issues for sentry apps and add them in
return (
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/api/serializers/models/group_stream.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
from sentry.models.groupinbox import get_inbox_details
from sentry.models.grouplink import GroupLink
from sentry.models.groupowner import get_owner_details
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.api.serializers.platform_external_issue import (
PlatformExternalIssueSerializer,
)
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue
from sentry.snuba.dataset import Dataset
from sentry.tsdb.base import TSDBModel
from sentry.utils import metrics
Expand Down
1 change: 0 additions & 1 deletion src/sentry/backup/comparators.py
Original file line number Diff line number Diff line change
Expand Up @@ -882,7 +882,6 @@ def get_default_comparators() -> dict[str, list[JSONScrubbingComparator]]:
DateUpdatedComparator("date_updated", "date_added")
],
"workflow_engine.workflow": [DateUpdatedComparator("date_updated", "date_added")],
"workflow_engine.workflowaction": [DateUpdatedComparator("date_updated", "date_added")],
"workflow_engine.workflowdataconditiongroup": [
DateUpdatedComparator("date_updated", "date_added")
],
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/deletions/defaults/platform_external_issue.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from collections.abc import Sequence

from sentry.deletions.base import ModelDeletionTask
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue


class PlatformExternalIssueDeletionTask(ModelDeletionTask[PlatformExternalIssue]):
Expand Down
29 changes: 6 additions & 23 deletions src/sentry/event_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,7 @@
GroupingConfig,
get_grouping_config_dict_for_project,
)
from sentry.grouping.ingest.config import (
is_in_transition,
project_uses_optimized_grouping,
update_grouping_config_if_needed,
)
from sentry.grouping.ingest.config import is_in_transition, update_grouping_config_if_needed
from sentry.grouping.ingest.hashing import (
find_existing_grouphash,
get_hash_values,
Expand Down Expand Up @@ -517,12 +513,10 @@ def save(
return jobs[0]["event"]
else:
project = job["event"].project
job["optimized_grouping"] = project_uses_optimized_grouping(project)
job["in_grouping_transition"] = is_in_transition(project)
metric_tags = {
"platform": job["event"].platform or "unknown",
"sdk": normalized_sdk_tag_from_event(job["event"].data),
"using_transition_optimization": job["optimized_grouping"],
"in_transition": job["in_grouping_transition"],
}
# This metric allows differentiating from all calls to the `event_manager.save` metric
Expand Down Expand Up @@ -1323,20 +1317,11 @@ def get_culprit(data: Mapping[str, Any]) -> str:

@sentry_sdk.tracing.trace
def assign_event_to_group(event: Event, job: Job, metric_tags: MutableTags) -> GroupInfo | None:
if job["optimized_grouping"]:
group_info = _save_aggregate_new(
event=event,
job=job,
metric_tags=metric_tags,
)
else:
group_info = _save_aggregate(
event=event,
job=job,
release=job["release"],
received_timestamp=job["received_timestamp"],
metric_tags=metric_tags,
)
group_info = _save_aggregate_new(
event=event,
job=job,
metric_tags=metric_tags,
)

if group_info:
event.group = group_info.group
Expand Down Expand Up @@ -1585,8 +1570,6 @@ def _save_aggregate(
return GroupInfo(group, is_new, is_regression)


# TODO: None of the seer logic has been added to this version yet, so you can't simultaneously use
# optimized transitions and seer
def _save_aggregate_new(
event: Event,
job: Job,
Expand Down
2 changes: 2 additions & 0 deletions src/sentry/features/temporary.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ def register_temporary_features(manager: FeatureManager):
manager.add("organizations:custom-metrics-experimental", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enable daily summary
manager.add("organizations:daily-summary", OrganizationFeature, FeatureHandlerStrategy.INTERNAL, api_expose=False)
# Enable events analytics platform data in dashboards
manager.add("organizations:dashboards-eap", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enables import/export functionality for dashboards
manager.add("organizations:dashboards-import", OrganizationFeature, FeatureHandlerStrategy.FLAGPOLE, api_expose=True)
# Enable metrics enhanced performance in dashboards
Expand Down
3 changes: 1 addition & 2 deletions src/sentry/grouping/ingest/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from sentry import options
from sentry.grouping.api import GroupingConfig
from sentry.grouping.ingest.config import is_in_transition, project_uses_optimized_grouping
from sentry.grouping.ingest.config import is_in_transition
from sentry.models.project import Project
from sentry.utils import metrics
from sentry.utils.tag_normalization import normalized_sdk_tag_from_event
Expand Down Expand Up @@ -65,7 +65,6 @@ def record_calculation_metric_with_result(
# count to get an average number of calculations per event
tags = {
"in_transition": str(is_in_transition(project)),
"using_transition_optimization": str(project_uses_optimized_grouping(project)),
"result": result,
}
metrics.incr(
Expand Down
61 changes: 8 additions & 53 deletions src/sentry/incidents/logic.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
from django.db.models.signals import post_save
from django.forms import ValidationError
from django.utils import timezone as django_timezone
from parsimonious.exceptions import ParseError
from snuba_sdk import Column, Condition, Limit, Op
from urllib3.exceptions import MaxRetryError, TimeoutError

from sentry import analytics, audit_log, features, quotas
from sentry.api.exceptions import ResourceDoesNotExist
Expand Down Expand Up @@ -71,7 +69,7 @@
)
from sentry.search.events.fields import is_function, resolve_field
from sentry.seer.anomaly_detection.delete_rule import delete_rule_in_seer
from sentry.seer.anomaly_detection.store_data import send_historical_data_to_seer
from sentry.seer.anomaly_detection.store_data import send_new_rule_data, update_rule_data
from sentry.sentry_apps.services.app import RpcSentryAppInstallation, app_service
from sentry.shared_integrations.exceptions import (
ApiTimeoutError,
Expand Down Expand Up @@ -568,20 +566,17 @@ def create_alert_rule(
"""
if monitor_type == AlertRuleMonitorTypeInt.ACTIVATED and not activation_condition:
raise ValidationError("Activation condition required for activated alert rule")
if detection_type == AlertRuleDetectionType.DYNAMIC:
resolution = time_window
else:
resolution = get_alert_resolution(time_window, organization)

if detection_type == AlertRuleDetectionType.DYNAMIC:
resolution = time_window
# NOTE: we hardcode seasonality for EA
seasonality = AlertRuleSeasonality.AUTO
if not (sensitivity):
raise ValidationError("Dynamic alerts require a sensitivity level")
if time_window not in DYNAMIC_TIME_WINDOWS:
raise ValidationError(INVALID_TIME_WINDOW)
else:
# NOTE: we hardcode seasonality for EA
resolution = get_alert_resolution(time_window, organization)
seasonality = None
if sensitivity:
raise ValidationError("Sensitivity is not a valid field for this alert type")
Expand Down Expand Up @@ -657,26 +652,8 @@ def create_alert_rule(
raise ResourceDoesNotExist(
"Your organization does not have access to this feature."
)

try:
# NOTE: if adding a new metric alert type, take care to check that it's handled here
rule_status = send_historical_data_to_seer(
alert_rule=alert_rule, project=projects[0]
)
if rule_status == AlertRuleStatus.NOT_ENOUGH_DATA:
# if we don't have at least seven days worth of data, then the dynamic alert won't fire
alert_rule.update(status=AlertRuleStatus.NOT_ENOUGH_DATA.value)
except (TimeoutError, MaxRetryError):
alert_rule.delete()
raise TimeoutError("Failed to send data to Seer - cannot create alert rule.")
except ParseError:
alert_rule.delete()
raise ParseError("Failed to parse Seer store data response")
except (ValidationError, Exception):
alert_rule.delete()
raise
else:
metrics.incr("anomaly_detection_alert.created")
# NOTE: if adding a new metric alert type, take care to check that it's handled here
send_new_rule_data(alert_rule, projects[0])

if user:
create_audit_entry_from_user(
Expand Down Expand Up @@ -936,31 +913,9 @@ def update_alert_rule(
raise ResourceDoesNotExist(
"Your organization does not have access to this feature."
)

if updated_fields.get("detection_type") == AlertRuleDetectionType.DYNAMIC and (
alert_rule.detection_type != AlertRuleDetectionType.DYNAMIC or query or aggregate
):
for k, v in updated_fields.items():
setattr(alert_rule, k, v)

try:
# NOTE: if adding a new metric alert type, take care to check that it's handled here
rule_status = send_historical_data_to_seer(
alert_rule=alert_rule,
project=projects[0] if projects else alert_rule.projects.get(),
)
if rule_status == AlertRuleStatus.NOT_ENOUGH_DATA:
# if we don't have at least seven days worth of data, then the dynamic alert won't fire
alert_rule.update(status=AlertRuleStatus.NOT_ENOUGH_DATA.value)
except (TimeoutError, MaxRetryError):
raise TimeoutError("Failed to send data to Seer - cannot update alert rule.")
except ParseError:
raise ParseError(
"Failed to parse Seer store data response - cannot update alert rule."
)
except (ValidationError, Exception):
# If there's no historical data available—something went wrong when querying snuba
raise ValidationError("Failed to send data to Seer - cannot update alert rule.")
# NOTE: if adding a new metric alert type, take care to check that it's handled here
project = projects[0] if projects else alert_rule.projects.get()
update_rule_data(alert_rule, project, updated_fields, updated_query_fields)
else:
# if this was a dynamic rule, delete the data in Seer
if alert_rule.detection_type == AlertRuleDetectionType.DYNAMIC:
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/issues/endpoints/group_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@
from sentry.models.groupowner import get_owner_details
from sentry.models.groupseen import GroupSeen
from sentry.models.groupsubscription import GroupSubscriptionManager
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.models.team import Team
from sentry.models.userreport import UserReport
from sentry.plugins.base import plugins
from sentry.sentry_apps.api.serializers.platform_external_issue import (
PlatformExternalIssueSerializer,
)
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue
from sentry.tasks.post_process import fetch_buffered_group_stats
from sentry.types.ratelimit import RateLimit, RateLimitCategory
from sentry.users.services.user.service import user_service
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/mediators/external_issues/creator.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from sentry.mediators.mediator import Mediator
from sentry.mediators.param import Param
from sentry.models.group import Group
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.services.app import RpcSentryAppInstallation


Expand Down
2 changes: 1 addition & 1 deletion src/sentry/mediators/external_issues/issue_link_creator.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from sentry.mediators.mediator import Mediator
from sentry.mediators.param import Param
from sentry.models.group import Group
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue
from sentry.sentry_apps.services.app import RpcSentryAppInstallation
from sentry.users.services.user import RpcUser

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from ..sentry_apps.models.platformexternalissue import * # NOQA
from .activity import * # NOQA
from .apiapplication import * # NOQA
from .apiauthorization import * # NOQA
Expand Down Expand Up @@ -75,7 +76,6 @@
from .organizationslugreservation import * # NOQA
from .organizationslugreservationreplica import * # NOQA
from .orgauthtoken import * # NOQA
from .platformexternalissue import * # NOQA
from .project import * # NOQA
from .projectbookmark import * # NOQA
from .projectcodeowners import * # NOQA
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/search/snuba/backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
from sentry.models.grouplink import GroupLink
from sentry.models.groupowner import GroupOwner
from sentry.models.groupsubscription import GroupSubscription
from sentry.models.platformexternalissue import PlatformExternalIssue
from sentry.models.project import Project
from sentry.models.release import Release
from sentry.models.team import Team
Expand All @@ -40,6 +39,7 @@
PostgresSnubaQueryExecutor,
TrendsSortWeights,
)
from sentry.sentry_apps.models.platformexternalissue import PlatformExternalIssue
from sentry.users.models.user import User
from sentry.utils import metrics
from sentry.utils.cursors import Cursor, CursorResult
Expand Down
Loading

0 comments on commit b91e127

Please sign in to comment.