# Opentelemetry auto instrumentation for django-stomp
[//]: # ([![Build Status](https://dev.azure.com/juntos-somos-mais-loyalty/python/_apis/build/status/juntossomosmais.opentelemetry-instrumentation-django-stomp?branchName=main)](https://dev.azure.com/juntos-somos-mais-loyalty/python/_build/latest?definitionId=272&branchName=main))
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=juntossomosmais_opentelemetry-instrumentation-django-stomp&metric=sqale_rating&token=80cebbac184a793f8d0be7a3bbe9792f47a6ef23)](https://sonarcloud.io/summary/new_code?id=juntossomosmais_opentelemetry-instrumentation-django-stomp)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=juntossomosmais_opentelemetry-instrumentation-django-stomp&metric=coverage&token=80cebbac184a793f8d0be7a3bbe9792f47a6ef23)](https://sonarcloud.io/summary/new_code?id=juntossomosmais_opentelemetry-instrumentation-django-stomp)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=juntossomosmais_opentelemetry-instrumentation-django-stomp&metric=alert_status&token=80cebbac184a793f8d0be7a3bbe9792f47a6ef23)](https://sonarcloud.io/summary/new_code?id=juntossomosmais_opentelemetry-instrumentation-django-stomp)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)
[![PyPI version](https://badge.fury.io/py/opentelemetry-instrumentation-django-stomp.svg)](https://badge.fury.io/py/opentelemetry-instrumentation-django-stomp)
[![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/juntossomosmais/opentelemetry-instrumentation-django-stomp/blob/main/LICENSE)
This library will help you to use opentelemetry traces and metrics on [Django STOMP](https://github.com/juntossomosmais/django-stomp) usage library.
![Django stomp instrumentation](docs/example.gif?raw=true)
#### Installation
pip install `opentelemetry-instrumentation-django-stomp`
#### How to use ?
You can use the `DjangoStompInstrumentor().instrument()` for example in `manage.py` file.
```python
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
import typing
from opentelemetry_instrumentation_django_stomp import DjangoStompInstrumentor
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
from opentelemetry.trace.span import Span
def publisher_hook(span: Span, body: typing.Dict, headers: typing.Dict):
# Custom code in your project here we can see span attributes and make custom logic with then.
pass
def consumer_hook(span: Span, body: typing.Dict, headers: typing.Dict):
# Custom code in your project here we can see span attributes and make custom logic with then.
pass
provider = TracerProvider()
trace.set_tracer_provider(provider)
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))
def main():
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "application.settings")
DjangoStompInstrumentor().instrument(
trace_provider=trace,
publisher_hook=publisher_hook,
consumer_hook=consumer_hook,
)
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == "__main__":
main()
```
The code above will create telemetry wrappers inside django-stomp code and creates automatic spans with broker data.
The `DjangoStompInstrumentor` can receive three optional parameters:
- **trace_provider**: The tracer provider to use in open-telemetry spans.
- **publisher_hook**: The callable function on publisher action to call before the original function call, use this to override, enrich the span or get span information in the main project.
- **consumer_hook**: The callable function on consumer action to call before the original function call, use this to override, enrich the span or get span information in the main project.
:warning: The hook function will not raise an exception when an error occurs inside hook function, only a warning log is generated
#### PUBLISHER example
With the django-stomp, we can publish a message to a broker using `publisher.send` and the instrumentator
can include a span with telemetry data in this function utilization.
```python
from uuid import uuid4
from django_stomp.builder import build_publisher
publisher = build_publisher(f"publisher-unique-name-{uuid4()}")
publisher.send(
queue='/queue/a-destination',
body={"a": "random","body": "message"},
)
```
The publisher span had "PUBLISHER" name.
![publisher example](docs/publisher_example.png?raw=true)
#### CONSUMER example
With the django-stomp, we create a simple consumer using pubsub command and the instrumentator
can include a span with telemetry data in this function utilization.
```bash
python manage.py pubsub QUEUE_NAME callback_function_to_consume_message
```
Consumer spans can generate up to three types:
- CONSUMER
![consumer example](docs/consumer_example.png?raw=true)
- ACK
![ack example](docs/ack_example.png?raw=true)
- NACK
![nack example](docs/nack_example.png?raw=true)
#### Supress django-stomp traces and metrics
When the flag `OTEL_PYTHON_DJANGO_STOMP_INSTRUMENT` has `False` value traces and metrics will not be generated.
Use this to supress the django-stomp instrumentation.
#### HOW TO CONTRIBUTE ?
Look the [contributing](./CONTRIBUTING.md) specs
Raw data
{
"_id": null,
"home_page": "https://github.com/juntossomosmais/opentelemetry-instrumentation-django-stomp",
"name": "opentelemetry-instrumentation-django-stomp",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.7,<4.0",
"maintainer_email": "",
"keywords": "django-stomp,stomp,django,opentelemetry,instrumentation",
"author": "Juntos Somos Mais",
"author_email": "labs@juntossomosmais.com.br",
"download_url": "https://files.pythonhosted.org/packages/9b/74/d45446b152e2883c2efd00e52c7b699d0a95c5d156befffbe136ce987ad9/opentelemetry-instrumentation-django-stomp-0.2.0.tar.gz",
"platform": null,
"description": "# Opentelemetry auto instrumentation for django-stomp\n\n[//]: # ([![Build Status](https://dev.azure.com/juntos-somos-mais-loyalty/python/_apis/build/status/juntossomosmais.opentelemetry-instrumentation-django-stomp?branchName=main)](https://dev.azure.com/juntos-somos-mais-loyalty/python/_build/latest?definitionId=272&branchName=main))\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=juntossomosmais_opentelemetry-instrumentation-django-stomp&metric=sqale_rating&token=80cebbac184a793f8d0be7a3bbe9792f47a6ef23)](https://sonarcloud.io/summary/new_code?id=juntossomosmais_opentelemetry-instrumentation-django-stomp)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=juntossomosmais_opentelemetry-instrumentation-django-stomp&metric=coverage&token=80cebbac184a793f8d0be7a3bbe9792f47a6ef23)](https://sonarcloud.io/summary/new_code?id=juntossomosmais_opentelemetry-instrumentation-django-stomp)\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=juntossomosmais_opentelemetry-instrumentation-django-stomp&metric=alert_status&token=80cebbac184a793f8d0be7a3bbe9792f47a6ef23)](https://sonarcloud.io/summary/new_code?id=juntossomosmais_opentelemetry-instrumentation-django-stomp)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n[![PyPI version](https://badge.fury.io/py/opentelemetry-instrumentation-django-stomp.svg)](https://badge.fury.io/py/opentelemetry-instrumentation-django-stomp)\n[![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/juntossomosmais/opentelemetry-instrumentation-django-stomp/blob/main/LICENSE)\n\nThis library will help you to use opentelemetry traces and metrics on [Django STOMP](https://github.com/juntossomosmais/django-stomp) usage library.\n\n![Django stomp instrumentation](docs/example.gif?raw=true)\n\n\n#### Installation\npip install `opentelemetry-instrumentation-django-stomp`\n\n#### How to use ?\n\nYou can use the `DjangoStompInstrumentor().instrument()` for example in `manage.py` file.\n\n\n```python\n#!/usr/bin/env python\n\"\"\"Django's command-line utility for administrative tasks.\"\"\"\nimport os\nimport sys\nimport typing\n\nfrom opentelemetry_instrumentation_django_stomp import DjangoStompInstrumentor\n\nfrom opentelemetry import trace\nfrom opentelemetry.sdk.trace import TracerProvider\nfrom opentelemetry.sdk.trace.export import BatchSpanProcessor\nfrom opentelemetry.sdk.trace.export import ConsoleSpanExporter\nfrom opentelemetry.trace.span import Span\n\n\ndef publisher_hook(span: Span, body: typing.Dict, headers: typing.Dict):\n # Custom code in your project here we can see span attributes and make custom logic with then.\n pass\n\n\ndef consumer_hook(span: Span, body: typing.Dict, headers: typing.Dict):\n # Custom code in your project here we can see span attributes and make custom logic with then.\n pass\n\n\nprovider = TracerProvider()\ntrace.set_tracer_provider(provider)\ntrace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))\n\ndef main():\n os.environ.setdefault(\"DJANGO_SETTINGS_MODULE\", \"application.settings\")\n DjangoStompInstrumentor().instrument(\n trace_provider=trace,\n publisher_hook=publisher_hook,\n consumer_hook=consumer_hook,\n )\n try:\n from django.core.management import execute_from_command_line\n except ImportError as exc:\n raise ImportError(\n \"Couldn't import Django. Are you sure it's installed and \"\n \"available on your PYTHONPATH environment variable? Did you \"\n \"forget to activate a virtual environment?\"\n ) from exc\n execute_from_command_line(sys.argv)\n\n\nif __name__ == \"__main__\":\n main()\n```\n\nThe code above will create telemetry wrappers inside django-stomp code and creates automatic spans with broker data.\n\nThe `DjangoStompInstrumentor` can receive three optional parameters:\n- **trace_provider**: The tracer provider to use in open-telemetry spans.\n- **publisher_hook**: The callable function on publisher action to call before the original function call, use this to override, enrich the span or get span information in the main project.\n- **consumer_hook**: The callable function on consumer action to call before the original function call, use this to override, enrich the span or get span information in the main project.\n\n:warning: The hook function will not raise an exception when an error occurs inside hook function, only a warning log is generated\n\n#### PUBLISHER example\n\nWith the django-stomp, we can publish a message to a broker using `publisher.send` and the instrumentator\ncan include a span with telemetry data in this function utilization.\n\n```python\n from uuid import uuid4\n from django_stomp.builder import build_publisher\n publisher = build_publisher(f\"publisher-unique-name-{uuid4()}\")\n publisher.send(\n queue='/queue/a-destination',\n body={\"a\": \"random\",\"body\": \"message\"},\n )\n```\n\nThe publisher span had \"PUBLISHER\" name.\n\n![publisher example](docs/publisher_example.png?raw=true)\n\n#### CONSUMER example\nWith the django-stomp, we create a simple consumer using pubsub command and the instrumentator\ncan include a span with telemetry data in this function utilization.\n\n```bash\n python manage.py pubsub QUEUE_NAME callback_function_to_consume_message\n```\n\nConsumer spans can generate up to three types:\n\n- CONSUMER\n![consumer example](docs/consumer_example.png?raw=true)\n- ACK\n![ack example](docs/ack_example.png?raw=true)\n- NACK\n![nack example](docs/nack_example.png?raw=true)\n\n#### Supress django-stomp traces and metrics\nWhen the flag `OTEL_PYTHON_DJANGO_STOMP_INSTRUMENT` has `False` value traces and metrics will not be generated.\nUse this to supress the django-stomp instrumentation.\n\n#### HOW TO CONTRIBUTE ?\nLook the [contributing](./CONTRIBUTING.md) specs\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Opentelemetry instrumentor for django-stomp package",
"version": "0.2.0",
"split_keywords": [
"django-stomp",
"stomp",
"django",
"opentelemetry",
"instrumentation"
],
"urls": [
{
"comment_text": "",
"digests": {
"md5": "169461b80739fa0baf313cee36bb5be8",
"sha256": "917cad82729b35f887bc51092c73ead9ba864bed2099fca07443c23db6f7258b"
},
"downloads": -1,
"filename": "opentelemetry_instrumentation_django_stomp-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "169461b80739fa0baf313cee36bb5be8",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7,<4.0",
"size": 12253,
"upload_time": "2022-12-12T19:58:59",
"upload_time_iso_8601": "2022-12-12T19:58:59.754120Z",
"url": "https://files.pythonhosted.org/packages/b7/e6/e88f9c6c408f5b5b74f077952760cb04acafde1b09836c271c8e1b257f9e/opentelemetry_instrumentation_django_stomp-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"md5": "38ca89ef41613d7d82750602b41a5db4",
"sha256": "6e108df1a673800a0cb67f0cf26409cd17e97d7e5c743ae13f570457ecde0d49"
},
"downloads": -1,
"filename": "opentelemetry-instrumentation-django-stomp-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "38ca89ef41613d7d82750602b41a5db4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7,<4.0",
"size": 9875,
"upload_time": "2022-12-12T19:58:57",
"upload_time_iso_8601": "2022-12-12T19:58:57.985813Z",
"url": "https://files.pythonhosted.org/packages/9b/74/d45446b152e2883c2efd00e52c7b699d0a95c5d156befffbe136ce987ad9/opentelemetry-instrumentation-django-stomp-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2022-12-12 19:58:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "juntossomosmais",
"github_project": "opentelemetry-instrumentation-django-stomp",
"lcname": "opentelemetry-instrumentation-django-stomp"
}