Skip to content

Commit 265490f

Browse files
authored
kafka-python Instrument temporary fork, kafka-python-ng inside kafka-python's instrumentation (#2537)
* Instrument temporary fork, kafka-python-ng inside kafka-python's instrumentation * Make kafkapython-ng run tests
1 parent 3e18560 commit 265490f

File tree

9 files changed

+65
-5
lines changed

9 files changed

+65
-5
lines changed

.github/workflows/instrumentations_1.yml

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ jobs:
4040
- "util-http"
4141
- "fastapislim"
4242
- "processor-baggage"
43+
- "kafka-pythonng"
4344
os: [ubuntu-20.04]
4445
exclude:
4546
- python-version: pypy3

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
## Added
1111

12+
- `opentelemetry-instrumentation-kafka-python` Instrument temporary fork, kafka-python-ng
13+
inside kafka-python's instrumentation
14+
([#2537](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2537)))
15+
1216
## Breaking changes
1317

1418
## Fixed

instrumentation/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
| [opentelemetry-instrumentation-grpc](./opentelemetry-instrumentation-grpc) | grpcio ~= 1.27 | No | experimental
2525
| [opentelemetry-instrumentation-httpx](./opentelemetry-instrumentation-httpx) | httpx >= 0.18.0 | No | migration
2626
| [opentelemetry-instrumentation-jinja2](./opentelemetry-instrumentation-jinja2) | jinja2 >= 2.7, < 4.0 | No | experimental
27-
| [opentelemetry-instrumentation-kafka-python](./opentelemetry-instrumentation-kafka-python) | kafka-python >= 2.0 | No | experimental
27+
| [opentelemetry-instrumentation-kafka-python](./opentelemetry-instrumentation-kafka-python) | kafka-python >= 2.0, < 3.0,kafka-python-ng >= 2.0, < 3.0 | No | experimental
2828
| [opentelemetry-instrumentation-logging](./opentelemetry-instrumentation-logging) | logging | No | experimental
2929
| [opentelemetry-instrumentation-mysql](./opentelemetry-instrumentation-mysql) | mysql-connector-python >= 8.0, < 10.0 | No | experimental
3030
| [opentelemetry-instrumentation-mysqlclient](./opentelemetry-instrumentation-mysqlclient) | mysqlclient < 3 | No | experimental

instrumentation/opentelemetry-instrumentation-kafka-python/pyproject.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ classifiers = [
2222
"Programming Language :: Python :: 3.9",
2323
"Programming Language :: Python :: 3.10",
2424
"Programming Language :: Python :: 3.11",
25+
"Programming Language :: Python :: 3.12",
2526
]
2627
dependencies = [
2728
"opentelemetry-api ~= 1.5",
@@ -31,7 +32,8 @@ dependencies = [
3132

3233
[project.optional-dependencies]
3334
instruments = [
34-
"kafka-python >= 2.0",
35+
"kafka-python >= 2.0, < 3.0",
36+
"kafka-python-ng >= 2.0, < 3.0"
3537
]
3638

3739
[project.entry-points.opentelemetry_instrumentor]

instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/__init__.py

+23-1
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,19 @@ def consume_hook(span, record, args, kwargs):
6767
API
6868
___
6969
"""
70+
from importlib.metadata import PackageNotFoundError, distribution
7071
from typing import Collection
7172

7273
import kafka
7374
from wrapt import wrap_function_wrapper
7475

7576
from opentelemetry import trace
7677
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
77-
from opentelemetry.instrumentation.kafka.package import _instruments
78+
from opentelemetry.instrumentation.kafka.package import (
79+
_instruments,
80+
_instruments_kafka_python,
81+
_instruments_kafka_python_ng,
82+
)
7883
from opentelemetry.instrumentation.kafka.utils import _wrap_next, _wrap_send
7984
from opentelemetry.instrumentation.kafka.version import __version__
8085
from opentelemetry.instrumentation.utils import unwrap
@@ -86,6 +91,23 @@ class KafkaInstrumentor(BaseInstrumentor):
8691
"""
8792

8893
def instrumentation_dependencies(self) -> Collection[str]:
94+
# Determine which package of kafka-python is installed
95+
# Right now there are two packages, kafka-python and kafka-python-ng
96+
# The latter is a fork of the former because the former is connected
97+
# to a pypi namespace that the current maintainers cannot access
98+
# https://github.com/dpkp/kafka-python/issues/2431
99+
try:
100+
distribution("kafka-python-ng")
101+
return (_instruments_kafka_python_ng,)
102+
except PackageNotFoundError:
103+
pass
104+
105+
try:
106+
distribution("kafka-python")
107+
return (_instruments_kafka_python,)
108+
except PackageNotFoundError:
109+
pass
110+
89111
return _instruments
90112

91113
def _instrument(self, **kwargs):

instrumentation/opentelemetry-instrumentation-kafka-python/src/opentelemetry/instrumentation/kafka/package.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,7 @@
1313
# limitations under the License.
1414

1515

16-
_instruments = ("kafka-python >= 2.0",)
16+
_instruments_kafka_python = "kafka-python >= 2.0, < 3.0"
17+
_instruments_kafka_python_ng = "kafka-python-ng >= 2.0, < 3.0"
18+
19+
_instruments = (_instruments_kafka_python, _instruments_kafka_python_ng)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
asgiref==3.7.2
2+
Deprecated==1.2.14
3+
importlib-metadata==6.11.0
4+
iniconfig==2.0.0
5+
kafka-python-ng==2.2.2
6+
packaging==24.0
7+
pluggy==1.5.0
8+
py-cpuinfo==9.0.0
9+
pytest==7.4.4
10+
tomli==2.0.1
11+
typing_extensions==4.9.0
12+
wrapt==1.16.0
13+
zipp==3.19.2
14+
-e opentelemetry-instrumentation
15+
-e instrumentation/opentelemetry-instrumentation-kafka-python

opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,11 @@
105105
"instrumentation": "opentelemetry-instrumentation-jinja2==0.48b0.dev",
106106
},
107107
{
108-
"library": "kafka-python >= 2.0",
108+
"library": "kafka-python >= 2.0, < 3.0",
109+
"instrumentation": "opentelemetry-instrumentation-kafka-python==0.48b0.dev",
110+
},
111+
{
112+
"library": "kafka-python-ng >= 2.0, < 3.0",
109113
"instrumentation": "opentelemetry-instrumentation-kafka-python==0.48b0.dev",
110114
},
111115
{

tox.ini

+9
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,9 @@ envlist =
350350

351351
; opentelemetry-instrumentation-kafka-python
352352
py3{8,9,10,11}-test-instrumentation-kafka-python
353+
py3{8,9,10,11,12}-test-instrumentation-kafka-pythonng
353354
pypy3-test-instrumentation-kafka-python
355+
pypy3-test-instrumentation-kafka-pythonng
354356
lint-instrumentation-kafka-python
355357

356358
; opentelemetry-instrumentation-confluent-kafka
@@ -443,6 +445,10 @@ commands_pre =
443445
kafka-python: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions
444446
kafka-python: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk
445447
kafka-python: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements.txt
448+
kafka-pythonng: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api
449+
kafka-pythonng: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions
450+
kafka-pythonng: pip install opentelemetry-sdk@{env:CORE_REPO}\#egg=opentelemetry-sdk&subdirectory=opentelemetry-sdk
451+
kafka-pythonng: pip install -r {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/test-requirements-ng.txt
446452

447453
confluent-kafka: pip install opentelemetry-api@{env:CORE_REPO}\#egg=opentelemetry-api&subdirectory=opentelemetry-api
448454
confluent-kafka: pip install opentelemetry-semantic-conventions@{env:CORE_REPO}\#egg=opentelemetry-semantic-conventions&subdirectory=opentelemetry-semantic-conventions
@@ -940,6 +946,9 @@ commands =
940946
lint-instrumentation-kafka-python: flake8 --config {toxinidir}/.flake8 {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python
941947
lint-instrumentation-kafka-python: sh -c "cd instrumentation && pylint --rcfile ../.pylintrc opentelemetry-instrumentation-kafka-python"
942948

949+
; Test only for kafka-pythonng instrumentation as the only difference between kafka-python and kafka-pythonng is the version of kafka-python
950+
test-instrumentation-kafka-pythonng: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-kafka-python/tests {posargs}
951+
943952
test-instrumentation-confluent-kafka: pytest {toxinidir}/instrumentation/opentelemetry-instrumentation-confluent-kafka/tests {posargs}
944953
lint-instrumentation-confluent-kafka: black --diff --check --config {toxinidir}/pyproject.toml {toxinidir}/instrumentation/opentelemetry-instrumentation-confluent-kafka
945954
lint-instrumentation-confluent-kafka: isort --diff --check-only --settings-path {toxinidir}/.isort.cfg {toxinidir}/instrumentation/opentelemetry-instrumentation-confluent-kafka

0 commit comments

Comments
 (0)