Skip to content

Commit f1b7dd1

Browse files
committed
ci/cd: Make Kafka tests isolated.
Signed-off-by: Paulo Vital <[email protected]>
1 parent 53d8f69 commit f1b7dd1

9 files changed

+106
-95
lines changed

.circleci/config.yml

+29-63
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ commands:
5252
gevent:
5353
default: ""
5454
type: string
55+
kafka:
56+
default: ""
57+
type: string
5558
tests:
5659
default: "tests"
5760
type: string
@@ -61,6 +64,7 @@ commands:
6164
environment:
6265
CASSANDRA_TEST: "<<parameters.cassandra>>"
6366
GEVENT_STARLETTE_TEST: "<<parameters.gevent>>"
67+
KAFKA_TEST: "<<parameters.kafka>>"
6468
command: |
6569
. venv/bin/activate
6670
coverage run --source=instana -m pytest -v --junitxml=test-results <<parameters.tests>>
@@ -136,15 +140,6 @@ jobs:
136140
environment:
137141
PUBSUB_EMULATOR_HOST: 0.0.0.0:8681
138142
PUBSUB_PROJECT1: test-project,test-topic
139-
- image: public.ecr.aws/bitnami/kafka:3.9.0
140-
environment:
141-
KAFKA_CFG_NODE_ID: 0
142-
KAFKA_CFG_PROCESS_ROLES: controller,broker
143-
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
144-
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
145-
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
146-
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
147-
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
148143
working_directory: ~/repo
149144
steps:
150145
- checkout
@@ -173,15 +168,6 @@ jobs:
173168
environment:
174169
PUBSUB_EMULATOR_HOST: 0.0.0.0:8681
175170
PUBSUB_PROJECT1: test-project,test-topic
176-
- image: public.ecr.aws/bitnami/kafka:3.9.0
177-
environment:
178-
KAFKA_CFG_NODE_ID: 0
179-
KAFKA_CFG_PROCESS_ROLES: controller,broker
180-
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
181-
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
182-
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
183-
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
184-
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
185171
working_directory: ~/repo
186172
steps:
187173
- checkout
@@ -210,15 +196,6 @@ jobs:
210196
environment:
211197
PUBSUB_EMULATOR_HOST: 0.0.0.0:8681
212198
PUBSUB_PROJECT1: test-project,test-topic
213-
- image: public.ecr.aws/bitnami/kafka:3.9.0
214-
environment:
215-
KAFKA_CFG_NODE_ID: 0
216-
KAFKA_CFG_PROCESS_ROLES: controller,broker
217-
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
218-
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
219-
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
220-
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
221-
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
222199
working_directory: ~/repo
223200
steps:
224201
- checkout
@@ -248,15 +225,6 @@ jobs:
248225
environment:
249226
PUBSUB_EMULATOR_HOST: 0.0.0.0:8681
250227
PUBSUB_PROJECT1: test-project,test-topic
251-
- image: public.ecr.aws/bitnami/kafka:3.9.0
252-
environment:
253-
KAFKA_CFG_NODE_ID: 0
254-
KAFKA_CFG_PROCESS_ROLES: controller,broker
255-
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
256-
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
257-
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
258-
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
259-
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
260228
working_directory: ~/repo
261229
steps:
262230
- checkout
@@ -286,15 +254,6 @@ jobs:
286254
environment:
287255
PUBSUB_EMULATOR_HOST: 0.0.0.0:8681
288256
PUBSUB_PROJECT1: test-project,test-topic
289-
- image: public.ecr.aws/bitnami/kafka:3.9.0
290-
environment:
291-
KAFKA_CFG_NODE_ID: 0
292-
KAFKA_CFG_PROCESS_ROLES: controller,broker
293-
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
294-
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
295-
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
296-
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
297-
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
298257
working_directory: ~/repo
299258
steps:
300259
- checkout
@@ -338,15 +297,6 @@ jobs:
338297
environment:
339298
PUBSUB_EMULATOR_HOST: 0.0.0.0:8681
340299
PUBSUB_PROJECT1: test-project,test-topic
341-
- image: public.ecr.aws/bitnami/kafka:3.9.0
342-
environment:
343-
KAFKA_CFG_NODE_ID: 0
344-
KAFKA_CFG_PROCESS_ROLES: controller,broker
345-
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
346-
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
347-
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
348-
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
349-
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
350300
working_directory: ~/repo
351301
steps:
352302
- checkout
@@ -376,15 +326,6 @@ jobs:
376326
environment:
377327
PUBSUB_EMULATOR_HOST: 0.0.0.0:8681
378328
PUBSUB_PROJECT1: test-project,test-topic
379-
- image: public.ecr.aws/bitnami/kafka:3.9.0
380-
environment:
381-
KAFKA_CFG_NODE_ID: 0
382-
KAFKA_CFG_PROCESS_ROLES: controller,broker
383-
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
384-
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
385-
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
386-
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
387-
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
388329
working_directory: ~/repo
389330
steps:
390331
- checkout
@@ -443,6 +384,30 @@ jobs:
443384
- store-pytest-results
444385
- store-coverage-report
445386

387+
py312kafka:
388+
docker:
389+
- image: public.ecr.aws/docker/library/python:3.12
390+
- image: public.ecr.aws/bitnami/kafka:3.9.0
391+
environment:
392+
KAFKA_CFG_NODE_ID: 0
393+
KAFKA_CFG_PROCESS_ROLES: controller,broker
394+
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
395+
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
396+
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS: 0@localhost:9093
397+
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
398+
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092,EXTERNAL://localhost:9094
399+
working_directory: ~/repo
400+
steps:
401+
- checkout
402+
- check-if-tests-needed
403+
- pip-install-deps:
404+
requirements: "tests/requirements-kafka.txt"
405+
- run-tests-with-coverage-report:
406+
kafka: "true"
407+
tests: "tests/clients/kafka/test*.py"
408+
- store-pytest-results
409+
- store-coverage-report
410+
446411
workflows:
447412
version: 2
448413
build:
@@ -457,6 +422,7 @@ workflows:
457422
- py39cassandra
458423
- py39gevent_starlette
459424
- py312aws
425+
- py312kafka
460426
- final_job:
461427
requires:
462428
- python38

.tekton/pipeline.yaml

+14
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,17 @@ spec:
8787
workspaces:
8888
- name: task-pvc
8989
workspace: python-tracer-ci-pipeline-pvc
90+
- name: unittest-kafka
91+
runAfter:
92+
- clone
93+
matrix:
94+
params:
95+
- name: imageDigest
96+
value:
97+
# public.ecr.aws/docker/library/python:3.12.9-bookworm
98+
- "sha256:ae24158f83adcb3ec1dead14356e6debc9f3125167624408d95338faacc5cce3"
99+
taskRef:
100+
name: python-tracer-unittest-kafka-task
101+
workspaces:
102+
- name: task-pvc
103+
workspace: python-tracer-ci-pipeline-pvc

.tekton/run_unittests.sh

+5-1
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@ gevent_starlette)
3232
aws)
3333
export REQUIREMENTS='requirements.txt'
3434
export TESTS=('tests_aws') ;;
35+
kafka)
36+
export REQUIREMENTS='requirements-kafka.txt'
37+
export TESTS=('tests/clients/kafka')
38+
export KAFKA_TEST='true' ;;
3539
*)
3640
echo "ERROR \$TEST_CONFIGURATION='${TEST_CONFIGURATION}' is unsupported " \
37-
"not in (default|cassandra|gevent_starlette|aws)" >&2
41+
"not in (default|cassandra|gevent_starlette|aws|kafka)" >&2
3842
exit 3 ;;
3943
esac
4044

.tekton/task.yaml

+40-19
Original file line numberDiff line numberDiff line change
@@ -131,25 +131,6 @@ spec:
131131
- name: rabbitmq
132132
# public.ecr.aws/docker/library/rabbitmq:3.13.0
133133
image: public.ecr.aws/docker/library/rabbitmq@sha256:39de1a4fc6c72d12bd5dfa23e8576536fd1c0cc8418344cd5a51addfc9a1145d
134-
- name: kafka
135-
# public.ecr.aws/bitnami/kafka:3.9.0
136-
image: public.ecr.aws/bitnami/kafka@sha256:d2890d68f96b36da3c8413fa94294f018b2f95d87cf108cbf71eab510572d9be
137-
env:
138-
- name: KAFKA_CFG_NODE_ID
139-
value: "0"
140-
- name: KAFKA_CFG_PROCESS_ROLES
141-
value: "controller,broker"
142-
- name: KAFKA_CFG_LISTENERS
143-
value: "PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094"
144-
- name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP
145-
value: "CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT"
146-
- name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS
147-
value: "0@kafka:9093"
148-
- name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES
149-
value: "CONTROLLER"
150-
- name: KAFKA_CFG_ADVERTISED_LISTENERS
151-
value: "PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094"
152-
153134
params:
154135
- name: imageDigest
155136
type: string
@@ -186,3 +167,43 @@ spec:
186167
workingDir: /workspace/python-sensor/
187168
command:
188169
- /workspace/python-sensor/.tekton/run_unittests.sh
170+
---
171+
apiVersion: tekton.dev/v1
172+
kind: Task
173+
metadata:
174+
name: python-tracer-unittest-kafka-task
175+
spec:
176+
sidecars:
177+
- name: kafka
178+
# public.ecr.aws/bitnami/kafka:3.9.0
179+
image: public.ecr.aws/bitnami/kafka@sha256:d2890d68f96b36da3c8413fa94294f018b2f95d87cf108cbf71eab510572d9be
180+
env:
181+
- name: KAFKA_CFG_NODE_ID
182+
value: "0"
183+
- name: KAFKA_CFG_PROCESS_ROLES
184+
value: "controller,broker"
185+
- name: KAFKA_CFG_LISTENERS
186+
value: "PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094"
187+
- name: KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP
188+
value: "CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT"
189+
- name: KAFKA_CFG_CONTROLLER_QUORUM_VOTERS
190+
value: "0@kafka:9093"
191+
- name: KAFKA_CFG_CONTROLLER_LISTENER_NAMES
192+
value: "CONTROLLER"
193+
- name: KAFKA_CFG_ADVERTISED_LISTENERS
194+
value: "PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094"
195+
params:
196+
- name: imageDigest
197+
type: string
198+
workspaces:
199+
- name: task-pvc
200+
mountPath: /workspace
201+
steps:
202+
- name: unittest
203+
image: public.ecr.aws/docker/library/python@$(params.imageDigest)
204+
env:
205+
- name: TEST_CONFIGURATION
206+
value: kafka
207+
workingDir: /workspace/python-sensor/
208+
command:
209+
- /workspace/python-sensor/.tekton/run_unittests.sh

tests/clients/kafka/test_confluent_kafka.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@
33
from typing import Generator
44

55
import pytest
6-
from confluent_kafka import Consumer, KafkaException, Producer # noqa: F401
6+
from confluent_kafka import (
7+
Consumer,
8+
KafkaException,
9+
Producer,
10+
)
711
from confluent_kafka.admin import AdminClient, NewTopic
812
from opentelemetry.trace import SpanKind
913

@@ -70,7 +74,7 @@ def test_trace_confluent_kafka_produce(self) -> None:
7074
assert kafka_span.n == "kafka"
7175
assert kafka_span.k == SpanKind.CLIENT
7276
assert kafka_span.data["kafka"]["service"] == testenv["kafka_topic"]
73-
assert kafka_span.data["kafka"]["access"] == "send"
77+
assert kafka_span.data["kafka"]["access"] == "produce"
7478

7579
def test_trace_confluent_kafka_consume(self) -> None:
7680
# Produce some events
@@ -159,8 +163,7 @@ def test_trace_confluent_kafka_error(self) -> None:
159163
consumer.subscribe(["inexistent_kafka_topic"])
160164

161165
with tracer.start_as_current_span("test"):
162-
msg = consumer.poll(timeout=5) # noqa: F841
163-
# assert not msg
166+
consumer.consume(-10)
164167

165168
consumer.close()
166169

@@ -183,8 +186,8 @@ def test_trace_confluent_kafka_error(self) -> None:
183186
assert kafka_span.n == "kafka"
184187
assert kafka_span.k == SpanKind.SERVER
185188
assert not kafka_span.data["kafka"]["service"]
186-
assert kafka_span.data["kafka"]["access"] == "poll"
189+
assert kafka_span.data["kafka"]["access"] == "consume"
187190
assert (
188191
kafka_span.data["kafka"]["error"]
189-
== "'NoneType' object has no attribute 'topic'"
192+
== "num_messages must be between 0 and 1000000 (1M)"
190193
)

tests/conftest.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717

1818
from instana.agent.host import HostAgent
1919
from instana.collector.base import BaseCollector
20+
from instana.fsm import TheMachine
2021
from instana.recorder import StanRecorder
2122
from instana.span.base_span import BaseSpan
2223
from instana.span.span import InstanaSpan
2324
from instana.span_context import SpanContext
2425
from instana.tracer import InstanaTracerProvider
25-
from instana.fsm import TheMachine
2626

2727
collect_ignore_glob = [
2828
"*test_gevent*",
@@ -42,6 +42,8 @@
4242
collect_ignore_glob.append("*test_gevent*")
4343
collect_ignore_glob.append("*test_starlette*")
4444

45+
if not os.environ.get("KAFKA_TEST"):
46+
collect_ignore_glob.append("*kafka/test*")
4547

4648
if sys.version_info >= (3, 13):
4749
# Currently not installable dependencies because of 3.13 incompatibilities

tests/requirements-kafka.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
coverage>=5.5
2+
mock>=2.0.0
3+
pytest
4+
kafka-python>=2.0.0; python_version < "3.12"
5+
kafka-python-ng>=2.0.0; python_version >= "3.12"
6+
confluent-kafka>=2.0.0

tests/requirements-pre314.txt

-2
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,3 @@ tornado>=6.4.1
4141
uvicorn>=0.13.4
4242
urllib3>=1.26.5
4343
httpx>=0.27.0
44-
kafka-python-ng>=2.0.0
45-
confluent-kafka>=2.0.0

tests/requirements.txt

-3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,3 @@ tornado>=6.4.1
4040
uvicorn>=0.13.4
4141
urllib3>=1.26.5
4242
httpx>=0.27.0
43-
kafka-python>=2.0.0; python_version < "3.12"
44-
kafka-python-ng>=2.0.0; python_version >= "3.12"
45-
confluent-kafka>=2.0.0

0 commit comments

Comments
 (0)