Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions MIGRATION_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ Span ops are now a smaller, framework-neutral set.

- The OpenAI integration now emits `gen_ai.chat` instead of `gen_ai.responses`.
- The Cohere integration now emits `gen_ai.chat` instead of `ai.chat_completions.create.cohere`, and `gen_ai.embeddings` instead of `ai.embeddings.create.cohere`.
- The Redis integration now emits `db.query` instead of `db.redis`.
- The Django integration now emits `view.render` instead of `view.response.render`, `view` instead of `view.authenticate`, and `function` instead of `event.django`.
- The Django, Starlette, Starlite, and Litestar integrations now emit `middleware` instead of `middleware.django`, `middleware.starlette`, `middleware.starlette.receive`, `middleware.starlette.send`, `middleware.starlite`, `middleware.starlite.receive`, `middleware.starlite.send`, `middleware.litestar`, `middleware.litestar.receive`, and `middleware.litestar.send`.
- The ARQ, Celery, Django, Dramatiq, Huey, RQ, and Ray integrations now emit `queue.publish` and `queue.process` instead of `queue.submit.arq`, `queue.task.arq`, `queue.submit.celery`, `queue.task.celery`, `queue.submit.django`, `queue.task.dramatiq`, `queue.submit.huey`, `queue.task.huey`, `queue.task.rq`, `queue.submit.ray`, and `queue.task.ray`.
Expand Down
1 change: 1 addition & 0 deletions sentry_sdk/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -1334,6 +1334,7 @@ class OP:
DB = "db"
DB_CURSOR_ITERATOR = "db.cursor.iter"
DB_CURSOR_FETCH = "db.cursor.fetch"
DB_QUERY = "db.query"
DB_REDIS = "db.redis"
EVENT_DJANGO = "event.django"
FUNCTION = "function"
Expand Down
2 changes: 1 addition & 1 deletion sentry_sdk/integrations/redis/_async_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ async def _sentry_execute(self: "Any", *args: "Any", **kwargs: "Any") -> "Any":
name="redis.pipeline.execute",
attributes={
"sentry.origin": SPAN_ORIGIN,
"sentry.op": OP.DB_REDIS,
"sentry.op": OP.DB_QUERY,
},
)

Expand Down
2 changes: 1 addition & 1 deletion sentry_sdk/integrations/redis/_sync_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def sentry_patched_execute(self: "Any", *args: "Any", **kwargs: "Any") -> "Any":
name="redis.pipeline.execute",
attributes={
"sentry.origin": SPAN_ORIGIN,
"sentry.op": OP.DB_REDIS,
"sentry.op": OP.DB_QUERY,
},
)

Expand Down
2 changes: 1 addition & 1 deletion sentry_sdk/integrations/redis/modules/queries.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def _compile_db_span_properties(
description = _get_db_span_description(integration, redis_command, args)

properties = {
"op": OP.DB_REDIS,
"op": OP.DB_QUERY,
"description": description,
}

Expand Down
4 changes: 2 additions & 2 deletions tests/integrations/redis/asyncio/test_redis_asyncio.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import sentry_sdk
from sentry_sdk import capture_message
from sentry_sdk.consts import SPANDATA
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations.redis import RedisIntegration


Expand Down Expand Up @@ -60,7 +60,7 @@ async def test_async_redis_pipeline(sentry_init, capture_items):
assert parent_span["name"] == "custom parent"
assert pipeline_span["name"] == "redis.pipeline.execute"
attrs = pipeline_span["attributes"]
assert attrs["sentry.op"] == "db.redis"
assert attrs["sentry.op"] == OP.DB_QUERY
assert attrs[SPANDATA.DB_SYSTEM_NAME] == "redis"
assert attrs[SPANDATA.DB_DRIVER_NAME] == "redis-py"
assert attrs[SPANDATA.DB_NAMESPACE] == "0"
Expand Down
6 changes: 3 additions & 3 deletions tests/integrations/redis/cluster/test_redis_cluster.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import sentry_sdk
from sentry_sdk import capture_message
from sentry_sdk.consts import SPANDATA
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations.redis import RedisIntegration


Expand Down Expand Up @@ -94,7 +94,7 @@ def test_rediscluster_basic(
span = redis_spans[-1]
assert span["name"] == description
attrs = span["attributes"]
assert attrs["sentry.op"] == "db.redis"
assert attrs["sentry.op"] == OP.DB_QUERY
assert attrs[SPANDATA.DB_SYSTEM_NAME] == "redis"
assert attrs[SPANDATA.DB_DRIVER_NAME] == "redis-py"
# ClusterNode converts localhost to 127.0.0.1
Expand Down Expand Up @@ -132,7 +132,7 @@ def test_rediscluster_pipeline(sentry_init, capture_items):
pipeline_span = redis_spans[-1]
assert pipeline_span["name"] == "redis.pipeline.execute"
attrs = pipeline_span["attributes"]
assert attrs["sentry.op"] == "db.redis"
assert attrs["sentry.op"] == OP.DB_QUERY
assert attrs[SPANDATA.DB_SYSTEM_NAME] == "redis"
assert attrs[SPANDATA.DB_DRIVER_NAME] == "redis-py"
# ClusterNode converts localhost to 127.0.0.1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import sentry_sdk
from sentry_sdk import capture_message
from sentry_sdk.consts import SPANDATA
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations.redis import RedisIntegration
from tests.conftest import ApproxDict

Expand Down Expand Up @@ -96,7 +96,7 @@ async def test_async_basic(
assert parent_span["name"] == "custom parent"
assert redis_span["name"] == description
attrs = redis_span["attributes"]
assert attrs["sentry.op"] == "db.redis"
assert attrs["sentry.op"] == OP.DB_QUERY
assert attrs[SPANDATA.DB_SYSTEM_NAME] == "redis"
assert attrs[SPANDATA.DB_DRIVER_NAME] == "redis-py"
assert attrs[SPANDATA.SERVER_ADDRESS] == "127.0.0.1"
Expand Down Expand Up @@ -131,7 +131,7 @@ async def test_async_redis_pipeline(sentry_init, capture_items):
assert parent_span["name"] == "custom parent"
assert pipeline_span["name"] == "redis.pipeline.execute"
attrs = pipeline_span["attributes"]
assert attrs["sentry.op"] == "db.redis"
assert attrs["sentry.op"] == OP.DB_QUERY
assert attrs[SPANDATA.DB_SYSTEM_NAME] == "redis"
assert attrs[SPANDATA.DB_DRIVER_NAME] == "redis-py"
assert attrs[SPANDATA.SERVER_ADDRESS] == "127.0.0.1"
Expand Down
12 changes: 6 additions & 6 deletions tests/integrations/redis/test_redis.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import sentry_sdk
from sentry_sdk import capture_message
from sentry_sdk.consts import SPANDATA
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations.redis import RedisIntegration

MOCK_CONNECTION_POOL = mock.MagicMock()
Expand Down Expand Up @@ -70,7 +70,7 @@ def test_pii_data_redacted(
assert parent["name"] == "custom parent"
assert set1["name"] == "SET 'somekey1' [Filtered]"
assert set1["attributes"][SPANDATA.DB_QUERY_TEXT] == "SET 'somekey1' [Filtered]"
assert set1["attributes"]["sentry.op"] == "db.redis"
assert set1["attributes"]["sentry.op"] == OP.DB_QUERY
assert set2["name"] == "SET 'somekey2' [Filtered]"
assert set2["attributes"][SPANDATA.DB_QUERY_TEXT] == "SET 'somekey2' [Filtered]"
assert get["name"] == "GET 'somekey2'"
Expand Down Expand Up @@ -117,7 +117,7 @@ def test_data_collection_database_query_data(
assert parent["name"] == "custom parent"
assert set_span["name"] == expected_description
assert set_span["attributes"][SPANDATA.DB_QUERY_TEXT] == expected_description
assert set_span["attributes"]["sentry.op"] == "db.redis"
assert set_span["attributes"]["sentry.op"] == OP.DB_QUERY


def test_no_data_truncation_by_default(sentry_init, capture_items):
Expand Down Expand Up @@ -147,7 +147,7 @@ def test_no_data_truncation_by_default(sentry_init, capture_items):
assert (
set1["attributes"][SPANDATA.DB_QUERY_TEXT] == f"SET 'somekey1' '{long_string}'"
)
assert set1["attributes"]["sentry.op"] == "db.redis"
assert set1["attributes"]["sentry.op"] == OP.DB_QUERY
assert set2["name"] == f"SET 'somekey2' '{short_string}'"
assert (
set2["attributes"][SPANDATA.DB_QUERY_TEXT] == f"SET 'somekey2' '{short_string}'"
Expand Down Expand Up @@ -219,7 +219,7 @@ def test_db_connection_attributes_client(sentry_init, capture_items):
assert parent_span["name"] == "custom parent"
assert redis_span["name"] == "GET 'foobar'"
attrs = redis_span["attributes"]
assert attrs["sentry.op"] == "db.redis"
assert attrs["sentry.op"] == OP.DB_QUERY
assert attrs[SPANDATA.DB_QUERY_TEXT] == "GET 'foobar'"
assert attrs[SPANDATA.DB_SYSTEM_NAME] == "redis"
assert attrs[SPANDATA.DB_DRIVER_NAME] == "redis-py"
Expand Down Expand Up @@ -252,7 +252,7 @@ def test_db_connection_attributes_pipeline(sentry_init, capture_items):
assert parent_span["name"] == "custom parent"
assert pipeline_span["name"] == "redis.pipeline.execute"
attrs = pipeline_span["attributes"]
assert attrs["sentry.op"] == "db.redis"
assert attrs["sentry.op"] == OP.DB_QUERY
assert attrs[SPANDATA.DB_SYSTEM_NAME] == "redis"
assert attrs[SPANDATA.DB_DRIVER_NAME] == "redis-py"
assert attrs[SPANDATA.DB_NAMESPACE] == "1"
Expand Down
28 changes: 14 additions & 14 deletions tests/integrations/redis/test_redis_cache_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from fakeredis import FakeRedis

import sentry_sdk
from sentry_sdk.consts import SPANDATA
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations.redis import RedisIntegration
from sentry_sdk.integrations.redis.utils import _get_safe_key, _key_as_string
from sentry_sdk.utils import parse_version
Expand Down Expand Up @@ -33,7 +33,7 @@ def test_no_cache_basic(sentry_init, capture_items):
assert len(items) == 2
db_span, parent_span = items[0].payload, items[1].payload
assert parent_span["name"] == "custom parent"
assert db_span["attributes"]["sentry.op"] == "db.redis"
assert db_span["attributes"]["sentry.op"] == OP.DB_QUERY


def test_cache_basic(sentry_init, capture_items):
Expand Down Expand Up @@ -65,25 +65,25 @@ def test_cache_basic(sentry_init, capture_items):
payloads = [item.payload for item in items]

# hget: db only (HGET is not a cache command)
assert payloads[0]["attributes"]["sentry.op"] == "db.redis"
assert payloads[0]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[0]["attributes"][SPANDATA.DB_OPERATION_NAME] == "HGET"

# get: db then cache.get
assert payloads[1]["attributes"]["sentry.op"] == "db.redis"
assert payloads[1]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[1]["attributes"][SPANDATA.DB_OPERATION_NAME] == "GET"
assert payloads[2]["attributes"]["sentry.op"] == "cache.get"
assert payloads[2]["attributes"][SPANDATA.DB_QUERY_TEXT] == "GET 'mycachekey'"

# set: db then cache.put
assert payloads[3]["attributes"]["sentry.op"] == "db.redis"
assert payloads[3]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[3]["attributes"][SPANDATA.DB_OPERATION_NAME] == "SET"
assert payloads[4]["attributes"]["sentry.op"] == "cache.put"
assert (
payloads[4]["attributes"][SPANDATA.DB_QUERY_TEXT] == "SET 'mycachekey1' 'bla'"
)

# setex: db then cache.put
assert payloads[5]["attributes"]["sentry.op"] == "db.redis"
assert payloads[5]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[5]["attributes"][SPANDATA.DB_OPERATION_NAME] == "SETEX"
assert payloads[6]["attributes"]["sentry.op"] == "cache.put"
assert (
Expand All @@ -92,7 +92,7 @@ def test_cache_basic(sentry_init, capture_items):
)

# mget: db then cache.get
assert payloads[7]["attributes"]["sentry.op"] == "db.redis"
assert payloads[7]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[7]["attributes"][SPANDATA.DB_OPERATION_NAME] == "MGET"
assert payloads[8]["attributes"]["sentry.op"] == "cache.get"
assert (
Expand Down Expand Up @@ -129,25 +129,25 @@ def test_cache_keys(sentry_init, capture_items):
payloads = [item.payload for item in items]

# somethingelse: db only
assert payloads[0]["attributes"]["sentry.op"] == "db.redis"
assert payloads[0]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[0]["name"] == "GET 'somethingelse'"

# blub: db then cache.get
assert payloads[1]["attributes"]["sentry.op"] == "db.redis"
assert payloads[1]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[1]["name"] == "GET 'blub'"
assert payloads[2]["attributes"]["sentry.op"] == "cache.get"
assert payloads[2]["name"] == "blub"
assert payloads[2]["attributes"][SPANDATA.DB_QUERY_TEXT] == "GET 'blub'"

# blubkeything: db then cache.get
assert payloads[3]["attributes"]["sentry.op"] == "db.redis"
assert payloads[3]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[3]["name"] == "GET 'blubkeything'"
assert payloads[4]["attributes"]["sentry.op"] == "cache.get"
assert payloads[4]["name"] == "blubkeything"
assert payloads[4]["attributes"][SPANDATA.DB_QUERY_TEXT] == "GET 'blubkeything'"

# bl: db only (no prefix match)
assert payloads[5]["attributes"]["sentry.op"] == "db.redis"
assert payloads[5]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[5]["name"] == "GET 'bl'"

assert payloads[6]["name"] == "custom parent"
Expand Down Expand Up @@ -182,7 +182,7 @@ def test_cache_data(sentry_init, capture_items):
payloads = [item.payload for item in items]

# First get (miss)
assert payloads[0]["attributes"]["sentry.op"] == "db.redis"
assert payloads[0]["attributes"]["sentry.op"] == OP.DB_QUERY
cache_get_miss = payloads[1]
assert cache_get_miss["attributes"]["sentry.op"] == "cache.get"
assert cache_get_miss["name"] == "mycachekey"
Expand All @@ -199,7 +199,7 @@ def test_cache_data(sentry_init, capture_items):
assert cache_get_miss["attributes"]["network.peer.address"] == host

# Set
assert payloads[2]["attributes"]["sentry.op"] == "db.redis"
assert payloads[2]["attributes"]["sentry.op"] == OP.DB_QUERY
cache_put = payloads[3]
assert cache_put["attributes"]["sentry.op"] == "cache.put"
assert cache_put["name"] == "mycachekey"
Expand All @@ -216,7 +216,7 @@ def test_cache_data(sentry_init, capture_items):
assert cache_put["attributes"]["network.peer.address"] == host

# Second get (hit)
assert payloads[4]["attributes"]["sentry.op"] == "db.redis"
assert payloads[4]["attributes"]["sentry.op"] == OP.DB_QUERY
cache_get_hit = payloads[5]
assert cache_get_hit["attributes"]["sentry.op"] == "cache.get"
assert cache_get_hit["attributes"]["cache.key"] == ["mycachekey"]
Expand Down
20 changes: 10 additions & 10 deletions tests/integrations/redis/test_redis_cache_module_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
)

import sentry_sdk
from sentry_sdk.consts import SPANDATA
from sentry_sdk.consts import OP, SPANDATA
from sentry_sdk.integrations.redis import RedisIntegration
from sentry_sdk.utils import parse_version

Expand All @@ -41,7 +41,7 @@ async def test_no_cache_basic(sentry_init, capture_items):
assert len(items) == 2
db_span, parent_span = items[0].payload, items[1].payload
assert parent_span["name"] == "custom parent"
assert db_span["attributes"]["sentry.op"] == "db.redis"
assert db_span["attributes"]["sentry.op"] == OP.DB_QUERY


@pytest.mark.asyncio
Expand All @@ -65,7 +65,7 @@ async def test_cache_basic(sentry_init, capture_items):
assert len(items) == 3
db_span, cache_span, parent_span = [item.payload for item in items]
assert parent_span["name"] == "custom parent"
assert db_span["attributes"]["sentry.op"] == "db.redis"
assert db_span["attributes"]["sentry.op"] == OP.DB_QUERY
assert cache_span["attributes"]["sentry.op"] == "cache.get"
assert cache_span["attributes"][SPANDATA.CACHE_KEY] == ["myasynccachekey"]

Expand Down Expand Up @@ -95,25 +95,25 @@ async def test_cache_keys(sentry_init, capture_items):
payloads = [item.payload for item in items]

# asomethingelse: db only
assert payloads[0]["attributes"]["sentry.op"] == "db.redis"
assert payloads[0]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[0]["name"] == "GET 'asomethingelse'"

# ablub: db then cache.get
assert payloads[1]["attributes"]["sentry.op"] == "db.redis"
assert payloads[1]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[1]["name"] == "GET 'ablub'"
assert payloads[2]["attributes"]["sentry.op"] == "cache.get"
assert payloads[2]["name"] == "ablub"
assert payloads[2]["attributes"][SPANDATA.CACHE_KEY] == ["ablub"]

# ablubkeything: db then cache.get
assert payloads[3]["attributes"]["sentry.op"] == "db.redis"
assert payloads[3]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[3]["name"] == "GET 'ablubkeything'"
assert payloads[4]["attributes"]["sentry.op"] == "cache.get"
assert payloads[4]["name"] == "ablubkeything"
assert payloads[4]["attributes"][SPANDATA.CACHE_KEY] == ["ablubkeything"]

# abl: db only (no prefix match)
assert payloads[5]["attributes"]["sentry.op"] == "db.redis"
assert payloads[5]["attributes"]["sentry.op"] == OP.DB_QUERY
assert payloads[5]["name"] == "GET 'abl'"

assert payloads[6]["name"] == "custom parent"
Expand Down Expand Up @@ -146,7 +146,7 @@ async def test_cache_data(sentry_init, capture_items):
payloads = [item.payload for item in items]

# First get (miss)
assert payloads[0]["attributes"]["sentry.op"] == "db.redis"
assert payloads[0]["attributes"]["sentry.op"] == OP.DB_QUERY
cache_get_miss = payloads[1]
assert cache_get_miss["attributes"]["sentry.op"] == "cache.get"
assert cache_get_miss["name"] == "myasynccachekey"
Expand All @@ -163,7 +163,7 @@ async def test_cache_data(sentry_init, capture_items):
assert cache_get_miss["attributes"]["network.peer.address"] == host

# Set
assert payloads[2]["attributes"]["sentry.op"] == "db.redis"
assert payloads[2]["attributes"]["sentry.op"] == OP.DB_QUERY
cache_put = payloads[3]
assert cache_put["attributes"]["sentry.op"] == "cache.put"
assert cache_put["name"] == "myasynccachekey"
Expand All @@ -180,7 +180,7 @@ async def test_cache_data(sentry_init, capture_items):
assert cache_put["attributes"]["network.peer.address"] == host

# Second get (hit)
assert payloads[4]["attributes"]["sentry.op"] == "db.redis"
assert payloads[4]["attributes"]["sentry.op"] == OP.DB_QUERY
cache_get_hit = payloads[5]
assert cache_get_hit["attributes"]["sentry.op"] == "cache.get"
assert cache_get_hit["attributes"]["cache.key"] == ["myasynccachekey"]
Expand Down
Loading