Browse Source

perf: use orjson on bin, fixtures and scripts (#70453)

The goal is to get rid of all `sentry.utils.json` usages, and this is a
step towards that goal.
Yagiz Nizipli 10 months ago
parent
commit
435669b28d

+ 3 - 2
bin/mock-outcomes

@@ -1,4 +1,6 @@
 #!/usr/bin/env python
 #!/usr/bin/env python
+import orjson
+
 from sentry.runner import configure
 from sentry.runner import configure
 
 
 configure()
 configure()
@@ -10,7 +12,6 @@ import requests
 from django.conf import settings
 from django.conf import settings
 
 
 from sentry.constants import DataCategory
 from sentry.constants import DataCategory
-from sentry.utils import json
 from sentry.utils.outcomes import Outcome
 from sentry.utils.outcomes import Outcome
 
 
 # import random
 # import random
@@ -24,7 +25,7 @@ def store_outcomes(outcome, num_times=1):
         outcomes.append(outcome_copy)
         outcomes.append(outcome_copy)
 
 
     req = requests.post(
     req = requests.post(
-        settings.SENTRY_SNUBA + "/tests/entities/outcomes/insert", data=json.dumps(outcomes)
+        settings.SENTRY_SNUBA + "/tests/entities/outcomes/insert", data=orjson.dumps(outcomes)
     )
     )
     req.raise_for_status()
     req.raise_for_status()
 
 

+ 2 - 3
bin/run-model-tests

@@ -3,12 +3,11 @@ import os
 import os.path
 import os.path
 
 
 import click
 import click
-
-from sentry.utils import json
+import orjson
 
 
 
 
 def find_test_cases_matching(model_name: str):
 def find_test_cases_matching(model_name: str):
-    manifest = json.loads(open(os.environ["SENTRY_MODEL_MANIFEST_FILE_PATH"]).read())
+    manifest = orjson.loads(open(os.environ["SENTRY_MODEL_MANIFEST_FILE_PATH"], "rb").read())
     for test_node_id, hits in manifest.items():
     for test_node_id, hits in manifest.items():
         if model_name in hits:
         if model_name in hits:
             yield test_node_id.split("::")[1]
             yield test_node_id.split("::")[1]

+ 3 - 3
fixtures/apidocs_test_case.py

@@ -1,6 +1,7 @@
 import functools
 import functools
 import os
 import os
 
 
+import orjson
 from django.conf import settings
 from django.conf import settings
 from openapi_core.contrib.django import DjangoOpenAPIRequest, DjangoOpenAPIResponse
 from openapi_core.contrib.django import DjangoOpenAPIRequest, DjangoOpenAPIResponse
 from openapi_core.spec import Spec
 from openapi_core.spec import Spec
@@ -9,7 +10,6 @@ from openapi_core.validation.response.validators import V30ResponseDataValidator
 from sentry.testutils.cases import APITestCase
 from sentry.testutils.cases import APITestCase
 from sentry.testutils.helpers.datetime import before_now, iso_format
 from sentry.testutils.helpers.datetime import before_now, iso_format
 from sentry.testutils.skips import requires_snuba
 from sentry.testutils.skips import requires_snuba
-from sentry.utils import json
 
 
 
 
 @requires_snuba
 @requires_snuba
@@ -17,8 +17,8 @@ class APIDocsTestCase(APITestCase):
     @functools.cached_property
     @functools.cached_property
     def cached_schema(self):
     def cached_schema(self):
         path = os.path.join(os.path.dirname(__file__), "../tests/apidocs/openapi-derefed.json")
         path = os.path.join(os.path.dirname(__file__), "../tests/apidocs/openapi-derefed.json")
-        with open(path) as json_file:
-            data = json.load(json_file)
+        with open(path, "rb") as json_file:
+            data = orjson.loads(json_file.read())
             data["servers"][0]["url"] = settings.SENTRY_OPTIONS["system.url-prefix"]
             data["servers"][0]["url"] = settings.SENTRY_OPTIONS["system.url-prefix"]
             del data["components"]
             del data["components"]
 
 

+ 6 - 5
fixtures/integrations/mock_service.py

@@ -5,9 +5,10 @@ import shutil
 from collections import defaultdict
 from collections import defaultdict
 from typing import Any
 from typing import Any
 
 
+import orjson
+
 from fixtures.integrations import FIXTURE_DIRECTORY
 from fixtures.integrations import FIXTURE_DIRECTORY
 from fixtures.integrations.stub_service import StubService
 from fixtures.integrations.stub_service import StubService
-from sentry.utils import json
 from sentry.utils.numbers import base32_encode
 from sentry.utils.numbers import base32_encode
 
 
 
 
@@ -99,8 +100,8 @@ class MockService(StubService):
             return
             return
 
 
         path = os.path.join(self._get_project_path(project), f"{name}.json")
         path = os.path.join(self._get_project_path(project), f"{name}.json")
-        with open(path, "w") as f:
-            f.write(json.dumps(data))
+        with open(path, "wb") as f:
+            f.write(orjson.dumps(data))
 
 
     def _get_data(self, project, name):
     def _get_data(self, project, name):
         if self.mode == "memory":
         if self.mode == "memory":
@@ -112,5 +113,5 @@ class MockService(StubService):
         if not os.path.exists(path):
         if not os.path.exists(path):
             return None
             return None
 
 
-        with open(path) as f:
-            return json.loads(f.read())
+        with open(path, "rb") as f:
+            return orjson.loads(f.read())

+ 3 - 2
fixtures/integrations/stub_service.py

@@ -4,8 +4,9 @@ import os
 from copy import deepcopy
 from copy import deepcopy
 from typing import Any
 from typing import Any
 
 
+import orjson
+
 from fixtures.integrations import FIXTURE_DIRECTORY
 from fixtures.integrations import FIXTURE_DIRECTORY
-from sentry.utils import json
 
 
 
 
 class StubService:
 class StubService:
@@ -48,7 +49,7 @@ class StubService:
         if cached:
         if cached:
             data = cached
             data = cached
         else:
         else:
-            data = json.loads(StubService.get_stub_json(service_name, name))
+            data = orjson.loads(StubService.get_stub_json(service_name, name))
             StubService.stub_data_cache[cache_key] = data
             StubService.stub_data_cache[cache_key] = data
         return deepcopy(data)
         return deepcopy(data)
 
 

+ 4 - 3
scripts/appconnect_cli.py

@@ -10,11 +10,12 @@ first one found.
 import sys
 import sys
 from pprint import pprint
 from pprint import pprint
 
 
+import orjson
+
 from sentry.lang.native.appconnect import SYMBOL_SOURCES_PROP_NAME
 from sentry.lang.native.appconnect import SYMBOL_SOURCES_PROP_NAME
 from sentry.models.appconnectbuilds import AppConnectBuild
 from sentry.models.appconnectbuilds import AppConnectBuild
 from sentry.models.project import Project
 from sentry.models.project import Project
 from sentry.tasks import app_store_connect
 from sentry.tasks import app_store_connect
-from sentry.utils import json
 
 
 PROJECT_ID = 2
 PROJECT_ID = 2
 
 
@@ -24,7 +25,7 @@ def main(argv):
         # Dumps the symbolSource configuration as stored in the project option.
         # Dumps the symbolSource configuration as stored in the project option.
         project = Project.objects.get(pk=PROJECT_ID)
         project = Project.objects.get(pk=PROJECT_ID)
         raw_config = project.get_option(SYMBOL_SOURCES_PROP_NAME, default="[]")
         raw_config = project.get_option(SYMBOL_SOURCES_PROP_NAME, default="[]")
-        config = json.loads(raw_config)
+        config = orjson.loads(raw_config)
         pprint(config)
         pprint(config)
 
 
     elif argv[0] == "dsyms":
     elif argv[0] == "dsyms":
@@ -65,7 +66,7 @@ def main(argv):
 def appconnect_config():
 def appconnect_config():
     project = Project.objects.get(pk=PROJECT_ID)
     project = Project.objects.get(pk=PROJECT_ID)
     raw_config = project.get_option(SYMBOL_SOURCES_PROP_NAME, default="[]")
     raw_config = project.get_option(SYMBOL_SOURCES_PROP_NAME, default="[]")
-    symbol_sources = json.loads(raw_config)
+    symbol_sources = orjson.loads(raw_config)
     for config in symbol_sources:
     for config in symbol_sources:
         if config["type"] == "appStoreConnect":
         if config["type"] == "appStoreConnect":
             return config
             return config