Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-sentry-sdk for
openSUSE:Factory checked in at 2021-05-07 16:45:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-sentry-sdk (Old)
and /work/SRC/openSUSE:Factory/.python-sentry-sdk.new.2988 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-sentry-sdk"
Fri May 7 16:45:44 2021 rev:15 rq:891161 version:1.1.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-sentry-sdk/python-sentry-sdk.changes
2021-03-11 20:12:39.776699695 +0100
+++
/work/SRC/openSUSE:Factory/.python-sentry-sdk.new.2988/python-sentry-sdk.changes
2021-05-07 16:46:07.164217695 +0200
@@ -1,0 +2,14 @@
+Thu May 6 18:54:28 UTC 2021 - ecsos <[email protected]>
+
+- Update to 1.1.0
+ - Fix for AWSLambda integration returns value of original handler
+ #1106
+ - Fix for RQ integration that only captures exception if RQ job
+ has failed and ignore retries #1076
+ - Feature that supports Tracing for the Tornado integration #1060
+ - Feature that supports wild cards in ignore_logger in the
+ Logging Integration #1053
+ - Fix for django that deals with template span description names
+ that are either lists or tuples #1054
+
+-------------------------------------------------------------------
Old:
----
sentry-python-1.0.0.tar.gz
New:
----
sentry-python-1.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-sentry-sdk.spec ++++++
--- /var/tmp/diff_new_pack.GrTTy2/_old 2021-05-07 16:46:07.692216034 +0200
+++ /var/tmp/diff_new_pack.GrTTy2/_new 2021-05-07 16:46:07.696216022 +0200
@@ -20,7 +20,7 @@
# nothing provides python2-venusian >= 1.0 needed by python2-pyramid
%define skip_python2 1
Name: python-sentry-sdk
-Version: 1.0.0
+Version: 1.1.0
Release: 0
Summary: Python SDK for Sentry.io
License: BSD-2-Clause
@@ -58,12 +58,12 @@
BuildRequires: %{python_module tox}
# /SECTION
# SECTION extra requirements - which rise up buildtime error or missing in
openSUSE
+#BuildRequires: %%{python_module pyspark >= 2.4.4}
#BuildRequires: %%{python_module Django >= 1.8}
-#BuildRequires: %%{python_module sanic >= 0.8}
#BuildRequires: %%{python_module apache-beam >= 2.12}
-#BuildRequires: %%{python_module pyspark >= 2.4.4}
-#BuildRequires: %%{python_module pure_eval}
#BuildRequires: %%{python_module chalice >= 1.16.0}
+#BuildRequires: %%{python_module pure_eval}
+#BuildRequires: %%{python_module sanic >= 0.8}
# /SECTION
Requires: python-Flask >= 0.11
Requires: python-SQLAlchemy >= 1.2
++++++ sentry-python-1.0.0.tar.gz -> sentry-python-1.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/.github/workflows/ci.yml
new/sentry-python-1.1.0/.github/workflows/ci.yml
--- old/sentry-python-1.0.0/.github/workflows/ci.yml 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/.github/workflows/ci.yml 2021-05-06
18:58:30.000000000 +0200
@@ -77,7 +77,7 @@
strategy:
matrix:
python-version:
- ["2.7", "pypy-2.7", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9"]
+ ["2.7", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9"]
services:
# Label used to access the service container
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/.github/workflows/codeql-analysis.yml
new/sentry-python-1.1.0/.github/workflows/codeql-analysis.yml
--- old/sentry-python-1.0.0/.github/workflows/codeql-analysis.yml
1970-01-01 01:00:00.000000000 +0100
+++ new/sentry-python-1.1.0/.github/workflows/codeql-analysis.yml
2021-05-06 18:58:30.000000000 +0200
@@ -0,0 +1,67 @@
+# For most projects, this workflow file will not need changing; you simply need
+# to commit it to your repository.
+#
+# You may wish to alter this file to override the set of languages analyzed,
+# or to provide custom queries or build logic.
+#
+# ******** NOTE ********
+# We have attempted to detect the languages in your repository. Please check
+# the `language` matrix defined below to confirm you have the correct set of
+# supported CodeQL languages.
+#
+name: "CodeQL"
+
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ # The branches below must be a subset of the branches above
+ branches: [ master ]
+ schedule:
+ - cron: '18 18 * * 3'
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [ 'python' ]
+ # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript',
'python' ]
+ # Learn more:
+ #
https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ # Initializes the CodeQL tools for scanning.
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v1
+ with:
+ languages: ${{ matrix.language }}
+ # If you wish to specify custom queries, you can do so here or in a
config file.
+ # By default, queries listed here will override any specified in a
config file.
+ # Prefix the list here with "+" to use these queries and those in the
config file.
+ # queries: ./path/to/local/query, your-org/your-repo/queries@main
+
+ # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
+ # If this step fails, then you should remove it and run the build manually
(see below)
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v1
+
+ # ?????? Command-line programs to run using the OS shell.
+ # ???? https://git.io/JvXDl
+
+ # ?????? If the Autobuild fails above, remove it and uncomment the
following three lines
+ # and modify them (or add more) to build your code if your project
+ # uses a compiled language
+
+ #- run: |
+ # make bootstrap
+ # make release
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/CHANGELOG.md
new/sentry-python-1.1.0/CHANGELOG.md
--- old/sentry-python-1.0.0/CHANGELOG.md 2021-03-03 16:55:06.000000000
+0100
+++ new/sentry-python-1.1.0/CHANGELOG.md 2021-05-06 18:58:30.000000000
+0200
@@ -10,7 +10,7 @@
- Certain features (e.g. integrations) may be explicitly called out as
"experimental" or "unstable" in the documentation. They come with their own
versioning policy described in the documentation.
-We recommend to pin your version requirements against `0.x.*` or `0.x.y`.
+We recommend to pin your version requirements against `1.x.*` or `1.x.y`.
Either one of the following is fine:
```
@@ -20,11 +20,19 @@
A major release `N` implies the previous release `N-1` will no longer receive
updates. We generally do not backport bugfixes to older versions unless they
are security relevant. However, feel free to ask for backports of specific
commits on the bugtracker.
+## 1.1.0
+
+- Fix for `AWSLambda` integration returns value of original handler #1106
+- Fix for `RQ` integration that only captures exception if RQ job has failed
and ignore retries #1076
+- Feature that supports Tracing for the `Tornado` integration #1060
+- Feature that supports wild cards in `ignore_logger` in the `Logging`
Integration #1053
+- Fix for django that deals with template span description names that are
either lists or tuples #1054
+
## 1.0.0
-This release contains breaking changes
+This release contains a breaking change
-- Feat: Moved `auto_session_tracking` experimental flag to a proper option and
removed `session_mode`, hence enabling release health by default #994
+- **BREAKING CHANGE**: Feat: Moved `auto_session_tracking` experimental flag
to a proper option and removed explicitly setting experimental `session_mode`
in favor of auto detecting its value, hence enabling release health by default
#994
- Fixed Django transaction name by setting the name to `request.path_info`
rather than `request.path`
- Fix for tracing by getting HTTP headers from span rather than transaction
when possible #1035
- Fix for Flask transactions missing request body in non errored transactions
#1034
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/README.md
new/sentry-python-1.1.0/README.md
--- old/sentry-python-1.0.0/README.md 2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/README.md 2021-05-06 18:58:30.000000000 +0200
@@ -4,6 +4,8 @@
</a>
</p>
+_Bad software is everywhere, and we're tired of it. Sentry is on a mission to
help developers write better software faster, so we can get back to enjoying
technology. If you want to join us [<kbd>**Check out our open
positions**</kbd>](https://sentry.io/careers/)_
+
# sentry-python - Sentry SDK for Python
[](https://travis-ci.com/getsentry/sentry-python)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/docs/conf.py
new/sentry-python-1.1.0/docs/conf.py
--- old/sentry-python-1.0.0/docs/conf.py 2021-03-03 16:55:06.000000000
+0100
+++ new/sentry-python-1.1.0/docs/conf.py 2021-05-06 18:58:30.000000000
+0200
@@ -22,7 +22,7 @@
copyright = u"2019, Sentry Team and Contributors"
author = u"Sentry Team and Contributors"
-release = "1.0.0"
+release = "1.1.0"
version = ".".join(release.split(".")[:2]) # The short X.Y version.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/docs-requirements.txt
new/sentry-python-1.1.0/docs-requirements.txt
--- old/sentry-python-1.0.0/docs-requirements.txt 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/docs-requirements.txt 2021-05-06
18:58:30.000000000 +0200
@@ -1,4 +1,4 @@
-sphinx==3.5.1
+sphinx==3.5.3
sphinx-rtd-theme
sphinx-autodoc-typehints[type_comments]>=1.8.0
typing-extensions
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/linter-requirements.txt
new/sentry-python-1.1.0/linter-requirements.txt
--- old/sentry-python-1.0.0/linter-requirements.txt 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/linter-requirements.txt 2021-05-06
18:58:30.000000000 +0200
@@ -1,6 +1,6 @@
black==20.8b1
-flake8==3.8.4
+flake8==3.9.0
flake8-import-order==0.18.1
mypy==0.782
-flake8-bugbear==20.11.1
+flake8-bugbear==21.3.2
pep8-naming==0.11.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/scripts/build_awslambda_layer.py
new/sentry-python-1.1.0/scripts/build_awslambda_layer.py
--- old/sentry-python-1.0.0/scripts/build_awslambda_layer.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/scripts/build_awslambda_layer.py 2021-05-06
18:58:30.000000000 +0200
@@ -51,12 +51,14 @@
Method that creates the init_serverless_sdk pkg in the
sentry-python-serverless zip
"""
- serverless_sdk_path = f'{self.packages_dir}/sentry_sdk/' \
- f'integrations/init_serverless_sdk'
+ serverless_sdk_path = (
+ f"{self.packages_dir}/sentry_sdk/"
f"integrations/init_serverless_sdk"
+ )
if not os.path.exists(serverless_sdk_path):
os.makedirs(serverless_sdk_path)
- shutil.copy('scripts/init_serverless_sdk.py',
- f'{serverless_sdk_path}/__init__.py')
+ shutil.copy(
+ "scripts/init_serverless_sdk.py",
f"{serverless_sdk_path}/__init__.py"
+ )
def zip(
self, filename # type: str
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/scripts/init_serverless_sdk.py
new/sentry-python-1.1.0/scripts/init_serverless_sdk.py
--- old/sentry-python-1.0.0/scripts/init_serverless_sdk.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/scripts/init_serverless_sdk.py 2021-05-06
18:58:30.000000000 +0200
@@ -19,7 +19,7 @@
sentry_sdk.init(
dsn=os.environ["SENTRY_DSN"],
integrations=[AwsLambdaIntegration(timeout_warning=True)],
- traces_sample_rate=float(os.environ["SENTRY_TRACES_SAMPLE_RATE"])
+ traces_sample_rate=float(os.environ["SENTRY_TRACES_SAMPLE_RATE"]),
)
@@ -35,4 +35,4 @@
raise ValueError("Incorrect AWS Handler path (Not a path)")
lambda_function = __import__(module_name)
lambda_handler = getattr(lambda_function, handler_name)
- lambda_handler(event, context)
+ return lambda_handler(event, context)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/sentry_sdk/_types.py
new/sentry-python-1.1.0/sentry_sdk/_types.py
--- old/sentry-python-1.0.0/sentry_sdk/_types.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/_types.py 2021-05-06
18:58:30.000000000 +0200
@@ -5,7 +5,6 @@
if MYPY:
- from numbers import Real
from types import TracebackType
from typing import Any
from typing import Callable
@@ -32,7 +31,7 @@
ErrorProcessor = Callable[[Event, ExcInfo], Optional[Event]]
BreadcrumbProcessor = Callable[[Breadcrumb, BreadcrumbHint],
Optional[Breadcrumb]]
- TracesSampler = Callable[[SamplingContext], Union[Real, bool]]
+ TracesSampler = Callable[[SamplingContext], Union[float, int, bool]]
# https://github.com/python/mypy/issues/5710
NotImplementedType = Any
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/sentry_sdk/consts.py
new/sentry-python-1.1.0/sentry_sdk/consts.py
--- old/sentry-python-1.0.0/sentry_sdk/consts.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/consts.py 2021-05-06
18:58:30.000000000 +0200
@@ -99,7 +99,7 @@
del _get_default_options
-VERSION = "1.0.0"
+VERSION = "1.1.0"
SDK_INFO = {
"name": "sentry.python",
"version": VERSION,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/sentry_sdk/integrations/aiohttp.py
new/sentry-python-1.1.0/sentry_sdk/integrations/aiohttp.py
--- old/sentry-python-1.0.0/sentry_sdk/integrations/aiohttp.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/integrations/aiohttp.py 2021-05-06
18:58:30.000000000 +0200
@@ -92,7 +92,7 @@
weak_request = weakref.ref(request)
- with Hub(Hub.current) as hub:
+ with Hub(hub) as hub:
# Scope data will not leak between requests because aiohttp
# create a task to wrap each request.
with hub.configure_scope() as scope:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/sentry_sdk/integrations/django/__init__.py
new/sentry-python-1.1.0/sentry_sdk/integrations/django/__init__.py
--- old/sentry-python-1.0.0/sentry_sdk/integrations/django/__init__.py
2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/integrations/django/__init__.py
2021-05-06 18:58:30.000000000 +0200
@@ -332,8 +332,9 @@
# Rely on WSGI middleware to start a trace
try:
if integration.transaction_style == "function_name":
+ fn = resolve(request.path).func
scope.transaction = transaction_from_function(
- resolve(request.path).func
+ getattr(fn, "view_class", fn)
)
elif integration.transaction_style == "url":
scope.transaction = LEGACY_RESOLVER.resolve(request.path_info)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/sentry_sdk/integrations/django/templates.py
new/sentry-python-1.1.0/sentry_sdk/integrations/django/templates.py
--- old/sentry-python-1.0.0/sentry_sdk/integrations/django/templates.py
2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/integrations/django/templates.py
2021-05-06 18:58:30.000000000 +0200
@@ -42,6 +42,15 @@
return None
+def _get_template_name_description(template_name):
+ # type: (str) -> str
+ if isinstance(template_name, (list, tuple)):
+ if template_name:
+ return "[{}, ...]".format(template_name[0])
+ else:
+ return template_name
+
+
def patch_templates():
# type: () -> None
from django.template.response import SimpleTemplateResponse
@@ -57,7 +66,8 @@
return real_rendered_content.fget(self)
with hub.start_span(
- op="django.template.render", description=self.template_name
+ op="django.template.render",
+ description=_get_template_name_description(self.template_name),
) as span:
span.set_data("context", self.context_data)
return real_rendered_content.fget(self)
@@ -78,7 +88,8 @@
return real_render(request, template_name, context, *args,
**kwargs)
with hub.start_span(
- op="django.template.render", description=template_name
+ op="django.template.render",
+ description=_get_template_name_description(template_name),
) as span:
span.set_data("context", context)
return real_render(request, template_name, context, *args,
**kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/sentry_sdk/integrations/flask.py
new/sentry-python-1.1.0/sentry_sdk/integrations/flask.py
--- old/sentry-python-1.0.0/sentry_sdk/integrations/flask.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/integrations/flask.py 2021-05-06
18:58:30.000000000 +0200
@@ -65,13 +65,17 @@
@staticmethod
def setup_once():
# type: () -> None
+
+ # This version parsing is absolutely naive but the alternative is to
+ # import pkg_resources which slows down the SDK a lot.
try:
version = tuple(map(int, FLASK_VERSION.split(".")[:3]))
except (ValueError, TypeError):
- raise DidNotEnable("Unparsable Flask version:
{}".format(FLASK_VERSION))
-
- if version < (0, 10):
- raise DidNotEnable("Flask 0.10 or newer is required.")
+ # It's probably a release candidate, we assume it's fine.
+ pass
+ else:
+ if version < (0, 10):
+ raise DidNotEnable("Flask 0.10 or newer is required.")
request_started.connect(_request_started)
got_request_exception.connect(_capture_exception)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/sentry_sdk/integrations/logging.py
new/sentry-python-1.1.0/sentry_sdk/integrations/logging.py
--- old/sentry-python-1.0.0/sentry_sdk/integrations/logging.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/integrations/logging.py 2021-05-06
18:58:30.000000000 +0200
@@ -2,6 +2,7 @@
import logging
import datetime
+from fnmatch import fnmatch
from sentry_sdk.hub import Hub
from sentry_sdk.utils import (
@@ -98,7 +99,11 @@
def _can_record(record):
# type: (LogRecord) -> bool
- return record.name not in _IGNORED_LOGGERS
+ """Prevents ignored loggers from recording"""
+ for logger in _IGNORED_LOGGERS:
+ if fnmatch(record.name, logger):
+ return False
+ return True
def _breadcrumb_from_record(record):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/sentry_sdk/integrations/rq.py
new/sentry-python-1.1.0/sentry_sdk/integrations/rq.py
--- old/sentry-python-1.0.0/sentry_sdk/integrations/rq.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/integrations/rq.py 2021-05-06
18:58:30.000000000 +0200
@@ -3,30 +3,28 @@
import weakref
from sentry_sdk.hub import Hub
-from sentry_sdk.integrations import Integration, DidNotEnable
+from sentry_sdk.integrations import DidNotEnable, Integration
+from sentry_sdk.integrations.logging import ignore_logger
from sentry_sdk.tracing import Transaction
from sentry_sdk.utils import capture_internal_exceptions, event_from_exception
-
try:
- from rq.version import VERSION as RQ_VERSION
+ from rq.queue import Queue
from rq.timeouts import JobTimeoutException
+ from rq.version import VERSION as RQ_VERSION
from rq.worker import Worker
- from rq.queue import Queue
except ImportError:
raise DidNotEnable("RQ not installed")
from sentry_sdk._types import MYPY
if MYPY:
- from typing import Any
- from typing import Dict
- from typing import Callable
-
- from rq.job import Job
+ from typing import Any, Callable, Dict
- from sentry_sdk.utils import ExcInfo
from sentry_sdk._types import EventProcessor
+ from sentry_sdk.utils import ExcInfo
+
+ from rq.job import Job
class RqIntegration(Integration):
@@ -89,7 +87,9 @@
def sentry_patched_handle_exception(self, job, *exc_info, **kwargs):
# type: (Worker, Any, *Any, **Any) -> Any
- _capture_exception(exc_info) # type: ignore
+ if job.is_failed:
+ _capture_exception(exc_info) # type: ignore
+
return old_handle_exception(self, job, *exc_info, **kwargs)
Worker.handle_exception = sentry_patched_handle_exception
@@ -108,6 +108,8 @@
Queue.enqueue_job = sentry_patched_enqueue_job
+ ignore_logger("rq.worker")
+
def _make_event_processor(weak_job):
# type: (Callable[[], Job]) -> EventProcessor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/sentry_sdk/integrations/tornado.py
new/sentry-python-1.1.0/sentry_sdk/integrations/tornado.py
--- old/sentry-python-1.0.0/sentry_sdk/integrations/tornado.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/sentry_sdk/integrations/tornado.py 2021-05-06
18:58:30.000000000 +0200
@@ -1,7 +1,9 @@
import weakref
+import contextlib
from inspect import iscoroutinefunction
from sentry_sdk.hub import Hub, _should_send_default_pii
+from sentry_sdk.tracing import Transaction
from sentry_sdk.utils import (
HAS_REAL_CONTEXTVARS,
CONTEXTVARS_ERROR_MESSAGE,
@@ -32,6 +34,7 @@
from typing import Optional
from typing import Dict
from typing import Callable
+ from typing import Generator
from sentry_sdk._types import EventProcessor
@@ -63,38 +66,16 @@
# Starting Tornado 6 RequestHandler._execute method is a standard
Python coroutine (async/await)
# In that case our method should be a coroutine function too
async def sentry_execute_request_handler(self, *args, **kwargs):
- # type: (Any, *Any, **Any) -> Any
- hub = Hub.current
- integration = hub.get_integration(TornadoIntegration)
- if integration is None:
- return await old_execute(self, *args, **kwargs)
-
- weak_handler = weakref.ref(self)
-
- with Hub(hub) as hub:
- with hub.configure_scope() as scope:
- scope.clear_breadcrumbs()
- processor = _make_event_processor(weak_handler) #
type: ignore
- scope.add_event_processor(processor)
+ # type: (RequestHandler, *Any, **Any) -> Any
+ with _handle_request_impl(self):
return await old_execute(self, *args, **kwargs)
else:
@coroutine # type: ignore
- def sentry_execute_request_handler(self, *args, **kwargs):
+ def sentry_execute_request_handler(self, *args, **kwargs): #
type: ignore
# type: (RequestHandler, *Any, **Any) -> Any
- hub = Hub.current
- integration = hub.get_integration(TornadoIntegration)
- if integration is None:
- return old_execute(self, *args, **kwargs)
-
- weak_handler = weakref.ref(self)
-
- with Hub(hub) as hub:
- with hub.configure_scope() as scope:
- scope.clear_breadcrumbs()
- processor = _make_event_processor(weak_handler) #
type: ignore
- scope.add_event_processor(processor)
+ with _handle_request_impl(self):
result = yield from old_execute(self, *args, **kwargs)
return result
@@ -110,6 +91,39 @@
RequestHandler.log_exception = sentry_log_exception # type: ignore
[email protected]
+def _handle_request_impl(self):
+ # type: (RequestHandler) -> Generator[None, None, None]
+ hub = Hub.current
+ integration = hub.get_integration(TornadoIntegration)
+
+ if integration is None:
+ yield
+
+ weak_handler = weakref.ref(self)
+
+ with Hub(hub) as hub:
+ with hub.configure_scope() as scope:
+ scope.clear_breadcrumbs()
+ processor = _make_event_processor(weak_handler) # type: ignore
+ scope.add_event_processor(processor)
+
+ transaction = Transaction.continue_from_headers(
+ self.request.headers,
+ op="http.server",
+ # Like with all other integrations, this is our
+ # fallback transaction in case there is no route.
+ # sentry_urldispatcher_resolve is responsible for
+ # setting a transaction name later.
+ name="generic Tornado request",
+ )
+
+ with hub.start_transaction(
+ transaction, custom_sampling_context={"tornado_request":
self.request}
+ ):
+ yield
+
+
def _capture_exception(ty, value, tb):
# type: (type, BaseException, Any) -> None
hub = Hub.current
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/setup.cfg
new/sentry-python-1.1.0/setup.cfg
--- old/sentry-python-1.0.0/setup.cfg 2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/setup.cfg 1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-[bdist_wheel]
-universal = 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/setup.py
new/sentry-python-1.1.0/setup.py
--- old/sentry-python-1.0.0/setup.py 2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/setup.py 2021-05-06 18:58:30.000000000 +0200
@@ -21,7 +21,7 @@
setup(
name="sentry-sdk",
- version="1.0.0",
+ version="1.1.0",
author="Sentry Team and Contributors",
author_email="[email protected]",
url="https://github.com/getsentry/sentry-python",
@@ -72,4 +72,5 @@
"Programming Language :: Python :: 3.9",
"Topic :: Software Development :: Libraries :: Python Modules",
],
+ options={"bdist_wheel": {"universal": "1"}},
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/tests/integrations/django/myapp/views.py
new/sentry-python-1.1.0/tests/integrations/django/myapp/views.py
--- old/sentry-python-1.0.0/tests/integrations/django/myapp/views.py
2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/tests/integrations/django/myapp/views.py
2021-05-06 18:58:30.000000000 +0200
@@ -122,7 +122,9 @@
@csrf_exempt
def template_test2(request, *args, **kwargs):
- return TemplateResponse(request, "user_name.html", {"user_age": 25})
+ return TemplateResponse(
+ request, ("user_name.html", "another_template.html"), {"user_age": 25}
+ )
@csrf_exempt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/tests/integrations/django/test_basic.py
new/sentry-python-1.1.0/tests/integrations/django/test_basic.py
--- old/sentry-python-1.0.0/tests/integrations/django/test_basic.py
2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/tests/integrations/django/test_basic.py
2021-05-06 18:58:30.000000000 +0200
@@ -563,18 +563,25 @@
integrations=[DjangoIntegration()],
traces_sample_rate=1.0,
)
- views_urls = [reverse("template_test2")]
+ views_tests = [
+ (
+ reverse("template_test2"),
+ '- op="django.template.render": description="[user_name.html,
...]"',
+ ),
+ ]
if DJANGO_VERSION >= (1, 7):
- views_urls.append(reverse("template_test"))
+ views_tests.append(
+ (
+ reverse("template_test"),
+ '- op="django.template.render": description="user_name.html"',
+ ),
+ )
- for url in views_urls:
+ for url, expected_line in views_tests:
events = capture_events()
_content, status, _headers = client.get(url)
transaction = events[0]
- assert (
- '- op="django.template.render": description="user_name.html"'
- in render_span_tree(transaction)
- )
+ assert expected_line in render_span_tree(transaction)
def test_middleware_spans(sentry_init, client, capture_events,
render_span_tree):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/tests/integrations/logging/test_logging.py
new/sentry-python-1.1.0/tests/integrations/logging/test_logging.py
--- old/sentry-python-1.0.0/tests/integrations/logging/test_logging.py
2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/tests/integrations/logging/test_logging.py
2021-05-06 18:58:30.000000000 +0200
@@ -3,7 +3,7 @@
import pytest
import logging
-from sentry_sdk.integrations.logging import LoggingIntegration
+from sentry_sdk.integrations.logging import LoggingIntegration, ignore_logger
other_logger = logging.getLogger("testfoo")
logger = logging.getLogger(__name__)
@@ -134,3 +134,30 @@
(event,) = events
assert event["logentry"]["message"] == "hi"
+
+
+def test_ignore_logger(sentry_init, capture_events):
+ sentry_init(integrations=[LoggingIntegration()],
default_integrations=False)
+ events = capture_events()
+
+ ignore_logger("testfoo")
+
+ other_logger.error("hi")
+
+ assert not events
+
+
+def test_ignore_logger_wildcard(sentry_init, capture_events):
+ sentry_init(integrations=[LoggingIntegration()],
default_integrations=False)
+ events = capture_events()
+
+ ignore_logger("testfoo.*")
+
+ nested_logger = logging.getLogger("testfoo.submodule")
+
+ logger.error("hi")
+
+ nested_logger.error("bye")
+
+ (event,) = events
+ assert event["logentry"]["message"] == "hi"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/tests/integrations/rq/test_rq.py
new/sentry-python-1.1.0/tests/integrations/rq/test_rq.py
--- old/sentry-python-1.0.0/tests/integrations/rq/test_rq.py 2021-03-03
16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/tests/integrations/rq/test_rq.py 2021-05-06
18:58:30.000000000 +0200
@@ -1,8 +1,7 @@
-from sentry_sdk.integrations.rq import RqIntegration
-
import pytest
-
from fakeredis import FakeStrictRedis
+from sentry_sdk.integrations.rq import RqIntegration
+
import rq
try:
@@ -177,3 +176,19 @@
}
)
)
+
+
[email protected](
+ rq.__version__.split(".") < ["1", "5"], reason="At least rq-1.5 required"
+)
+def test_job_with_retries(sentry_init, capture_events):
+ sentry_init(integrations=[RqIntegration()])
+ events = capture_events()
+
+ queue = rq.Queue(connection=FakeStrictRedis())
+ worker = rq.SimpleWorker([queue], connection=queue.connection)
+
+ queue.enqueue(crashing_job, foo=42, retry=rq.Retry(max=1))
+ worker.work(burst=True)
+
+ assert len(events) == 1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/sentry-python-1.0.0/tests/integrations/tornado/test_tornado.py
new/sentry-python-1.1.0/tests/integrations/tornado/test_tornado.py
--- old/sentry-python-1.0.0/tests/integrations/tornado/test_tornado.py
2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/tests/integrations/tornado/test_tornado.py
2021-05-06 18:58:30.000000000 +0200
@@ -2,7 +2,7 @@
import pytest
-from sentry_sdk import configure_scope
+from sentry_sdk import configure_scope, start_transaction
from sentry_sdk.integrations.tornado import TornadoIntegration
from tornado.web import RequestHandler, Application, HTTPError
@@ -40,6 +40,25 @@
scope.set_tag("foo", "42")
1 / 0
+ def post(self):
+ with configure_scope() as scope:
+ scope.set_tag("foo", "43")
+ 1 / 0
+
+
+class HelloHandler(RequestHandler):
+ async def get(self):
+ with configure_scope() as scope:
+ scope.set_tag("foo", "42")
+
+ return b"hello"
+
+ async def post(self):
+ with configure_scope() as scope:
+ scope.set_tag("foo", "43")
+
+ return b"hello"
+
def test_basic(tornado_testcase, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()], send_default_pii=True)
@@ -82,6 +101,82 @@
assert not scope._tags
[email protected](
+ "handler,code",
+ [
+ (CrashingHandler, 500),
+ (HelloHandler, 200),
+ ],
+)
+def test_transactions(tornado_testcase, sentry_init, capture_events, handler,
code):
+ sentry_init(integrations=[TornadoIntegration()], traces_sample_rate=1.0,
debug=True)
+ events = capture_events()
+ client = tornado_testcase(Application([(r"/hi", handler)]))
+
+ with start_transaction(name="client") as span:
+ pass
+
+ response = client.fetch(
+ "/hi", method="POST", body=b"heyoo", headers=dict(span.iter_headers())
+ )
+ assert response.code == code
+
+ if code == 200:
+ client_tx, server_tx = events
+ server_error = None
+ else:
+ client_tx, server_error, server_tx = events
+
+ assert client_tx["type"] == "transaction"
+ assert client_tx["transaction"] == "client"
+
+ if server_error is not None:
+ assert server_error["exception"]["values"][0]["type"] ==
"ZeroDivisionError"
+ assert (
+ server_error["transaction"]
+ == "tests.integrations.tornado.test_tornado.CrashingHandler.post"
+ )
+
+ if code == 200:
+ assert (
+ server_tx["transaction"]
+ == "tests.integrations.tornado.test_tornado.HelloHandler.post"
+ )
+ else:
+ assert (
+ server_tx["transaction"]
+ == "tests.integrations.tornado.test_tornado.CrashingHandler.post"
+ )
+
+ assert server_tx["type"] == "transaction"
+
+ request = server_tx["request"]
+ host = request["headers"]["Host"]
+ assert server_tx["request"] == {
+ "env": {"REMOTE_ADDR": "127.0.0.1"},
+ "headers": {
+ "Accept-Encoding": "gzip",
+ "Connection": "close",
+ **request["headers"],
+ },
+ "method": "POST",
+ "query_string": "",
+ "data": {"heyoo": [""]},
+ "url": "http://{host}/hi".format(host=host),
+ }
+
+ assert (
+ client_tx["contexts"]["trace"]["trace_id"]
+ == server_tx["contexts"]["trace"]["trace_id"]
+ )
+
+ if server_error is not None:
+ assert (
+ server_error["contexts"]["trace"]["trace_id"]
+ == server_tx["contexts"]["trace"]["trace_id"]
+ )
+
+
def test_400_not_logged(tornado_testcase, sentry_init, capture_events):
sentry_init(integrations=[TornadoIntegration()])
events = capture_events()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/sentry-python-1.0.0/tox.ini
new/sentry-python-1.1.0/tox.ini
--- old/sentry-python-1.0.0/tox.ini 2021-03-03 16:55:06.000000000 +0100
+++ new/sentry-python-1.1.0/tox.ini 2021-05-06 18:58:30.000000000 +0200
@@ -76,7 +76,6 @@
{py2.7,py3.7,py3.8,py3.9}-sqlalchemy-{1.2,1.3}
- py3.7-spark
{py3.5,py3.6,py3.7,py3.8,py3.9}-pure_eval
@@ -215,8 +214,6 @@
sqlalchemy-1.2: sqlalchemy>=1.2,<1.3
sqlalchemy-1.3: sqlalchemy>=1.3,<1.4
- spark: pyspark==2.4.4
-
linters: -r linter-requirements.txt
py3.8: hypothesis
@@ -260,7 +257,6 @@
rediscluster: TESTPATH=tests/integrations/rediscluster
asgi: TESTPATH=tests/integrations/asgi
sqlalchemy: TESTPATH=tests/integrations/sqlalchemy
- spark: TESTPATH=tests/integrations/spark
pure_eval: TESTPATH=tests/integrations/pure_eval
chalice: TESTPATH=tests/integrations/chalice
boto3: TESTPATH=tests/integrations/boto3