sentry-sdk 2.34.1__py2.py3-none-any.whl → 2.35.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of sentry-sdk might be problematic. Click here for more details.
- sentry_sdk/__init__.py +1 -0
- sentry_sdk/ai/utils.py +9 -9
- sentry_sdk/api.py +80 -0
- sentry_sdk/client.py +8 -5
- sentry_sdk/consts.py +135 -10
- sentry_sdk/crons/api.py +5 -0
- sentry_sdk/integrations/anthropic.py +138 -75
- sentry_sdk/integrations/asgi.py +11 -25
- sentry_sdk/integrations/clickhouse_driver.py +33 -13
- sentry_sdk/integrations/django/asgi.py +1 -1
- sentry_sdk/integrations/fastapi.py +1 -7
- sentry_sdk/integrations/gnu_backtrace.py +6 -3
- sentry_sdk/integrations/langchain.py +466 -193
- sentry_sdk/integrations/litestar.py +1 -1
- sentry_sdk/integrations/logging.py +2 -1
- sentry_sdk/integrations/loguru.py +2 -1
- sentry_sdk/integrations/openai.py +8 -2
- sentry_sdk/integrations/openfeature.py +2 -4
- sentry_sdk/integrations/quart.py +1 -1
- sentry_sdk/integrations/starlette.py +1 -5
- sentry_sdk/integrations/starlite.py +1 -1
- sentry_sdk/scope.py +11 -11
- sentry_sdk/tracing.py +118 -25
- sentry_sdk/tracing_utils.py +321 -39
- sentry_sdk/utils.py +22 -1
- {sentry_sdk-2.34.1.dist-info → sentry_sdk-2.35.0.dist-info}/METADATA +1 -1
- {sentry_sdk-2.34.1.dist-info → sentry_sdk-2.35.0.dist-info}/RECORD +31 -31
- {sentry_sdk-2.34.1.dist-info → sentry_sdk-2.35.0.dist-info}/WHEEL +0 -0
- {sentry_sdk-2.34.1.dist-info → sentry_sdk-2.35.0.dist-info}/entry_points.txt +0 -0
- {sentry_sdk-2.34.1.dist-info → sentry_sdk-2.35.0.dist-info}/licenses/LICENSE +0 -0
- {sentry_sdk-2.34.1.dist-info → sentry_sdk-2.35.0.dist-info}/top_level.txt +0 -0
sentry_sdk/tracing_utils.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import contextlib
|
|
2
|
+
import functools
|
|
2
3
|
import inspect
|
|
3
4
|
import os
|
|
4
5
|
import re
|
|
@@ -6,13 +7,12 @@ import sys
|
|
|
6
7
|
from collections.abc import Mapping
|
|
7
8
|
from datetime import timedelta
|
|
8
9
|
from decimal import ROUND_DOWN, Decimal, DefaultContext, localcontext
|
|
9
|
-
from functools import wraps
|
|
10
10
|
from random import Random
|
|
11
11
|
from urllib.parse import quote, unquote
|
|
12
12
|
import uuid
|
|
13
13
|
|
|
14
14
|
import sentry_sdk
|
|
15
|
-
from sentry_sdk.consts import OP, SPANDATA
|
|
15
|
+
from sentry_sdk.consts import OP, SPANDATA, SPANTEMPLATE
|
|
16
16
|
from sentry_sdk.utils import (
|
|
17
17
|
capture_internal_exceptions,
|
|
18
18
|
filename_for_module,
|
|
@@ -20,6 +20,7 @@ from sentry_sdk.utils import (
|
|
|
20
20
|
logger,
|
|
21
21
|
match_regex_list,
|
|
22
22
|
qualname_from_function,
|
|
23
|
+
safe_repr,
|
|
23
24
|
to_string,
|
|
24
25
|
try_convert,
|
|
25
26
|
is_sentry_url,
|
|
@@ -770,70 +771,116 @@ def normalize_incoming_data(incoming_data):
|
|
|
770
771
|
return data
|
|
771
772
|
|
|
772
773
|
|
|
773
|
-
def
|
|
774
|
-
|
|
774
|
+
def create_span_decorator(
|
|
775
|
+
op=None, name=None, attributes=None, template=SPANTEMPLATE.DEFAULT
|
|
776
|
+
):
|
|
777
|
+
# type: (Optional[Union[str, OP]], Optional[str], Optional[dict[str, Any]], SPANTEMPLATE) -> Any
|
|
775
778
|
"""
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
+
Create a span decorator that can wrap both sync and async functions.
|
|
780
|
+
|
|
781
|
+
:param op: The operation type for the span.
|
|
782
|
+
:type op: str or :py:class:`sentry_sdk.consts.OP` or None
|
|
783
|
+
:param name: The name of the span.
|
|
784
|
+
:type name: str or None
|
|
785
|
+
:param attributes: Additional attributes to set on the span.
|
|
786
|
+
:type attributes: dict or None
|
|
787
|
+
:param template: The type of span to create. This determines what kind of
|
|
788
|
+
span instrumentation and data collection will be applied. Use predefined
|
|
789
|
+
constants from :py:class:`sentry_sdk.consts.SPANTEMPLATE`.
|
|
790
|
+
The default is `SPANTEMPLATE.DEFAULT` which is the right choice for most
|
|
791
|
+
use cases.
|
|
792
|
+
:type template: :py:class:`sentry_sdk.consts.SPANTEMPLATE`
|
|
779
793
|
"""
|
|
780
|
-
|
|
781
|
-
if inspect.iscoroutinefunction(func):
|
|
794
|
+
from sentry_sdk.scope import should_send_default_pii
|
|
782
795
|
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
796
|
+
def span_decorator(f):
|
|
797
|
+
# type: (Any) -> Any
|
|
798
|
+
"""
|
|
799
|
+
Decorator to create a span for the given function.
|
|
800
|
+
"""
|
|
786
801
|
|
|
787
|
-
|
|
802
|
+
@functools.wraps(f)
|
|
803
|
+
async def async_wrapper(*args, **kwargs):
|
|
804
|
+
# type: (*Any, **Any) -> Any
|
|
805
|
+
current_span = get_current_span()
|
|
788
806
|
|
|
789
|
-
if
|
|
807
|
+
if current_span is None:
|
|
790
808
|
logger.debug(
|
|
791
809
|
"Cannot create a child span for %s. "
|
|
792
810
|
"Please start a Sentry transaction before calling this function.",
|
|
793
|
-
qualname_from_function(
|
|
811
|
+
qualname_from_function(f),
|
|
812
|
+
)
|
|
813
|
+
return await f(*args, **kwargs)
|
|
814
|
+
|
|
815
|
+
span_op = op or _get_span_op(template)
|
|
816
|
+
function_name = name or qualname_from_function(f) or ""
|
|
817
|
+
span_name = _get_span_name(template, function_name, kwargs)
|
|
818
|
+
send_pii = should_send_default_pii()
|
|
819
|
+
|
|
820
|
+
with current_span.start_child(
|
|
821
|
+
op=span_op,
|
|
822
|
+
name=span_name,
|
|
823
|
+
) as span:
|
|
824
|
+
span.update_data(attributes or {})
|
|
825
|
+
_set_input_attributes(
|
|
826
|
+
span, template, send_pii, function_name, f, args, kwargs
|
|
794
827
|
)
|
|
795
|
-
return await func(*args, **kwargs)
|
|
796
828
|
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
return
|
|
829
|
+
result = await f(*args, **kwargs)
|
|
830
|
+
|
|
831
|
+
_set_output_attributes(span, template, send_pii, result)
|
|
832
|
+
|
|
833
|
+
return result
|
|
802
834
|
|
|
803
835
|
try:
|
|
804
|
-
|
|
836
|
+
async_wrapper.__signature__ = inspect.signature(f) # type: ignore[attr-defined]
|
|
805
837
|
except Exception:
|
|
806
838
|
pass
|
|
807
839
|
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
@wraps(func)
|
|
812
|
-
def func_with_tracing(*args, **kwargs):
|
|
840
|
+
@functools.wraps(f)
|
|
841
|
+
def sync_wrapper(*args, **kwargs):
|
|
813
842
|
# type: (*Any, **Any) -> Any
|
|
843
|
+
current_span = get_current_span()
|
|
814
844
|
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
if span is None:
|
|
845
|
+
if current_span is None:
|
|
818
846
|
logger.debug(
|
|
819
847
|
"Cannot create a child span for %s. "
|
|
820
848
|
"Please start a Sentry transaction before calling this function.",
|
|
821
|
-
qualname_from_function(
|
|
849
|
+
qualname_from_function(f),
|
|
850
|
+
)
|
|
851
|
+
return f(*args, **kwargs)
|
|
852
|
+
|
|
853
|
+
span_op = op or _get_span_op(template)
|
|
854
|
+
function_name = name or qualname_from_function(f) or ""
|
|
855
|
+
span_name = _get_span_name(template, function_name, kwargs)
|
|
856
|
+
send_pii = should_send_default_pii()
|
|
857
|
+
|
|
858
|
+
with current_span.start_child(
|
|
859
|
+
op=span_op,
|
|
860
|
+
name=span_name,
|
|
861
|
+
) as span:
|
|
862
|
+
span.update_data(attributes or {})
|
|
863
|
+
_set_input_attributes(
|
|
864
|
+
span, template, send_pii, function_name, f, args, kwargs
|
|
822
865
|
)
|
|
823
|
-
return func(*args, **kwargs)
|
|
824
866
|
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
return
|
|
867
|
+
result = f(*args, **kwargs)
|
|
868
|
+
|
|
869
|
+
_set_output_attributes(span, template, send_pii, result)
|
|
870
|
+
|
|
871
|
+
return result
|
|
830
872
|
|
|
831
873
|
try:
|
|
832
|
-
|
|
874
|
+
sync_wrapper.__signature__ = inspect.signature(f) # type: ignore[attr-defined]
|
|
833
875
|
except Exception:
|
|
834
876
|
pass
|
|
835
877
|
|
|
836
|
-
|
|
878
|
+
if inspect.iscoroutinefunction(f):
|
|
879
|
+
return async_wrapper
|
|
880
|
+
else:
|
|
881
|
+
return sync_wrapper
|
|
882
|
+
|
|
883
|
+
return span_decorator
|
|
837
884
|
|
|
838
885
|
|
|
839
886
|
def get_current_span(scope=None):
|
|
@@ -896,6 +943,241 @@ def _sample_rand_range(parent_sampled, sample_rate):
|
|
|
896
943
|
return sample_rate, 1.0
|
|
897
944
|
|
|
898
945
|
|
|
946
|
+
def _get_value(source, key):
|
|
947
|
+
# type: (Any, str) -> Optional[Any]
|
|
948
|
+
"""
|
|
949
|
+
Gets a value from a source object. The source can be a dict or an object.
|
|
950
|
+
It is checked for dictionary keys and object attributes.
|
|
951
|
+
"""
|
|
952
|
+
value = None
|
|
953
|
+
if isinstance(source, dict):
|
|
954
|
+
value = source.get(key)
|
|
955
|
+
else:
|
|
956
|
+
if hasattr(source, key):
|
|
957
|
+
try:
|
|
958
|
+
value = getattr(source, key)
|
|
959
|
+
except Exception:
|
|
960
|
+
value = None
|
|
961
|
+
return value
|
|
962
|
+
|
|
963
|
+
|
|
964
|
+
def _get_span_name(template, name, kwargs=None):
|
|
965
|
+
# type: (Union[str, SPANTEMPLATE], str, Optional[dict[str, Any]]) -> str
|
|
966
|
+
"""
|
|
967
|
+
Get the name of the span based on the template and the name.
|
|
968
|
+
"""
|
|
969
|
+
span_name = name
|
|
970
|
+
|
|
971
|
+
if template == SPANTEMPLATE.AI_CHAT:
|
|
972
|
+
model = None
|
|
973
|
+
if kwargs:
|
|
974
|
+
for key in ("model", "model_name"):
|
|
975
|
+
if kwargs.get(key) and isinstance(kwargs[key], str):
|
|
976
|
+
model = kwargs[key]
|
|
977
|
+
break
|
|
978
|
+
|
|
979
|
+
span_name = f"chat {model}" if model else "chat"
|
|
980
|
+
|
|
981
|
+
elif template == SPANTEMPLATE.AI_AGENT:
|
|
982
|
+
span_name = f"invoke_agent {name}"
|
|
983
|
+
|
|
984
|
+
elif template == SPANTEMPLATE.AI_TOOL:
|
|
985
|
+
span_name = f"execute_tool {name}"
|
|
986
|
+
|
|
987
|
+
return span_name
|
|
988
|
+
|
|
989
|
+
|
|
990
|
+
def _get_span_op(template):
|
|
991
|
+
# type: (Union[str, SPANTEMPLATE]) -> str
|
|
992
|
+
"""
|
|
993
|
+
Get the operation of the span based on the template.
|
|
994
|
+
"""
|
|
995
|
+
mapping = {
|
|
996
|
+
SPANTEMPLATE.AI_CHAT: OP.GEN_AI_CHAT,
|
|
997
|
+
SPANTEMPLATE.AI_AGENT: OP.GEN_AI_INVOKE_AGENT,
|
|
998
|
+
SPANTEMPLATE.AI_TOOL: OP.GEN_AI_EXECUTE_TOOL,
|
|
999
|
+
} # type: dict[Union[str, SPANTEMPLATE], Union[str, OP]]
|
|
1000
|
+
op = mapping.get(template, OP.FUNCTION)
|
|
1001
|
+
|
|
1002
|
+
return str(op)
|
|
1003
|
+
|
|
1004
|
+
|
|
1005
|
+
def _get_input_attributes(template, send_pii, args, kwargs):
|
|
1006
|
+
# type: (Union[str, SPANTEMPLATE], bool, tuple[Any, ...], dict[str, Any]) -> dict[str, Any]
|
|
1007
|
+
"""
|
|
1008
|
+
Get input attributes for the given span template.
|
|
1009
|
+
"""
|
|
1010
|
+
attributes = {} # type: dict[str, Any]
|
|
1011
|
+
|
|
1012
|
+
if template in [SPANTEMPLATE.AI_AGENT, SPANTEMPLATE.AI_TOOL, SPANTEMPLATE.AI_CHAT]:
|
|
1013
|
+
mapping = {
|
|
1014
|
+
"model": (SPANDATA.GEN_AI_REQUEST_MODEL, str),
|
|
1015
|
+
"model_name": (SPANDATA.GEN_AI_REQUEST_MODEL, str),
|
|
1016
|
+
"agent": (SPANDATA.GEN_AI_AGENT_NAME, str),
|
|
1017
|
+
"agent_name": (SPANDATA.GEN_AI_AGENT_NAME, str),
|
|
1018
|
+
"max_tokens": (SPANDATA.GEN_AI_REQUEST_MAX_TOKENS, int),
|
|
1019
|
+
"frequency_penalty": (SPANDATA.GEN_AI_REQUEST_FREQUENCY_PENALTY, float),
|
|
1020
|
+
"presence_penalty": (SPANDATA.GEN_AI_REQUEST_PRESENCE_PENALTY, float),
|
|
1021
|
+
"temperature": (SPANDATA.GEN_AI_REQUEST_TEMPERATURE, float),
|
|
1022
|
+
"top_p": (SPANDATA.GEN_AI_REQUEST_TOP_P, float),
|
|
1023
|
+
"top_k": (SPANDATA.GEN_AI_REQUEST_TOP_K, int),
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
def _set_from_key(key, value):
|
|
1027
|
+
# type: (str, Any) -> None
|
|
1028
|
+
if key in mapping:
|
|
1029
|
+
(attribute, data_type) = mapping[key]
|
|
1030
|
+
if value is not None and isinstance(value, data_type):
|
|
1031
|
+
attributes[attribute] = value
|
|
1032
|
+
|
|
1033
|
+
for key, value in list(kwargs.items()):
|
|
1034
|
+
if key == "prompt" and isinstance(value, str):
|
|
1035
|
+
attributes.setdefault(SPANDATA.GEN_AI_REQUEST_MESSAGES, []).append(
|
|
1036
|
+
{"role": "user", "content": value}
|
|
1037
|
+
)
|
|
1038
|
+
continue
|
|
1039
|
+
|
|
1040
|
+
if key == "system_prompt" and isinstance(value, str):
|
|
1041
|
+
attributes.setdefault(SPANDATA.GEN_AI_REQUEST_MESSAGES, []).append(
|
|
1042
|
+
{"role": "system", "content": value}
|
|
1043
|
+
)
|
|
1044
|
+
continue
|
|
1045
|
+
|
|
1046
|
+
_set_from_key(key, value)
|
|
1047
|
+
|
|
1048
|
+
if template == SPANTEMPLATE.AI_TOOL and send_pii:
|
|
1049
|
+
attributes[SPANDATA.GEN_AI_TOOL_INPUT] = safe_repr(
|
|
1050
|
+
{"args": args, "kwargs": kwargs}
|
|
1051
|
+
)
|
|
1052
|
+
|
|
1053
|
+
# Coerce to string
|
|
1054
|
+
if SPANDATA.GEN_AI_REQUEST_MESSAGES in attributes:
|
|
1055
|
+
attributes[SPANDATA.GEN_AI_REQUEST_MESSAGES] = safe_repr(
|
|
1056
|
+
attributes[SPANDATA.GEN_AI_REQUEST_MESSAGES]
|
|
1057
|
+
)
|
|
1058
|
+
|
|
1059
|
+
return attributes
|
|
1060
|
+
|
|
1061
|
+
|
|
1062
|
+
def _get_usage_attributes(usage):
|
|
1063
|
+
# type: (Any) -> dict[str, Any]
|
|
1064
|
+
"""
|
|
1065
|
+
Get usage attributes.
|
|
1066
|
+
"""
|
|
1067
|
+
attributes = {}
|
|
1068
|
+
|
|
1069
|
+
def _set_from_keys(attribute, keys):
|
|
1070
|
+
# type: (str, tuple[str, ...]) -> None
|
|
1071
|
+
for key in keys:
|
|
1072
|
+
value = _get_value(usage, key)
|
|
1073
|
+
if value is not None and isinstance(value, int):
|
|
1074
|
+
attributes[attribute] = value
|
|
1075
|
+
|
|
1076
|
+
_set_from_keys(
|
|
1077
|
+
SPANDATA.GEN_AI_USAGE_INPUT_TOKENS,
|
|
1078
|
+
("prompt_tokens", "input_tokens"),
|
|
1079
|
+
)
|
|
1080
|
+
_set_from_keys(
|
|
1081
|
+
SPANDATA.GEN_AI_USAGE_OUTPUT_TOKENS,
|
|
1082
|
+
("completion_tokens", "output_tokens"),
|
|
1083
|
+
)
|
|
1084
|
+
_set_from_keys(
|
|
1085
|
+
SPANDATA.GEN_AI_USAGE_TOTAL_TOKENS,
|
|
1086
|
+
("total_tokens",),
|
|
1087
|
+
)
|
|
1088
|
+
|
|
1089
|
+
return attributes
|
|
1090
|
+
|
|
1091
|
+
|
|
1092
|
+
def _get_output_attributes(template, send_pii, result):
|
|
1093
|
+
# type: (Union[str, SPANTEMPLATE], bool, Any) -> dict[str, Any]
|
|
1094
|
+
"""
|
|
1095
|
+
Get output attributes for the given span template.
|
|
1096
|
+
"""
|
|
1097
|
+
attributes = {} # type: dict[str, Any]
|
|
1098
|
+
|
|
1099
|
+
if template in [SPANTEMPLATE.AI_AGENT, SPANTEMPLATE.AI_TOOL, SPANTEMPLATE.AI_CHAT]:
|
|
1100
|
+
with capture_internal_exceptions():
|
|
1101
|
+
# Usage from result, result.usage, and result.metadata.usage
|
|
1102
|
+
usage_candidates = [result]
|
|
1103
|
+
|
|
1104
|
+
usage = _get_value(result, "usage")
|
|
1105
|
+
usage_candidates.append(usage)
|
|
1106
|
+
|
|
1107
|
+
meta = _get_value(result, "metadata")
|
|
1108
|
+
usage = _get_value(meta, "usage")
|
|
1109
|
+
usage_candidates.append(usage)
|
|
1110
|
+
|
|
1111
|
+
for usage_candidate in usage_candidates:
|
|
1112
|
+
if usage_candidate is not None:
|
|
1113
|
+
attributes.update(_get_usage_attributes(usage_candidate))
|
|
1114
|
+
|
|
1115
|
+
# Response model
|
|
1116
|
+
model_name = _get_value(result, "model")
|
|
1117
|
+
if model_name is not None and isinstance(model_name, str):
|
|
1118
|
+
attributes[SPANDATA.GEN_AI_RESPONSE_MODEL] = model_name
|
|
1119
|
+
|
|
1120
|
+
model_name = _get_value(result, "model_name")
|
|
1121
|
+
if model_name is not None and isinstance(model_name, str):
|
|
1122
|
+
attributes[SPANDATA.GEN_AI_RESPONSE_MODEL] = model_name
|
|
1123
|
+
|
|
1124
|
+
# Tool output
|
|
1125
|
+
if template == SPANTEMPLATE.AI_TOOL and send_pii:
|
|
1126
|
+
attributes[SPANDATA.GEN_AI_TOOL_OUTPUT] = safe_repr(result)
|
|
1127
|
+
|
|
1128
|
+
return attributes
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
def _set_input_attributes(span, template, send_pii, name, f, args, kwargs):
|
|
1132
|
+
# type: (Span, Union[str, SPANTEMPLATE], bool, str, Any, tuple[Any, ...], dict[str, Any]) -> None
|
|
1133
|
+
"""
|
|
1134
|
+
Set span input attributes based on the given span template.
|
|
1135
|
+
|
|
1136
|
+
:param span: The span to set attributes on.
|
|
1137
|
+
:param template: The template to use to set attributes on the span.
|
|
1138
|
+
:param send_pii: Whether to send PII data.
|
|
1139
|
+
:param f: The wrapped function.
|
|
1140
|
+
:param args: The arguments to the wrapped function.
|
|
1141
|
+
:param kwargs: The keyword arguments to the wrapped function.
|
|
1142
|
+
"""
|
|
1143
|
+
attributes = {} # type: dict[str, Any]
|
|
1144
|
+
|
|
1145
|
+
if template == SPANTEMPLATE.AI_AGENT:
|
|
1146
|
+
attributes = {
|
|
1147
|
+
SPANDATA.GEN_AI_OPERATION_NAME: "invoke_agent",
|
|
1148
|
+
SPANDATA.GEN_AI_AGENT_NAME: name,
|
|
1149
|
+
}
|
|
1150
|
+
elif template == SPANTEMPLATE.AI_CHAT:
|
|
1151
|
+
attributes = {
|
|
1152
|
+
SPANDATA.GEN_AI_OPERATION_NAME: "chat",
|
|
1153
|
+
}
|
|
1154
|
+
elif template == SPANTEMPLATE.AI_TOOL:
|
|
1155
|
+
attributes = {
|
|
1156
|
+
SPANDATA.GEN_AI_OPERATION_NAME: "execute_tool",
|
|
1157
|
+
SPANDATA.GEN_AI_TOOL_NAME: name,
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
docstring = f.__doc__
|
|
1161
|
+
if docstring is not None:
|
|
1162
|
+
attributes[SPANDATA.GEN_AI_TOOL_DESCRIPTION] = docstring
|
|
1163
|
+
|
|
1164
|
+
attributes.update(_get_input_attributes(template, send_pii, args, kwargs))
|
|
1165
|
+
span.update_data(attributes or {})
|
|
1166
|
+
|
|
1167
|
+
|
|
1168
|
+
def _set_output_attributes(span, template, send_pii, result):
|
|
1169
|
+
# type: (Span, Union[str, SPANTEMPLATE], bool, Any) -> None
|
|
1170
|
+
"""
|
|
1171
|
+
Set span output attributes based on the given span template.
|
|
1172
|
+
|
|
1173
|
+
:param span: The span to set attributes on.
|
|
1174
|
+
:param template: The template to use to set attributes on the span.
|
|
1175
|
+
:param send_pii: Whether to send PII data.
|
|
1176
|
+
:param result: The result of the wrapped function.
|
|
1177
|
+
"""
|
|
1178
|
+
span.update_data(_get_output_attributes(template, send_pii, result) or {})
|
|
1179
|
+
|
|
1180
|
+
|
|
899
1181
|
# Circular imports
|
|
900
1182
|
from sentry_sdk.tracing import (
|
|
901
1183
|
BAGGAGE_HEADER_NAME,
|
sentry_sdk/utils.py
CHANGED
|
@@ -59,7 +59,7 @@ if TYPE_CHECKING:
|
|
|
59
59
|
|
|
60
60
|
from gevent.hub import Hub
|
|
61
61
|
|
|
62
|
-
from sentry_sdk._types import Event, ExcInfo
|
|
62
|
+
from sentry_sdk._types import Event, ExcInfo, Log, Hint
|
|
63
63
|
|
|
64
64
|
P = ParamSpec("P")
|
|
65
65
|
R = TypeVar("R")
|
|
@@ -1984,3 +1984,24 @@ def safe_serialize(data):
|
|
|
1984
1984
|
return json.dumps(serialized, default=str)
|
|
1985
1985
|
except Exception:
|
|
1986
1986
|
return str(data)
|
|
1987
|
+
|
|
1988
|
+
|
|
1989
|
+
def has_logs_enabled(options):
|
|
1990
|
+
# type: (Optional[dict[str, Any]]) -> bool
|
|
1991
|
+
if options is None:
|
|
1992
|
+
return False
|
|
1993
|
+
|
|
1994
|
+
return bool(
|
|
1995
|
+
options.get("enable_logs", False)
|
|
1996
|
+
or options["_experiments"].get("enable_logs", False)
|
|
1997
|
+
)
|
|
1998
|
+
|
|
1999
|
+
|
|
2000
|
+
def get_before_send_log(options):
|
|
2001
|
+
# type: (Optional[dict[str, Any]]) -> Optional[Callable[[Log, Hint], Optional[Log]]]
|
|
2002
|
+
if options is None:
|
|
2003
|
+
return None
|
|
2004
|
+
|
|
2005
|
+
return options.get("before_send_log") or options["_experiments"].get(
|
|
2006
|
+
"before_send_log"
|
|
2007
|
+
)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
sentry_sdk/__init__.py,sha256=
|
|
1
|
+
sentry_sdk/__init__.py,sha256=WaDm18HlX8BC_JAApork8LhiUBqPeJSXcMZDv3ACcWs,1310
|
|
2
2
|
sentry_sdk/_compat.py,sha256=Pxcg6cUYPiOoXIFfLI_H3ATb7SfrcXOeZdzpeWv3umI,3116
|
|
3
3
|
sentry_sdk/_init_implementation.py,sha256=WL54d8nggjRunBm3XlG-sWSx4yS5lpYYggd7YBWpuVk,2559
|
|
4
4
|
sentry_sdk/_log_batcher.py,sha256=bBpspIlf1ejxlbudo17bZOSir226LGAdjDe_3kHkOro,5085
|
|
@@ -6,10 +6,10 @@ sentry_sdk/_lru_cache.py,sha256=phZMBm9EKU1m67OOApnKCffnlWAlVz9bYjig7CglQuk,1229
|
|
|
6
6
|
sentry_sdk/_queue.py,sha256=UUzbmliDYmdVYiDA32NMYkX369ElWMFNSj5kodqVQZE,11250
|
|
7
7
|
sentry_sdk/_types.py,sha256=TMdmMSxc0dYErvRA5ikEnNxH_Iwb2Wiw3ZUMNlp0HCA,10482
|
|
8
8
|
sentry_sdk/_werkzeug.py,sha256=m3GPf-jHd8v3eVOfBHaKw5f0uHoLkXrSO1EcY-8EisY,3734
|
|
9
|
-
sentry_sdk/api.py,sha256=
|
|
9
|
+
sentry_sdk/api.py,sha256=OkwQ2tA5YASJ77wLOteUdv_woPF4wL_JTOAMxe9z8k4,15282
|
|
10
10
|
sentry_sdk/attachments.py,sha256=0Dylhm065O6hNFjB40fWCd5Hg4qWSXndmi1TPWglZkI,3109
|
|
11
|
-
sentry_sdk/client.py,sha256=
|
|
12
|
-
sentry_sdk/consts.py,sha256=
|
|
11
|
+
sentry_sdk/client.py,sha256=BZvI07seonpiZpbbKBsiXDdMVDh3I42JsIvbgo06oqw,38828
|
|
12
|
+
sentry_sdk/consts.py,sha256=eOQlSwtO4x3XGZYxOvOPkeA700mXmomHY1izrlr6j5s,49767
|
|
13
13
|
sentry_sdk/debug.py,sha256=ddBehQlAuQC1sg1XO-N4N3diZ0x0iT5RWJwFdrtcsjw,1019
|
|
14
14
|
sentry_sdk/envelope.py,sha256=Mgcib0uLm_5tSVzOrznRLdK9B3CjQ6TEgM1ZIZIfjWo,10355
|
|
15
15
|
sentry_sdk/feature_flags.py,sha256=99JRig6TBkrkBzVCKqYcmVgjsuA_Hk-ul7jFHGhJplc,2233
|
|
@@ -18,34 +18,34 @@ sentry_sdk/logger.py,sha256=u_8zS8gjQt7FjYqz_I91sCbdsmBe7IgRqWxMP3vrsq0,2399
|
|
|
18
18
|
sentry_sdk/metrics.py,sha256=3IvBwbHlU-C-JdwDysTeJqOoVyYXsHZ7oEkkU0qTZb4,29913
|
|
19
19
|
sentry_sdk/monitor.py,sha256=52CG1m2e8okFDVoTpbqfm9zeeaLa0ciC_r9x2RiXuDg,3639
|
|
20
20
|
sentry_sdk/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
|
-
sentry_sdk/scope.py,sha256=
|
|
21
|
+
sentry_sdk/scope.py,sha256=opbEbR_qWzSj4OCp8vr9Sn-7H11Qe7z4vKY0pjIgA88,63907
|
|
22
22
|
sentry_sdk/scrubber.py,sha256=rENmQ35buugDl269bRZuIAtgr27B9SzisJYUF-691pc,6064
|
|
23
23
|
sentry_sdk/serializer.py,sha256=xUw3xjSsGF0cWRHL9ofe0nmWEtZvzPOHSQ6IHvo6UAc,13239
|
|
24
24
|
sentry_sdk/session.py,sha256=TqDVmRKKHUDSmZb4jQR-s8wDt7Fwb6QaG21hawUGWEs,5571
|
|
25
25
|
sentry_sdk/sessions.py,sha256=UZ2jfrqhYvZzTxCDGc1MLD6P_aHLJnTFetSUROIaPaA,9154
|
|
26
26
|
sentry_sdk/spotlight.py,sha256=93kdd8KxdLfcPaxFnFuqHgYAAL4FCfpK1hiiPoD7Ac4,8678
|
|
27
|
-
sentry_sdk/tracing.py,sha256=
|
|
28
|
-
sentry_sdk/tracing_utils.py,sha256=
|
|
27
|
+
sentry_sdk/tracing.py,sha256=H3tp4b5aAP69hVwwu2sQQSi97dD_Bb9mtq0DhFw37zo,51485
|
|
28
|
+
sentry_sdk/tracing_utils.py,sha256=0RjENkigpVHydBIk_CqOTRZ8GJQHslgHveatvelZA1c,39040
|
|
29
29
|
sentry_sdk/transport.py,sha256=A0uux7XnniDJuExLudLyyFDYnS5C6r7zozGbkveUM7E,32469
|
|
30
30
|
sentry_sdk/types.py,sha256=NLbnRzww2K3_oGz2GzcC8TdX5L2DXYso1-H1uCv2Hwc,1222
|
|
31
|
-
sentry_sdk/utils.py,sha256=
|
|
31
|
+
sentry_sdk/utils.py,sha256=Ys7lnnvXZMIR9dcoT30CVxpUx2NnZifSy-TUNrCtMQA,61575
|
|
32
32
|
sentry_sdk/worker.py,sha256=VSMaigRMbInVyupSFpBC42bft2oIViea-0C_d9ThnIo,4464
|
|
33
33
|
sentry_sdk/ai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
34
|
sentry_sdk/ai/monitoring.py,sha256=OqQHsi832ZTL6mf38hO_qehaqMqVAb2E6HOyyaXSOtY,4948
|
|
35
|
-
sentry_sdk/ai/utils.py,sha256=
|
|
35
|
+
sentry_sdk/ai/utils.py,sha256=11PMqGCfEzAVrI2aSx-rdCl0dNYFzUi0bio6L8iM3kU,1174
|
|
36
36
|
sentry_sdk/crons/__init__.py,sha256=3Zt6g1-pZZ12uRKKsC8QLm3XgJ4K1VYxgVpNNUygOZY,221
|
|
37
|
-
sentry_sdk/crons/api.py,sha256=
|
|
37
|
+
sentry_sdk/crons/api.py,sha256=mk-UB8Im2LU2rJFdE-TV302EaKnf8kAjwEL0bIV0Hzc,1767
|
|
38
38
|
sentry_sdk/crons/consts.py,sha256=dXqJk5meBSu5rjlGpqAOlkpACnuUi7svQnAFoy1ZNUU,87
|
|
39
39
|
sentry_sdk/crons/decorator.py,sha256=UrjeIqBCbvsuKrfjGkKJbbLBvjw2TQvDWcTO7WwAmrI,3913
|
|
40
40
|
sentry_sdk/integrations/__init__.py,sha256=d0-uVMIrodezjlfK10IYZLXotZ8LtZzHSWGwysAQ4RY,10251
|
|
41
41
|
sentry_sdk/integrations/_asgi_common.py,sha256=Ypg7IctB3iPPY60ebVlzChzgT8GeGpZ0YH8VvJNDlEY,3187
|
|
42
42
|
sentry_sdk/integrations/_wsgi_common.py,sha256=A1-X7l1pZCcrbUhRHkmdKiK_EemEZjn7xToJIvlEuFM,7558
|
|
43
43
|
sentry_sdk/integrations/aiohttp.py,sha256=_rfDKx1arvVQwcC20vh7HG80p8XtgzqKB3iBuPYZy8A,12895
|
|
44
|
-
sentry_sdk/integrations/anthropic.py,sha256=
|
|
44
|
+
sentry_sdk/integrations/anthropic.py,sha256=8KnFdRNeaaB_rB9Bmi0FbYQrw1TUX535t2uSRI8Pv9o,11726
|
|
45
45
|
sentry_sdk/integrations/argv.py,sha256=GIY7TBFETF8Z0fDzqTXEJldt5XXCDdFNZxpGxP7EPaU,911
|
|
46
46
|
sentry_sdk/integrations/ariadne.py,sha256=C-zKlOrU7jvTWmQHZx0M0tAZNkPPo7Z5-5jXDD92LiU,5834
|
|
47
47
|
sentry_sdk/integrations/arq.py,sha256=yDPdWJa3ZgnGLwFzavIylIafEVN0qqSSgL4kUHxQF70,7881
|
|
48
|
-
sentry_sdk/integrations/asgi.py,sha256=
|
|
48
|
+
sentry_sdk/integrations/asgi.py,sha256=zjoOOA5bHlTptRsP3ZU4X5UsluyHFqebsUt3lRfiGtE,12738
|
|
49
49
|
sentry_sdk/integrations/asyncio.py,sha256=KdQs5dd_jY2cmBTGeG_jwEgfrPntC4lH71vTBXI670k,4034
|
|
50
50
|
sentry_sdk/integrations/asyncpg.py,sha256=fbBTi5bEERK3c9o43LBLtS5wPaSVq_qIl3Y50NPmr5Y,6521
|
|
51
51
|
sentry_sdk/integrations/atexit.py,sha256=sY46N2hEvtGuT1DBQhirUXHbjgXjXAm7R_sgiectVKw,1652
|
|
@@ -54,7 +54,7 @@ sentry_sdk/integrations/beam.py,sha256=qt35UmkA0ng4VNzmwqH9oz7SESU-is9IjFbTJ21ad
|
|
|
54
54
|
sentry_sdk/integrations/boto3.py,sha256=1ItKUX7EL9MHXS1H8VSn6IfZSFLeqaUqeWg-OKBm_Ik,4411
|
|
55
55
|
sentry_sdk/integrations/bottle.py,sha256=aC5OsitlsRUEWBlpkNjxvH0m6UEG3OfAJ9jFyPCbzqQ,6615
|
|
56
56
|
sentry_sdk/integrations/chalice.py,sha256=A4K_9FmNUu131El0ctkTmjtyYd184I4hQTlidZcEC54,4699
|
|
57
|
-
sentry_sdk/integrations/clickhouse_driver.py,sha256
|
|
57
|
+
sentry_sdk/integrations/clickhouse_driver.py,sha256=2qpRznwSNuRSzrCA1R5bmpgiehDmzbG7yZe6hN-61Wg,6098
|
|
58
58
|
sentry_sdk/integrations/cloud_resource_context.py,sha256=_gFldMeVHs5pxP5sm8uP7ZKmm6s_5hw3UsnXek9Iw8A,7780
|
|
59
59
|
sentry_sdk/integrations/cohere.py,sha256=iuDI1IVPE39rbsc3e9_qJS2bCjNg7F53apueCdhzr8Q,9322
|
|
60
60
|
sentry_sdk/integrations/dedupe.py,sha256=usREWhtGDFyxVBlIVzyCYj_Qy7NJBJ84FK0B57z11LM,1418
|
|
@@ -62,27 +62,27 @@ sentry_sdk/integrations/dramatiq.py,sha256=I09vKWnfiuhdRFCjYYjmE9LOBQvDTPS-KFqf3
|
|
|
62
62
|
sentry_sdk/integrations/excepthook.py,sha256=tfwpSQuo1b_OmJbNKPPRh90EUjD_OSE4DqqgYY9PVQI,2408
|
|
63
63
|
sentry_sdk/integrations/executing.py,sha256=5lxBAxO5FypY-zTV03AHncGmolmaHd327-3Vrjzskcc,1994
|
|
64
64
|
sentry_sdk/integrations/falcon.py,sha256=uhjqFPKa8bWRQr0za4pVXGYaPr-LRdICw2rUO-laKCo,9501
|
|
65
|
-
sentry_sdk/integrations/fastapi.py,sha256=
|
|
65
|
+
sentry_sdk/integrations/fastapi.py,sha256=kicdigHM3MG-GlpLUN6wwH8jOVu4dTuoQD6RBFrlXgo,4589
|
|
66
66
|
sentry_sdk/integrations/flask.py,sha256=t7q73JoJT46RWDtrNImtIloGyDg7CnsNFKpS4gOuBIw,8740
|
|
67
67
|
sentry_sdk/integrations/gcp.py,sha256=u1rSi3nK2ISUQqkRnmKFG23Ks-SefshTf5PV0Dwp3_4,8274
|
|
68
|
-
sentry_sdk/integrations/gnu_backtrace.py,sha256=
|
|
68
|
+
sentry_sdk/integrations/gnu_backtrace.py,sha256=FL7WkRfHT6idYCSLIrtFQ2G5ZTGoYudCKvBcjR5hqsI,2812
|
|
69
69
|
sentry_sdk/integrations/gql.py,sha256=ppC7fjpyQ6jWST-batRt5HtebxE_9IeHbmZ-CJ1TfUU,4179
|
|
70
70
|
sentry_sdk/integrations/graphene.py,sha256=I6ZJ8Apd9dO9XPVvZY7I46-v1eXOW1C1rAkWwasF3gU,5042
|
|
71
71
|
sentry_sdk/integrations/httpx.py,sha256=WwUulqzBLoGGqWUUdQg_MThwQUKzBXnA-m3g_1GOpCE,5866
|
|
72
72
|
sentry_sdk/integrations/huey.py,sha256=wlyxjeWqqJp1X5S3neD5FiZjXcyznm1dl8_u1wIo76U,5443
|
|
73
73
|
sentry_sdk/integrations/huggingface_hub.py,sha256=ypTn17T0vufQwi7ODXONFkB8fMjUrU5b4Q6JZ34bnA4,6717
|
|
74
|
-
sentry_sdk/integrations/langchain.py,sha256=
|
|
74
|
+
sentry_sdk/integrations/langchain.py,sha256=8ht-fXKb9muG3HEnKhuSvna2G8f2_M9BBzm1jXjnqiQ,26413
|
|
75
75
|
sentry_sdk/integrations/launchdarkly.py,sha256=bvtExuj68xPXZFsQeWTDR-ZBqP087tPuVzP1bNAOZHc,1935
|
|
76
|
-
sentry_sdk/integrations/litestar.py,sha256=
|
|
77
|
-
sentry_sdk/integrations/logging.py,sha256
|
|
78
|
-
sentry_sdk/integrations/loguru.py,sha256=
|
|
76
|
+
sentry_sdk/integrations/litestar.py,sha256=jao0f8v5JQagkBg15dUJTdWGPxpS3LmOV301-lwGkGc,11815
|
|
77
|
+
sentry_sdk/integrations/logging.py,sha256=3IvbPmvisv9ZM98SRRYlEH5g1nNVjOZz-204CWRcg-I,13641
|
|
78
|
+
sentry_sdk/integrations/loguru.py,sha256=fgivPdQn3rmsMeInUd2wbNlbXPAH9MKhjaqytRVKnsI,6215
|
|
79
79
|
sentry_sdk/integrations/modules.py,sha256=vzLx3Erg77Vl4mnUvAgTg_3teAuWy7zylFpAidBI9I0,820
|
|
80
|
-
sentry_sdk/integrations/openai.py,sha256=
|
|
81
|
-
sentry_sdk/integrations/openfeature.py,sha256
|
|
80
|
+
sentry_sdk/integrations/openai.py,sha256=N3CSx8OJlcx6cK2bj8GjmtcjBsw4T3fHdqlMKAzXirc,22939
|
|
81
|
+
sentry_sdk/integrations/openfeature.py,sha256=-vvdrN4fK0Xhu2ip41bkPIPEqdzv8xzmLu9wRlI2xPA,1131
|
|
82
82
|
sentry_sdk/integrations/pure_eval.py,sha256=OvT76XvllQ_J6ABu3jVNU6KD2QAxnXMtTZ7hqhXNhpY,4581
|
|
83
83
|
sentry_sdk/integrations/pymongo.py,sha256=cPpMGEbXHlV6HTHgmIDL1F-x3w7ZMROXVb4eUhLs3bw,6380
|
|
84
84
|
sentry_sdk/integrations/pyramid.py,sha256=IDonzoZvLrH18JL-i_Qpbztc4T3iZNQhWFFv6SAXac8,7364
|
|
85
|
-
sentry_sdk/integrations/quart.py,sha256=
|
|
85
|
+
sentry_sdk/integrations/quart.py,sha256=7h4BuGNWzZabVIIOKm194gMKDlIvS-dmWFW4iZXsmF4,7413
|
|
86
86
|
sentry_sdk/integrations/ray.py,sha256=HfRxAfTYe9Mli3c8hv-HPD8XSZ339l-6yM-rKrCm2Os,4596
|
|
87
87
|
sentry_sdk/integrations/rq.py,sha256=2Cidur0yL_JtdpOtBup6D6aYyN4T9mgshebEc-kvp-E,5307
|
|
88
88
|
sentry_sdk/integrations/rust_tracing.py,sha256=fQ0eG09w3IPZe8ecgeUoQTPoGFThkkarUyGC8KJj35o,9078
|
|
@@ -90,8 +90,8 @@ sentry_sdk/integrations/sanic.py,sha256=Z7orxkX9YhU9YSX4Oidsi3n46J0qlVG7Ajog-fnU
|
|
|
90
90
|
sentry_sdk/integrations/serverless.py,sha256=npiKJuIy_sEkWT_x0Eu2xSEMiMh_aySqGYlnvIROsYk,1804
|
|
91
91
|
sentry_sdk/integrations/socket.py,sha256=hlJDYlspzOy3UNjsd7qXPUoqJl5s1ShF3iijTRWpVaU,3169
|
|
92
92
|
sentry_sdk/integrations/sqlalchemy.py,sha256=QemZA6BmmZN5A8ux84gYdelJ9G9G-6kZQB7a5yRJCtQ,4372
|
|
93
|
-
sentry_sdk/integrations/starlette.py,sha256=
|
|
94
|
-
sentry_sdk/integrations/starlite.py,sha256=
|
|
93
|
+
sentry_sdk/integrations/starlette.py,sha256=URQB0dJDiVPyAKyySC1RdfR3qo9WU9GJU_fudp6T8ww,26267
|
|
94
|
+
sentry_sdk/integrations/starlite.py,sha256=llHsTmS__WWLeSKX0VxZ_LTIk_2cNf3UDQzqJ8r8noE,10544
|
|
95
95
|
sentry_sdk/integrations/statsig.py,sha256=-e57hxHfHo1S13YQKObV65q_UvREyxbR56fnf7bkC9o,1227
|
|
96
96
|
sentry_sdk/integrations/stdlib.py,sha256=vgB9weDGh455vBwmUSgcQRgzViKstu3O0syOthCn_H0,8831
|
|
97
97
|
sentry_sdk/integrations/strawberry.py,sha256=u7Lk4u3sNEycdSmY1nQBzYKmqI-mO8BWKAAJkCSuTRA,14126
|
|
@@ -106,7 +106,7 @@ sentry_sdk/integrations/celery/__init__.py,sha256=FNmrLL0Cs95kv6yUCpJGu9X8Cpw20m
|
|
|
106
106
|
sentry_sdk/integrations/celery/beat.py,sha256=WHEdKetrDJgtZGNp1VUMa6BG1q-MhsLZMefUmVrPu3w,8953
|
|
107
107
|
sentry_sdk/integrations/celery/utils.py,sha256=CMWQOpg9yniEkm3WlXe7YakJfVnLwaY0-jyeo2GX-ZI,1208
|
|
108
108
|
sentry_sdk/integrations/django/__init__.py,sha256=KqAgBKkuyJGw0lqNZBj0otqZGy_YHqPsisgPZLCN8mQ,25247
|
|
109
|
-
sentry_sdk/integrations/django/asgi.py,sha256=
|
|
109
|
+
sentry_sdk/integrations/django/asgi.py,sha256=R5wQYS6HAaSM9rmO5bnTHNt6pClthM6LsrgSioTSZSM,8349
|
|
110
110
|
sentry_sdk/integrations/django/caching.py,sha256=UvYaiI7xrN08Se59vMgJWrSO2BuowOyx3jmXmZoxQJo,6427
|
|
111
111
|
sentry_sdk/integrations/django/middleware.py,sha256=UVKq134w_TyOVPV7WwBW0QjHY-ziDipcZBIDQmjqceE,6009
|
|
112
112
|
sentry_sdk/integrations/django/signals_handlers.py,sha256=iudWetTlzNr5-kx_ew1YwW_vZ0yDChoonwPZB7AYGPo,3098
|
|
@@ -158,9 +158,9 @@ sentry_sdk/profiler/__init__.py,sha256=3PI3bHk9RSkkOXZKN84DDedk_7M65EiqqaIGo-DYs
|
|
|
158
158
|
sentry_sdk/profiler/continuous_profiler.py,sha256=s0DHkj3RZYRg9HnQQC0G44ku6DaFqRy30fZTMtTYvIs,22828
|
|
159
159
|
sentry_sdk/profiler/transaction_profiler.py,sha256=4Gj6FHLnK1di3GmnI1cCc_DbNcBVMdBjZZFvPvm7C7k,27877
|
|
160
160
|
sentry_sdk/profiler/utils.py,sha256=G5s4tYai9ATJqcHrQ3bOIxlK6jIaHzELrDtU5k3N4HI,6556
|
|
161
|
-
sentry_sdk-2.
|
|
162
|
-
sentry_sdk-2.
|
|
163
|
-
sentry_sdk-2.
|
|
164
|
-
sentry_sdk-2.
|
|
165
|
-
sentry_sdk-2.
|
|
166
|
-
sentry_sdk-2.
|
|
161
|
+
sentry_sdk-2.35.0.dist-info/licenses/LICENSE,sha256=KhQNZg9GKBL6KQvHQNBGMxJsXsRdhLebVp4Sew7t3Qs,1093
|
|
162
|
+
sentry_sdk-2.35.0.dist-info/METADATA,sha256=uoH5SQyyqgV4Tym4v4l9Hb21ENS9_wlln2WFYdKz39U,10278
|
|
163
|
+
sentry_sdk-2.35.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
|
|
164
|
+
sentry_sdk-2.35.0.dist-info/entry_points.txt,sha256=qacZEz40UspQZD1IukCXykx0JtImqGDOctS5KfOLTko,91
|
|
165
|
+
sentry_sdk-2.35.0.dist-info/top_level.txt,sha256=XrQz30XE9FKXSY_yGLrd9bsv2Rk390GTDJOSujYaMxI,11
|
|
166
|
+
sentry_sdk-2.35.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|