Browse Source

Revert "ref(projectconfigs): Introduce versioned project config builds (#55383)"

This reverts commit 504cc10b053e6c3f91a92a7c732a369d89a7df8f.

Co-authored-by: iker-barriocanal <32816711+iker-barriocanal@users.noreply.github.com>
getsentry-bot 1 year ago
parent
commit
9dd777e109

+ 11 - 15
src/sentry/api/endpoints/relay/project_configs.py

@@ -66,18 +66,16 @@ class RelayProjectConfigsEndpoint(Endpoint):
             # Always compute the full config. It's invalid to send partial
             # configs to processing relays, and these validate the requests they
             # get with permissions and trim configs down accordingly.
-            response.update(
-                # XXX(iker): we assume we can safely parse the version by
-                # casting it to an int if `_should_post_or_schedule` returns True
-                self._post_or_schedule_by_key(request, version=int(version))
-            )
+            response.update(self._post_or_schedule_by_key(request))
         elif version in ["2", "3", "4"]:
             response["configs"] = self._post_by_key(
-                request=request, full_config_requested=full_config_requested, version=int(version)
+                request=request,
+                full_config_requested=full_config_requested,
             )
         elif version == "1":
             response["configs"] = self._post_by_project(
-                request=request, full_config_requested=full_config_requested, version=1
+                request=request,
+                full_config_requested=full_config_requested,
             )
         else:
             return Response("Unsupported version, we only support versions 1 to 4.", 400)
@@ -132,13 +130,13 @@ class RelayProjectConfigsEndpoint(Endpoint):
 
         return post_or_schedule
 
-    def _post_or_schedule_by_key(self, request: Request, version: int):
+    def _post_or_schedule_by_key(self, request: Request):
         public_keys = set(request.relay_request_data.get("publicKeys") or ())
 
         proj_configs = {}
         pending = []
         for key in public_keys:
-            computed = self._get_cached_or_schedule(key, version)
+            computed = self._get_cached_or_schedule(key)
             if not computed:
                 pending.append(key)
             else:
@@ -152,7 +150,7 @@ class RelayProjectConfigsEndpoint(Endpoint):
         metrics.incr("relay.project_configs.post_v3.fetched", amount=len(proj_configs))
         return {"configs": proj_configs, "pending": pending}
 
-    def _get_cached_or_schedule(self, public_key, version: int) -> Optional[dict]:
+    def _get_cached_or_schedule(self, public_key) -> Optional[dict]:
         """
         Returns the config of a project if it's in the cache; else, schedules a
         task to compute and write it into the cache.
@@ -163,11 +161,11 @@ class RelayProjectConfigsEndpoint(Endpoint):
         if cached_config:
             return cached_config
 
-        schedule_build_project_config(public_key=public_key, version=version)
+        schedule_build_project_config(public_key=public_key)
         return None
 
     def _post_by_key(
-        self, request: Request, full_config_requested, version: int
+        self, request: Request, full_config_requested
     ) -> MutableMapping[str, ProjectConfig]:
         public_keys = request.relay_request_data.get("publicKeys")
         public_keys = set(public_keys or ())
@@ -238,7 +236,6 @@ class RelayProjectConfigsEndpoint(Endpoint):
                         project,
                         full_config=full_config_requested,
                         project_keys=[key],
-                        version=version,
                     )
 
             configs[public_key] = project_config.to_dict()
@@ -249,7 +246,7 @@ class RelayProjectConfigsEndpoint(Endpoint):
         return configs
 
     def _post_by_project(
-        self, request: Request, full_config_requested, version: int
+        self, request: Request, full_config_requested
     ) -> MutableMapping[str, ProjectConfig]:
         project_ids = set(request.relay_request_data.get("projects") or ())
 
@@ -305,7 +302,6 @@ class RelayProjectConfigsEndpoint(Endpoint):
                         project,
                         full_config=full_config_requested,
                         project_keys=project_keys.get(project.id) or [],
-                        version=version,
                     )
 
             configs[str(project_id)] = project_config.to_dict()

+ 5 - 19
src/sentry/relay/config/__init__.py

@@ -176,12 +176,7 @@ def get_quotas(project: Project, keys: Optional[Sequence[ProjectKey]] = None) ->
 
 
 def get_project_config(
-    project: Project,
-    full_config: bool = True,
-    project_keys: Optional[Sequence[ProjectKey]] = None,
-    *,
-    # TODO(iker): default to an up-to-date version once we've moved to v4.
-    version: int = 3,
+    project: Project, full_config: bool = True, project_keys: Optional[Sequence[ProjectKey]] = None
 ) -> "ProjectConfig":
     """Constructs the ProjectConfig information.
     :param project: The project to load configuration for. Ensure that
@@ -194,16 +189,12 @@ def get_project_config(
         no project keys are provided it is assumed that the config does not
         need to contain auth information (this is the case when used in
         python's StoreView)
-    :param version: version of the project config to build.
     :return: a ProjectConfig object for the given project
     """
     with sentry_sdk.push_scope() as scope:
         scope.set_tag("project", project.id)
-        scope.set_tag("version", version)
         with metrics.timer("relay.config.get_project_config.duration"):
-            return _get_project_config(
-                project, full_config=full_config, project_keys=project_keys, version=version
-            )
+            return _get_project_config(project, full_config=full_config, project_keys=project_keys)
 
 
 def get_dynamic_sampling_config(project: Project) -> Optional[Mapping[str, Any]]:
@@ -322,11 +313,7 @@ def _should_extract_abnormal_mechanism(project: Project) -> bool:
 
 
 def _get_project_config(
-    project: Project,
-    full_config: bool = True,
-    project_keys: Optional[Sequence[ProjectKey]] = None,
-    *,
-    version: int,
+    project: Project, full_config: bool = True, project_keys: Optional[Sequence[ProjectKey]] = None
 ) -> "ProjectConfig":
     if project.status != ObjectStatus.ACTIVE:
         return ProjectConfig(project, disabled=True)
@@ -366,9 +353,8 @@ def _get_project_config(
     # anything.
     add_experimental_config(config, "dynamicSampling", get_dynamic_sampling_config, project)
 
-    if version <= 3:
-        # Limit the number of custom measurements
-        add_experimental_config(config, "measurements", get_measurements_config)
+    # Limit the number of custom measurements
+    add_experimental_config(config, "measurements", get_measurements_config)
 
     # Rules to replace high cardinality transaction names
     add_experimental_config(config, "txNameRules", get_transaction_names_config, project)

+ 11 - 19
src/sentry/tasks/relay.py

@@ -24,7 +24,7 @@ logger = logging.getLogger(__name__)
     time_limit=10,  # Extra 5 seconds to remove the debounce key.
     expires=30,  # Relay stops waiting for this anyway.
 )
-def build_project_config(version: int, public_key=None, **kwargs):
+def build_project_config(public_key=None, **kwargs):
     """Build a project config and put it in the Redis cache.
 
     This task is used to compute missing project configs, it is aggressively
@@ -36,7 +36,6 @@ def build_project_config(version: int, public_key=None, **kwargs):
     Do not invoke this task directly, instead use :func:`schedule_build_project_config`.
     """
     sentry_sdk.set_tag("public_key", public_key)
-    sentry_sdk.set_tag("version", version)
 
     try:
         from sentry.models import ProjectKey
@@ -49,7 +48,7 @@ def build_project_config(version: int, public_key=None, **kwargs):
             # avoid creating more tasks for it.
             projectconfig_cache.backend.set_many({public_key: {"disabled": True}})
         else:
-            config = compute_projectkey_config(key, version=version)
+            config = compute_projectkey_config(key)
             projectconfig_cache.backend.set_many({public_key: config})
 
     finally:
@@ -61,7 +60,7 @@ def build_project_config(version: int, public_key=None, **kwargs):
         )
 
 
-def schedule_build_project_config(public_key, version: int):
+def schedule_build_project_config(public_key):
     """Schedule the `build_project_config` with debouncing applied.
 
     See documentation of `build_project_config` for documentation of parameters.
@@ -81,7 +80,7 @@ def schedule_build_project_config(public_key, version: int):
         "relay.projectconfig_cache.scheduled",
         tags={"task": "build"},
     )
-    build_project_config.delay(version=version, public_key=public_key, tmp_scheduled=tmp_scheduled)
+    build_project_config.delay(public_key=public_key, tmp_scheduled=tmp_scheduled)
 
     # Checking if the project is debounced and debouncing it are two separate
     # actions that aren't atomic. If the process marks a project as debounced
@@ -104,7 +103,7 @@ def validate_args(organization_id=None, project_id=None, public_key=None):
         raise TypeError("Must provide exactly one of organzation_id, project_id or public_key")
 
 
-def compute_configs(organization_id=None, project_id=None, public_key=None, *, version: int):
+def compute_configs(organization_id=None, project_id=None, public_key=None):
     """Computes all configs for the org, project or single public key.
 
     You must only provide one single argument, not all.
@@ -133,7 +132,7 @@ def compute_configs(organization_id=None, project_id=None, public_key=None, *, v
                     # recalculate it.  If the config was not there at all, we leave it and avoid the
                     # cost of re-computation.
                     if projectconfig_cache.backend.get(key.public_key) is not None:
-                        configs[key.public_key] = compute_projectkey_config(key, version=version)
+                        configs[key.public_key] = compute_projectkey_config(key)
                         action = "recompute"
                     else:
                         action = "not-cached"
@@ -149,7 +148,7 @@ def compute_configs(organization_id=None, project_id=None, public_key=None, *, v
                 # recalculate it.  If the config was not there at all, we leave it and avoid the
                 # cost of re-computation.
                 if projectconfig_cache.backend.get(key.public_key) is not None:
-                    configs[key.public_key] = compute_projectkey_config(key, version=version)
+                    configs[key.public_key] = compute_projectkey_config(key)
                     action = "recompute"
                 else:
                     action = "not-cached"
@@ -171,7 +170,7 @@ def compute_configs(organization_id=None, project_id=None, public_key=None, *, v
             # bug was fixed in https://github.com/getsentry/sentry/pull/35671
             configs[public_key] = {"disabled": True}
         else:
-            configs[public_key] = compute_projectkey_config(key, version=version)
+            configs[public_key] = compute_projectkey_config(key)
 
     else:
         raise TypeError("One of the arguments must not be None")
@@ -179,7 +178,7 @@ def compute_configs(organization_id=None, project_id=None, public_key=None, *, v
     return configs
 
 
-def compute_projectkey_config(key, *, version: int):
+def compute_projectkey_config(key):
     """Computes a single config for the given :class:`ProjectKey`.
 
     :returns: A dict with the project config.
@@ -190,9 +189,7 @@ def compute_projectkey_config(key, *, version: int):
     if key.status != ProjectKeyStatus.ACTIVE:
         return {"disabled": True}
     else:
-        return get_project_config(
-            key.project, project_keys=[key], full_config=True, version=version
-        ).to_dict()
+        return get_project_config(key.project, project_keys=[key], full_config=True).to_dict()
 
 
 @instrumented_task(
@@ -242,12 +239,7 @@ def invalidate_project_config(
     sentry_sdk.set_context("kwargs", kwargs)
 
     updated_configs = compute_configs(
-        organization_id=organization_id,
-        project_id=project_id,
-        public_key=public_key,
-        # TODO(iker): schedule invalidations with up-to-date versions once we've
-        # moved to v4.
-        version=3,
+        organization_id=organization_id, project_id=project_id, public_key=public_key
     )
     projectconfig_cache.backend.set_many(updated_configs)
 

+ 0 - 21
tests/sentry/api/endpoints/test_relay_globalconfig_v4.py

@@ -3,7 +3,6 @@ from unittest.mock import patch
 import pytest
 from django.urls import reverse
 
-from sentry.relay.config import get_project_config
 from sentry.relay.globalconfig import get_global_config
 from sentry.testutils.pytest.fixtures import django_db_all
 from sentry.utils import json
@@ -87,23 +86,3 @@ def test_return_global_config_on_right_version(
         assert "global" not in result
     else:
         assert result.get("global") == {"global_mock_config": True}
-
-
-@django_db_all
-def test_projectconfig_no_duplicates(default_project):
-    """Verifies a project config doesn't get any duplicated data existing in
-    global config.
-
-    Note the key may exist in both configs, so that the project config overrides
-    the global config.
-    """
-
-    global_config = get_global_config()
-    project_config = get_project_config(
-        project=default_project,
-        version=4,
-    ).to_dict()["config"]
-
-    # Measurements are common to all orgs, so they must only exist in global configs
-    assert "measurements" in global_config
-    assert "measurements" not in project_config

+ 0 - 1
tests/sentry/api/endpoints/test_relay_projectconfigs_v3.py

@@ -164,7 +164,6 @@ def test_task_writes_config_into_cache(
     build_project_config(
         public_key=default_projectkey.public_key,
         update_reason="test",
-        version=3,
     )
 
     assert cache_set_many_mock.call_count == 1

+ 0 - 1
tests/sentry/api/endpoints/test_relay_projectconfigs_v4.py

@@ -170,7 +170,6 @@ def test_task_writes_config_into_cache(
     build_project_config(
         public_key=default_projectkey.public_key,
         update_reason="test",
-        version=4,
     )
 
     assert cache_set_many_mock.call_count == 1

+ 2 - 3
tests/sentry/ingest/test_span_desc_clusterer.py

@@ -341,12 +341,11 @@ def test_get_deleted_project():
     assert list(get_active_projects(ClustererNamespace.SPANS)) == []
 
 
-@pytest.mark.parametrize("projectconfig_version", (3, 4))
 @django_db_all
-def test_span_descs_clusterer_generates_rules(default_project, projectconfig_version):
+def test_span_descs_clusterer_generates_rules(default_project):
     def _get_projconfig_span_desc_rules(project: Project):
         return (
-            get_project_config(project, full_config=True, version=projectconfig_version)
+            get_project_config(project, full_config=True)
             .to_dict()["config"]
             .get("spanDescriptionRules")
         )

+ 2 - 7
tests/sentry/ingest/test_transaction_clusterer.py

@@ -352,15 +352,10 @@ def test_get_deleted_project():
     assert list(get_active_projects(ClustererNamespace.TRANSACTIONS)) == []
 
 
-@pytest.mark.parametrize("projectconfig_version", (3, 4))
 @django_db_all
-def test_transaction_clusterer_generates_rules(default_project, projectconfig_version):
+def test_transaction_clusterer_generates_rules(default_project):
     def _get_projconfig_tx_rules(project: Project):
-        return (
-            get_project_config(project, full_config=True, version=projectconfig_version)
-            .to_dict()["config"]
-            .get("txNameRules")
-        )
+        return get_project_config(project, full_config=True).to_dict()["config"].get("txNameRules")
 
     feature = "organizations:transaction-name-normalize"
     with Feature({feature: False}):

+ 0 - 124
tests/sentry/relay/snapshots/test_config/test_get_project_config/4/full_config/MONOLITH.pysnap

@@ -1,124 +0,0 @@
----
-created: '2023-08-31T08:54:07.338398Z'
-creator: sentry
-source: tests/sentry/relay/test_config.py
----
-config:
-  allowedDomains:
-  - '*'
-  breakdownsV2:
-    span_ops:
-      matches:
-      - http
-      - db
-      - browser
-      - resource
-      - ui
-      type: spanOperations
-  datascrubbingSettings:
-    excludeFields: []
-    scrubData: true
-    scrubDefaults: true
-    sensitiveFields: []
-  features:
-  - organizations:transaction-name-mark-scrubbed-as-sanitized
-  - organizations:transaction-name-normalize
-  filterSettings:
-    csp:
-      disallowedSources:
-      - about
-      - ms-browser-extension
-      - chrome://*
-      - chrome-extension://*
-      - chromeinvokeimmediate://*
-      - chromenull://*
-      - data:text/html,chromewebdata
-      - safari-extension://*
-      - mxaddon-pkg://*
-      - jar://*
-      - webviewprogressproxy://*
-      - ms-browser-extension://*
-      - tmtbff://*
-      - mbinit://*
-      - symres://*
-      - resource://*
-      - moz-extension://*
-      - '*.metrext.com'
-      - static.image2play.com
-      - '*.tlscdn.com'
-      - 73a5b0806e464be8bd4e694c744624f0.com
-      - 020dfefc4ac745dab7594f2f771c1ded.com
-      - '*.superfish.com'
-      - addons.mozilla.org
-      - v.zilionfast.in
-      - widgets.amung.us
-      - '*.superfish.com'
-      - xls.searchfun.in
-      - istatic.datafastguru.info
-      - v.zilionfast.in
-      - localhost
-      - resultshub-a.akamaihd.net
-      - pulseadnetwork.com
-      - gateway.zscalertwo.net
-      - www.passpack.com
-      - middlerush-a.akamaihd.net
-      - www.websmartcenter.com
-      - a.linkluster.com
-      - saveyoutime.ru
-      - cdncache-a.akamaihd.net
-      - x.rafomedia.com
-      - savingsslider-a.akamaihd.net
-      - injections.adguard.com
-      - icontent.us
-      - amiok.org
-      - connectionstrenth.com
-      - siteheart.net
-      - netanalitics.space
-      - printapplink.com
-      - godlinkapp.com
-      - devappstor.com
-      - hoholikik.club
-      - smartlink.cool
-      - promfflinkdev.com
-    errorMessages:
-      patterns:
-      - '*https://reactjs.org/docs/error-decoder.html?invariant={418,419,422,423,425}*'
-    ignoreTransactions:
-      isEnabled: true
-      patterns:
-      - '*healthcheck*'
-      - '*healthy*'
-      - '*live*'
-      - '*ready*'
-      - '*heartbeat*'
-      - '*/health'
-      - '*/healthz'
-      - '*/ping'
-  groupingConfig:
-    enhancements: eJybzDRxc15qeXFJZU6qlZGBkbGugaGuoeEEAHJMCAM
-    id: newstyle:2023-01-11
-  piiConfig:
-    applications:
-      $string:
-      - organization:remove_ips_and_macs
-      - project:remove_ips_and_macs
-    rules:
-      organization:remove_ips_and_macs:
-        redaction:
-          method: remove
-        rules:
-        - '@ip'
-        - '@mac'
-        type: multiple
-      project:remove_ips_and_macs:
-        redaction:
-          method: remove
-        rules:
-        - '@ip'
-        - '@mac'
-        type: multiple
-  spanAttributes:
-  - exclusive-time
-  trustedRelays: []
-disabled: false
-slug: bar

+ 0 - 124
tests/sentry/relay/snapshots/test_config/test_get_project_config/4/full_config/REGION.pysnap

@@ -1,124 +0,0 @@
----
-created: '2023-08-31T08:54:07.872992Z'
-creator: sentry
-source: tests/sentry/relay/test_config.py
----
-config:
-  allowedDomains:
-  - '*'
-  breakdownsV2:
-    span_ops:
-      matches:
-      - http
-      - db
-      - browser
-      - resource
-      - ui
-      type: spanOperations
-  datascrubbingSettings:
-    excludeFields: []
-    scrubData: true
-    scrubDefaults: true
-    sensitiveFields: []
-  features:
-  - organizations:transaction-name-mark-scrubbed-as-sanitized
-  - organizations:transaction-name-normalize
-  filterSettings:
-    csp:
-      disallowedSources:
-      - about
-      - ms-browser-extension
-      - chrome://*
-      - chrome-extension://*
-      - chromeinvokeimmediate://*
-      - chromenull://*
-      - data:text/html,chromewebdata
-      - safari-extension://*
-      - mxaddon-pkg://*
-      - jar://*
-      - webviewprogressproxy://*
-      - ms-browser-extension://*
-      - tmtbff://*
-      - mbinit://*
-      - symres://*
-      - resource://*
-      - moz-extension://*
-      - '*.metrext.com'
-      - static.image2play.com
-      - '*.tlscdn.com'
-      - 73a5b0806e464be8bd4e694c744624f0.com
-      - 020dfefc4ac745dab7594f2f771c1ded.com
-      - '*.superfish.com'
-      - addons.mozilla.org
-      - v.zilionfast.in
-      - widgets.amung.us
-      - '*.superfish.com'
-      - xls.searchfun.in
-      - istatic.datafastguru.info
-      - v.zilionfast.in
-      - localhost
-      - resultshub-a.akamaihd.net
-      - pulseadnetwork.com
-      - gateway.zscalertwo.net
-      - www.passpack.com
-      - middlerush-a.akamaihd.net
-      - www.websmartcenter.com
-      - a.linkluster.com
-      - saveyoutime.ru
-      - cdncache-a.akamaihd.net
-      - x.rafomedia.com
-      - savingsslider-a.akamaihd.net
-      - injections.adguard.com
-      - icontent.us
-      - amiok.org
-      - connectionstrenth.com
-      - siteheart.net
-      - netanalitics.space
-      - printapplink.com
-      - godlinkapp.com
-      - devappstor.com
-      - hoholikik.club
-      - smartlink.cool
-      - promfflinkdev.com
-    errorMessages:
-      patterns:
-      - '*https://reactjs.org/docs/error-decoder.html?invariant={418,419,422,423,425}*'
-    ignoreTransactions:
-      isEnabled: true
-      patterns:
-      - '*healthcheck*'
-      - '*healthy*'
-      - '*live*'
-      - '*ready*'
-      - '*heartbeat*'
-      - '*/health'
-      - '*/healthz'
-      - '*/ping'
-  groupingConfig:
-    enhancements: eJybzDRxc15qeXFJZU6qlZGBkbGugaGuoeEEAHJMCAM
-    id: newstyle:2023-01-11
-  piiConfig:
-    applications:
-      $string:
-      - organization:remove_ips_and_macs
-      - project:remove_ips_and_macs
-    rules:
-      organization:remove_ips_and_macs:
-        redaction:
-          method: remove
-        rules:
-        - '@ip'
-        - '@mac'
-        type: multiple
-      project:remove_ips_and_macs:
-        redaction:
-          method: remove
-        rules:
-        - '@ip'
-        - '@mac'
-        type: multiple
-  spanAttributes:
-  - exclusive-time
-  trustedRelays: []
-disabled: false
-slug: bar

Some files were not shown because too many files changed in this diff