python-sentry-sdk/python-sentry-sdk.spec
2024-08-20 07:48:25 +03:00

477 lines
19 KiB
RPMSpec

# Excluded extras/integrations
# Lines below are in `code: comment` format, where `code` is used for
# easier navigation in text editors and linking
# no_anthropic: anthropic not packaged yet
# no_ariadne: ariadne not packaged yet
# no_arq: arq not packaged yet
# no_beam: beam not packaged yet
# no_celery_redbeat: celery-redbeat not packaged yet
# no_chalice: chalice not packaged yet
# no_clickhouse_driver: clickhouse_driver not packaged yet
# no_cohere: cohere is not packaged
# no_fakeredis: fakeredis is not packaged
# no_gql: gql not packaged yet
# no_huey: huey not packaged yet
# no_huggingface_hub: huggingface_hub not packaged yet
# no_langchain: langchain not packaged yet
# no_loguru: loguru not packaged yet
# no_mockupdb: mockupdb is not packaged; it is unmaintained: https://github.com/mongodb-labs/mongo-mockup-db
# no_newrelic: newrelic is not packaged
# no_openai: openai not packaged yet
# no_potel: opentelemetry-experimental is not packaged
# no_pyspark: pyspark not packaged yet
# no_quart: quart not packaged yet
# no_sanic: sanic not packaged yet
# no_starlite: starlite not packaged yet
# no_strawberry: strawberry not packaged yet
# no_trytond: trytond not packaged yet
# no_py313_support_gevent: do not install gevent and test with gevent on Fedora >= 41 for now,
# since it is not fully compatible with Python 3.13:
# https://bugzilla.redhat.com/show_bug.cgi?id=2275488
# https://bugzilla.redhat.com/show_bug.cgi?id=2290569
# https://github.com/gevent/gevent/issues/2037
# old_graphene: graphene in Fedora 41 is too old (Sentry SDK wants 3.3, Fedora 41 has 3.0b6)
# new_werkzeug: werkzeug in Fedora 41 is too new (Sentry SDK wants < 2.1.0, Fedora 41 has 3.0.3):
# https://github.com/getsentry/sentry-python/issues/1398
%bcond tests 1
%bcond network_tests 0
%global forgeurl https://github.com/getsentry/sentry-python
Version: 2.7.1
%global tag %{version}
%forgemeta
Name: python-sentry-sdk
Release: %autorelease
Summary: The new Python SDK for Sentry.io
License: MIT
URL: https://sentry.io/for/python/
Source0: %{forgesource}
# Tests fail with:
# `AssertionError: previous item was not torn down properly`
# because of the bug in pytest-forked, reorder them to make them pass.
# See https://github.com/pytest-dev/pytest-forked/issues/67#issuecomment-1964718720
# for the explanation.
# Upstream issue: https://github.com/getsentry/sentry-python/issues/3035
Patch0: 0001-Reorder-forked-tests.patch
# Tests fail because they are expected to be executed in a clean environment.
# Upstream PR: https://github.com/getsentry/sentry-python/pull/3240
Patch1: 0002-ref-tests-Unhardcode-integration-list.patch
# Patches for Python 3.13 support
# Upstream PR: https://github.com/getsentry/sentry-python/pull/3271
Patch2: 0003-fix-tests-Fix-exception-on-copying-frame.f_locals-Py.patch
# Upstream PR: https://github.com/getsentry/sentry-python/pull/3272
Patch3: 0004-fix-utils-Handle-partialmethod-in-qualname_from_func.patch
BuildArch: noarch
BuildRequires: python3-devel
%if %{with tests}
BuildRequires: python3dist(botocore)
BuildRequires: python3dist(certifi)
BuildRequires: python3dist(djangorestframework)
# BuildRequires: python3dist(gevent) # no_py313_support_gevent
BuildRequires: python3dist(graphene)
BuildRequires: python3dist(jsonschema)
BuildRequires: python3dist(protobuf)
BuildRequires: python3dist(psycopg2)
BuildRequires: python3dist(pyramid)
BuildRequires: python3dist(pysocks)
BuildRequires: python3dist(pytest)
BuildRequires: python3dist(pytest-aiohttp)
BuildRequires: python3dist(pytest-asyncio)
BuildRequires: python3dist(pytest-django)
BuildRequires: python3dist(pytest-forked)
BuildRequires: python3dist(pytest-localserver)
BuildRequires: python3dist(python-multipart)
BuildRequires: python3dist(requests)
BuildRequires: python3dist(responses)
BuildRequires: python3dist(wheel)
%if %{with network_tests}
BuildRequires: python3dist(boto3)
BuildRequires: python3dist(httpx)
BuildRequires: python3dist(pytest-httpx)
%endif
%endif
# For re-generating protobuf bindings
BuildRequires: protobuf-compiler
%global _description %{expand:
Python Error and Performance Monitoring. Actionable insights to resolve Python
performance bottlenecks and errors. See the full picture of any Python exception
so you can diagnose, fix, and optimize performance in the Python debugging
process.}
%description %_description
%package -n python3-sentry-sdk
Summary: %{summary}
%description -n python3-sentry-sdk %_description
%global default_toxenv py%{python3_version}
# List of names of extras & toxenvs included
%global components %{shrink:
aiohttp
celery
django
falcon
fastapi
opentelemetry
pure_eval
sqlalchemy
starlette
tornado
%{nil}}
# List of names of extras & toxenvs excluded
# anthropic: no_anthropic
# arq: no_arq
# beam: no_beam
# chalice: no_chalice
# huey: no_huey
# huggingface_hub: no_huggingface_hub
# langchain: no_langchain
# loguru: no_loguru
# openai: no_openai
# quart: no_quart
# sanic: no_sanic
# starlite: no_starlite
%global components_excluded %{shrink:
anthropic
arq
beam
chalice
huey
huggingface_hub
langchain
loguru
openai
quart
sanic
starlite
%{nil}}
# List of names of extras included (if not present in components)
%global extras %{shrink:
%{components}
asyncpg
bottle
flask
grpcio
httpx
pymongo
rq
opentelemetry-experimental
%{nil}}
# List of names of extras excluded (if not present in components_excluded)
# celery-redbeat: no_celery_redbeat
# clickhouse-driver: no_clickhouse_driver
# pyspark: no_pyspark
%global extras_excluded %{shrink:
%{components_excluded}
celery-redbeat
clickhouse-driver
pyspark
%{nil}}
%define toxenvs_by_components %{expand:%(echo %{components} | sed "s/^/%{toxenv}-/;s/ / %{toxenv}-/g")}
# List of names of toxenvs included (if not present in components)
%global toxenvs %{shrink:
%{toxenvs_by_components}
%{toxenv}-common
%{toxenv}-cloud_resource_context
%{nil}
}
%define toxenvs_excluded_by_components %{expand:%(echo %{components_excluded} | sed "s/^/%{toxenv}-/;s/ / %{toxenv}-/g")}
# List of names of toxenvs excluded (if not present in components_excluded)
# ariadne: no_ariadne
# asgi: async_asgi_testclient is unpackaged yet
# asyncpg: require a local PostgreSQL instance running
# aws_lambda: aws_lambda requires credentials
# boto3: require network
# bottle: new_werkzeug
# clickhouse_driver: no_clickhouse_driver
# cohere: no_cohere
# flask: new_werkzeug
# gcp: python 3.7 only
# gevent: no_py313_support_gevent
# gql: no_gql
# graphene: old_graphene
# grpc: protobuf is too old
# httpx: require network
# potel: no_potel
# pymongo: no_mockupdb
# pyramid: new_werkzeug
# redis: no_fakeredis
# redis_py_cluster_legacy: no_fakeredis
# requests: require network
# rq: no_fakeredis
# socket: require network
# spark: no_pyspark
# starberry: no_strawberry
# trytond: no_trytond
%global toxenvs_excluded %{shrink:
%{toxenvs_excluded_by_components}
%{toxenv}-ariadne
%{toxenv}-asgi
%{toxenv}-asyncpg
%{toxenv}-aws_lambda
%{toxenv}-boto3
%{toxenv}-bottle
%{toxenv}-clickhouse_driver
%{toxenv}-cohere
%{toxenv}-flask
%{toxenv}-gcp
%{toxenv}-gevent
%{toxenv}-gql
%{toxenv}-graphene
%{toxenv}-grpc
%{toxenv}-httpx
%{toxenv}-potel
%{toxenv}-pymongo
%{toxenv}-pyramid
%{toxenv}-redis
%{toxenv}-redis_py_cluster_legacy
%{toxenv}-rq
%{toxenv}-requests
%{toxenv}-socket
%{toxenv}-spark
%{toxenv}-strawberry
%{toxenv}-trytond
%{nil}}
%define toxenvs_csv %{expand:%(echo %{toxenvs} | sed "s/ /,/g")}
%define extras_csv %{expand:%(echo %{extras} | sed "s/ /,/g")}
%pyproject_extras_subpkg -n python3-sentry-sdk %{extras}
%prep
%forgeautosetup -p1
# Verify all extras defined against setup.py
defined_extra=$(echo "%extras_excluded" "%extras" | xargs -n1 | sort -u)
setup_py_extra=$(cat setup.py | sed -n '/extras_require/,/}/p' | sed 's/ //g' | sed '$ s/.$/\nprint("\\n".join(extras_require))/' | python3 -)
diff <(echo "$defined_extra") <(echo "$setup_py_extra")
sed -r -i 's/psycopg2-binary/psycopg2/' tox.ini
# Unpin all test dependencies to make installation happen
sed -r -i 's/(pytest)<7\.0\.0/\1/' tox.ini
sed -r -i 's/(Werkzeug)<2\.1\.0/\1/' tox.ini
sed -r -i 's/(gevent)>=22\.10\.0, <22\.11\.0/\1/' tox.ini
sed -r -i 's/(anyio)<4\.0\.0/\1/' tox.ini
# no_newrelic
sed -r -i '/(newrelic)/d' tox.ini
# ipdb is not used.
# https://github.com/getsentry/sentry-python/pull/3237
sed -r -i '/(ipdb)/d' requirements-testing.txt
# These opentelemetry-instrumentation Python packages are not packaged.
sed -r -i '/(opentelemetry-instrumentation-aio-pika)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-cassandra)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-confluent-kafka)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-falcon)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-grpc)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-remoulade)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-sklearn)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-starlette)/d' setup.py
sed -r -i '/(opentelemetry-instrumentation-tortoiseorm)/d' setup.py
%generate_buildrequires
%pyproject_buildrequires -x %{extras_csv} -e %{toxenvs_csv}
%build
# Re-generate the protobuf bindings for compatibility with the packaged
# protobuf version.
pushd tests/integrations/grpc/protos/
protoc --python_out="${PWD}" grpc_test_service.proto
popd
%pyproject_wheel
%install
%pyproject_install
%pyproject_save_files sentry_sdk
%check
# Import check
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.anthropic" # no_anthropic
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.ariadne" # no_ariadne
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.arq" # no_arq
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.celery_redbeat" # no_celery_redbeat
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.chalice" # no_chalice
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.clickhouse_driver" # no_clickhouse_driver
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.cohere" # no_cohere
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.gql" # no_gql
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.huey" # no_huey
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.huggingface_hub" # no_huggingface_hub
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.langchain" # no_langchain
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.loguru" # no_loguru
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.openai" # no_openai
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.quart" # no_quart
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.sanic" # no_sanic
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.starlite" # no_starlite
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.strawberry" # no_strawberry
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.trytond" # no_trytond
%if %{without tests}
skip_import_check="${skip_import_check-} -e sentry_sdk.db.explain_plan.sqlalchemy"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.aiohttp"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.asyncpg"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.boto3"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.bottle"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.celery*"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.django*"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.executing"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.falcon"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.fastapi"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.flask"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.graphene"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.grpc*"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.httpx"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.opentelemetry*"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.pure_eval"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.pymongo"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.pyramid"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.rq"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.sqlalchemy"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.starlette"
skip_import_check="${skip_import_check-} -e sentry_sdk.integrations.tornado"
%endif
%pyproject_check_import ${skip_import_check}
%if %{with tests}
# Tests
# Deselect/ignore:
# not in tox.ini, probably broken
ignore="${ignore-} --ignore=tests/integrations/wsgi"
# python 2 only
deselect="${deselect-} --deselect=tests/integrations/threading/test_threading.py::test_wrapper_attributes_no_qualname"
# python 3.7 only
ignore="${ignore-} --ignore=tests/integrations/gcp"
# require network
%if %{without network_tests}
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_cache_spans_decorator"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_cache_spans_disabled_decorator"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_cache_spans_disabled_middleware"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_cache_spans_disabled_templatetag"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_cache_spans_middleware"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_cache_spans_templatetag"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_db_connection_span_data"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_django_connect_breadcrumbs"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_django_connect_trace"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_queryset_repr"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_response_trace"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_sql_dict_query_params"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_sql_psycopg2_placeholders"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_sql_psycopg2_string_composition"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_sql_queries"
deselect="${deselect-} --deselect=tests/integrations/django/test_basic.py::test_user_captured"
deselect="${deselect-} --deselect=tests/integrations/django/test_data_scrubbing.py::test_scrub_django_custom_session_cookies_filtered"
deselect="${deselect-} --deselect=tests/integrations/django/test_data_scrubbing.py::test_scrub_django_session_cookies_filtered"
deselect="${deselect-} --deselect=tests/integrations/django/test_data_scrubbing.py::test_scrub_django_session_cookies_removed"
deselect="${deselect-} --deselect=tests/integrations/django/test_db_query_data.py"
deselect="${deselect-} --deselect=tests/integrations/requests/test_requests.py::test_omit_url_data_if_parsing_fails"
deselect="${deselect-} --deselect=tests/integrations/requests/test_requests.py::test_crumb_capture"
ignore="${ignore-} --ignore=tests/integrations/boto3"
ignore="${ignore-} --ignore=tests/integrations/httpx"
ignore="${ignore-} --ignore=tests/integrations/socket"
%endif
# TODO: investigate
ignore="${ignore-} --ignore=tests/integrations/fastapi"
# require credentials
ignore="${ignore-} --ignore=tests/integrations/aws_lambda/"
# require a local PostgreSQL instance running
ignore="${ignore-} --ignore=tests/integrations/asyncpg"
# testing suite relies on the test to be executed in clean env
deselect="${deselect-} --deselect=tests/test_basics.py::test_auto_enabling_integrations_catches_import_error"
# currently will always fail: there is no env vars or git repository
deselect="${deselect-} --deselect=tests/test_utils.py::test_default_release"
# tests cannot be run during Fedora build because of the version of pytest:
# https://github.com/pytest-dev/pytest/issues/9621
# https://github.com/pytest-dev/pytest-forked/issues/67
deselect="${deselect-} --deselect=tests/utils/test_contextvars.py"
# TODO: relies on django testing, incompatible with pytest macro (see above)
deselect="${deselect-} --deselect=tests/test_transport.py::test_transport_works"
ignore="${ignore-} --ignore=tests/integrations/django"
# no_fakeredis
deselect="${deselect-} --deselect=tests/test_basics.py::test_redis_disabled_when_not_installed"
ignore="${ignore-} --ignore=tests/integrations/redis"
ignore="${ignore-} --ignore=tests/integrations/rq"
# old_graphene
ignore="${ignore-} --ignore=tests/integrations/graphene"
# no_mockupdb
ignore="${ignore-} --ignore=tests/integrations/pymongo"
# protobuf is too old
ignore="${ignore-} --ignore=tests/integrations/grpc"
# no_newrelic
deselect="${deselect-} --deselect=tests/integrations/celery/test_celery.py::test_newrelic_interference"
# new_werkzeug
ignore="${ignore-} --ignore=tests/integrations/bottle"
ignore="${ignore-} --ignore=tests/integrations/flask"
ignore="${ignore-} --ignore=tests/integrations/pyramid"
defined_toxenvs=$(echo "%toxenvs_excluded" "%toxenvs" | xargs -n1 | sort -u)
tox_ini_toxenvs=$(cat tox.ini | sed -r -n 's/[[:blank:]]*(.*):[[:blank:]]*TESTPATH=.*/%{default_toxenv}-\1/p' | xargs -n1 | sort -u)
diff <(echo "$defined_toxenvs") <(echo "$tox_ini_toxenvs")
# TODO:
# sqlalchemy installed during tests causes many failures.
# It is used by sentry_sdk/db/explain_plan/sqlalchemy.py and is optional, drop it.
# Test sqlalchemy separately.
%tox -e %{default_toxenv}-sqlalchemy -- -- ${deselect-} ${ignore-}
# Make `import sqlalchemy` fail
echo "raise ImportError()" > sqlalchemy.py
%define toxenvs_csv_without_sqlalchemy %{expand:%(echo %{toxenvs_csv} | sed "s/%{default_toxenv}-sqlalchemy,//")}
# TODO:
# By some reason, some tests fail because of django plugin, run them separately.
%define toxenvs_csv_without_django_and_sqlalchemy %{expand:%(echo %{toxenvs_csv} | sed "s/%{default_toxenv}-django,//")}
tests_no_django="test_link_trace_context_to_error_event or test_on_end_sentry_span or test_on_end_sentry_transaction or test_pruning_old_spans_on_end or test_transaction_style or test_user_information_error or test_circular_references"
%tox -e %{toxenvs_csv_without_django_and_sqlalchemy} -- -- -p no:django ${deselect-} ${ignore-} tests/integrations/opentelemetry tests/integrations/starlette/test_starlette.py tests/integrations/threading/test_threading.py -k "$tests_no_django"
%tox -e %{toxenvs_csv_without_sqlalchemy} -- -- ${deselect-} ${ignore-} -k "not ($tests_no_django)"
%endif
%files -n python3-sentry-sdk -f %{pyproject_files}
%doc README.md
%changelog
%autochangelog