sentry-sdk 2.34.0__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.

@@ -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 start_child_span_decorator(func):
774
- # type: (Any) -> Any
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
- Decorator to add child spans for functions.
777
-
778
- See also ``sentry_sdk.tracing.trace()``.
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
- # Asynchronous case
781
- if inspect.iscoroutinefunction(func):
794
+ from sentry_sdk.scope import should_send_default_pii
782
795
 
783
- @wraps(func)
784
- async def func_with_tracing(*args, **kwargs):
785
- # type: (*Any, **Any) -> Any
796
+ def span_decorator(f):
797
+ # type: (Any) -> Any
798
+ """
799
+ Decorator to create a span for the given function.
800
+ """
786
801
 
787
- span = get_current_span()
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 span is None:
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(func),
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
- with span.start_child(
798
- op=OP.FUNCTION,
799
- name=qualname_from_function(func),
800
- ):
801
- return await func(*args, **kwargs)
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
- func_with_tracing.__signature__ = inspect.signature(func) # type: ignore[attr-defined]
836
+ async_wrapper.__signature__ = inspect.signature(f) # type: ignore[attr-defined]
805
837
  except Exception:
806
838
  pass
807
839
 
808
- # Synchronous case
809
- else:
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
- span = get_current_span()
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(func),
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
- with span.start_child(
826
- op=OP.FUNCTION,
827
- name=qualname_from_function(func),
828
- ):
829
- return func(*args, **kwargs)
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
- func_with_tracing.__signature__ = inspect.signature(func) # type: ignore[attr-defined]
874
+ sync_wrapper.__signature__ = inspect.signature(f) # type: ignore[attr-defined]
833
875
  except Exception:
834
876
  pass
835
877
 
836
- return func_with_tracing
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sentry-sdk
3
- Version: 2.34.0
3
+ Version: 2.35.0
4
4
  Summary: Python client for Sentry (https://sentry.io)
5
5
  Home-page: https://github.com/getsentry/sentry-python
6
6
  Author: Sentry Team and Contributors
@@ -1,4 +1,4 @@
1
- sentry_sdk/__init__.py,sha256=a9ZsEg5C8RSuLekRk1dbS_9-4ej5E2ebvktY5YPnT-k,1283
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=K4cNSmsJXI1HFyeCdHMans-IgQuDxviyhO4H2rrMkWY,12387
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=gHznIT7uGb6-h5gZFtN2qmjUEZNOuqIJQXwB1V-lSPU,38839
12
- sentry_sdk/consts.py,sha256=ikw6F3xZxjhylV9Dy8r2uj78guKAhK2KekpxZj6YZCo,45825
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=fl6Hm7BD-1HlzghOHkWY_zQY3FkakrNrqdjebfJ0LbY,63942
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=dEyLZn0JSj5WMjVJEQUxRud5NewBRau9dkuDrrzJ_Xw,48114
28
- sentry_sdk/tracing_utils.py,sha256=J_eY_0XuyydslEmcFZcrv8dt2ItpW7uWwe6CoXxoK5Q,28820
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=Uv_85CVVn_grmr1GjqGkogAbZPW1mr-iEcYcvlYp6EE,61036
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=QCwhHoptrdXyYroJqzCKxqi0cmrlD9IDDWUcBk6yWZc,950
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=s3x6SG-jqIdWS-Kj0sAxJv0nz2A3stdGE1UCtQyRUy4,1559
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=Jkf6adRz-SixvHuAqpv3gEssdso8TWp9bAK2xYD8Cys,9605
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=NiaIUpSycwU8GPJhykHYqArGGeQliMn9PMXrhIqSt7g,13471
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=-CN3MLtiOy3ryqjh2sSD-TUI_gvhG2DRrvKgoWszd3w,5247
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=KJsG73Xrm5AmAb2yiiINyfvlU9tIaVbPWA4urj6uEOU,4718
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=EdMQB6ZFBZhZHtkmEyKdQdJzNmzFRIP1hjg1ve2_qOQ,2658
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=nRmr6sc1W0xOQfNDkPzAI5gOhEHZFy24FERVbeKDByE,19060
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=ui52AfgyyAO4aQ9XSkqJZNcPduX0BccCYUkQA9nIJ_E,11891
77
- sentry_sdk/integrations/logging.py,sha256=-0o9HTFo5RpHkCpxfZvpiBj5VWpH4aIJmH-HNQzj3Ec,13643
78
- sentry_sdk/integrations/loguru.py,sha256=mEWYWsNHQLlWknU4M8RBgOf2-5B5cBr5aGd-ZH1Emq4,6193
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=1IyriExZ4BVCteq9Ml8Q0swRR4BkAboqfumoSFm74TA,22788
81
- sentry_sdk/integrations/openfeature.py,sha256=NXRKnhg0knMKOx_TO_2Z4zSsh4Glgk3tStu-lI99XsE,1235
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=pPFB-MVYGj_nfmZK9BRKxJHiqmBVulUnW0nAxI7FDOc,7437
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=bE4ySDV6n24IA-QEBtG7w3cQo3TPz6K_dqyI2tWA_lY,26413
94
- sentry_sdk/integrations/starlite.py,sha256=pmLgdIsDDJOLFz-o_Wx7TbgSDvEVwWhDMx6nd_WOWwA,10620
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=RdDiCjlWAJ2pKm84-0li3jpp2Zl_GmLNprYdkLDTXgY,8333
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.34.0.dist-info/licenses/LICENSE,sha256=KhQNZg9GKBL6KQvHQNBGMxJsXsRdhLebVp4Sew7t3Qs,1093
162
- sentry_sdk-2.34.0.dist-info/METADATA,sha256=lx1pIBA63c_gfGyea7bRqZdtENj63J4xeHDUQbE8ie4,10278
163
- sentry_sdk-2.34.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
164
- sentry_sdk-2.34.0.dist-info/entry_points.txt,sha256=qacZEz40UspQZD1IukCXykx0JtImqGDOctS5KfOLTko,91
165
- sentry_sdk-2.34.0.dist-info/top_level.txt,sha256=XrQz30XE9FKXSY_yGLrd9bsv2Rk390GTDJOSujYaMxI,11
166
- sentry_sdk-2.34.0.dist-info/RECORD,,
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,,