Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-osprofiler for openSUSE:Factory checked in at 2024-04-14 11:55:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-osprofiler (Old) and /work/SRC/openSUSE:Factory/.python-osprofiler.new.26366 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-osprofiler" Sun Apr 14 11:55:01 2024 rev:17 rq:1167538 version:4.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-osprofiler/python-osprofiler.changes 2022-06-09 14:11:58.628542865 +0200 +++ /work/SRC/openSUSE:Factory/.python-osprofiler.new.26366/python-osprofiler.changes 2024-04-14 12:24:48.797985051 +0200 @@ -1,0 +2,25 @@ +Mon Apr 1 17:37:16 UTC 2024 - Christian Boltz <suse-b...@cboltz.de> + +- %check: delete test_jaeger.py (already excluded via + --exclude-regex, but still causes import error) +- add missing BuildRequires: python3-opentelemetry-exporter-otlp + +------------------------------------------------------------------- +Thu Jan 4 09:08:04 UTC 2024 - cloud-de...@suse.de + +- added 0001-Add-default-port-to-Elasticsearch-connection-url.patch +- update to version 4.1.0 + - tox: Add functional-py38, functional-py39 envs + - add support of otlp exporter + - jaeger: introduce process tags' option for tracer + - Fix formattiing of release list + - [profiler] hmac_key should be secret + - setup.cfg: Replace dashes with underscores + - jaeger: introduce service name prefix + - remove unicode prefix from code + - jaeger: fix driver initialization for tests + - devstack: remove jaeger container on unstack + - profiler: add python requests profile + - Change StrictRedis usage to Redis + +------------------------------------------------------------------- Old: ---- osprofiler-3.4.3.tar.gz New: ---- 0001-Add-default-port-to-Elasticsearch-connection-url.patch osprofiler-4.1.0.tar.gz BETA DEBUG BEGIN: New: - added 0001-Add-default-port-to-Elasticsearch-connection-url.patch - update to version 4.1.0 BETA DEBUG END: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-osprofiler.spec ++++++ --- /var/tmp/diff_new_pack.OI4b62/_old 2024-04-14 12:24:49.474009669 +0200 +++ /var/tmp/diff_new_pack.OI4b62/_new 2024-04-14 12:24:49.474009669 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-osprofiler # -# Copyright (c) 2022 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,13 +17,15 @@ Name: python-osprofiler -Version: 3.4.3 +Version: 4.1.0 Release: 0 Summary: OpenStack Profiler Library License: Apache-2.0 Group: Development/Languages/Python URL: https://docs.openstack.org/osprofiler -Source0: https://files.pythonhosted.org/packages/source/o/osprofiler/osprofiler-3.4.3.tar.gz +Source0: https://files.pythonhosted.org/packages/source/o/osprofiler/osprofiler-4.1.0.tar.gz +# https://review.opendev.org/c/openstack/osprofiler/+/860412 +Patch0: 0001-Add-default-port-to-Elasticsearch-connection-url.patch BuildRequires: openstack-macros BuildRequires: python3-PrettyTable >= 0.7.2 BuildRequires: python3-WebOb >= 1.7.1 @@ -31,8 +33,9 @@ BuildRequires: python3-docutils BuildRequires: python3-elasticsearch BuildRequires: python3-importlib-metadata +BuildRequires: python3-opentelemetry-exporter-otlp BuildRequires: python3-oslo.concurrency >= 3.26.0 -BuildRequires: python3-oslo.config +BuildRequires: python3-oslo.config >= 5.2.0 BuildRequires: python3-oslo.log BuildRequires: python3-oslo.utils >= 3.33.0 BuildRequires: python3-pymongo @@ -56,7 +59,7 @@ Requires: python3-WebOb >= 1.7.1 Requires: python3-importlib-metadata Requires: python3-oslo.concurrency >= 3.26.0 -Requires: python3-oslo.config +Requires: python3-oslo.config >= 5.2.0 Requires: python3-oslo.log Requires: python3-oslo.utils >= 3.33.0 %if 0%{?suse_version} @@ -83,7 +86,7 @@ Documentation for OSProfiler. %prep -%autosetup -p1 -n osprofiler-3.4.3 +%autosetup -p1 -n osprofiler-4.1.0 %py_req_cleanup %build @@ -98,7 +101,8 @@ rm -rf doc/build/html/.{doctrees,buildinfo} %check -python3 -m stestr.cli run --black-regex '(^osprofiler.tests.unit.drivers.test_jaeger.JaegerTestCase.*$)' +rm osprofiler/tests/unit/drivers/test_jaeger.py # causes import error, --exclude-regex in the next line isn't enough +%{openstack_stestr_run} --exclude-regex '(^osprofiler.tests.unit.drivers.test_jaeger.JaegerTestCase.*$)' %files -n python3-osprofiler %license LICENSE ++++++ 0001-Add-default-port-to-Elasticsearch-connection-url.patch ++++++ >From 5833d9519a31665447250e9c734ca64c065dab64 Mon Sep 17 00:00:00 2001 From: Daniel Garcia Moreno <daniel.gar...@suse.com> Date: Wed, 5 Oct 2022 14:42:54 +0200 Subject: [PATCH] Add default port to Elasticsearch connection url This change makes it compatible with modern versions of elasticsearch. Change-Id: I10b8b57432894e28d5da87eb6d886a053be776f0 --- osprofiler/drivers/elasticsearch_driver.py | 2 +- test-requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/osprofiler/drivers/elasticsearch_driver.py b/osprofiler/drivers/elasticsearch_driver.py index da9be17..deb42a3 100644 --- a/osprofiler/drivers/elasticsearch_driver.py +++ b/osprofiler/drivers/elasticsearch_driver.py @@ -44,7 +44,7 @@ class ElasticsearchDriver(base.Driver): client_url = parser.urlunparse(parser.urlparse(self.connection_str) ._replace(scheme="http")) self.conf = conf - self.client = Elasticsearch(client_url) + self.client = Elasticsearch(client_url + ":9200") self.index_name = index_name self.index_name_error = "osprofiler-notifications-error" diff --git a/test-requirements.txt b/test-requirements.txt index 3e1bbd8..52c1446 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -13,7 +13,7 @@ bandit>=1.6.0,<1.7.0 # Apache-2.0 pymongo!=3.1,>=3.0.2 # Apache-2.0 # Elasticsearch python client -elasticsearch>=2.0.0,<3.0.0 # Apache-2.0 +elasticsearch>=2.0.0,<9.0.0 # Apache-2.0 # Redis python client redis>=2.10.0 # MIT -- 2.37.3 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.OI4b62/_old 2024-04-14 12:24:49.514011125 +0200 +++ /var/tmp/diff_new_pack.OI4b62/_new 2024-04-14 12:24:49.518011271 +0200 @@ -1,13 +1,13 @@ <services> - <service mode="disabled" name="renderspec"> + <service mode="manual" name="renderspec"> <param name="input-template">https://opendev.org/openstack/rpm-packaging/raw/master/openstack/osprofiler/osprofiler.spec.j2</param> <param name="output-name">python-osprofiler.spec</param> <param name="requirements">https://opendev.org/openstack/osprofiler/raw/master/requirements.txt</param> <param name="changelog-email">cloud-de...@suse.de</param> <param name="changelog-provider">gh,openstack,osprofiler</param> </service> - <service mode="disabled" name="download_files"> + <service mode="manual" name="download_files"> </service> - <service name="format_spec_file" mode="disabled"/> + <service name="format_spec_file" mode="manual"/> </services> ++++++ osprofiler-3.4.3.tar.gz -> osprofiler-4.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/.zuul.yaml new/osprofiler-4.1.0/.zuul.yaml --- old/osprofiler-3.4.3/.zuul.yaml 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/.zuul.yaml 2023-07-13 17:46:21.000000000 +0200 @@ -9,12 +9,12 @@ - release-notes-jobs-python3 check: jobs: - - openstack-tox-functional-py36 + - openstack-tox-functional-py38 - tempest-smoke-py3-osprofiler-redis - tempest-smoke-py3-osprofiler-sqlalchemy gate: jobs: - - openstack-tox-functional-py36 + - openstack-tox-functional-py38 - job: name: tempest-smoke-py3-osprofiler-redis diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/AUTHORS new/osprofiler-4.1.0/AUTHORS --- old/osprofiler-3.4.3/AUTHORS 2022-05-05 11:53:50.000000000 +0200 +++ new/osprofiler-4.1.0/AUTHORS 2023-07-13 17:46:48.000000000 +0200 @@ -47,14 +47,17 @@ OpenStack Release Bot <infra-r...@openstack.org> Radoslaw Smigielski <radoslaw.smigiel...@nokia.com> Roman Podoliaka <rpodoly...@mirantis.com> +Sahid Orentino Ferdjaoui <sahid.ferdja...@industrialdiscipline.com> Sean McGinnis <sean.mcgin...@gmail.com> Shoham Peller <shoh...@gmail.com> Simon Pasquier <spasqu...@mirantis.com> Slawek Kaplonski <skapl...@redhat.com> Stephen Finucane <stephen...@redhat.com> Stuart Grace <stuart.gr...@bbc.co.uk> +Takashi Kajinami <tkaji...@redhat.com> Thomas Bechtold <tbecht...@suse.com> Timur Sufiev <tsuf...@mirantis.com> +Tobias Urdin <tobias.ur...@binero.com> Tony Xu <hhkt...@gmail.com> Tovin Seven <vin...@vn.fujitsu.com> Victor Morales <victor.mora...@intel.com> @@ -63,6 +66,7 @@ Vu Cong Tuan <tua...@vn.fujitsu.com> Wander Way <wanderway...@gmail.com> XiaojueGuan <guanalbertj...@gmail.com> +YuehuiLei <leiyue...@inspur.com> Zhi Yan Liu <zhiy...@cn.ibm.com> caoyuan <cao.y...@99cloud.net> chenxu <424024...@qq.com> @@ -73,6 +77,7 @@ lipan <lipan7...@fiberhome.com> lvdongbing <dongbing...@kylin-cloud.com> melissaml <ma....@99cloud.net> +niuke <niuke19970...@163.com> qingszhao <zhao.daq...@99cloud.net> reedip <reedip.baner...@nectechnologies.in> ricolin <rico....@easystack.cn> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/ChangeLog new/osprofiler-4.1.0/ChangeLog --- old/osprofiler-3.4.3/ChangeLog 2022-05-05 11:53:50.000000000 +0200 +++ new/osprofiler-4.1.0/ChangeLog 2023-07-13 17:46:48.000000000 +0200 @@ -1,6 +1,26 @@ CHANGES ======= +4.1.0 +----- + +* profiler: add python requests profile + +4.0.0 +----- + +* add support of otlp exporter +* devstack: remove jaeger container on unstack +* [profiler] hmac\_key should be secret +* jaeger: introduce process tags' option for tracer +* jaeger: introduce service name prefix +* jaeger: fix driver initialization for tests +* setup.cfg: Replace dashes with underscores +* Change StrictRedis usage to Redis +* tox: Add functional-py38, functional-py39 envs +* remove unicode prefix from code +* Fix formattiing of release list + 3.4.3 ----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/PKG-INFO new/osprofiler-4.1.0/PKG-INFO --- old/osprofiler-3.4.3/PKG-INFO 2022-05-05 11:53:51.021370400 +0200 +++ new/osprofiler-4.1.0/PKG-INFO 2023-07-13 17:46:48.875940000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: osprofiler -Version: 3.4.3 +Version: 4.1.0 Summary: OpenStack Profiler Library Home-page: https://docs.openstack.org/osprofiler/latest/ Author: OpenStack @@ -45,11 +45,10 @@ Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: Implementation :: CPython -Requires-Python: >=3.6 +Requires-Python: >=3.8 Provides-Extra: oslo_config Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/devstack/lib/osprofiler new/osprofiler-4.1.0/devstack/lib/osprofiler --- old/osprofiler-3.4.3/devstack/lib/osprofiler 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/devstack/lib/osprofiler 2023-07-13 17:46:21.000000000 +0200 @@ -58,19 +58,33 @@ pip_install_gr redis } -function install_jaeger() { +function install_jaeger_backend() { if is_ubuntu; then install_package docker.io start_service docker add_user_to_group $STACK_USER docker - sg docker -c "docker run -d --name jaeger -p 6831:6831/udp -p 16686:16686 jaegertracing/all-in-one:1.7" + sg docker -c "docker run -d --name jaeger -e COLLECTOR_OTLP_ENABLED=true -p 6831:6831/udp -p 16686:16686 -p 4318:4318 jaegertracing/all-in-one:1.42" else exit_distro_not_supported "docker.io installation" fi +} +function install_jaeger() { + install_jaeger_backend pip_install jaeger-client } +function install_otlp() { + # For OTLP we use Jaeger backend but any OTLP compatible backend + # can be used. + install_jaeger_backend + pip_install opentelemetry-sdk opentelemetry-exporter-otlp +} + +function drop_jaeger() { + sg docker -c 'docker rm jaeger --force' +} + function install_elasticsearch() { if is_ubuntu; then install_package docker.io @@ -108,6 +122,9 @@ elif [ "$OSPROFILER_COLLECTOR" == "jaeger" ]; then install_jaeger OSPROFILER_CONNECTION_STRING=${OSPROFILER_CONNECTION_STRING:-"jaeger://localhost:6831"} + elif [ "$OSPROFILER_COLLECTOR" == "otlp" ]; then + install_otlp + OSPROFILER_CONNECTION_STRING=${OSPROFILER_CONNECTION_STRING:-"otlp://localhost:4318"} elif [ "$OSPROFILER_COLLECTOR" == "elasticsearch" ]; then install_elasticsearch OSPROFILER_CONNECTION_STRING=${OSPROFILER_CONNECTION_STRING:-"elasticsearch://elastic:changeme@localhost:9200"} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/devstack/plugin.sh new/osprofiler-4.1.0/devstack/plugin.sh --- old/osprofiler-3.4.3/devstack/plugin.sh 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/devstack/plugin.sh 2023-07-13 17:46:21.000000000 +0200 @@ -19,6 +19,12 @@ echo_summary "Configuring Tempest" configure_osprofiler_in_tempest +elif [[ "$1" == "unstack" ]]; then + if [[ "$OSPROFILER_COLLECTOR" == "jaeger" || \ + "$OSPROFILER_COLLECTOR" == "otlp" ]]; then + echo_summary "Deleting jaeger docker container" + drop_jaeger + fi fi # Restore xtrace diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/doc/source/conf.py new/osprofiler-4.1.0/doc/source/conf.py --- old/osprofiler-3.4.3/doc/source/conf.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/doc/source/conf.py 2023-07-13 17:46:21.000000000 +0200 @@ -70,8 +70,8 @@ master_doc = 'index' # General information about the project. -project = u'OSprofiler' -copyright = u'2016, OpenStack Foundation' +project = 'OSprofiler' +copyright = '2016, OpenStack Foundation' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -111,8 +111,8 @@ latex_documents = [ ('index', '%s.tex' % project, - u'%s Documentation' % project, - u'OpenStack Foundation', 'manual'), + '%s Documentation' % project, + 'OpenStack Foundation', 'manual'), ] # -- Options for Texinfo output ----------- @@ -124,8 +124,8 @@ ( 'index', 'OSprofiler', - u'OSprofiler Documentation', - u'OSprofiler Team', + 'OSprofiler Documentation', + 'OSprofiler Team', 'OSprofiler', 'One line description of project.', 'Miscellaneous' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/doc/source/user/collectors.rst new/osprofiler-4.1.0/doc/source/user/collectors.rst --- old/osprofiler-3.4.3/doc/source/user/collectors.rst 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/doc/source/user/collectors.rst 2023-07-13 17:46:21.000000000 +0200 @@ -71,3 +71,25 @@ - MySQL 5.7.8 .. _SQLAlchemy understands: https://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls + + +OTLP +---- + +Use OTLP exporter. Can be used with any comptable backend that support +OTLP. + +Usage +===== +To use the driver, the `connection_string` in the `[osprofiler]` config section +needs to be set:: + + [osprofiler] + connection_string = otlp://192.168.192.81:4318 + +Example: By default, jaeger is listening OTLP on 4318. + +.. note:: + + Curently the exporter is only supporting HTTP. In future some work + may happen to support gRPC. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/doc/source/user/history.rst new/osprofiler-4.1.0/doc/source/user/history.rst --- old/osprofiler-3.4.3/doc/source/user/history.rst 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/doc/source/user/history.rst 2023-07-13 17:46:21.000000000 +0200 @@ -1 +1,5 @@ +========= +ChangeLog +========= + .. include:: ../../../ChangeLog diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/doc/source/user/integration.rst new/osprofiler-4.1.0/doc/source/user/integration.rst --- old/osprofiler-3.4.3/doc/source/user/integration.rst 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/doc/source/user/integration.rst 2023-07-13 17:46:21.000000000 +0200 @@ -87,6 +87,10 @@ the list and rolling out that change and then removing the older key at some time in the future). + * Optionally you can enable client tracing using `requests`_, + Currently only supported by OTLP driver, this will add client call + tracing. see `profiler/trace_requests`'s option. + * RPC API RPC calls are used for interaction between services of one project. @@ -132,3 +136,4 @@ .. _Ceilometer: https://wiki.openstack.org/wiki/Ceilometer .. _oslo.messaging: https://pypi.org/project/oslo.messaging .. _OSprofiler WSGI middleware: https://github.com/openstack/osprofiler/blob/master/osprofiler/web.py +.. _requests: https://docs.python-requests.org/en/latest/index.html diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/lower-constraints.txt new/osprofiler-4.1.0/lower-constraints.txt --- old/osprofiler-3.4.3/lower-constraints.txt 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/lower-constraints.txt 2023-07-13 17:46:21.000000000 +0200 @@ -5,6 +5,8 @@ elasticsearch===2.0.0 importlib_metadata==1.7.0 jaeger-client==3.8.0 +opentelemetry-exporter-otlp==1.16.0 +opentelemetry-sdk==1.16.0 netaddr===0.7.18 openstackdocstheme==2.2.1 oslo.concurrency===3.26.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/_utils.py new/osprofiler-4.1.0/osprofiler/_utils.py --- old/osprofiler-3.4.3/osprofiler/_utils.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler/_utils.py 2023-07-13 17:46:21.000000000 +0200 @@ -161,3 +161,15 @@ # Return a new short id for this short_id = shorten_id(uuidutils.generate_uuid()) return short_id + + +def uuid_to_int128(span_uuid): + """Convert from uuid4 to 128 bit id for OpenTracing""" + if isinstance(span_uuid, int): + return span_uuid + try: + span_int = uuid.UUID(span_uuid).int + except ValueError: + # Return a new short id for this + span_int = uuid_to_int128(uuidutils.generate_uuid()) + return span_int diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/drivers/__init__.py new/osprofiler-4.1.0/osprofiler/drivers/__init__.py --- old/osprofiler-3.4.3/osprofiler/drivers/__init__.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler/drivers/__init__.py 2023-07-13 17:46:21.000000000 +0200 @@ -1,6 +1,7 @@ from osprofiler.drivers import base # noqa from osprofiler.drivers import elasticsearch_driver # noqa from osprofiler.drivers import jaeger # noqa +from osprofiler.drivers import otlp # noqa from osprofiler.drivers import loginsight # noqa from osprofiler.drivers import messaging # noqa from osprofiler.drivers import mongodb # noqa diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/drivers/jaeger.py new/osprofiler-4.1.0/osprofiler/drivers/jaeger.py --- old/osprofiler-3.4.3/osprofiler/drivers/jaeger.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler/drivers/jaeger.py 2023-07-13 17:46:21.000000000 +0200 @@ -49,16 +49,23 @@ "local_agent": { "reporting_host": parsed_url.hostname, "reporting_port": parsed_url.port, - } + }, + "tags": conf.profiler_jaeger.process_tags } # Initialize tracer for each profiler - service_name = "{}-{}".format(project, service) + service_name = self._get_service_name(conf, project, service) config = jaeger_client.Config(cfg, service_name=service_name) self.tracer = config.initialize_tracer() self.spans = collections.deque() + def _get_service_name(self, conf, project, service): + prefix = conf.profiler_jaeger.service_name_prefix + if prefix: + return "{}-{}-{}".format(prefix, project, service) + return "{}-{}".format(project, service) + @classmethod def get_name(cls): return "jaeger" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/drivers/otlp.py new/osprofiler-4.1.0/osprofiler/drivers/otlp.py --- old/osprofiler-3.4.3/osprofiler/drivers/otlp.py 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/osprofiler/drivers/otlp.py 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,194 @@ +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import collections +from urllib import parse as parser + +from oslo_config import cfg +from oslo_serialization import jsonutils + +from osprofiler import _utils as utils +from osprofiler.drivers import base +from osprofiler import exc + + +class OTLP(base.Driver): + def __init__(self, connection_str, project=None, service=None, host=None, + conf=cfg.CONF, **kwargs): + """OTLP driver using OTLP exporters.""" + + super(OTLP, self).__init__(connection_str, project=project, + service=service, host=host, + conf=conf, **kwargs) + try: + from opentelemetry import trace as trace_api + + from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter # noqa + from opentelemetry.sdk.resources import Resource + from opentelemetry.sdk.trace.export import BatchSpanProcessor + from opentelemetry.sdk.trace import TracerProvider + + self.trace_api = trace_api + except ImportError: + raise exc.CommandError( + "To use OSProfiler with OTLP exporters, " + "please install `opentelemetry-sdk` and " + "opentelemetry-exporter-otlp libraries. " + "To install with pip:\n `pip install opentelemetry-sdk " + "opentelemetry-exporter-otlp`.") + + service_name = self._get_service_name(conf, project, service) + resource = Resource(attributes={ + "service.name": service_name + }) + + parsed_url = parser.urlparse(connection_str) + # TODO("sahid"): We also want to handle https scheme? + parsed_url = parsed_url._replace(scheme="http") + + self.trace_api.set_tracer_provider( + TracerProvider(resource=resource)) + self.tracer = self.trace_api.get_tracer(__name__) + + exporter = OTLPSpanExporter("{}/v1/traces".format( + parsed_url.geturl())) + self.trace_api.get_tracer_provider().add_span_processor( + BatchSpanProcessor(exporter)) + + self.spans = collections.deque() + + def _get_service_name(self, conf, project, service): + prefix = conf.profiler_otlp.service_name_prefix + if prefix: + return "{}-{}-{}".format(prefix, project, service) + return "{}-{}".format(project, service) + + @classmethod + def get_name(cls): + return "otlp" + + def _kind(self, name): + if "wsgi" in name: + return self.trace_api.SpanKind.SERVER + elif ("db" in name or "http" in name or "api" in name): + return self.trace_api.SpanKind.CLIENT + return self.trace_api.SpanKind.INTERNAL + + def _name(self, payload): + info = payload["info"] + if info.get("request"): + return "WSGI_{}_{}".format( + info["request"]["method"], info["request"]["path"]) + elif info.get("db"): + return "SQL_{}".format( + info["db"]["statement"].split(' ', 1)[0].upper()) + elif info.get("requests"): + return "REQUESTS_{}_{}".format( + info["requests"]["method"], info["requests"]["hostname"]) + return payload["name"].rstrip("-start") + + def notify(self, payload): + if payload["name"].endswith("start"): + parent = self.trace_api.SpanContext( + trace_id=utils.uuid_to_int128(payload["base_id"]), + span_id=utils.shorten_id(payload["parent_id"]), + is_remote=False, + trace_flags=self.trace_api.TraceFlags( + self.trace_api.TraceFlags.SAMPLED)) + + ctx = self.trace_api.set_span_in_context( + self.trace_api.NonRecordingSpan(parent)) + + # OTLP Tracing span + span = self.tracer.start_span( + name=self._name(payload), + kind=self._kind(payload['name']), + attributes=self.create_span_tags(payload), + context=ctx) + + span._context = self.trace_api.SpanContext( + trace_id=span.context.trace_id, + span_id=utils.shorten_id(payload["trace_id"]), + is_remote=span.context.is_remote, + trace_flags=span.context.trace_flags, + trace_state=span.context.trace_state) + + self.spans.append(span) + else: + span = self.spans.pop() + + # Store result of db call and function call + for call in ("db", "function"): + if payload.get("info", {}).get(call): + span.set_attribute( + "result", payload["info"][call]["result"]) + # Store result of requests + if payload.get("info", {}).get("requests"): + span.set_attribute( + "status_code", payload["info"]["requests"]["status_code"]) + # Span error tag and log + if payload["info"].get("etype"): + span.set_attribute("error", True) + span.add_event("log", { + "error.kind": payload["info"]["etype"], + "message": payload["info"]["message"]}) + span.end() + + def get_report(self, base_id): + return self._parse_results() + + def list_traces(self, fields=None): + return [] + + def list_error_traces(self): + return [] + + def create_span_tags(self, payload): + """Create tags an OpenTracing compatible span. + + :param info: Information from OSProfiler trace. + :returns tags: A dictionary contains standard tags + from OpenTracing sematic conventions, + and some other custom tags related to http, db calls. + """ + tags = {} + info = payload["info"] + + if info.get("db"): + # DB calls + tags["db.statement"] = info["db"]["statement"] + tags["db.params"] = jsonutils.dumps(info["db"]["params"]) + elif info.get("request"): + # WSGI call + tags["http.path"] = info["request"]["path"] + tags["http.query"] = info["request"]["query"] + tags["http.method"] = info["request"]["method"] + tags["http.scheme"] = info["request"]["scheme"] + elif info.get("requests"): + # requests call + tags["http.path"] = info["requests"]["path"] + tags["http.query"] = info["requests"]["query"] + tags["http.method"] = info["requests"]["method"] + tags["http.scheme"] = info["requests"]["scheme"] + tags["http.hostname"] = info["requests"]["hostname"] + tags["http.port"] = info["requests"]["port"] + elif info.get("function"): + # RPC, function calls + if "args" in info["function"]: + tags["args"] = info["function"]["args"] + if "kwargs" in info["function"]: + tags["kwargs"] = info["function"]["kwargs"] + tags["name"] = info["function"]["name"] + + return tags diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/drivers/redis_driver.py new/osprofiler-4.1.0/osprofiler/drivers/redis_driver.py --- old/osprofiler-3.4.3/osprofiler/drivers/redis_driver.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler/drivers/redis_driver.py 2023-07-13 17:46:21.000000000 +0200 @@ -37,7 +37,7 @@ service=service, host=host, conf=conf, **kwargs) try: - from redis import StrictRedis + from redis import Redis as _Redis except ImportError: raise exc.CommandError( "To use OSProfiler with Redis driver, " @@ -46,7 +46,7 @@ # only connection over network is supported with schema # redis://[:password]@host[:port][/db] - self.db = StrictRedis.from_url(self.connection_str) + self.db = _Redis.from_url(self.connection_str) self.namespace_opt = "osprofiler_opt:" self.namespace = "osprofiler:" # legacy self.namespace_error = "osprofiler_error:" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/initializer.py new/osprofiler-4.1.0/osprofiler/initializer.py --- old/osprofiler-3.4.3/osprofiler/initializer.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler/initializer.py 2023-07-13 17:46:21.000000000 +0200 @@ -14,6 +14,7 @@ # under the License. from osprofiler import notifier +from osprofiler import requests from osprofiler import web @@ -39,3 +40,5 @@ **kwargs) notifier.set(_notifier) web.enable(conf.profiler.hmac_keys) + if conf.profiler.trace_requests: + requests.enable() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/opts.py new/osprofiler-4.1.0/osprofiler/opts.py --- old/osprofiler-3.4.3/osprofiler/opts.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler/opts.py 2023-07-13 17:46:21.000000000 +0200 @@ -64,9 +64,26 @@ higher level of operations. Single SQL queries cannot be analyzed this way. """) +_trace_requests_opt = cfg.BoolOpt( + "trace_requests", + default=False, + help=""" +Enable python requests package profiling. + +Supported drivers: jaeger+otlp + +Default value is False. + +Possible values: + +* True: Enables requests profiling. +* False: Disables requests profiling. +""") + _hmac_keys_opt = cfg.StrOpt( "hmac_keys", default="SECRET_KEY", + secret=True, help=""" Secret key(s) to use for encrypting context data for performance profiling. @@ -158,6 +175,7 @@ _PROFILER_OPTS = [ _enabled_opt, _trace_sqlalchemy_opt, + _trace_requests_opt, _hmac_keys_opt, _connection_string_opt, _es_doc_type_opt, @@ -170,6 +188,46 @@ cfg.CONF.register_opts(_PROFILER_OPTS, group=_profiler_opt_group) +_jaegerprofiler_opt_group = cfg.OptGroup( + "profiler_jaeger", + title="Jaeger's profiler driver related options") + +_service_name_prefix = cfg.StrOpt( + "service_name_prefix", + help=""" +Set service name prefix to Jaeger service name. +""") + +_process_tags = cfg.DictOpt( + "process_tags", + default={}, + help=""" +Set process tracer tags. +""") + +_JAEGER_OPTS = [ + _service_name_prefix, + _process_tags +] + +cfg.CONF.register_opts(_JAEGER_OPTS, group=_jaegerprofiler_opt_group) + +_otlp_profiler_opt_group = cfg.OptGroup( + "profiler_otlp", + title="OTLP's profiler driver related options") + +_otlp_service_name_prefix = cfg.StrOpt( + "service_name_prefix", + help=""" +Set service name prefix to OTLP exporters. +""") + +_OTLP_OPTS = [ + _otlp_service_name_prefix, +] + +cfg.CONF.register_opts(_OTLP_OPTS, group=_otlp_profiler_opt_group) + def set_defaults(conf, enabled=None, trace_sqlalchemy=None, hmac_keys=None, connection_string=None, es_doc_type=None, @@ -239,4 +297,6 @@ def list_opts(): - return [(_profiler_opt_group.name, _PROFILER_OPTS)] + return [(_profiler_opt_group.name, _PROFILER_OPTS), + (_jaegerprofiler_opt_group, _JAEGER_OPTS), + (_otlp_profiler_opt_group, _OTLP_OPTS)] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/requests.py new/osprofiler-4.1.0/osprofiler/requests.py --- old/osprofiler-3.4.3/osprofiler/requests.py 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/osprofiler/requests.py 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,73 @@ +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import logging as log +from urllib import parse as parser + +from osprofiler import profiler +from osprofiler import web + + +# Register an OSProfiler HTTP Adapter that will profile any call made with +# requests. + +LOG = log.getLogger(__name__) + +_FUNC = None + +try: + from requests.adapters import HTTPAdapter +except ImportError: + pass +else: + def send(self, request, *args, **kwargs): + parsed_url = parser.urlparse(request.url) + + # Best effort guessing port if needed + port = parsed_url.port or "" + if not port and parsed_url.scheme == "http": + port = 80 + elif not port and parsed_url.scheme == "https": + port = 443 + + profiler.start(parsed_url.scheme, info={"requests": { + "method": request.method, + "query": parsed_url.query, + "path": parsed_url.path, + "hostname": parsed_url.hostname, + "port": port, + "scheme": parsed_url.scheme}}) + + # Profiling headers are overrident to take in account this new + # context/span. + request.headers.update( + web.get_trace_id_headers()) + + response = _FUNC(self, request, *args, **kwargs) + + profiler.stop(info={"requests": { + "status_code": response.status_code}}) + + return response + + _FUNC = HTTPAdapter.send + + +def enable(): + if _FUNC: + HTTPAdapter.send = send + LOG.debug("profiling requests enabled") + else: + LOG.warning("unable to activate profiling for requests, " + "please ensure that python requests is installed.") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/tests/unit/drivers/test_jaeger.py new/osprofiler-4.1.0/osprofiler/tests/unit/drivers/test_jaeger.py --- old/osprofiler-3.4.3/osprofiler/tests/unit/drivers/test_jaeger.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler/tests/unit/drivers/test_jaeger.py 2023-07-13 17:46:21.000000000 +0200 @@ -15,14 +15,24 @@ from unittest import mock +from oslo_config import cfg + from osprofiler.drivers import jaeger +from osprofiler import opts from osprofiler.tests import test +from jaeger_client import Config + class JaegerTestCase(test.TestCase): def setUp(self): super(JaegerTestCase, self).setUp() + + opts.set_defaults(cfg.CONF) + cfg.CONF.set_default( + "process_tags", "k1:v1,k2:v2", "profiler_jaeger") + self.payload_start = { "name": "api-start", "base_id": "4e3e0ec6-2938-40b1-8504-09eb1d4b0dee", @@ -48,8 +58,12 @@ } } + # Force to False as if already initialized, tracer will be None. + # see: jaeger_client/config.py#L374 + Config._initialized = False self.driver = jaeger.Jaeger("jaeger://127.0.0.1:6831", - project="nova", service="api") + project="nova", service="api", + conf=cfg.CONF) @mock.patch("osprofiler._utils.shorten_id") def test_notify_start(self, mock_shorten_id): @@ -76,3 +90,21 @@ mock_time.reset_mock() span.finish.assert_called_once_with(finish_time=fake_time) + + def test_service_name_default(self): + self.assertEqual("pr1-svc1", self.driver._get_service_name( + cfg.CONF, "pr1", "svc1")) + + def test_service_name_prefix(self): + cfg.CONF.set_default( + "service_name_prefix", "prx1", "profiler_jaeger") + self.assertEqual("prx1-pr1-svc1", self.driver._get_service_name( + cfg.CONF, "pr1", "svc1")) + + def test_process_tags(self): + tags = self.driver.tracer.tags + # Let's remove variable tags generated by Jaeger client + del tags['hostname'] + del tags['jaeger.version'] + del tags['ip'] + self.assertEqual({'k1': 'v1', 'k2': 'v2'}, tags) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler/tests/unit/drivers/test_otlp.py new/osprofiler-4.1.0/osprofiler/tests/unit/drivers/test_otlp.py --- old/osprofiler-3.4.3/osprofiler/tests/unit/drivers/test_otlp.py 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/osprofiler/tests/unit/drivers/test_otlp.py 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,84 @@ +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from unittest import mock + +from oslo_config import cfg + +from osprofiler.drivers import otlp +from osprofiler import opts +from osprofiler.tests import test + + +class OTLPTestCase(test.TestCase): + + def setUp(self): + super(OTLPTestCase, self).setUp() + + opts.set_defaults(cfg.CONF) + + self.payload_start = { + "name": "api-start", + "base_id": "4e3e0ec6-2938-40b1-8504-09eb1d4b0dee", + "trace_id": "1c089ea8-28fe-4f3d-8c00-f6daa2bc32f1", + "parent_id": "e2715537-3d1c-4f0c-b3af-87355dc5fc5b", + "timestamp": "2018-05-03T04:31:51.781381", + "info": { + "host": "test" + } + } + + self.payload_stop = { + "name": "api-stop", + "base_id": "4e3e0ec6-2938-40b1-8504-09eb1d4b0dee", + "trace_id": "1c089ea8-28fe-4f3d-8c00-f6daa2bc32f1", + "parent_id": "e2715537-3d1c-4f0c-b3af-87355dc5fc5b", + "timestamp": "2018-05-03T04:31:51.781381", + "info": { + "host": "test", + "function": { + "result": 1 + } + } + } + + self.driver = otlp.OTLP( + "otlp://127.0.0.1:6831", + project="nova", service="api", + conf=cfg.CONF) + + def test_notify_start(self): + self.driver.notify(self.payload_start) + self.assertEqual(1, len(self.driver.spans)) + + def test_notify_stop(self): + mock_end = mock.MagicMock() + self.driver.notify(self.payload_start) + self.driver.spans[0].end = mock_end + self.driver.notify(self.payload_stop) + mock_end.assert_called_once() + + def test_service_name_default(self): + self.assertEqual("pr1-svc1", self.driver._get_service_name( + cfg.CONF, "pr1", "svc1")) + + def test_service_name_prefix(self): + cfg.CONF.set_default( + "service_name_prefix", "prx1", "profiler_otlp") + self.assertEqual("prx1-pr1-svc1", self.driver._get_service_name( + cfg.CONF, "pr1", "svc1")) + + def test_process_tags(self): + # Need to be implemented. + pass diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler.egg-info/PKG-INFO new/osprofiler-4.1.0/osprofiler.egg-info/PKG-INFO --- old/osprofiler-3.4.3/osprofiler.egg-info/PKG-INFO 2022-05-05 11:53:50.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler.egg-info/PKG-INFO 2023-07-13 17:46:48.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: osprofiler -Version: 3.4.3 +Version: 4.1.0 Summary: OpenStack Profiler Library Home-page: https://docs.openstack.org/osprofiler/latest/ Author: OpenStack @@ -45,11 +45,10 @@ Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.6 -Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3 :: Only Classifier: Programming Language :: Python :: Implementation :: CPython -Requires-Python: >=3.6 +Requires-Python: >=3.8 Provides-Extra: oslo_config Provides-Extra: test diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler.egg-info/SOURCES.txt new/osprofiler-4.1.0/osprofiler.egg-info/SOURCES.txt --- old/osprofiler-3.4.3/osprofiler.egg-info/SOURCES.txt 2022-05-05 11:53:50.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler.egg-info/SOURCES.txt 2023-07-13 17:46:48.000000000 +0200 @@ -43,6 +43,7 @@ osprofiler/notifier.py osprofiler/opts.py osprofiler/profiler.py +osprofiler/requests.py osprofiler/sqlalchemy.py osprofiler/web.py osprofiler.egg-info/PKG-INFO @@ -65,6 +66,7 @@ osprofiler/drivers/loginsight.py osprofiler/drivers/messaging.py osprofiler/drivers/mongodb.py +osprofiler/drivers/otlp.py osprofiler/drivers/redis_driver.py osprofiler/drivers/sqlalchemy_driver.py osprofiler/hacking/__init__.py @@ -93,11 +95,18 @@ osprofiler/tests/unit/drivers/test_loginsight.py osprofiler/tests/unit/drivers/test_messaging.py osprofiler/tests/unit/drivers/test_mongodb.py +osprofiler/tests/unit/drivers/test_otlp.py osprofiler/tests/unit/drivers/test_redis_driver.py playbooks/osprofiler-post.yaml releasenotes/notes/add-reno-996dd44974d53238.yaml +releasenotes/notes/add-requests-profiling-761e09f243d36966.yaml +releasenotes/notes/drop-jaeger-container-when-unstacking-e8fcdc036f80158a.yaml releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml +releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml +releasenotes/notes/otlp-driver-cb932038ad580ac2.yaml releasenotes/notes/redis-improvement-d4c91683fc89f570.yaml +releasenotes/notes/remove-strict-redis-9eb43d30c9c1fc43.yaml releasenotes/source/conf.py releasenotes/source/index.rst releasenotes/source/ocata.rst diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler.egg-info/pbr.json new/osprofiler-4.1.0/osprofiler.egg-info/pbr.json --- old/osprofiler-3.4.3/osprofiler.egg-info/pbr.json 2022-05-05 11:53:50.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler.egg-info/pbr.json 2023-07-13 17:46:48.000000000 +0200 @@ -1 +1 @@ -{"git_version": "3286301", "is_release": true} \ No newline at end of file +{"git_version": "3c5fead", "is_release": true} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/osprofiler.egg-info/requires.txt new/osprofiler-4.1.0/osprofiler.egg-info/requires.txt --- old/osprofiler-3.4.3/osprofiler.egg-info/requires.txt 2022-05-05 11:53:50.000000000 +0200 +++ new/osprofiler-4.1.0/osprofiler.egg-info/requires.txt 2023-07-13 17:46:48.000000000 +0200 @@ -21,6 +21,8 @@ flake8-import-order==0.18.1 hacking<3.2.0,>=3.1.0 jaeger-client>=3.8.0 +opentelemetry-exporter-otlp>=1.16.0 +opentelemetry-sdk>=1.16.0 pre-commit>=2.6.0 pymongo!=3.1,>=3.0.2 redis>=2.10.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/notes/add-requests-profiling-761e09f243d36966.yaml new/osprofiler-4.1.0/releasenotes/notes/add-requests-profiling-761e09f243d36966.yaml --- old/osprofiler-3.4.3/releasenotes/notes/add-requests-profiling-761e09f243d36966.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/releasenotes/notes/add-requests-profiling-761e09f243d36966.yaml 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,5 @@ +--- +features: + - | + New profiler for python requests. Currently only OTLP driver is + supporting it, see `profiler/trace_requests`'s option. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/notes/drop-jaeger-container-when-unstacking-e8fcdc036f80158a.yaml new/osprofiler-4.1.0/releasenotes/notes/drop-jaeger-container-when-unstacking-e8fcdc036f80158a.yaml --- old/osprofiler-3.4.3/releasenotes/notes/drop-jaeger-container-when-unstacking-e8fcdc036f80158a.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/releasenotes/notes/drop-jaeger-container-when-unstacking-e8fcdc036f80158a.yaml 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,7 @@ +--- +issues: + - | + Using devstack, when unstacking, the docker container running + Jaeger tracing will be deleted that to correctly clean processes + started by devstack.. This also avoid `./stack.sh` to fail when + recreating the environnement. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml new/osprofiler-4.1.0/releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml --- old/osprofiler-3.4.3/releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/releasenotes/notes/jaeger-add-process-tags-79d5f5d7a0b049ef.yaml 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,5 @@ +--- +features: + - | + Add ability to set tracer process tags to Jaeger via a + configuration option introduced, `profiler_jaeger/process_tags`. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml new/osprofiler-4.1.0/releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml --- old/osprofiler-3.4.3/releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/releasenotes/notes/jaeger-service-name-prefix-72878a930f700878.yaml 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,5 @@ +--- +features: + - | + Introduces service name prefix for Jaeger driver. Please consider + using option `profiler_jaeger/service_name_prefix` to set it. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/notes/otlp-driver-cb932038ad580ac2.yaml new/osprofiler-4.1.0/releasenotes/notes/otlp-driver-cb932038ad580ac2.yaml --- old/osprofiler-3.4.3/releasenotes/notes/otlp-driver-cb932038ad580ac2.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/releasenotes/notes/otlp-driver-cb932038ad580ac2.yaml 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,8 @@ +--- +features: + - | + An OTLP (OpenTelemetry) exporter is now supported. The current + support is experimental but the aim is to deprecate and remove + legacy Jaeger driver which is using the already deprecated python + library jaeger client. Operators who want to use it should enable + `otlp`. OTLP is comptatible with Jaeger backend. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/notes/remove-strict-redis-9eb43d30c9c1fc43.yaml new/osprofiler-4.1.0/releasenotes/notes/remove-strict-redis-9eb43d30c9c1fc43.yaml --- old/osprofiler-3.4.3/releasenotes/notes/remove-strict-redis-9eb43d30c9c1fc43.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/osprofiler-4.1.0/releasenotes/notes/remove-strict-redis-9eb43d30c9c1fc43.yaml 2023-07-13 17:46:21.000000000 +0200 @@ -0,0 +1,4 @@ +--- +upgrade: + - | + The minimum redis-py version required is now >= 3.0.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/source/conf.py new/osprofiler-4.1.0/releasenotes/source/conf.py --- old/osprofiler-3.4.3/releasenotes/source/conf.py 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/releasenotes/source/conf.py 2023-07-13 17:46:21.000000000 +0200 @@ -58,8 +58,8 @@ master_doc = 'index' # General information about the project. -project = u'osprofiler Release Notes' -copyright = u'2016, osprofiler Developers' +project = 'osprofiler Release Notes' +copyright = '2016, osprofiler Developers' # Release notes do not need a version in the title, they span # multiple versions. @@ -209,8 +209,8 @@ # author, documentclass [howto, manual, or own class]). latex_documents = [ ('index', 'osprofilerReleaseNotes.tex', - u'osprofiler Release Notes Documentation', - u'osprofiler Developers', 'manual'), + 'osprofiler Release Notes Documentation', + 'osprofiler Developers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -240,8 +240,8 @@ # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'osprofilerReleaseNotes', - u'osprofiler Release Notes Documentation', - [u'osprofiler Developers'], 1) + 'osprofiler Release Notes Documentation', + ['osprofiler Developers'], 1) ] # If true, show URL addresses after external links. @@ -255,8 +255,8 @@ # dir menu entry, description, category) texinfo_documents = [ ('index', 'osprofilerReleaseNotes', - u'osprofiler Release Notes Documentation', - u'osprofiler Developers', 'osprofilerReleaseNotes', + 'osprofiler Release Notes Documentation', + 'osprofiler Developers', 'osprofilerReleaseNotes', 'One line description of project.', 'Miscellaneous'), ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/releasenotes/source/index.rst new/osprofiler-4.1.0/releasenotes/source/index.rst --- old/osprofiler-3.4.3/releasenotes/source/index.rst 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/releasenotes/source/index.rst 2023-07-13 17:46:21.000000000 +0200 @@ -2,15 +2,15 @@ osprofiler Release Notes ========================== - .. toctree:: - :maxdepth: 1 +.. toctree:: + :maxdepth: 1 - unreleased - victoria - ussuri - train - stein - rocky - queens - pike - ocata + unreleased + victoria + ussuri + train + stein + rocky + queens + pike + ocata diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/setup.cfg new/osprofiler-4.1.0/setup.cfg --- old/osprofiler-3.4.3/setup.cfg 2022-05-05 11:53:51.025370600 +0200 +++ new/osprofiler-4.1.0/setup.cfg 2023-07-13 17:46:48.875940000 +0200 @@ -1,12 +1,12 @@ [metadata] name = osprofiler summary = OpenStack Profiler Library -description-file = +description_file = README.rst author = OpenStack -author-email = openstack-disc...@lists.openstack.org -home-page = https://docs.openstack.org/osprofiler/latest/ -python-requires = >=3.6 +author_email = openstack-disc...@lists.openstack.org +home_page = https://docs.openstack.org/osprofiler/latest/ +python_requires = >=3.8 classifier = Environment :: OpenStack Intended Audience :: Developers @@ -15,9 +15,8 @@ Operating System :: POSIX :: Linux Programming Language :: Python Programming Language :: Python :: 3 - Programming Language :: Python :: 3.6 - Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 Programming Language :: Python :: 3 :: Only Programming Language :: Python :: Implementation :: CPython diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/test-requirements.txt new/osprofiler-4.1.0/test-requirements.txt --- old/osprofiler-3.4.3/test-requirements.txt 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/test-requirements.txt 2023-07-13 17:46:21.000000000 +0200 @@ -20,5 +20,7 @@ # For Jaeger Tracing jaeger-client>=3.8.0 # Apache-2.0 +opentelemetry-exporter-otlp>=1.16.0 +opentelemetry-sdk>=1.16.0 pre-commit>=2.6.0 # MIT diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/osprofiler-3.4.3/tox.ini new/osprofiler-4.1.0/tox.ini --- old/osprofiler-3.4.3/tox.ini 2022-05-05 11:53:10.000000000 +0200 +++ new/osprofiler-4.1.0/tox.ini 2023-07-13 17:46:21.000000000 +0200 @@ -1,16 +1,14 @@ [tox] minversion = 3.18.0 -# Needed to create ChangeLog for docs building -skipsdist = False envlist = py3,pep8 -ignore_basepython_conflict = True +ignore_basepython_conflict = true [testenv] basepython = python3 -setenv = VIRTUAL_ENV={envdir} - LANG=en_US.UTF-8 - LANGUAGE=en_US:en - LC_ALL=C +setenv = + LANG=en_US.UTF-8 + LANGUAGE=en_US:en + LC_ALL=C deps = -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} -r{toxinidir}/requirements.txt @@ -19,19 +17,14 @@ commands = stestr run --slowest {posargs} distribute = false -[testenv:functional] -setenv = {[testenv]setenv} - OS_TEST_PATH=./osprofiler/tests/functional +[testenv:functional{,-py38,-py39}] +setenv = + {[testenv]setenv} + OS_TEST_PATH=./osprofiler/tests/functional deps = {[testenv]deps} oslo.messaging -[testenv:functional-py36] -basepython = python3.6 -setenv = {[testenv:functional]setenv} -deps = - {[testenv:functional]deps} - [testenv:pep8] commands = pre-commit run -a @@ -44,22 +37,23 @@ [testenv:cover] setenv = - PYTHON=coverage run --source osprofiler --parallel-mode + PYTHON=coverage run --source osprofiler --parallel-mode commands = - stestr run {posargs} - coverage combine - coverage html -d cover - coverage xml -o cover/coverage.xml + stestr run {posargs} + coverage combine + coverage html -d cover + coverage xml -o cover/coverage.xml [testenv:docs] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} - -r{toxinidir}/requirements.txt - -r{toxinidir}/doc/requirements.txt + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/requirements.txt + -r{toxinidir}/doc/requirements.txt allowlist_externals = rm commands = rm -rf doc/build api-guide/build api-ref/build doc/source/contributor/modules sphinx-build -W --keep-going -b html -d doc/build/doctrees doc/source doc/build/html +usedevelop = false [testenv:bandit] commands = bandit -r osprofiler -n5 @@ -76,22 +70,22 @@ [flake8:local-plugins] extension = - N301 = checks:check_assert_methods_from_mock - N320 = checks:assert_true_instance - N321 = checks:assert_equal_type - N322 = checks:assert_equal_none - N323 = checks:assert_true_or_false_with_in - N324 = checks:assert_equal_in - N351 = checks:check_no_constructor_data_struct - N352 = checks:check_dict_formatting_in_string - N353 = checks:check_using_unicode - N354 = checks:check_raises + N301 = checks:check_assert_methods_from_mock + N320 = checks:assert_true_instance + N321 = checks:assert_equal_type + N322 = checks:assert_equal_none + N323 = checks:assert_true_or_false_with_in + N324 = checks:assert_equal_in + N351 = checks:check_no_constructor_data_struct + N352 = checks:check_dict_formatting_in_string + N353 = checks:check_using_unicode + N354 = checks:check_raises paths = ./osprofiler/hacking [testenv:releasenotes] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} - -r{toxinidir}/doc/requirements.txt + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/doc/requirements.txt allowlist_externals = rm commands = rm -rf releasenotes/build