-
Notifications
You must be signed in to change notification settings - Fork 621
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature/add pika instrumentation (#680)
* Added initial code * Add all needed spans, and add support of instrumentation and uninstrumentation * Added tests. Ready for PR * Rename RequestsInstrumentation to RequestsInstrumentor to follow conventions * Add suppress_instrumentation functionality * Fix suppress_instrumentation functionality * Fix CR comments and lint test failures * Add usage of wrapt according to CR comments * Fix according to CR Comments * Move the tracer to be an attribute of the instrumentor instead of the channel * Fix Tests * Update Changelog and fix failing test * update code using tox -e generate * Update the name of the variable to store the tracer provider. * Update the core repo hash in the workflow * Update the core repo hash in the workflow Co-authored-by: Leighton Chen <[email protected]> Co-authored-by: Diego Hurtado <[email protected]> Co-authored-by: Owais Lone <[email protected]>
- Loading branch information
1 parent
1960371
commit fb24599
Showing
16 changed files
with
930 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
70 changes: 70 additions & 0 deletions
70
instrumentation/opentelemetry-instrumentation-pika/README.rst
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
OpenTelemetry pika Instrumentation | ||
================================== | ||
|
||
|pypi| | ||
|
||
.. |pypi| image:: https://badge.fury.io/py/opentelemetry-instrumentation-pika.svg | ||
:target: https://pypi.org/project/opentelemetry-instrumentation-pika/ | ||
|
||
This library allows tracing requests made by the pika library. | ||
|
||
Installation | ||
------------ | ||
|
||
:: | ||
|
||
pip install opentelemetry-instrumentation-pika | ||
|
||
Usage | ||
----- | ||
|
||
* Start broker backend | ||
|
||
.. code-block:: python | ||
docker run -p 5672:5672 rabbitmq | ||
* Run instrumented task | ||
|
||
.. code-block:: python | ||
import pika | ||
from opentelemetry.instrumentation.pika import PikaInstrumentor | ||
PikaInstrumentor().instrument() | ||
connection = pika.BlockingConnection(pika.URLParameters('amqp://localhost')) | ||
channel = connection.channel() | ||
channel.queue_declare(queue='hello') | ||
channel.basic_publish(exchange='', routing_key='hello', body=b'Hello World!') | ||
* PikaInstrumentor also supports instrumentation of a single channel | ||
|
||
.. code-block:: python | ||
import pika | ||
from opentelemetry.instrumentation.pika import PikaInstrumentor | ||
connection = pika.BlockingConnection(pika.URLParameters('amqp://localhost')) | ||
channel = connection.channel() | ||
channel.queue_declare(queue='hello') | ||
pika_instrumentation = PikaInstrumentor() | ||
pika_instrumentation.instrument_channel(channel=channel) | ||
channel.basic_publish(exchange='', routing_key='hello', body=b'Hello World!') | ||
pika_instrumentation.uninstrument_channel(channel=channel) | ||
* PikaInstrumentor also supports instrumentation without creating an object, and receiving a tracer_provider | ||
|
||
.. code-block:: python | ||
PikaInstrumentor.instrument_channel(channel, tracer_provider=tracer_provider) | ||
References | ||
---------- | ||
|
||
* `OpenTelemetry pika/ Tracing <https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/pika/pika.html>`_ | ||
* `OpenTelemetry Project <https://opentelemetry.io/>`_ |
56 changes: 56 additions & 0 deletions
56
instrumentation/opentelemetry-instrumentation-pika/setup.cfg
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
# Copyright The OpenTelemetry Authors | ||
# | ||
# 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. | ||
# | ||
[metadata] | ||
name = opentelemetry-instrumentation-pika | ||
description = OpenTelemetry pika instrumentation | ||
long_description = file: README.rst | ||
long_description_content_type = text/x-rst | ||
author = OpenTelemetry Authors | ||
author_email = [email protected] | ||
url = https://github.com/open-telemetry/opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-pika | ||
platforms = any | ||
license = Apache-2.0 | ||
classifiers = | ||
Development Status :: 4 - Beta | ||
Intended Audience :: Developers | ||
License :: OSI Approved :: Apache Software License | ||
Programming Language :: Python | ||
Programming Language :: Python :: 3 | ||
Programming Language :: Python :: 3.6 | ||
Programming Language :: Python :: 3.7 | ||
Programming Language :: Python :: 3.8 | ||
|
||
[options] | ||
python_requires = >=3.6 | ||
package_dir= | ||
=src | ||
packages=find_namespace: | ||
|
||
install_requires = | ||
opentelemetry-api ~= 1.5 | ||
wrapt >= 1.0.0, < 2.0.0 | ||
|
||
[options.extras_require] | ||
test = | ||
pytest | ||
wrapt >= 1.0.0, < 2.0.0 | ||
opentelemetry-test == 0.24b0 | ||
|
||
[options.packages.find] | ||
where = src | ||
|
||
[options.entry_points] | ||
opentelemetry_instrumentor = | ||
pika = opentelemetry.instrumentation.pika:PikaInstrumentor |
89 changes: 89 additions & 0 deletions
89
instrumentation/opentelemetry-instrumentation-pika/setup.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
# Copyright The OpenTelemetry Authors | ||
# | ||
# 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. | ||
|
||
|
||
# DO NOT EDIT. THIS FILE WAS AUTOGENERATED FROM templates/instrumentation_setup.py.txt. | ||
# RUN `python scripts/generate_setup.py` TO REGENERATE. | ||
|
||
|
||
import distutils.cmd | ||
import json | ||
import os | ||
from configparser import ConfigParser | ||
|
||
import setuptools | ||
|
||
config = ConfigParser() | ||
config.read("setup.cfg") | ||
|
||
# We provide extras_require parameter to setuptools.setup later which | ||
# overwrites the extra_require section from setup.cfg. To support extra_require | ||
# secion in setup.cfg, we load it here and merge it with the extra_require param. | ||
extras_require = {} | ||
if "options.extras_require" in config: | ||
for key, value in config["options.extras_require"].items(): | ||
extras_require[key] = [v for v in value.split("\n") if v.strip()] | ||
|
||
BASE_DIR = os.path.dirname(__file__) | ||
PACKAGE_INFO = {} | ||
|
||
VERSION_FILENAME = os.path.join( | ||
BASE_DIR, "src", "opentelemetry", "instrumentation", "pika", "version.py" | ||
) | ||
with open(VERSION_FILENAME, encoding="utf-8") as f: | ||
exec(f.read(), PACKAGE_INFO) | ||
|
||
PACKAGE_FILENAME = os.path.join( | ||
BASE_DIR, "src", "opentelemetry", "instrumentation", "pika", "package.py" | ||
) | ||
with open(PACKAGE_FILENAME, encoding="utf-8") as f: | ||
exec(f.read(), PACKAGE_INFO) | ||
|
||
# Mark any instruments/runtime dependencies as test dependencies as well. | ||
extras_require["instruments"] = PACKAGE_INFO["_instruments"] | ||
test_deps = extras_require.get("test", []) | ||
for dep in extras_require["instruments"]: | ||
test_deps.append(dep) | ||
|
||
extras_require["test"] = test_deps | ||
|
||
|
||
class JSONMetadataCommand(distutils.cmd.Command): | ||
|
||
description = ( | ||
"print out package metadata as JSON. This is used by OpenTelemetry dev scripts to ", | ||
"auto-generate code in other places", | ||
) | ||
user_options = [] | ||
|
||
def initialize_options(self): | ||
pass | ||
|
||
def finalize_options(self): | ||
pass | ||
|
||
def run(self): | ||
metadata = { | ||
"name": config["metadata"]["name"], | ||
"version": PACKAGE_INFO["__version__"], | ||
"instruments": PACKAGE_INFO["_instruments"], | ||
} | ||
print(json.dumps(metadata)) | ||
|
||
|
||
setuptools.setup( | ||
cmdclass={"meta": JSONMetadataCommand}, | ||
version=PACKAGE_INFO["__version__"], | ||
extras_require=extras_require, | ||
) |
73 changes: 73 additions & 0 deletions
73
...ion/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/__init__.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
# Copyright The OpenTelemetry Authors | ||
# | ||
# 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. | ||
""" | ||
Instrument `pika` to trace RabbitMQ applications. | ||
Usage | ||
----- | ||
* Start broker backend | ||
.. code-block:: python | ||
docker run -p 5672:5672 rabbitmq | ||
* Run instrumented task | ||
.. code-block:: python | ||
import pika | ||
from opentelemetry.instrumentation.pika import PikaInstrumentor | ||
PikaInstrumentor().instrument() | ||
connection = pika.BlockingConnection(pika.URLParameters('amqp://localhost')) | ||
channel = connection.channel() | ||
channel.queue_declare(queue='hello') | ||
channel.basic_publish(exchange='', routing_key='hello', body=b'Hello World!') | ||
* PikaInstrumentor also supports instrumentation of a single channel | ||
.. code-block:: python | ||
import pika | ||
from opentelemetry.instrumentation.pika import PikaInstrumentor | ||
connection = pika.BlockingConnection(pika.URLParameters('amqp://localhost')) | ||
channel = connection.channel() | ||
channel.queue_declare(queue='hello') | ||
pika_instrumentation = PikaInstrumentor() | ||
pika_instrumentation.instrument_channel(channel=channel) | ||
channel.basic_publish(exchange='', routing_key='hello', body=b'Hello World!') | ||
pika_instrumentation.uninstrument_channel(channel=channel) | ||
* PikaInstrumentor also supports instrumentation without creating an object, and receiving a tracer_provider | ||
.. code-block:: python | ||
PikaInstrumentor.instrument_channel(channel, tracer_provider=tracer_provider) | ||
API | ||
--- | ||
""" | ||
# pylint: disable=import-error | ||
|
||
from .pika_instrumentor import PikaInstrumentor | ||
from .version import __version__ | ||
|
||
__all__ = ["PikaInstrumentor", "__version__"] |
16 changes: 16 additions & 0 deletions
16
...tion/opentelemetry-instrumentation-pika/src/opentelemetry/instrumentation/pika/package.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# Copyright The OpenTelemetry Authors | ||
# | ||
# 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 typing import Collection | ||
|
||
_instruments: Collection[str] = ("pika >= 1.1.0",) |
Oops, something went wrong.