Add client cert and key support to HttpTransport (#3258) by @grammy-jiang
Add cert_file and key_file to your sentry_sdk.init to use a custom client cert and key. Alternatively, the environment variables CLIENT_CERT_FILE and CLIENT_KEY_FILE can be used as well.
OpenAI: Lazy initialize tiktoken to avoid http at import time (#3287) by @colin-sentry
OpenAI, Langchain: Make tiktoken encoding name configurable + tiktoken usage opt-in (#3289) by @colin-sentry
Fixed a bug where having certain packages installed along the Sentry SDK caused an HTTP request to be made to OpenAI infrastructure when the Sentry SDK was initialized. The request was made when the tiktoken package and at least one of the openai or langchain packages were installed.
The request was fetching a tiktoken encoding in order to correctly measure token usage in some OpenAI and Langchain calls. This behavior is now opt-in. The choice of encoding to use was made configurable as well. To opt in, set the tiktoken_encoding_name parameter in the OpenAPI or Langchain integration.
sentry_sdk.init(
integrations=[
OpenAIIntegration(tiktoken_encoding_name="cl100k_base"),
LangchainIntegration(tiktoken_encoding_name="cl100k_base"),
],
)
PyMongo: Send query description as valid JSON (#3291) by @0Calories
Remove Python 2 compatibility code (#3284) by @szokeasaurusrex
Fix sentry_sdk.init type hint (#3283) by @szokeasaurusrex
Deprecate hub in Profile (#3270) by @szokeasaurusrex
Stop using Hub in init (#3275) by @szokeasaurusrex
Delete _should_send_default_pii (#3274) by @szokeasaurusrex
Remove Hub usage in conftest (#3273) by @szokeasaurusrex
Rename debug logging filter (#3260) by @szokeasaurusrex
Update NoOpSpan.finish signature (#3267) by @szokeasaurusrex
Remove Hub in Transaction.finish (#3267) by @szokeasaurusrex
Remove Hub from capture_internal_exception logic (#3264) by @szokeasaurusrex
Improve Scope._capture_internal_exception type hint (#3264) by @szokeasaurusrex
Correct ExcInfo type (#3266) by @szokeasaurusrex
Stop using Hub in tracing_utils (#3269) by @szokeasaurusrex
capture_record_lost_event_calls (#3257) by @szokeasaurusrexcapture_record_lost_event_calls fixture (#3254) by @szokeasaurusrexprofiler_id uses underscore (#3249) by @ZylphrexHub in HttpTransport (#3247) by @szokeasaurusrexipdb from test requirements (#3237) by @rominfSentryPropagator (#3086) by @mender8c13457 to 88273a9 (#3225) by @dependabotorigin to spans and transactions (#3133) by @antonpirkerdb.query to db (#3186) by @0Calories59f9683 to 8c13457 (#3146) by @dependabotThis change fixes a regression in our cron monitoring feature, which caused cron checkins not to be sent. The regression appears to have been introduced in version 2.4.0.
We recommend that all users, who use Cron monitoring and are currently running sentry-python ≥2.4.0, upgrade to this release as soon as possible!
last_event_id cleared (#3124) by @szokeasaurusrexAllow to configure status codes to report to Sentry in Starlette and FastAPI (#3008) by @sentrivana
By passing a new option to the FastAPI and Starlette integrations, you're now able to configure what status codes should be sent as events to Sentry. Here's how it works:
from sentry_sdk.integrations.starlette import StarletteIntegration
from sentry_sdk.integrations.fastapi import FastApiIntegration
sentry_sdk.init(
# ...
integrations=[
StarletteIntegration(
failed_request_status_codes=[403, range(500, 599)],
),
FastApiIntegration(
failed_request_status_codes=[403, range(500, 599)],
),
]
)
failed_request_status_codes expects a list of integers or containers (objects that allow membership checks via in)
of integers. Examples of valid failed_request_status_codes:
[500] will only send events on HTTP 500.[400, range(500, 599)] will send events on HTTP 400 as well as the 500-599 range.[500, 503] will send events on HTTP 500 and 503.The default is [range(500, 599)].
See the FastAPI and Starlette integration docs for more details.
Support multiple keys with cache_prefixes (#3136) by @sentrivana
Support integer Redis keys (#3132) by @sentrivana
Update SDK version in CONTRIBUTING.md (#3129) by @sentrivana
Bump actions/checkout from 4.1.4 to 4.1.5 (#3067) by @dependabot
cache.key span data field a list (#3110) by @antonpirkerlast_event_id from migration guide (#3126) by @szokeasaurusrex_last_event_id in Scope.__copy__ (#3123) by @szokeasaurusrex4381a97 to 59f9683 (#3066) by @dependabotcohere testsuite for new release of cohere (#3098) by @antonpirker_sentry_span might be missing (#3096) by @sentrivanalast_event_id function, which had been removed in 2.0.0get_client typing (#3063) by @szokeasaurusrexfix(quart): Fix Quart integration (#3043) by @szokeasaurusrex
New integration: Langchain (#2911) by @colin-sentry
Usage: (Langchain is auto enabling, so you do not need to do anything special)
from langchain_openai import ChatOpenAI
import sentry_sdk
sentry_sdk.init(
dsn="...",
enable_tracing=True,
traces_sample_rate=1.0,
)
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
Check out the LangChain docs for details.
New integration: Anthropic (#2831) by @czyber
Usage: (add the AnthropicIntegration to your sentry_sdk.init() call)
from anthropic import Anthropic
import sentry_sdk
sentry_sdk.init(
dsn="...",
enable_tracing=True,
traces_sample_rate=1.0,
integrations=[AnthropicIntegration()],
)
client = Anthropic()
Check out the Anthropic docs for details.
New integration: Huggingface Hub (#3033) by @colin-sentry
Usage: (Huggingface Hub is auto enabling, so you do not need to do anything special)
import sentry_sdk
from huggingface_hub import InferenceClient
sentry_sdk.init(
dsn="...",
enable_tracing=True,
traces_sample_rate=1.0,
)
client = InferenceClient("some-model")
Check out the Huggingface docs for details. (comming soon!)
fix(huggingface): Reduce API cross-section for huggingface in test (#3042) by @colin-sentry
fix(django): Fix Django ASGI integration on Python 3.12 (#3027) by @bellini666
feat(perf): Add ability to put measurements directly on spans. (#2967) by @colin-sentry
fix(tests): Fix trytond tests (#3031) by @sentrivana
fix(tests): Update pytest-asyncio to fix CI (#3030) by @sentrivana
fix(docs): Link to respective migration guides directly (#3020) by @sentrivana
docs(scope): Add docstring to Scope.set_tags (#2978) by @szokeasaurusrex
test(scope): Fix typos in assert error message (#2978) by @szokeasaurusrex
feat(scope): New set_tags function (#2978) by @szokeasaurusrex
test(scope): Add unit test for Scope.set_tags (#2978) by @szokeasaurusrex
feat(scope): Add set_tags to top-level API (#2978) by @szokeasaurusrex
test(scope): Add unit test for top-level API set_tags (#2978) by @szokeasaurusrex
feat(tests): Parallelize tox (#3025) by @sentrivana
build(deps): Bump checkouts/data-schemas from 4aa14a7 to 4381a97 (#3028) by @dependabot
meta(license): Bump copyright year (#3029) by @szokeasaurusrex
pid for test database name in Django tests (#2998) by @antonpirker1e17eb5 to 4aa14a7 (#2997) by @dependabotThis is the first major update in a long time!
We dropped support for some ancient languages and frameworks (Yes, Python 2.7 is no longer supported). Additionally we refactored a big part of the foundation of the SDK (how data inside the SDK is handled).
We hope you like it!
For a shorter version of what you need to do, to upgrade to Sentry SDK 2.0 see: https://docs.sentry.io/platforms/python/migration/1.x-to-2.x
new_scope, isolation_scope. See the Deprecated section to see how they map to the existing APIs.(These changes are all backwards-incompatible. Breaking Change (if you are just skimming for that phrase))
The Pyramid integration will not capture errors that might happen in authenticated_userid() in a custom AuthenticationPolicy class.
The method need_code_loation of the MetricsAggregator was renamed to need_code_location.
The BackgroundWorker thread used to process events was renamed from raven-sentry.BackgroundWorker to sentry-sdk.BackgroundWorker.
The reraise function was moved from sentry_sdk._compat to sentry_sdk.utils.
The _ScopeManager was moved from sentry_sdk.hub to sentry_sdk.scope.
Moved the contents of tracing_utils_py3.py to tracing_utils.py. The start_child_span_decorator is now in sentry_sdk.tracing_utils.
The actual implementation of get_current_span was moved to sentry_sdk.tracing_utils. sentry_sdk.get_current_span is still accessible as part of the top-level API.
sentry_sdk.tracing_utils.add_query_source(): Removed the hub parameter. It is not necessary anymore.
sentry_sdk.tracing_utils.record_sql_queries(): Removed the hub parameter. It is not necessary anymore.
sentry_sdk.tracing_utils.get_current_span() does now take a scope instead of a hub as parameter.
sentry_sdk.tracing_utils.should_propagate_trace() now takes a Client instead of a Hub as first parameter.
sentry_sdk.utils.is_sentry_url() now takes a Client instead of a Hub as first parameter.
sentry_sdk.utils._get_contextvars does not return a tuple with three values, but a tuple with two values. The copy_context was removed.
If you create a transaction manually and later mutate the transaction in a configure_scope block this does not work anymore. Here is a recipe on how to change your code to make it work:
Your existing implementation:
transaction = sentry_sdk.transaction(...)
# later in the code execution:
with sentry_sdk.configure_scope() as scope:
scope.set_transaction_name("new-transaction-name")
needs to be changed to this:
transaction = sentry_sdk.transaction(...)
# later in the code execution:
scope = sentry_sdk.Scope.get_current_scope()
scope.set_transaction_name("new-transaction-name")
The classes listed in the table below are now abstract base classes. Therefore, they can no longer be instantiated. Subclasses can only be instantiated if they implement all of the abstract methods.
<details> <summary><b>Show table</b></summary>| Class | Abstract methods |
|---|---|
sentry_sdk.integrations.Integration | setup_once |
sentry_sdk.metrics.Metric | add, serialize_value, and weight |
sentry_sdk.profiler.Scheduler | setup and teardown |
sentry_sdk.transport.Transport | capture_envelope |
(These changes are all backwards-incompatible. Breaking Change (if you are just skimming for that phrase))
last_event_id() top level API. The last event ID is still returned by capture_event(), capture_exception() and capture_message() but the top level API sentry_sdk.last_event_id() has been removed./store endpoint. Everything is now sent to the /envelope endpoint. If you're on SaaS you don't have to worry about this, but if you're running Sentry yourself you'll need version 20.6.0 or higher of self-hosted Sentry.with_locals configuration option was removed. Use include_local_variables instead. See https://docs.sentry.io/platforms/python/configuration/options/#include-local-variables.request_bodies configuration option was removed. Use max_request_body_size. See https://docs.sentry.io/platforms/python/configuration/options/#max-request-body-size.user.segment. It was also removed from the trace header as well as from the dynamic sampling context.install method for custom integrations. Please use setup_once instead.sentry_sdk.tracing.Span.new_span. Use sentry_sdk.tracing.Span.start_child instead.sentry_sdk.tracing.Transaction.new_span. Use sentry_sdk.tracing.Transaction.start_child instead.sentry_sdk.tracing.Span(transaction=...). To create a transaction, please use sentry_sdk.tracing.Transaction(name=...).sentry_sdk.utils.Auth.store_api_url.sentry_sdk.utils.Auth.get_api_url's now accepts a sentry_sdk.consts.EndpointType enum instead of a string as its only parameter. We recommend omitting this argument when calling the function, since the parameter's default value is the only possible sentry_sdk.consts.EndpointType value. The parameter exists for future compatibility.tracing_utils_py2.py. The start_child_span_decorator is now in sentry_sdk.tracing_utils.sentry_sdk.profiler.Scheduler.stop_profiling method. Any calls to this method can simply be removed, since this was a no-op method.Using the Hub directly as well as using hub-based APIs has been deprecated. Where available, use the top-level API instead; otherwise use the scope API or the client API.
Before:
with hub.start_span(...):
# do something
After:
import sentry_sdk
with sentry_sdk.start_span(...):
# do something
Hub cloning is deprecated.
Before:
with Hub(Hub.current) as hub:
# do something with the cloned hub
After:
import sentry_sdk
with sentry_sdk.isolation_scope() as scope:
# do something with the forked scope
configure_scope is deprecated. Use the new isolation scope directly via Scope.get_isolation_scope() instead.
Before:
with configure_scope() as scope:
# do something with `scope`
After:
from sentry_sdk.scope import Scope
scope = Scope.get_isolation_scope()
# do something with `scope`
push_scope is deprecated. Use the new new_scope context manager to fork the necessary scopes.
Before:
with push_scope() as scope:
# do something with `scope`
After:
import sentry_sdk
with sentry_sdk.new_scope() as scope:
# do something with `scope`
Accessing the client via the hub has been deprecated. Use the top-level sentry_sdk.get_client() to get the current client.
profiler_mode and profiles_sample_rate have been deprecated as _experiments options. Use them as top level options instead:
sentry_sdk.init(
...,
profiler_mode="thread",
profiles_sample_rate=1.0,
)
Deprecated sentry_sdk.transport.Transport.capture_event. Please use sentry_sdk.transport.Transport.capture_envelope, instead.
Passing a function to sentry_sdk.init's transport keyword argument has been deprecated. If you wish to provide a custom transport, please pass a sentry_sdk.transport.Transport instance or a subclass.
The parameter propagate_hub in ThreadingIntegration() was deprecated and renamed to propagate_scope.
This is the final 1.x release for the forseeable future. Development will continue on the 2.x release line. The first 2.x version will be available in the next few weeks.
Allow to upsert monitors (#2929) by @sentrivana
It's now possible to provide monitor_config to the monitor decorator/context manager directly:
from sentry_sdk.crons import monitor
# All keys except `schedule` are optional
monitor_config = {
"schedule": {"type": "crontab", "value": "0 0 * * *"},
"timezone": "Europe/Vienna",
"checkin_margin": 10,
"max_runtime": 10,
"failure_issue_threshold": 5,
"recovery_threshold": 5,
}
@monitor(monitor_slug='<monitor-slug>', monitor_config=monitor_config)
def tell_the_world():
print('My scheduled task...')
Check out the cron docs for details.
Add Django signals_denylist to filter signals that are attached to by signals_spans (#2758) by @lieryan
If you want to exclude some Django signals from performance tracking, you can use the new signals_denylist Django option:
import django.db.models.signals
import sentry_sdk
sentry_sdk.init(
...
integrations=[
DjangoIntegration(
...
signals_denylist=[
django.db.models.signals.pre_init,
django.db.models.signals.post_init,
],
),
],
)
increment for metrics (#2588) by @mitsuhiko
increment and incr are equivalent, so you can pick whichever you like more.
Add value, unit to before_emit_metric (#2958) by @sentrivana
If you add a custom before_emit_metric, it'll now accept 4 arguments (the key, value, unit and tags) instead of just key and tags.
def before_emit(key, value, unit, tags):
if key == "removed-metric":
return False
tags["extra"] = "foo"
del tags["release"]
return True
sentry_sdk.init(
...
_experiments={
"before_emit_metric": before_emit,
}
)
Remove experimental metric summary options (#2957) by @sentrivana
The _experiments options metrics_summary_sample_rate and should_summarize_metric have been removed.
New normalization rules for metric keys, names, units, tags (#2946) by @sentrivana
Change data_category from statsd to metric_bucket (#2954) by @cleptric
Accessing __mro__ might throw a ValueError (#2952) by @sentrivana
Suppress prompt spawned by subprocess when using pythonw (#2936) by @collinbanko
Handle None in GraphQL query #2715 (#2762) by @czyber
Do not send "quiet" Sanic exceptions to Sentry (#2821) by @hamedsh
Implement metric_bucket rate limits (#2933) by @cleptric
Fix type hints for monitor decorator (#2944) by @szokeasaurusrex
Remove deprecated typing imports in crons (#2945) by @szokeasaurusrex
Make monitor_config a TypedDict (#2931) by @sentrivana
Add devenv-requirements.txt and update env setup instructions (#2761) by @arr-ee
Bump types-protobuf from 4.24.0.20240311 to 4.24.0.20240408 (#2941) by @dependabot
Disable Codecov check run annotations (#2537) by @eliatcodecov