diff --git a/CHANGELOG.rst b/CHANGELOG.rst index bb3896f4..2a6cbd40 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -11,6 +11,13 @@ Change Log .. There should always be an "Unreleased" section for changes pending release. + +[5.14.0] - 2024-03-28 +--------------------- +Added +~~~~~ +* Initial support for sending monitoring data from Celery to OpenTelemetry collector or Datadog agent. + [5.13.0] - 2024-04-30 --------------------- Added diff --git a/edx_django_utils/__init__.py b/edx_django_utils/__init__.py index 449b8ce7..afea1b66 100644 --- a/edx_django_utils/__init__.py +++ b/edx_django_utils/__init__.py @@ -2,7 +2,7 @@ EdX utilities for Django Application development.. """ -__version__ = "5.13.0" +__version__ = "5.14.0" default_app_config = ( "edx_django_utils.apps.EdxDjangoUtilsConfig" diff --git a/edx_django_utils/monitoring/README.rst b/edx_django_utils/monitoring/README.rst index 14d0937a..ae7e1719 100644 --- a/edx_django_utils/monitoring/README.rst +++ b/edx_django_utils/monitoring/README.rst @@ -40,6 +40,10 @@ Feature support matrix for built-in telemetry backends: - ✅ - ❌ - ❌ + * - Instrument celery tasks directly (``intialize_celery_task``) + - ❌ + - ✅ + - ✅ Using Custom Attributes ----------------------- diff --git a/edx_django_utils/monitoring/__init__.py b/edx_django_utils/monitoring/__init__.py index 431acc2e..387d27bb 100644 --- a/edx_django_utils/monitoring/__init__.py +++ b/edx_django_utils/monitoring/__init__.py @@ -26,6 +26,7 @@ accumulate, background_task, increment, + initialize_celery_monitoring, record_exception, set_custom_attribute, set_custom_attributes_for_course_key diff --git a/edx_django_utils/monitoring/internal/backends.py b/edx_django_utils/monitoring/internal/backends.py index a6190156..a6cb421a 100644 --- a/edx_django_utils/monitoring/internal/backends.py +++ b/edx_django_utils/monitoring/internal/backends.py @@ -50,6 +50,16 @@ def record_exception(self): Record the exception that is currently being handled. """ + @abstractmethod + def initialize_celery_monitoring(self, *args, **kwargs): + """ + Instrument celery to be monitored by the monitoring service. + + Optional kwargs: + worker_process_init - required for open telemetry to integrate to the clery signal. + Import from from celery.signals. + """ + class NewRelicBackend(TelemetryBackend): """ @@ -77,6 +87,9 @@ def record_exception(self): # https://docs.newrelic.com/docs/apm/agents/python-agent/python-agent-api/recordexception-python-agent-api/ newrelic.agent.record_exception() + def initialize_celery_monitoring(self, *args, **kwargs): + pass + class OpenTelemetryBackend(TelemetryBackend): """ @@ -84,7 +97,7 @@ class OpenTelemetryBackend(TelemetryBackend): Requirements to use: - - Install `opentelemetry-api` Python package + - Install `opentelemetry-api` and `opentelemetry-instrumentation-celery` Python packages. - Configure and initialize OpenTelemetry API reference: https://opentelemetry-python.readthedocs.io/en/latest/ @@ -93,7 +106,9 @@ class OpenTelemetryBackend(TelemetryBackend): def __init__(self): # If import fails, the backend won't be used. from opentelemetry import trace + from opentelemetry.instrumentation.celery import CeleryInstrumentor self.otel_trace = trace + self.instrumentor = CeleryInstrumentor def set_attribute(self, key, value): # Sets the value on the current span, not necessarily the root @@ -103,6 +118,17 @@ def set_attribute(self, key, value): def record_exception(self): self.otel_trace.get_current_span().record_exception(sys.exc_info()[1]) + def initialize_celery_monitoring(self, *args, **kwargs): + worker_process_init = kwargs.get('worker_process_init', None) + if worker_process_init is not None: + @worker_process_init.connect(weak=False) + def init_celery_tracing(*args, **kwargs): + self.instrumentor().instrument() + else: + raise Exception( + "the worker_process_init celery signal must be provided for OpenTelemetry to monitor celery tasks." + ) + class DatadogBackend(TelemetryBackend): """ @@ -118,8 +144,9 @@ class DatadogBackend(TelemetryBackend): # pylint: disable=import-outside-toplevel def __init__(self): # If import fails, the backend won't be used. - from ddtrace import tracer + from ddtrace import patch, tracer self.dd_tracer = tracer + self.patch = patch def set_attribute(self, key, value): if root_span := self.dd_tracer.current_root_span(): @@ -129,6 +156,9 @@ def record_exception(self): if span := self.dd_tracer.current_span(): span.set_traceback() + def initialize_celery_monitoring(self, *args, **kwargs): + self.patch(celery=True) + # We're using an lru_cache instead of assigning the result to a variable on # module load. With the default settings (pointing to a TelemetryBackend diff --git a/edx_django_utils/monitoring/internal/utils.py b/edx_django_utils/monitoring/internal/utils.py index 2dc2cfb1..9a71f3e1 100644 --- a/edx_django_utils/monitoring/internal/utils.py +++ b/edx_django_utils/monitoring/internal/utils.py @@ -14,8 +14,6 @@ We try to keep track of our custom monitoring at: https://openedx.atlassian.net/wiki/spaces/PERF/pages/54362736/Custom+Attributes+in+New+Relic -At this time, the custom monitoring will only be reported to New Relic. - """ from .backends import configured_backends from .middleware import CachedCustomMonitoringMiddleware @@ -110,3 +108,12 @@ def noop_decorator(func): return newrelic.agent.background_task(*args, **kwargs) else: return noop_decorator + + +def initialize_celery_monitoring(*args, **kwargs): + """ + Set monitoring custom attribute. + This is not cached. + """ + for backend in configured_backends(): + backend.initialize_celery_monitoring(*args, **kwargs) diff --git a/edx_django_utils/monitoring/tests/test_backends.py b/edx_django_utils/monitoring/tests/test_backends.py index 29b65d3c..a55bda23 100644 --- a/edx_django_utils/monitoring/tests/test_backends.py +++ b/edx_django_utils/monitoring/tests/test_backends.py @@ -1,13 +1,13 @@ """ Tests for TelemetryBackend and implementations. """ -from unittest.mock import patch +from unittest.mock import Mock, patch import ddt import pytest from django.test import TestCase, override_settings -from edx_django_utils.monitoring import record_exception, set_custom_attribute +from edx_django_utils.monitoring import initialize_celery_monitoring, record_exception, set_custom_attribute from edx_django_utils.monitoring.internal.backends import configured_backends @@ -151,3 +151,19 @@ def test_record_exception( mock_nr_record_exception.assert_called_once() mock_otel_record_exception.assert_called_once() mock_dd_span.assert_called_once() + + # Record exception on current span, not root span. + @patch('ddtrace.patch') + def test_initialize_celery_monitoring( + self, mock_dd_patch + ): + celery_signal_decorator_mock = Mock() + with override_settings(OPENEDX_TELEMETRY=[ + 'edx_django_utils.monitoring.NewRelicBackend', + 'edx_django_utils.monitoring.OpenTelemetryBackend', + 'edx_django_utils.monitoring.DatadogBackend', + ]): + initialize_celery_monitoring(worker_process_init=celery_signal_decorator_mock) + mock_dd_patch.assert_called_once() + # celery hook should be defined, but not called. + self.assertFalse(celery_signal_decorator_mock.called) diff --git a/requirements/base.txt b/requirements/base.txt index e20f7453..639306bf 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -24,19 +24,19 @@ django-crum==0.7.9 # via -r requirements/base.in django-waffle==4.1.0 # via -r requirements/base.in -newrelic==9.8.0 +newrelic==9.9.0 # via -r requirements/base.in pbr==6.0.0 # via stevedore psutil==5.9.8 # via -r requirements/base.in -pycparser==2.21 +pycparser==2.22 # via cffi pynacl==1.5.0 # via -r requirements/base.in -sqlparse==0.4.4 +sqlparse==0.5.0 # via django stevedore==5.2.0 # via -r requirements/base.in -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via asgiref diff --git a/requirements/ci.txt b/requirements/ci.txt index c085cbcf..2877eac1 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -12,7 +12,7 @@ colorama==0.4.6 # via tox distlib==0.3.8 # via virtualenv -filelock==3.13.3 +filelock==3.14.0 # via # tox # virtualenv @@ -20,11 +20,11 @@ packaging==24.0 # via # pyproject-api # tox -platformdirs==4.2.0 +platformdirs==4.2.1 # via # tox # virtualenv -pluggy==1.4.0 +pluggy==1.5.0 # via tox pyproject-api==1.6.1 # via tox @@ -32,7 +32,7 @@ tomli==2.0.1 # via # pyproject-api # tox -tox==4.14.2 +tox==4.15.0 # via -r requirements/ci.in -virtualenv==20.25.1 +virtualenv==20.26.1 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index bcbf3ab6..d7ccca0d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -4,8 +4,10 @@ # # make upgrade # -annotated-types==0.6.0 - # via pydantic +amqp==5.2.0 + # via + # -r requirements/quality.txt + # kombu asgiref==3.8.1 # via # -r requirements/quality.txt @@ -20,11 +22,17 @@ attrs==23.2.0 # -r requirements/quality.txt # cattrs # ddtrace -backports-zoneinfo==0.2.1 ; python_version < "3.9" +backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # via # -c requirements/constraints.txt # -r requirements/quality.txt + # celery # django + # kombu +billiard==4.2.0 + # via + # -r requirements/quality.txt + # celery build==1.2.1 # via # -r requirements/pip-tools.txt @@ -41,6 +49,8 @@ cattrs==23.2.3 # via # -r requirements/quality.txt # ddtrace +celery==5.4.0 + # via -r requirements/quality.txt cffi==1.16.0 # via # -r requirements/quality.txt @@ -54,15 +64,31 @@ click==8.1.7 # via # -r requirements/pip-tools.txt # -r requirements/quality.txt + # celery + # click-didyoumean # click-log + # click-plugins + # click-repl # code-annotations # edx-lint # pip-tools +click-didyoumean==0.3.1 + # via + # -r requirements/quality.txt + # celery click-log==0.4.0 # via # -r requirements/quality.txt # edx-lint -code-annotations==1.7.0 +click-plugins==1.1.1 + # via + # -r requirements/quality.txt + # celery +click-repl==0.3.0 + # via + # -r requirements/quality.txt + # celery +code-annotations==1.8.0 # via # -r requirements/quality.txt # edx-lint @@ -70,17 +96,17 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.4.4 +coverage[toml]==7.5.0 # via # -r requirements/quality.txt # pytest-cov -ddsketch==2.0.4 +ddsketch==3.0.1 # via # -r requirements/quality.txt # ddtrace ddt==1.7.2 # via -r requirements/quality.txt -ddtrace==2.7.5 +ddtrace==2.8.3 # via -r requirements/quality.txt deprecated==1.2.14 # via @@ -109,7 +135,7 @@ django-crum==0.7.9 # via -r requirements/quality.txt django-waffle==4.1.0 # via -r requirements/quality.txt -edx-i18n-tools==1.3.0 +edx-i18n-tools==1.6.0 # via -r requirements/dev.in edx-lint==5.3.6 # via -r requirements/quality.txt @@ -117,18 +143,18 @@ envier==0.5.1 # via # -r requirements/quality.txt # ddtrace -exceptiongroup==1.2.0 +exceptiongroup==1.2.1 # via # -r requirements/quality.txt # cattrs # pytest factory-boy==3.3.0 # via -r requirements/quality.txt -faker==24.4.0 +faker==25.0.0 # via # -r requirements/quality.txt # factory-boy -filelock==3.13.3 +filelock==3.14.0 # via # -r requirements/ci.txt # tox @@ -140,7 +166,8 @@ importlib-metadata==6.11.0 # -r requirements/quality.txt # build # opentelemetry-api -inflect==7.0.0 + # typeguard +inflect==7.2.1 # via jinja2-pluralize iniconfig==2.0.0 # via @@ -158,8 +185,16 @@ jinja2==3.1.3 # jinja2-pluralize jinja2-pluralize==0.3.0 # via diff-cover -lxml==5.1.1 - # via edx-i18n-tools +kombu==5.3.7 + # via + # -r requirements/quality.txt + # celery +lxml[html-clean,html_clean]==5.2.1 + # via + # edx-i18n-tools + # lxml-html-clean +lxml-html-clean==0.1.1 + # via lxml markupsafe==2.1.5 # via # -r requirements/quality.txt @@ -170,12 +205,26 @@ mccabe==0.7.0 # pylint mock==5.1.0 # via -r requirements/quality.txt -newrelic==9.8.0 +more-itertools==10.2.0 + # via inflect +newrelic==9.9.0 # via -r requirements/quality.txt opentelemetry-api==1.24.0 # via # -r requirements/quality.txt # ddtrace + # opentelemetry-instrumentation + # opentelemetry-instrumentation-celery +opentelemetry-instrumentation==0.45b0 + # via + # -r requirements/quality.txt + # opentelemetry-instrumentation-celery +opentelemetry-instrumentation-celery==0.45b0 + # via -r requirements/quality.txt +opentelemetry-semantic-conventions==0.45b0 + # via + # -r requirements/quality.txt + # opentelemetry-instrumentation-celery packaging==24.0 # via # -r requirements/ci.txt @@ -185,7 +234,7 @@ packaging==24.0 # pyproject-api # pytest # tox -path==16.10.0 +path==16.14.0 # via edx-i18n-tools pbr==6.0.0 # via @@ -193,14 +242,14 @@ pbr==6.0.0 # stevedore pip-tools==7.4.1 # via -r requirements/pip-tools.txt -platformdirs==4.2.0 +platformdirs==4.2.1 # via # -r requirements/ci.txt # -r requirements/quality.txt # pylint # tox # virtualenv -pluggy==1.4.0 +pluggy==1.5.0 # via # -r requirements/ci.txt # -r requirements/quality.txt @@ -209,23 +258,22 @@ pluggy==1.4.0 # tox polib==1.2.0 # via edx-i18n-tools +prompt-toolkit==3.0.43 + # via + # -r requirements/quality.txt + # click-repl protobuf==5.26.1 # via # -r requirements/quality.txt - # ddsketch # ddtrace psutil==5.9.8 # via -r requirements/quality.txt pycodestyle==2.11.1 # via -r requirements/quality.txt -pycparser==2.21 +pycparser==2.22 # via # -r requirements/quality.txt # cffi -pydantic==2.6.4 - # via inflect -pydantic-core==2.16.3 - # via pydantic pydocstyle==6.3.0 # via -r requirements/quality.txt pygments==2.17.2 @@ -256,12 +304,12 @@ pyproject-api==1.6.1 # via # -r requirements/ci.txt # tox -pyproject-hooks==1.0.0 +pyproject-hooks==1.1.0 # via # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.1.1 +pytest==8.2.0 # via # -r requirements/quality.txt # pytest-cov @@ -274,6 +322,7 @@ python-dateutil==2.9.0.post0 # via # -r requirements/dev.in # -r requirements/quality.txt + # celery # faker python-slugify==8.0.4 # via @@ -295,7 +344,7 @@ snowballstemmer==2.2.0 # via # -r requirements/quality.txt # pydocstyle -sqlparse==0.4.4 +sqlparse==0.5.0 # via # -r requirements/quality.txt # ddtrace @@ -318,33 +367,47 @@ tomli==2.0.1 # pip-tools # pylint # pyproject-api - # pyproject-hooks # pytest # tox tomlkit==0.12.4 # via # -r requirements/quality.txt # pylint -tox==4.14.2 +tox==4.15.0 # via -r requirements/ci.txt -typing-extensions==4.10.0 +typeguard==4.2.1 + # via inflect +typing-extensions==4.11.0 # via # -r requirements/quality.txt - # annotated-types # asgiref # astroid # bytecode # cattrs # ddtrace - # faker # inflect - # pydantic - # pydantic-core + # kombu # pylint -virtualenv==20.25.1 + # typeguard +tzdata==2024.1 + # via + # -r requirements/quality.txt + # backports-zoneinfo + # celery +vine==5.1.0 + # via + # -r requirements/quality.txt + # amqp + # celery + # kombu +virtualenv==20.26.1 # via # -r requirements/ci.txt # tox +wcwidth==0.2.13 + # via + # -r requirements/quality.txt + # prompt-toolkit wheel==0.43.0 # via # -r requirements/pip-tools.txt @@ -353,6 +416,7 @@ wrapt==1.16.0 # via # -r requirements/quality.txt # deprecated + # opentelemetry-instrumentation xmltodict==0.13.0 # via # -r requirements/quality.txt diff --git a/requirements/doc.txt b/requirements/doc.txt index cfced93b..ce4f9fc9 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -8,6 +8,10 @@ accessible-pygments==0.0.4 # via pydata-sphinx-theme alabaster==0.7.13 # via sphinx +amqp==5.2.0 + # via + # -r requirements/test.txt + # kombu asgiref==3.8.1 # via # -r requirements/test.txt @@ -21,13 +25,21 @@ babel==2.14.0 # via # pydata-sphinx-theme # sphinx -backports-zoneinfo==0.2.1 ; python_version < "3.9" +backports-tarfile==1.1.1 + # via jaraco-context +backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # via # -c requirements/constraints.txt # -r requirements/test.txt + # celery # django + # kombu beautifulsoup4==4.12.3 # via pydata-sphinx-theme +billiard==4.2.0 + # via + # -r requirements/test.txt + # celery bytecode==0.15.1 # via # -r requirements/test.txt @@ -36,6 +48,8 @@ cattrs==23.2.3 # via # -r requirements/test.txt # ddtrace +celery==5.4.0 + # via -r requirements/test.txt certifi==2024.2.2 # via requests cffi==1.16.0 @@ -46,20 +60,37 @@ cffi==1.16.0 charset-normalizer==3.3.2 # via requests click==8.1.7 - # via -r requirements/test.txt -coverage[toml]==7.4.4 + # via + # -r requirements/test.txt + # celery + # click-didyoumean + # click-plugins + # click-repl +click-didyoumean==0.3.1 + # via + # -r requirements/test.txt + # celery +click-plugins==1.1.1 + # via + # -r requirements/test.txt + # celery +click-repl==0.3.0 + # via + # -r requirements/test.txt + # celery +coverage[toml]==7.5.0 # via # -r requirements/test.txt # pytest-cov cryptography==42.0.5 # via secretstorage -ddsketch==2.0.4 +ddsketch==3.0.1 # via # -r requirements/test.txt # ddtrace ddt==1.7.2 # via -r requirements/test.txt -ddtrace==2.7.5 +ddtrace==2.8.3 # via -r requirements/test.txt deprecated==1.2.14 # via @@ -90,7 +121,7 @@ envier==0.5.1 # via # -r requirements/test.txt # ddtrace -exceptiongroup==1.2.0 +exceptiongroup==1.2.1 # via # -r requirements/test.txt # cattrs @@ -99,11 +130,11 @@ factory-boy==3.3.0 # via # -r requirements/doc.in # -r requirements/test.txt -faker==24.4.0 +faker==25.0.0 # via # -r requirements/test.txt # factory-boy -idna==3.6 +idna==3.7 # via requests imagesize==1.4.1 # via sphinx @@ -120,11 +151,11 @@ iniconfig==2.0.0 # via # -r requirements/test.txt # pytest -jaraco-classes==3.3.1 +jaraco-classes==3.4.0 # via keyring -jaraco-context==4.3.0 +jaraco-context==5.3.0 # via keyring -jaraco-functools==4.0.0 +jaraco-functools==4.0.1 # via keyring jeepney==0.8.0 # via @@ -132,8 +163,12 @@ jeepney==0.8.0 # secretstorage jinja2==3.1.3 # via sphinx -keyring==25.0.0 +keyring==25.2.0 # via twine +kombu==5.3.7 + # via + # -r requirements/test.txt + # celery markdown-it-py==3.0.0 # via rich markupsafe==2.1.5 @@ -146,7 +181,7 @@ more-itertools==10.2.0 # via # jaraco-classes # jaraco-functools -newrelic==9.8.0 +newrelic==9.9.0 # via -r requirements/test.txt nh3==0.2.17 # via readme-renderer @@ -154,6 +189,18 @@ opentelemetry-api==1.24.0 # via # -r requirements/test.txt # ddtrace + # opentelemetry-instrumentation + # opentelemetry-instrumentation-celery +opentelemetry-instrumentation==0.45b0 + # via + # -r requirements/test.txt + # opentelemetry-instrumentation-celery +opentelemetry-instrumentation-celery==0.45b0 + # via -r requirements/test.txt +opentelemetry-semantic-conventions==0.45b0 + # via + # -r requirements/test.txt + # opentelemetry-instrumentation-celery packaging==24.0 # via # -r requirements/test.txt @@ -166,18 +213,21 @@ pbr==6.0.0 # stevedore pkginfo==1.10.0 # via twine -pluggy==1.4.0 +pluggy==1.5.0 # via # -r requirements/test.txt # pytest +prompt-toolkit==3.0.43 + # via + # -r requirements/test.txt + # click-repl protobuf==5.26.1 # via # -r requirements/test.txt - # ddsketch # ddtrace psutil==5.9.8 # via -r requirements/test.txt -pycparser==2.21 +pycparser==2.22 # via # -r requirements/test.txt # cffi @@ -193,7 +243,7 @@ pygments==2.17.2 # sphinx pynacl==1.5.0 # via -r requirements/test.txt -pytest==8.1.1 +pytest==8.2.0 # via # -r requirements/doc.in # -r requirements/test.txt @@ -206,6 +256,7 @@ pytest-django==4.8.0 python-dateutil==2.9.0.post0 # via # -r requirements/test.txt + # celery # faker pytz==2024.1 # via babel @@ -258,7 +309,7 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx -sqlparse==0.4.4 +sqlparse==0.5.0 # via # -r requirements/test.txt # ddtrace @@ -274,26 +325,42 @@ tomli==2.0.1 # pytest twine==5.0.0 # via -r requirements/doc.in -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/test.txt # asgiref # bytecode # cattrs # ddtrace - # faker + # kombu # pydata-sphinx-theme # rich +tzdata==2024.1 + # via + # -r requirements/test.txt + # backports-zoneinfo + # celery urllib3==2.2.1 # via # requests # twine +vine==5.1.0 + # via + # -r requirements/test.txt + # amqp + # celery + # kombu +wcwidth==0.2.13 + # via + # -r requirements/test.txt + # prompt-toolkit wheel==0.43.0 # via -r requirements/doc.in wrapt==1.16.0 # via # -r requirements/test.txt # deprecated + # opentelemetry-instrumentation xmltodict==0.13.0 # via # -r requirements/test.txt diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 748bf44e..3f056281 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -16,7 +16,7 @@ packaging==24.0 # via build pip-tools==7.4.1 # via -r requirements/pip-tools.in -pyproject-hooks==1.0.0 +pyproject-hooks==1.1.0 # via # build # pip-tools @@ -24,7 +24,6 @@ tomli==2.0.1 # via # build # pip-tools - # pyproject-hooks wheel==0.43.0 # via pip-tools zipp==3.18.1 diff --git a/requirements/pip.txt b/requirements/pip.txt index cf449024..e3ffcc7b 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -10,5 +10,5 @@ wheel==0.43.0 # The following packages are considered to be unsafe in a requirements file: pip==24.0 # via -r requirements/pip.in -setuptools==69.2.0 +setuptools==69.5.1 # via -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index 16e952c3..ecd5476a 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -4,6 +4,10 @@ # # make upgrade # +amqp==5.2.0 + # via + # -r requirements/test.txt + # kombu asgiref==3.8.1 # via # -r requirements/test.txt @@ -17,11 +21,17 @@ attrs==23.2.0 # -r requirements/test.txt # cattrs # ddtrace -backports-zoneinfo==0.2.1 ; python_version < "3.9" +backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # via # -c requirements/constraints.txt # -r requirements/test.txt + # celery # django + # kombu +billiard==4.2.0 + # via + # -r requirements/test.txt + # celery bytecode==0.15.1 # via # -r requirements/test.txt @@ -30,6 +40,8 @@ cattrs==23.2.3 # via # -r requirements/test.txt # ddtrace +celery==5.4.0 + # via -r requirements/test.txt cffi==1.16.0 # via # -r requirements/test.txt @@ -37,24 +49,40 @@ cffi==1.16.0 click==8.1.7 # via # -r requirements/test.txt + # celery + # click-didyoumean # click-log + # click-plugins + # click-repl # code-annotations # edx-lint +click-didyoumean==0.3.1 + # via + # -r requirements/test.txt + # celery click-log==0.4.0 # via edx-lint -code-annotations==1.7.0 +click-plugins==1.1.1 + # via + # -r requirements/test.txt + # celery +click-repl==0.3.0 + # via + # -r requirements/test.txt + # celery +code-annotations==1.8.0 # via edx-lint -coverage[toml]==7.4.4 +coverage[toml]==7.5.0 # via # -r requirements/test.txt # pytest-cov -ddsketch==2.0.4 +ddsketch==3.0.1 # via # -r requirements/test.txt # ddtrace ddt==1.7.2 # via -r requirements/test.txt -ddtrace==2.7.5 +ddtrace==2.8.3 # via -r requirements/test.txt deprecated==1.2.14 # via @@ -78,14 +106,14 @@ envier==0.5.1 # via # -r requirements/test.txt # ddtrace -exceptiongroup==1.2.0 +exceptiongroup==1.2.1 # via # -r requirements/test.txt # cattrs # pytest factory-boy==3.3.0 # via -r requirements/test.txt -faker==24.4.0 +faker==25.0.0 # via # -r requirements/test.txt # factory-boy @@ -104,18 +132,34 @@ isort==5.13.2 # pylint jinja2==3.1.3 # via code-annotations +kombu==5.3.7 + # via + # -r requirements/test.txt + # celery markupsafe==2.1.5 # via jinja2 mccabe==0.7.0 # via pylint mock==5.1.0 # via -r requirements/test.txt -newrelic==9.8.0 +newrelic==9.9.0 # via -r requirements/test.txt opentelemetry-api==1.24.0 # via # -r requirements/test.txt # ddtrace + # opentelemetry-instrumentation + # opentelemetry-instrumentation-celery +opentelemetry-instrumentation==0.45b0 + # via + # -r requirements/test.txt + # opentelemetry-instrumentation-celery +opentelemetry-instrumentation-celery==0.45b0 + # via -r requirements/test.txt +opentelemetry-semantic-conventions==0.45b0 + # via + # -r requirements/test.txt + # opentelemetry-instrumentation-celery packaging==24.0 # via # -r requirements/test.txt @@ -124,22 +168,25 @@ pbr==6.0.0 # via # -r requirements/test.txt # stevedore -platformdirs==4.2.0 +platformdirs==4.2.1 # via pylint -pluggy==1.4.0 +pluggy==1.5.0 # via # -r requirements/test.txt # pytest +prompt-toolkit==3.0.43 + # via + # -r requirements/test.txt + # click-repl protobuf==5.26.1 # via # -r requirements/test.txt - # ddsketch # ddtrace psutil==5.9.8 # via -r requirements/test.txt pycodestyle==2.11.1 # via -r requirements/quality.in -pycparser==2.21 +pycparser==2.22 # via # -r requirements/test.txt # cffi @@ -161,7 +208,7 @@ pylint-plugin-utils==0.8.2 # pylint-django pynacl==1.5.0 # via -r requirements/test.txt -pytest==8.1.1 +pytest==8.2.0 # via # -r requirements/test.txt # pytest-cov @@ -173,6 +220,7 @@ pytest-django==4.8.0 python-dateutil==2.9.0.post0 # via # -r requirements/test.txt + # celery # faker python-slugify==8.0.4 # via code-annotations @@ -187,7 +235,7 @@ six==1.16.0 # python-dateutil snowballstemmer==2.2.0 # via pydocstyle -sqlparse==0.4.4 +sqlparse==0.5.0 # via # -r requirements/test.txt # ddtrace @@ -206,7 +254,7 @@ tomli==2.0.1 # pytest tomlkit==0.12.4 # via pylint -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/test.txt # asgiref @@ -214,12 +262,28 @@ typing-extensions==4.10.0 # bytecode # cattrs # ddtrace - # faker + # kombu # pylint +tzdata==2024.1 + # via + # -r requirements/test.txt + # backports-zoneinfo + # celery +vine==5.1.0 + # via + # -r requirements/test.txt + # amqp + # celery + # kombu +wcwidth==0.2.13 + # via + # -r requirements/test.txt + # prompt-toolkit wrapt==1.16.0 # via # -r requirements/test.txt # deprecated + # opentelemetry-instrumentation xmltodict==0.13.0 # via # -r requirements/test.txt @@ -228,3 +292,6 @@ zipp==3.18.1 # via # -r requirements/test.txt # importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +# setuptools diff --git a/requirements/test.in b/requirements/test.in index 45500971..85eae6cc 100644 --- a/requirements/test.in +++ b/requirements/test.in @@ -10,4 +10,6 @@ pytest-cov # pytest extension for code coverage statistics pytest-django # pytest extension for better Django support newrelic # Required for testing NewRelicBackend opentelemetry-api # Required for testing OpenTelemetryBackend +opentelemetry-instrumentation-celery # Required for testing OpenTelemetryBackend ddtrace # Required for testing DatadogBackend +celery # Required for testing celery monitoring for OpenTelemetry diff --git a/requirements/test.txt b/requirements/test.txt index 2a0a0338..22153187 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -4,6 +4,8 @@ # # make upgrade # +amqp==5.2.0 + # via kombu asgiref==3.8.1 # via # -r requirements/base.txt @@ -12,28 +14,45 @@ attrs==23.2.0 # via # cattrs # ddtrace -backports-zoneinfo==0.2.1 ; python_version < "3.9" +backports-zoneinfo[tzdata]==0.2.1 ; python_version < "3.9" # via # -c requirements/constraints.txt # -r requirements/base.txt + # celery # django + # kombu +billiard==4.2.0 + # via celery bytecode==0.15.1 # via ddtrace cattrs==23.2.3 # via ddtrace +celery==5.4.0 + # via -r requirements/test.in cffi==1.16.0 # via # -r requirements/base.txt # pynacl click==8.1.7 - # via -r requirements/base.txt -coverage[toml]==7.4.4 + # via + # -r requirements/base.txt + # celery + # click-didyoumean + # click-plugins + # click-repl +click-didyoumean==0.3.1 + # via celery +click-plugins==1.1.1 + # via celery +click-repl==0.3.0 + # via celery +coverage[toml]==7.5.0 # via pytest-cov -ddsketch==2.0.4 +ddsketch==3.0.1 # via ddtrace ddt==1.7.2 # via -r requirements/test.in -ddtrace==2.7.5 +ddtrace==2.8.3 # via -r requirements/test.in deprecated==1.2.14 # via opentelemetry-api @@ -48,13 +67,13 @@ django-waffle==4.1.0 # via -r requirements/base.txt envier==0.5.1 # via ddtrace -exceptiongroup==1.2.0 +exceptiongroup==1.2.1 # via # cattrs # pytest factory-boy==3.3.0 # via -r requirements/test.in -faker==24.4.0 +faker==25.0.0 # via factory-boy importlib-metadata==6.11.0 # via @@ -62,9 +81,11 @@ importlib-metadata==6.11.0 # opentelemetry-api iniconfig==2.0.0 # via pytest +kombu==5.3.7 + # via celery mock==5.1.0 # via -r requirements/test.in -newrelic==9.8.0 +newrelic==9.9.0 # via # -r requirements/base.txt # -r requirements/test.in @@ -72,27 +93,35 @@ opentelemetry-api==1.24.0 # via # -r requirements/test.in # ddtrace + # opentelemetry-instrumentation + # opentelemetry-instrumentation-celery +opentelemetry-instrumentation==0.45b0 + # via opentelemetry-instrumentation-celery +opentelemetry-instrumentation-celery==0.45b0 + # via -r requirements/test.in +opentelemetry-semantic-conventions==0.45b0 + # via opentelemetry-instrumentation-celery packaging==24.0 # via pytest pbr==6.0.0 # via # -r requirements/base.txt # stevedore -pluggy==1.4.0 +pluggy==1.5.0 # via pytest +prompt-toolkit==3.0.43 + # via click-repl protobuf==5.26.1 - # via - # ddsketch - # ddtrace + # via ddtrace psutil==5.9.8 # via -r requirements/base.txt -pycparser==2.21 +pycparser==2.22 # via # -r requirements/base.txt # cffi pynacl==1.5.0 # via -r requirements/base.txt -pytest==8.1.1 +pytest==8.2.0 # via # pytest-cov # pytest-django @@ -101,13 +130,15 @@ pytest-cov==5.0.0 pytest-django==4.8.0 # via -r requirements/test.in python-dateutil==2.9.0.post0 - # via faker + # via + # celery + # faker six==1.16.0 # via # ddsketch # ddtrace # python-dateutil -sqlparse==0.4.4 +sqlparse==0.5.0 # via # -r requirements/base.txt # ddtrace @@ -118,17 +149,33 @@ tomli==2.0.1 # via # coverage # pytest -typing-extensions==4.10.0 +typing-extensions==4.11.0 # via # -r requirements/base.txt # asgiref # bytecode # cattrs # ddtrace - # faker + # kombu +tzdata==2024.1 + # via + # backports-zoneinfo + # celery +vine==5.1.0 + # via + # amqp + # celery + # kombu +wcwidth==0.2.13 + # via prompt-toolkit wrapt==1.16.0 - # via deprecated + # via + # deprecated + # opentelemetry-instrumentation xmltodict==0.13.0 # via ddtrace zipp==3.18.1 # via importlib-metadata + +# The following packages are considered to be unsafe in a requirements file: +# setuptools