|
@@ -9,6 +9,7 @@ from enum import Enum
|
|
|
from time import time
|
|
|
from typing import Any, TypeVar
|
|
|
|
|
|
+import orjson
|
|
|
import rb
|
|
|
from django.utils.encoding import force_bytes, force_str
|
|
|
from rediscluster import RedisCluster
|
|
@@ -16,7 +17,7 @@ from rediscluster import RedisCluster
|
|
|
from sentry.buffer.base import Buffer
|
|
|
from sentry.db import models
|
|
|
from sentry.tasks.process_buffer import process_incr
|
|
|
-from sentry.utils import json, metrics
|
|
|
+from sentry.utils import metrics
|
|
|
from sentry.utils.hashlib import md5_text
|
|
|
from sentry.utils.imports import import_string
|
|
|
from sentry.utils.redis import (
|
|
@@ -47,7 +48,9 @@ def _validate_json_roundtrip(value: dict[str, Any], model: type[models.Model]) -
|
|
|
_last_validation_log = time()
|
|
|
try:
|
|
|
if (
|
|
|
- RedisBuffer._load_values(json.loads(json.dumps(RedisBuffer._dump_values(value))))
|
|
|
+ RedisBuffer._load_values(
|
|
|
+ orjson.loads(orjson.dumps(RedisBuffer._dump_values(value)))
|
|
|
+ )
|
|
|
!= value
|
|
|
):
|
|
|
logger.error("buffer.corrupted_value", extra={"value": value, "model": model})
|
|
@@ -252,10 +255,6 @@ class RedisBuffer(Buffer):
|
|
|
def push_to_sorted_set(self, key: str, value: list[int] | int) -> None:
|
|
|
value_dict = {value: time()}
|
|
|
self._execute_redis_operation(key, RedisOperation.SORTED_SET_ADD, value_dict)
|
|
|
- logger.info(
|
|
|
- "redis_buffer.push_to_sorted_set",
|
|
|
- extra={"key_name": key, "value": json.dumps(value_dict)},
|
|
|
- )
|
|
|
|
|
|
def get_sorted_set(self, key: str, min: float, max: float) -> list[tuple[int, datetime]]:
|
|
|
redis_set = self._execute_redis_operation(
|
|
@@ -347,7 +346,7 @@ class RedisBuffer(Buffer):
|
|
|
_validate_json_roundtrip(filters, model)
|
|
|
|
|
|
if is_instance_redis_cluster(self.cluster, self.is_redis_cluster):
|
|
|
- pipe.hsetnx(key, "f", json.dumps(self._dump_values(filters)))
|
|
|
+ pipe.hsetnx(key, "f", orjson.dumps(self._dump_values(filters)).decode())
|
|
|
else:
|
|
|
pipe.hsetnx(key, "f", pickle.dumps(filters))
|
|
|
|
|
@@ -361,7 +360,7 @@ class RedisBuffer(Buffer):
|
|
|
_validate_json_roundtrip(extra, model)
|
|
|
for column, value in extra.items():
|
|
|
if is_instance_redis_cluster(self.cluster, self.is_redis_cluster):
|
|
|
- pipe.hset(key, "e+" + column, json.dumps(self._dump_value(value)))
|
|
|
+ pipe.hset(key, "e+" + column, orjson.dumps(self._dump_value(value)).decode())
|
|
|
else:
|
|
|
pipe.hset(key, "e+" + column, pickle.dumps(value))
|
|
|
|
|
@@ -474,7 +473,7 @@ class RedisBuffer(Buffer):
|
|
|
model = import_string(force_str(values.pop("m")))
|
|
|
|
|
|
if values["f"].startswith(b"{" if not self.is_redis_cluster else "{"):
|
|
|
- filters = self._load_values(json.loads(force_str(values.pop("f"))))
|
|
|
+ filters = self._load_values(orjson.loads(force_str(values.pop("f"))))
|
|
|
else:
|
|
|
# TODO(dcramer): legacy pickle support - remove in Sentry 9.1
|
|
|
filters = pickle.loads(force_bytes(values.pop("f")))
|
|
@@ -487,7 +486,7 @@ class RedisBuffer(Buffer):
|
|
|
incr_values[k[2:]] = int(v)
|
|
|
elif k.startswith("e+"):
|
|
|
if v.startswith(b"[" if not self.is_redis_cluster else "["):
|
|
|
- extra_values[k[2:]] = self._load_value(json.loads(force_str(v)))
|
|
|
+ extra_values[k[2:]] = self._load_value(orjson.loads(force_str(v)))
|
|
|
else:
|
|
|
# TODO(dcramer): legacy pickle support - remove in Sentry 9.1
|
|
|
extra_values[k[2:]] = pickle.loads(force_bytes(v))
|