Skip to content

Commit efdf170

Browse files
wconti27tabgok
andauthored
chore: enable new test agent service naming and peer service checks (#6191)
This PR enables service naming and peer.service checks available from the APM Test Agent. Co-authored-by: Teague Bick <[email protected]>
1 parent c698a10 commit efdf170

File tree

8 files changed

+130
-108
lines changed

8 files changed

+130
-108
lines changed

.circleci/config.yml

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ mongo_image: &mongo_image mongo:3.6
1515
httpbin_image: &httpbin_image kennethreitz/httpbin@sha256:2c7abc4803080c22928265744410173b6fea3b898872c01c5fd0f0f9df4a59fb
1616
vertica_image: &vertica_image sumitchawla/vertica:latest
1717
rabbitmq_image: &rabbitmq_image rabbitmq:3.7-alpine
18-
testagent_image: &testagent_image ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:v1.10.1
18+
testagent_image: &testagent_image ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:v1.11.0
1919

2020
parameters:
2121
coverage:
@@ -128,6 +128,9 @@ commands:
128128
store_coverage:
129129
type: boolean
130130
default: true
131+
trace_agent_url:
132+
type: string
133+
default: "http://localhost:9126"
131134
steps:
132135
- attach_workspace:
133136
at: .
@@ -143,7 +146,7 @@ commands:
143146
services: testagent << parameters.docker_services >>
144147
- run:
145148
environment:
146-
DD_TRACE_AGENT_URL: http://localhost:9126
149+
DD_TRACE_AGENT_URL: << parameters.trace_agent_url >>
147150
RIOT_RUN_RECOMPILE_REQS: "<< pipeline.parameters.riot_run_latest >>"
148151
command: |
149152
# Sort the hashes to ensure a consistent ordering/division between each node
@@ -161,6 +164,14 @@ commands:
161164
- run:
162165
name: "Waiting for << parameters.wait >>"
163166
command: riot -v run 'wait' << parameters.wait >>
167+
- when:
168+
condition:
169+
<< parameters.trace_agent_url >> != ""
170+
steps:
171+
- run:
172+
command: |
173+
echo 'export DD_TRACE_AGENT_URL=<< parameters.trace_agent_url >>' >> "$BASH_ENV"
174+
source "$BASH_ENV"
164175
- run:
165176
environment:
166177
RIOT_RUN_RECOMPILE_REQS: "<< pipeline.parameters.riot_run_latest >>"
@@ -180,6 +191,10 @@ commands:
180191
path: test-results
181192
- store_artifacts:
182193
path: test-results
194+
- run:
195+
name: Get APM Test Agent Trace Check Results
196+
when: always
197+
command: bash ./scripts/get-test-agent-results.sh
183198

184199
executors:
185200
cimg_base:
@@ -223,9 +238,13 @@ postgres_server: &postgres_server
223238
testagent: &testagent
224239
image: *testagent_image
225240
environment:
226-
- LOG_LEVEL=WARNING
241+
- LOG_LEVEL=DEBUG
227242
- SNAPSHOT_DIR=/snapshots
243+
- PORT=9126
228244
- SNAPSHOT_CI=1
245+
- DD_POOL_TRACE_CHECK_FAILURES=true
246+
- DD_DISABLE_ERROR_RESPONSES=true
247+
- ENABLED_CHECKS=trace_content_length,trace_stall,meta_tracer_version_header,trace_count_header,trace_peer_service,trace_dd_service
229248

230249
jobs:
231250
pre_check:
@@ -364,12 +383,14 @@ jobs:
364383
steps:
365384
- run_test:
366385
pattern: "tracer"
386+
trace_agent_url: ""
367387

368388
ci_visibility:
369389
<<: *contrib_job
370390
steps:
371391
- run_test:
372392
pattern: "ci_visibility"
393+
trace_agent_url: ""
373394

374395
sourcecode:
375396
<<: *contrib_job
@@ -423,6 +444,7 @@ jobs:
423444
store_coverage: false
424445
# We don't want to run the profile-diff venvs
425446
pattern: 'profile$'
447+
trace_agent_url: ""
426448

427449
integration_agent:
428450
<<: *machine_executor
@@ -449,6 +471,7 @@ jobs:
449471
snapshot: true
450472
store_coverage: false
451473
pattern: 'integration-snapshot'
474+
trace_agent_url: ""
452475

453476
vendor:
454477
<<: *contrib_job_small
@@ -476,6 +499,7 @@ jobs:
476499
- run_test:
477500
store_coverage: false
478501
pattern: 'ddtracerun'
502+
trace_agent_url: ""
479503

480504
test_logging:
481505
<<: *contrib_job
@@ -509,6 +533,7 @@ jobs:
509533
steps:
510534
- run_test:
511535
pattern: 'pylons'
536+
trace_agent_url: "http://localhost:8126"
512537

513538
aiohttp:
514539
<<: *machine_executor
@@ -568,7 +593,15 @@ jobs:
568593
- image: *ddtrace_dev_image
569594
- image: redis:4.0-alpine
570595
- image: *rabbitmq_image
571-
- *testagent
596+
- image: *testagent_image
597+
environment:
598+
- LOG_LEVEL=DEBUG
599+
- SNAPSHOT_DIR=/snapshots
600+
- PORT=9126
601+
- SNAPSHOT_CI=1
602+
- DD_POOL_TRACE_CHECK_FAILURES=true
603+
- DD_DISABLE_ERROR_RESPONSES=true
604+
- ENABLED_CHECKS=trace_stall,meta_tracer_version_header,trace_content_length,trace_peer_service,trace_dd_service # disable flaky content length check
572605
steps:
573606
- run_test:
574607
pattern: 'celery'

docker-compose.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,15 +137,18 @@ services:
137137
volumes:
138138
- ddagent:/tmp/ddagent:rw
139139
testagent:
140-
image: ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:v1.10.1
140+
image: ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:v1.11.0
141141
ports:
142142
- "127.0.0.1:9126:8126"
143143
volumes:
144144
- ./tests/snapshots:/snapshots
145145
environment:
146-
- LOG_LEVEL=WARNING
146+
- LOG_LEVEL=DEBUG
147147
- SNAPSHOT_DIR=/snapshots
148148
- SNAPSHOT_CI
149+
- DD_POOL_TRACE_CHECK_FAILURES=true
150+
- DD_DISABLE_ERROR_RESPONSES=true
151+
- ENABLED_CHECKS=trace_content_length,trace_stall,meta_tracer_version_header,trace_count_header,trace_peer_service,trace_dd_service
149152
vertica:
150153
image: sumitchawla/vertica
151154
environment:

scripts/get-test-agent-results.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
set +e # Disable exiting from testagent response failure
2+
SUMMARY_RESPONSE=$(curl -s -w "\n%{http_code}" -o summary_response.txt http://localhost:9126/test/trace_check/summary)
3+
set -e
4+
SUMMARY_RESPONSE_CODE=$(echo "$SUMMARY_RESPONSE" | awk 'END {print $NF}')
5+
6+
if [[ SUMMARY_RESPONSE_CODE -eq 200 ]]; then
7+
echo "APM Test Agent is running. (HTTP 200)"
8+
else
9+
echo "APM Test Agent is not running and was not used for testing. No checks failed."
10+
exit 0
11+
fi
12+
13+
RESPONSE=$(curl -s -w "\n%{http_code}" -o response.txt http://localhost:9126/test/trace_check/failures)
14+
RESPONSE_CODE=$(echo "$RESPONSE" | awk 'END {print $NF}')
15+
16+
if [[ $RESPONSE_CODE -eq 200 ]]; then
17+
echo "All APM Test Agent Check Traces returned successful! (HTTP 200)"
18+
echo "APM Test Agent Check Traces Summary Results:"
19+
cat summary_response.txt | jq '.'
20+
elif [[ $RESPONSE_CODE -eq 404 ]]; then
21+
echo "Real APM Agent running in place of TestAgent, no checks to validate!"
22+
else
23+
echo "APM Test Agent Check Traces failed with response code: $RESPONSE_CODE"
24+
echo "Failures:"
25+
cat response.txt
26+
echo "APM Test Agent Check Traces Summary Results:"
27+
cat summary_response.txt | jq '.'
28+
exit 1
29+
fi

tests/contrib/mongoengine/test.py

Lines changed: 27 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -193,42 +193,6 @@ def test_analytics_without_rate(self):
193193
assert len(spans) == 1
194194
assert spans[0].get_metric(ANALYTICS_SAMPLE_RATE_KEY) == 1.0
195195

196-
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"))
197-
def test_span_name_v0_schema(self):
198-
"""
199-
When a user specifies a service for the app
200-
The mongoengine integration should not use it.
201-
"""
202-
tracer = self.get_tracer_and_connect()
203-
Artist.drop_collection()
204-
205-
spans = tracer.pop()
206-
assert len(spans) == 1
207-
assert spans[0].name == "pymongo.cmd"
208-
209-
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"))
210-
def test_span_name_v1_schema(self):
211-
"""
212-
When a user specifies a service for the app
213-
The mongoengine integration should not use it.
214-
"""
215-
tracer = self.get_tracer_and_connect()
216-
Artist.drop_collection()
217-
218-
spans = tracer.pop()
219-
assert len(spans) == 1
220-
assert spans[0].name == "mongodb.query"
221-
222-
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"))
223-
def test_peer_service_tagging(self):
224-
tracer = self.get_tracer_and_connect()
225-
Artist.drop_collection()
226-
227-
spans = tracer.pop()
228-
assert len(spans) == 1
229-
assert spans[0].get_tag("mongodb.db") == "test"
230-
assert spans[0].get_tag("peer.service") == "test"
231-
232196

233197
class TestMongoEnginePatchConnectDefault(TracerTestCase, MongoEngineCore):
234198
"""Test suite with a global Pin for the connect function with the default configuration"""
@@ -251,7 +215,7 @@ def get_tracer_and_connect(self):
251215
return tracer
252216

253217

254-
class TestMongoEnginePatchConnectDefaultOnly(TestMongoEnginePatchConnectDefault):
218+
class TestMongoEnginePatchConnectSchematization(TestMongoEnginePatchConnectDefault):
255219
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc"))
256220
def test_user_specified_service_default(self):
257221
"""
@@ -337,6 +301,32 @@ def test_unspecified_service_v1(self):
337301
assert len(spans) == 1
338302
assert spans[0].service == DEFAULT_SPAN_SERVICE_NAME
339303

304+
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"))
305+
def test_span_name_v0_schema(self):
306+
"""
307+
When a user specifies a service for the app
308+
The mongoengine integration should not use it.
309+
"""
310+
tracer = self.get_tracer_and_connect()
311+
Artist.drop_collection()
312+
313+
spans = tracer.pop()
314+
assert len(spans) == 1
315+
assert spans[0].name == "pymongo.cmd"
316+
317+
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"))
318+
def test_span_name_v1_schema(self):
319+
"""
320+
When a user specifies a service for the app
321+
The mongoengine integration should not use it.
322+
"""
323+
tracer = self.get_tracer_and_connect()
324+
Artist.drop_collection()
325+
326+
spans = tracer.pop()
327+
assert len(spans) == 1
328+
assert spans[0].name == "mongodb.query"
329+
340330

341331
class TestMongoEnginePatchConnect(TestMongoEnginePatchConnectDefault):
342332
"""Test suite with a global Pin for the connect function with custom service"""

tests/contrib/pylibmc/test.py

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -286,28 +286,6 @@ def test_disabled(self):
286286
finally:
287287
tracer.enabled = True
288288

289-
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"))
290-
def test_operation_name_v0_schema(self):
291-
"""
292-
v0 schema: memcached.cmd
293-
"""
294-
client, tracer = self.get_client()
295-
client.set("a", "crow")
296-
spans = self.get_spans()
297-
assert len(spans) == 1
298-
assert spans[0].name == "memcached.cmd"
299-
300-
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"))
301-
def test_operation_name_v1_schema(self):
302-
"""
303-
v1 schema: memcached.command
304-
"""
305-
client, tracer = self.get_client()
306-
client.set("a", "crow")
307-
spans = self.get_spans()
308-
assert len(spans) == 1
309-
assert spans[0].name == "memcached.command"
310-
311289

312290
class TestPylibmcLegacy(TracerTestCase, PylibmcCore):
313291
"""Test suite for the tracing of pylibmc with the legacy TracedClient interface"""
@@ -393,7 +371,7 @@ def test_patch_unpatch(self):
393371
assert len(spans) == 1
394372

395373

396-
class TestPylibmcPatchServiceNames(TestPylibmcPatchDefault):
374+
class TestPylibmcPatchSchematization(TestPylibmcPatchDefault):
397375
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_SERVICE="mysvc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"))
398376
def test_user_specified_service_v0(self):
399377
"""
@@ -427,3 +405,25 @@ def test_user_specified_service_v1(self):
427405
spans = self.get_spans()
428406
assert len(spans) == 1
429407
assert spans[0].service == "mysvc"
408+
409+
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"))
410+
def test_operation_name_v0_schema(self):
411+
"""
412+
v0 schema: memcached.cmd
413+
"""
414+
client, tracer = self.get_client()
415+
client.set("a", "crow")
416+
spans = self.get_spans()
417+
assert len(spans) == 1
418+
assert spans[0].name == "memcached.cmd"
419+
420+
@TracerTestCase.run_in_subprocess(env_overrides=dict(DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"))
421+
def test_operation_name_v1_schema(self):
422+
"""
423+
v1 schema: memcached.command
424+
"""
425+
client, tracer = self.get_client()
426+
client.set("a", "crow")
427+
spans = self.get_spans()
428+
assert len(spans) == 1
429+
assert spans[0].name == "memcached.command"

tests/contrib/redis/test_redis.py

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -304,30 +304,6 @@ def test_env_user_specified_redis_service_v0(self):
304304
span = self.get_spans()[0]
305305
assert span.service == "mysvc", span.service
306306

307-
@TracerTestCase.run_in_subprocess(
308-
env_overrides=dict(DD_REDIS_SERVICE="myredis", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1")
309-
)
310-
def test_env_user_specified_redis_service_v1(self):
311-
self.r.get("cheese")
312-
span = self.get_spans()[0]
313-
assert span.service == "myredis", span.service
314-
315-
self.reset()
316-
317-
# Global config
318-
with self.override_config("redis", dict(service="cfg-redis")):
319-
self.r.get("cheese")
320-
span = self.get_spans()[0]
321-
assert span.service == "cfg-redis", span.service
322-
323-
self.reset()
324-
325-
# Manual override
326-
Pin.override(self.r, service="mysvc", tracer=self.tracer)
327-
self.r.get("cheese")
328-
span = self.get_spans()[0]
329-
assert span.service == "mysvc", span.service
330-
331307
@TracerTestCase.run_in_subprocess(
332308
env_overrides=dict(
333309
DD_SERVICE="app-svc", DD_REDIS_SERVICE="env-specified-redis-svc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v0"
@@ -346,24 +322,6 @@ def test_service_precedence_v0(self):
346322
span = self.get_spans()[0]
347323
assert span.service == "override-redis", span.service
348324

349-
@TracerTestCase.run_in_subprocess(
350-
env_overrides=dict(
351-
DD_SERVICE="app-svc", DD_REDIS_SERVICE="env-specified-redis-svc", DD_TRACE_SPAN_ATTRIBUTE_SCHEMA="v1"
352-
)
353-
)
354-
def test_service_precedence_v1(self):
355-
self.r.get("cheese")
356-
span = self.get_spans()[0]
357-
assert span.service == "env-specified-redis-svc", span.service
358-
359-
self.reset()
360-
361-
# Do a manual override
362-
Pin.override(self.r, service="override-redis", tracer=self.tracer)
363-
self.r.get("cheese")
364-
span = self.get_spans()[0]
365-
assert span.service == "override-redis", span.service
366-
367325

368326
class TestRedisPatchSnapshot(TracerTestCase):
369327

0 commit comments

Comments
 (0)