Skip to content

Commit 57107d8

Browse files
authored
feat(inbound-filters): Turn on some filters for new Javascript projects (#62654)
this pr will update how projects are created so that new javascript platform projects have some of the inbound filters turned on by default. browser extension, health check transaction, legacy browser, and web crawler filters will be on by default for these new javascript based projects. it will not impact projects of any other platform, nor will it change the filters for any existing project.
1 parent 6f21f54 commit 57107d8

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

src/sentry/api/endpoints/team_projects.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
from rest_framework.request import Request
77
from rest_framework.response import Response
88

9-
from sentry import audit_log
9+
from sentry import audit_log, features
1010
from sentry.api.api_owners import ApiOwner
1111
from sentry.api.api_publish_status import ApiPublishStatus
1212
from sentry.api.base import EnvironmentMixin, region_silo_endpoint
1313
from sentry.api.bases.team import TeamEndpoint, TeamPermission
1414
from sentry.api.fields.sentry_slug import SentrySerializerSlugField
15+
from sentry.api.helpers.default_inbound_filters import set_default_inbound_filters
1516
from sentry.api.paginator import OffsetPaginator
1617
from sentry.api.serializers import ProjectSummarySerializer, serialize
1718
from sentry.api.serializers.models.project import OrganizationProjectResponse, ProjectSerializer
@@ -182,6 +183,14 @@ def post(self, request: Request, team) -> Response:
182183

183184
# XXX: create sample event?
184185

186+
# Turns on some inbound filters by default for new Javascript platform projects
187+
if (
188+
features.has("organizations:default-inbound-filters", team.organization)
189+
and project.platform
190+
and project.platform.startswith("javascript")
191+
):
192+
set_default_inbound_filters(project)
193+
185194
self.create_audit_entry(
186195
request=request,
187196
organization=team.organization,
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from typing import Dict, List, Union
2+
3+
from sentry.ingest import inbound_filters
4+
5+
6+
# Turns on certain inbound filters by default for project.
7+
def set_default_inbound_filters(project):
8+
state: Dict[str, Union[bool, List[str]]] = {}
9+
filters = [
10+
"browser-extensions",
11+
"legacy-browsers",
12+
"web-crawlers",
13+
"filtered-transaction",
14+
]
15+
16+
for filter_id in filters:
17+
if filter_id == "legacy-browsers":
18+
state["subfilters"] = [
19+
"ie_pre_9",
20+
"ie9",
21+
"ie10",
22+
"ie11",
23+
"safari_pre_6",
24+
"opera_pre_15",
25+
"opera_mini_pre_8",
26+
"android_pre_4",
27+
"edge_pre_79",
28+
]
29+
else:
30+
state["active"] = True
31+
32+
inbound_filters.set_filter_state(filter_id, project, state)

tests/sentry/api/endpoints/test_team_projects.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from sentry.ingest import inbound_filters
12
from sentry.models.project import Project
23
from sentry.models.rule import Rule
34
from sentry.notifications.types import FallthroughChoiceType
@@ -143,3 +144,45 @@ def test_without_default_rules(self):
143144
)
144145
project = Project.objects.get(id=response.data["id"])
145146
assert not Rule.objects.filter(project=project).exists()
147+
148+
@with_feature("organizations:default-inbound-filters")
149+
def test_default_inbound_filters(self):
150+
filters = ["browser-extensions", "legacy-browsers", "web-crawlers", "filtered-transaction"]
151+
python_response = self.get_success_response(
152+
self.organization.slug,
153+
self.team.slug,
154+
**self.data,
155+
status_code=201,
156+
)
157+
158+
python_project = Project.objects.get(id=python_response.data["id"])
159+
160+
python_filter_states = {
161+
filter_id: inbound_filters.get_filter_state(filter_id, python_project)
162+
for filter_id in filters
163+
}
164+
165+
assert not python_filter_states["browser-extensions"]
166+
assert not python_filter_states["legacy-browsers"]
167+
assert not python_filter_states["web-crawlers"]
168+
assert python_filter_states["filtered-transaction"]
169+
170+
project_data = {"name": "foo", "slug": "baz", "platform": "javascript-react"}
171+
javascript_response = self.get_success_response(
172+
self.organization.slug,
173+
self.team.slug,
174+
**project_data,
175+
status_code=201,
176+
)
177+
178+
javascript_project = Project.objects.get(id=javascript_response.data["id"])
179+
180+
javascript_filter_states = {
181+
filter_id: inbound_filters.get_filter_state(filter_id, javascript_project)
182+
for filter_id in filters
183+
}
184+
185+
assert javascript_filter_states["browser-extensions"]
186+
assert javascript_filter_states["legacy-browsers"]
187+
assert javascript_filter_states["web-crawlers"]
188+
assert javascript_filter_states["filtered-transaction"]

0 commit comments

Comments
 (0)