sentry-sdk 3.0.0a4__tar.gz → 3.0.0a5__tar.gz

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.

Files changed (203) hide show
  1. {sentry_sdk-3.0.0a4/sentry_sdk.egg-info → sentry_sdk-3.0.0a5}/PKG-INFO +1 -1
  2. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/__init__.py +1 -0
  3. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/api.py +57 -0
  4. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/consts.py +113 -4
  5. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/starlite.py +1 -1
  6. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/scope.py +3 -1
  7. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/span_processor.py +1 -0
  8. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/tracing.py +6 -1
  9. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5/sentry_sdk.egg-info}/PKG-INFO +1 -1
  10. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/setup.py +1 -1
  11. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_api.py +19 -0
  12. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/LICENSE +0 -0
  13. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/MANIFEST.in +0 -0
  14. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/README.md +0 -0
  15. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/pyproject.toml +0 -0
  16. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/_compat.py +0 -0
  17. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/_init_implementation.py +0 -0
  18. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/_log_batcher.py +0 -0
  19. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/_lru_cache.py +0 -0
  20. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/_queue.py +0 -0
  21. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/_types.py +0 -0
  22. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/_werkzeug.py +0 -0
  23. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/ai/__init__.py +0 -0
  24. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/ai/monitoring.py +0 -0
  25. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/ai/utils.py +0 -0
  26. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/attachments.py +0 -0
  27. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/client.py +0 -0
  28. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/crons/__init__.py +0 -0
  29. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/crons/api.py +0 -0
  30. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/crons/consts.py +0 -0
  31. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/crons/decorator.py +0 -0
  32. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/debug.py +0 -0
  33. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/envelope.py +0 -0
  34. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/feature_flags.py +0 -0
  35. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/__init__.py +0 -0
  36. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/_asgi_common.py +0 -0
  37. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/_wsgi_common.py +0 -0
  38. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/aiohttp.py +0 -0
  39. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/anthropic.py +0 -0
  40. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/argv.py +0 -0
  41. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/ariadne.py +0 -0
  42. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/arq.py +0 -0
  43. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/asgi.py +0 -0
  44. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/asyncio.py +0 -0
  45. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/asyncpg.py +0 -0
  46. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/atexit.py +0 -0
  47. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/aws_lambda.py +0 -0
  48. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/beam.py +0 -0
  49. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/boto3.py +0 -0
  50. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/bottle.py +0 -0
  51. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/celery/__init__.py +0 -0
  52. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/celery/beat.py +0 -0
  53. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/celery/utils.py +0 -0
  54. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/chalice.py +0 -0
  55. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/clickhouse_driver.py +0 -0
  56. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/cloud_resource_context.py +0 -0
  57. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/cohere.py +0 -0
  58. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/dedupe.py +0 -0
  59. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/__init__.py +0 -0
  60. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/asgi.py +0 -0
  61. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/caching.py +0 -0
  62. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/middleware.py +0 -0
  63. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/signals_handlers.py +0 -0
  64. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/templates.py +0 -0
  65. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/transactions.py +0 -0
  66. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/django/views.py +0 -0
  67. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/dramatiq.py +0 -0
  68. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/excepthook.py +0 -0
  69. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/executing.py +0 -0
  70. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/falcon.py +0 -0
  71. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/fastapi.py +0 -0
  72. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/flask.py +0 -0
  73. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/gcp.py +0 -0
  74. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/gnu_backtrace.py +0 -0
  75. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/gql.py +0 -0
  76. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/graphene.py +0 -0
  77. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/grpc/__init__.py +0 -0
  78. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/grpc/aio/__init__.py +0 -0
  79. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/grpc/aio/client.py +0 -0
  80. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/grpc/aio/server.py +0 -0
  81. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/grpc/client.py +0 -0
  82. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/grpc/consts.py +0 -0
  83. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/grpc/server.py +0 -0
  84. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/httpx.py +0 -0
  85. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/huey.py +0 -0
  86. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/huggingface_hub.py +0 -0
  87. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/langchain.py +0 -0
  88. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/launchdarkly.py +0 -0
  89. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/litestar.py +0 -0
  90. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/logging.py +0 -0
  91. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/loguru.py +0 -0
  92. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/modules.py +0 -0
  93. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai.py +0 -0
  94. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/__init__.py +0 -0
  95. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/consts.py +0 -0
  96. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/patches/__init__.py +0 -0
  97. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/patches/agent_run.py +0 -0
  98. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/patches/models.py +0 -0
  99. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/patches/runner.py +0 -0
  100. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/patches/tools.py +0 -0
  101. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/spans/__init__.py +0 -0
  102. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/spans/agent_workflow.py +0 -0
  103. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/spans/ai_client.py +0 -0
  104. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/spans/execute_tool.py +0 -0
  105. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/spans/handoff.py +0 -0
  106. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/spans/invoke_agent.py +0 -0
  107. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openai_agents/utils.py +0 -0
  108. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/openfeature.py +0 -0
  109. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/pure_eval.py +0 -0
  110. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/pymongo.py +0 -0
  111. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/pyramid.py +0 -0
  112. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/quart.py +0 -0
  113. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/ray.py +0 -0
  114. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/__init__.py +0 -0
  115. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/_async_common.py +0 -0
  116. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/_sync_common.py +0 -0
  117. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/consts.py +0 -0
  118. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/modules/__init__.py +0 -0
  119. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/modules/caches.py +0 -0
  120. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/modules/queries.py +0 -0
  121. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/rb.py +0 -0
  122. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/redis.py +0 -0
  123. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/redis_cluster.py +0 -0
  124. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/redis_py_cluster_legacy.py +0 -0
  125. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/redis/utils.py +0 -0
  126. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/rq.py +0 -0
  127. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/rust_tracing.py +0 -0
  128. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/sanic.py +0 -0
  129. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/serverless.py +0 -0
  130. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/socket.py +0 -0
  131. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/spark/__init__.py +0 -0
  132. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/spark/spark_driver.py +0 -0
  133. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/spark/spark_worker.py +0 -0
  134. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/sqlalchemy.py +0 -0
  135. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/starlette.py +0 -0
  136. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/statsig.py +0 -0
  137. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/stdlib.py +0 -0
  138. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/strawberry.py +0 -0
  139. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/sys_exit.py +0 -0
  140. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/threading.py +0 -0
  141. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/tornado.py +0 -0
  142. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/trytond.py +0 -0
  143. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/typer.py +0 -0
  144. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/unleash.py +0 -0
  145. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/integrations/wsgi.py +0 -0
  146. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/logger.py +0 -0
  147. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/monitor.py +0 -0
  148. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/__init__.py +0 -0
  149. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/consts.py +0 -0
  150. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/contextvars_context.py +0 -0
  151. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/propagator.py +0 -0
  152. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/sampler.py +0 -0
  153. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/tracing.py +0 -0
  154. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/opentelemetry/utils.py +0 -0
  155. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/profiler/__init__.py +0 -0
  156. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/profiler/continuous_profiler.py +0 -0
  157. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/profiler/transaction_profiler.py +0 -0
  158. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/profiler/utils.py +0 -0
  159. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/py.typed +0 -0
  160. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/scope.py +0 -0
  161. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/scrubber.py +0 -0
  162. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/serializer.py +0 -0
  163. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/session.py +0 -0
  164. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/sessions.py +0 -0
  165. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/spotlight.py +0 -0
  166. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/tracing_utils.py +0 -0
  167. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/transport.py +0 -0
  168. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/types.py +0 -0
  169. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/utils.py +0 -0
  170. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk/worker.py +0 -0
  171. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk.egg-info/SOURCES.txt +0 -0
  172. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk.egg-info/dependency_links.txt +0 -0
  173. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk.egg-info/entry_points.txt +0 -0
  174. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk.egg-info/not-zip-safe +0 -0
  175. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk.egg-info/requires.txt +0 -0
  176. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/sentry_sdk.egg-info/top_level.txt +0 -0
  177. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/setup.cfg +0 -0
  178. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_ai_monitoring.py +0 -0
  179. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_basics.py +0 -0
  180. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_breadcrumbs.py +0 -0
  181. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_client.py +0 -0
  182. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_conftest.py +0 -0
  183. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_crons.py +0 -0
  184. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_dsc.py +0 -0
  185. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_envelope.py +0 -0
  186. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_exceptiongroup.py +0 -0
  187. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_feature_flags.py +0 -0
  188. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_full_stack_frames.py +0 -0
  189. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_gevent.py +0 -0
  190. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_import.py +0 -0
  191. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_logs.py +0 -0
  192. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_lru_cache.py +0 -0
  193. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_monitor.py +0 -0
  194. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_propagationcontext.py +0 -0
  195. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_scope.py +0 -0
  196. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_scrubber.py +0 -0
  197. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_serializer.py +0 -0
  198. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_sessions.py +0 -0
  199. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_spotlight.py +0 -0
  200. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_tracing_utils.py +0 -0
  201. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_transport.py +0 -0
  202. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_types.py +0 -0
  203. {sentry_sdk-3.0.0a4 → sentry_sdk-3.0.0a5}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sentry-sdk
3
- Version: 3.0.0a4
3
+ Version: 3.0.0a5
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
@@ -49,6 +49,7 @@ __all__ = [ # noqa
49
49
  "start_session",
50
50
  "end_session",
51
51
  "set_transaction_name",
52
+ "update_current_span",
52
53
  ]
53
54
 
54
55
  # Initialize the debug support after everything is loaded
@@ -76,6 +76,7 @@ __all__ = [
76
76
  "start_session",
77
77
  "end_session",
78
78
  "set_transaction_name",
79
+ "update_current_span",
79
80
  ]
80
81
 
81
82
 
@@ -341,3 +342,59 @@ def end_session() -> None:
341
342
  @scopemethod
342
343
  def set_transaction_name(name: str, source: Optional[str] = None) -> None:
343
344
  return get_current_scope().set_transaction_name(name, source)
345
+
346
+
347
+ def update_current_span(op=None, name=None, attributes=None):
348
+ # type: (Optional[str], Optional[str], Optional[dict[str, Union[str, int, float, bool]]]) -> None
349
+ """
350
+ Update the current active span with the provided parameters.
351
+
352
+ This function allows you to modify properties of the currently active span.
353
+ If no span is currently active, this function will do nothing.
354
+
355
+ :param op: The operation name for the span. This is a high-level description
356
+ of what the span represents (e.g., "http.client", "db.query").
357
+ You can use predefined constants from :py:class:`sentry_sdk.consts.OP`
358
+ or provide your own string. If not provided, the span's operation will
359
+ remain unchanged.
360
+ :type op: str or None
361
+
362
+ :param name: The human-readable name/description for the span. This provides
363
+ more specific details about what the span represents (e.g., "GET /api/users",
364
+ "SELECT * FROM users"). If not provided, the span's name will remain unchanged.
365
+ :type name: str or None
366
+
367
+ :param attributes: A dictionary of key-value pairs to add as attributes to the span.
368
+ Attribute values must be strings, integers, floats, or booleans. These
369
+ attributes will be merged with any existing span data. If not provided,
370
+ no attributes will be added.
371
+ :type attributes: dict[str, Union[str, int, float, bool]] or None
372
+
373
+ :returns: None
374
+
375
+ .. versionadded:: 2.35.0
376
+
377
+ Example::
378
+
379
+ import sentry_sdk
380
+ from sentry_sdk.consts import OP
381
+
382
+ sentry_sdk.update_current_span(
383
+ op=OP.FUNCTION,
384
+ name="process_user_data",
385
+ attributes={"user_id": 123, "batch_size": 50}
386
+ )
387
+ """
388
+ current_span = get_current_span()
389
+
390
+ if current_span is None:
391
+ return
392
+
393
+ if op is not None:
394
+ current_span.op = op
395
+
396
+ if name is not None:
397
+ current_span.name = name
398
+
399
+ if attributes is not None:
400
+ current_span.set_attributes(attributes)
@@ -103,6 +103,9 @@ class SPANDATA:
103
103
 
104
104
  AI_CITATIONS = "ai.citations"
105
105
  """
106
+ .. deprecated::
107
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
108
+
106
109
  References or sources cited by the AI model in its response.
107
110
  Example: ["Smith et al. 2020", "Jones 2019"]
108
111
  """
@@ -115,65 +118,97 @@ class SPANDATA:
115
118
 
116
119
  AI_DOCUMENTS = "ai.documents"
117
120
  """
121
+ .. deprecated::
122
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
123
+
118
124
  Documents or content chunks used as context for the AI model.
119
125
  Example: ["doc1.txt", "doc2.pdf"]
120
126
  """
121
127
 
122
128
  AI_FINISH_REASON = "ai.finish_reason"
123
129
  """
130
+ .. deprecated::
131
+ This attribute is deprecated. Use GEN_AI_RESPONSE_FINISH_REASONS instead.
132
+
124
133
  The reason why the model stopped generating.
125
134
  Example: "length"
126
135
  """
127
136
 
128
137
  AI_FREQUENCY_PENALTY = "ai.frequency_penalty"
129
138
  """
139
+ .. deprecated::
140
+ This attribute is deprecated. Use GEN_AI_REQUEST_FREQUENCY_PENALTY instead.
141
+
130
142
  Used to reduce repetitiveness of generated tokens.
131
143
  Example: 0.5
132
144
  """
133
145
 
134
146
  AI_FUNCTION_CALL = "ai.function_call"
135
147
  """
148
+ .. deprecated::
149
+ This attribute is deprecated. Use GEN_AI_RESPONSE_TOOL_CALLS instead.
150
+
136
151
  For an AI model call, the function that was called. This is deprecated for OpenAI, and replaced by tool_calls
137
152
  """
138
153
 
139
154
  AI_GENERATION_ID = "ai.generation_id"
140
155
  """
156
+ .. deprecated::
157
+ This attribute is deprecated. Use GEN_AI_RESPONSE_ID instead.
158
+
141
159
  Unique identifier for the completion.
142
160
  Example: "gen_123abc"
143
161
  """
144
162
 
145
163
  AI_INPUT_MESSAGES = "ai.input_messages"
146
164
  """
165
+ .. deprecated::
166
+ This attribute is deprecated. Use GEN_AI_REQUEST_MESSAGES instead.
167
+
147
168
  The input messages to an LLM call.
148
169
  Example: [{"role": "user", "message": "hello"}]
149
170
  """
150
171
 
151
172
  AI_LOGIT_BIAS = "ai.logit_bias"
152
173
  """
174
+ .. deprecated::
175
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
176
+
153
177
  For an AI model call, the logit bias
154
178
  """
155
179
 
156
180
  AI_METADATA = "ai.metadata"
157
181
  """
182
+ .. deprecated::
183
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
184
+
158
185
  Extra metadata passed to an AI pipeline step.
159
186
  Example: {"executed_function": "add_integers"}
160
187
  """
161
188
 
162
189
  AI_MODEL_ID = "ai.model_id"
163
190
  """
164
- The unique descriptor of the model being execugted
191
+ .. deprecated::
192
+ This attribute is deprecated. Use GEN_AI_REQUEST_MODEL or GEN_AI_RESPONSE_MODEL instead.
193
+
194
+ The unique descriptor of the model being executed.
165
195
  Example: gpt-4
166
196
  """
167
197
 
168
198
  AI_PIPELINE_NAME = "ai.pipeline.name"
169
199
  """
200
+ .. deprecated::
201
+ This attribute is deprecated. Use GEN_AI_PIPELINE_NAME instead.
202
+
170
203
  Name of the AI pipeline or chain being executed.
171
- DEPRECATED: Use GEN_AI_PIPELINE_NAME instead.
172
204
  Example: "qa-pipeline"
173
205
  """
174
206
 
175
207
  AI_PREAMBLE = "ai.preamble"
176
208
  """
209
+ .. deprecated::
210
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
211
+
177
212
  For an AI model call, the preamble parameter.
178
213
  Preambles are a part of the prompt used to adjust the model's overall behavior and conversation style.
179
214
  Example: "You are now a clown."
@@ -181,6 +216,9 @@ class SPANDATA:
181
216
 
182
217
  AI_PRESENCE_PENALTY = "ai.presence_penalty"
183
218
  """
219
+ .. deprecated::
220
+ This attribute is deprecated. Use GEN_AI_REQUEST_PRESENCE_PENALTY instead.
221
+
184
222
  Used to reduce repetitiveness of generated tokens.
185
223
  Example: 0.5
186
224
  """
@@ -193,89 +231,133 @@ class SPANDATA:
193
231
 
194
232
  AI_RAW_PROMPTING = "ai.raw_prompting"
195
233
  """
234
+ .. deprecated::
235
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
236
+
196
237
  Minimize pre-processing done to the prompt sent to the LLM.
197
238
  Example: true
198
239
  """
199
240
 
200
241
  AI_RESPONSE_FORMAT = "ai.response_format"
201
242
  """
243
+ .. deprecated::
244
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
245
+
202
246
  For an AI model call, the format of the response
203
247
  """
204
248
 
205
249
  AI_RESPONSES = "ai.responses"
206
250
  """
251
+ .. deprecated::
252
+ This attribute is deprecated. Use GEN_AI_RESPONSE_TEXT instead.
253
+
207
254
  The responses to an AI model call. Always as a list.
208
255
  Example: ["hello", "world"]
209
256
  """
210
257
 
211
258
  AI_SEARCH_QUERIES = "ai.search_queries"
212
259
  """
260
+ .. deprecated::
261
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
262
+
213
263
  Queries used to search for relevant context or documents.
214
264
  Example: ["climate change effects", "renewable energy"]
215
265
  """
216
266
 
217
267
  AI_SEARCH_REQUIRED = "ai.is_search_required"
218
268
  """
269
+ .. deprecated::
270
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
271
+
219
272
  Boolean indicating if the model needs to perform a search.
220
273
  Example: true
221
274
  """
222
275
 
223
276
  AI_SEARCH_RESULTS = "ai.search_results"
224
277
  """
278
+ .. deprecated::
279
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
280
+
225
281
  Results returned from search queries for context.
226
282
  Example: ["Result 1", "Result 2"]
227
283
  """
228
284
 
229
285
  AI_SEED = "ai.seed"
230
286
  """
287
+ .. deprecated::
288
+ This attribute is deprecated. Use GEN_AI_REQUEST_SEED instead.
289
+
231
290
  The seed, ideally models given the same seed and same other parameters will produce the exact same output.
232
291
  Example: 123.45
233
292
  """
234
293
 
235
294
  AI_STREAMING = "ai.streaming"
236
295
  """
296
+ .. deprecated::
297
+ This attribute is deprecated. Use GEN_AI_RESPONSE_STREAMING instead.
298
+
237
299
  Whether or not the AI model call's response was streamed back asynchronously
238
- DEPRECATED: Use GEN_AI_RESPONSE_STREAMING instead.
239
300
  Example: true
240
301
  """
241
302
 
242
303
  AI_TAGS = "ai.tags"
243
304
  """
305
+ .. deprecated::
306
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
307
+
244
308
  Tags that describe an AI pipeline step.
245
309
  Example: {"executed_function": "add_integers"}
246
310
  """
247
311
 
248
312
  AI_TEMPERATURE = "ai.temperature"
249
313
  """
314
+ .. deprecated::
315
+ This attribute is deprecated. Use GEN_AI_REQUEST_TEMPERATURE instead.
316
+
250
317
  For an AI model call, the temperature parameter. Temperature essentially means how random the output will be.
251
318
  Example: 0.5
252
319
  """
253
320
 
254
321
  AI_TEXTS = "ai.texts"
255
322
  """
323
+ .. deprecated::
324
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
325
+
256
326
  Raw text inputs provided to the model.
257
327
  Example: ["What is machine learning?"]
258
328
  """
259
329
 
260
330
  AI_TOP_K = "ai.top_k"
261
331
  """
332
+ .. deprecated::
333
+ This attribute is deprecated. Use GEN_AI_REQUEST_TOP_K instead.
334
+
262
335
  For an AI model call, the top_k parameter. Top_k essentially controls how random the output will be.
263
336
  Example: 35
264
337
  """
265
338
 
266
339
  AI_TOP_P = "ai.top_p"
267
340
  """
341
+ .. deprecated::
342
+ This attribute is deprecated. Use GEN_AI_REQUEST_TOP_P instead.
343
+
268
344
  For an AI model call, the top_p parameter. Top_p essentially controls how random the output will be.
269
345
  Example: 0.5
270
346
  """
271
347
 
272
348
  AI_TOOL_CALLS = "ai.tool_calls"
273
349
  """
350
+ .. deprecated::
351
+ This attribute is deprecated. Use GEN_AI_RESPONSE_TOOL_CALLS instead.
352
+
274
353
  For an AI model call, the function that was called. This is deprecated for OpenAI, and replaced by tool_calls
275
354
  """
276
355
 
277
356
  AI_TOOLS = "ai.tools"
278
357
  """
358
+ .. deprecated::
359
+ This attribute is deprecated. Use GEN_AI_REQUEST_AVAILABLE_TOOLS instead.
360
+
279
361
  For an AI model call, the functions that are available
280
362
  """
281
363
 
@@ -287,6 +369,9 @@ class SPANDATA:
287
369
 
288
370
  AI_WARNINGS = "ai.warnings"
289
371
  """
372
+ .. deprecated::
373
+ This attribute is deprecated. Use GEN_AI_* attributes instead.
374
+
290
375
  Warning messages generated during model execution.
291
376
  Example: ["Token limit exceeded"]
292
377
  """
@@ -391,6 +476,18 @@ class SPANDATA:
391
476
  Example: "qa-pipeline"
392
477
  """
393
478
 
479
+ GEN_AI_RESPONSE_FINISH_REASONS = "gen_ai.response.finish_reasons"
480
+ """
481
+ The reason why the model stopped generating.
482
+ Example: "COMPLETE"
483
+ """
484
+
485
+ GEN_AI_RESPONSE_ID = "gen_ai.response.id"
486
+ """
487
+ Unique identifier for the completion.
488
+ Example: "gen_123abc"
489
+ """
490
+
394
491
  GEN_AI_RESPONSE_MODEL = "gen_ai.response.model"
395
492
  """
396
493
  Exact model identifier used to generate the response
@@ -451,12 +548,24 @@ class SPANDATA:
451
548
  Example: 0.1
452
549
  """
453
550
 
551
+ GEN_AI_REQUEST_SEED = "gen_ai.request.seed"
552
+ """
553
+ The seed, ideally models given the same seed and same other parameters will produce the exact same output.
554
+ Example: "1234567890"
555
+ """
556
+
454
557
  GEN_AI_REQUEST_TEMPERATURE = "gen_ai.request.temperature"
455
558
  """
456
559
  The temperature parameter used to control randomness in the output.
457
560
  Example: 0.7
458
561
  """
459
562
 
563
+ GEN_AI_REQUEST_TOP_K = "gen_ai.request.top_k"
564
+ """
565
+ Limits the model to only consider the K most likely next tokens, where K is an integer (e.g., top_k=20 means only the 20 highest probability tokens are considered).
566
+ Example: 35
567
+ """
568
+
460
569
  GEN_AI_REQUEST_TOP_P = "gen_ai.request.top_p"
461
570
  """
462
571
  The top_p parameter used to control diversity via nucleus sampling.
@@ -1272,4 +1381,4 @@ DEFAULT_OPTIONS = _get_default_options()
1272
1381
  del _get_default_options
1273
1382
 
1274
1383
 
1275
- VERSION = "3.0.0a4"
1384
+ VERSION = "3.0.0a5"
@@ -17,7 +17,7 @@ try:
17
17
  from starlite.plugins.base import get_plugin_for_value # type: ignore
18
18
  from starlite.routes.http import HTTPRoute # type: ignore
19
19
  from starlite.utils import ConnectionDataExtractor, is_async_callable, Ref # type: ignore
20
- from pydantic import BaseModel # type: ignore
20
+ from pydantic import BaseModel
21
21
  except ImportError:
22
22
  raise DidNotEnable("Starlite is not installed")
23
23
 
@@ -85,7 +85,9 @@ class PotelScope(Scope):
85
85
 
86
86
  span_context = self._incoming_otel_span_context()
87
87
  if span_context is None:
88
- yield
88
+ # force a new trace since no incoming stuff
89
+ with use_span(INVALID_SPAN):
90
+ yield
89
91
  else:
90
92
  with use_span(NonRecordingSpan(span_context)):
91
93
  yield
@@ -225,6 +225,7 @@ class SentrySpanProcessor(SpanProcessor):
225
225
  if span.resource.attributes:
226
226
  contexts[OTEL_SENTRY_CONTEXT] = {"resource": dict(span.resource.attributes)}
227
227
 
228
+ event.setdefault("tags", {})
228
229
  event.update(
229
230
  {
230
231
  "type": "transaction",
@@ -352,7 +352,8 @@ class Span:
352
352
  return self.get_attribute(SentrySpanAttribute.NAME)
353
353
 
354
354
  @name.setter
355
- def name(self, value: Optional[str]) -> None:
355
+ def name(self, value: str) -> None:
356
+ self._otel_span.update_name(value)
356
357
  self.set_attribute(SentrySpanAttribute.NAME, value)
357
358
 
358
359
  @property
@@ -450,6 +451,10 @@ class Span:
450
451
 
451
452
  self._otel_span.set_attribute(key, serialized_value)
452
453
 
454
+ def set_attributes(self, attributes: dict[str, Any]) -> None:
455
+ for key, value in attributes.items():
456
+ self.set_attribute(key, value)
457
+
453
458
  @property
454
459
  def status(self) -> Optional[str]:
455
460
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sentry-sdk
3
- Version: 3.0.0a4
3
+ Version: 3.0.0a5
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
@@ -21,7 +21,7 @@ def get_file_text(file_name):
21
21
 
22
22
  setup(
23
23
  name="sentry-sdk",
24
- version="3.0.0a4",
24
+ version="3.0.0a5",
25
25
  author="Sentry Team and Contributors",
26
26
  author_email="hello@sentry.io",
27
27
  url="https://github.com/getsentry/sentry-python",
@@ -97,6 +97,25 @@ def test_continue_trace(sentry_init):
97
97
  }
98
98
 
99
99
 
100
+ def test_continue_trace_without_headers_starts_new_trace(sentry_init, capture_events):
101
+ sentry_init(traces_sample_rate=1.0)
102
+ events = capture_events()
103
+
104
+ with start_span(name="parent"):
105
+ with start_span(name="child"):
106
+ with continue_trace({}):
107
+ with start_span(name="parent2"):
108
+ with start_span(name="child2"):
109
+ pass
110
+
111
+ assert len(events) == 2
112
+ (tx1, tx2) = events
113
+ assert tx1["transaction"] == "parent2"
114
+ assert tx1["spans"][0]["description"] == "child2"
115
+ assert tx2["transaction"] == "parent"
116
+ assert tx2["spans"][0]["description"] == "child"
117
+
118
+
100
119
  def test_new_trace(sentry_init, capture_events):
101
120
  sentry_init(traces_sample_rate=1.0)
102
121
  events = capture_events()
File without changes
File without changes
File without changes