Skip to content

feat(feign-10.8): toolkit-generated feign HTTP client instrumentation [DO NOT MERGE]#11709

Draft
jordan-wong wants to merge 4 commits into
masterfrom
eval/feign-10.8-toolkit-attempt
Draft

feat(feign-10.8): toolkit-generated feign HTTP client instrumentation [DO NOT MERGE]#11709
jordan-wong wants to merge 4 commits into
masterfrom
eval/feign-10.8-toolkit-attempt

Conversation

@jordan-wong

Copy link
Copy Markdown
Contributor

Summary

Toolkit-generated greenfield instrumentation for Feign HTTP client v10.8+. Supersedes #10855 (Feign 8.0, stale) and closed #10980 (Feign 10.8, never independently verified under current methodology).

Generated module

dd-java-agent/instrumentation/feign/feign-10.8-generated/

  • FeignClientInstrumentation (sync Client.execute)
  • FeignAsyncClientInstrumentation (async AsyncClient.execute)
  • FeignClientDecorator extends HttpClientDecorator
  • RequestHeaderInjectAdapter (header injection for distributed tracing)
  • SpanFinishingCallback (async future completion handler)
  • Java tests with JUnit 5 (no Groovy — per R20)

Run details

Toolkit branch eval/java @ 757979b9
Workflow new_integration (default)
Maven coordinates io.github.openfeign:feign-core:10.8
Cost $26.95
Duration 78 min
Reviewer verdict approved=True, todos_fixed=2, todos_remaining=0

Research integrity disclosure

metadata/supported-configurations.json (4 entries: DD_TRACE_FEIGN_10_8_ENABLED, DD_TRACE_FEIGN_ANALYTICS_ENABLED, DD_TRACE_FEIGN_ANALYTICS_SAMPLE_RATE, DD_TRACE_FEIGN_ENABLED) was hand-added by the human operator AFTER the toolkit run. The toolkit's R29 rule that would produce these automatically was added later in the same session (commit 757979b9 on eval/java).

settings.gradle.kts line addition is a faithful replay of what the toolkit produced in the eval worktree.

Full caveats: see docs/eval-research/generated/feign-20260623/caveats.md in the apm-instrumentation-toolkit repo (eval/java branch).

Next steps

  1. CI must pass on the new module (especially :check, :muzzle, :instrumentationLatestDepTest)
  2. Domain expert review on RoutesInstrumentation — typo (please scrutinize sync vs async wrapping per R2, single-module rule per R3)
  3. If green + approved: close [DRAFT] APM AI Toolkit: Add Feign HTTP client instrumentation (v8.0+) 2nd run with add-apm-integrations.md #10855 and eval: feign-core 10.8 instrumentation (skill v2, sync+async, Run #6) #10980 as superseded

🤖 Generated with Claude Code

Toolkit-generated greenfield instrumentation for Feign HTTP client v10.8+.

Run details:
- Branch (toolkit): eval/java @ 757979b9
- Branch (worktree): eval/feign-blind-attempt1-20260623 in /Users/jordan.wong/dd-trace-java-eval-feign
- Workflow: new_integration, completed 2026-06-23
- Cost: $26.95, 78min, reviewer approved=True
- Maven coordinates: io.github.openfeign:feign-core:10.8

Generated module: dd-java-agent/instrumentation/feign/feign-10.8-generated/
- FeignClientInstrumentation (sync Client.execute)
- FeignAsyncClientInstrumentation (async AsyncClient.execute)
- FeignClientDecorator (HttpClientDecorator)
- RequestHeaderInjectAdapter (header injection for distributed tracing)
- SpanFinishingCallback (async future completion)
- Java tests (FeignClientTest, FeignAsyncClientTest) per R20

Supersedes #10855 (Feign 8.0, stale) and closed #10980 (Feign 10.8, never independently verified).

## Research integrity note

`metadata/supported-configurations.json` (4 entries: DD_TRACE_FEIGN_10_8_ENABLED,
DD_TRACE_FEIGN_ANALYTICS_ENABLED, DD_TRACE_FEIGN_ANALYTICS_SAMPLE_RATE,
DD_TRACE_FEIGN_ENABLED) was **hand-added** by the human operator AFTER the toolkit
run; the toolkit's R29 rule was added later in the same session (see commit 757979b9
on eval/java). This is documented in
docs/eval-research/generated/feign-20260623/caveats.md.

`settings.gradle.kts` line addition is a faithful replay of what the toolkit produced
in the eval worktree.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@dd-octo-sts

dd-octo-sts Bot commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

🟢 Java Benchmark SLOs — All performance SLOs passed

Suite Status
Startup 🟢 pass

SLO thresholds are defined here based on automatically generated metrics. A warning is raised when results are within 5% of the threshold.

PR vs. master results
Scenario Candidate master Δ (95% CI of mean)
startup:insecure-bank:iast:Agent 13.95 s 13.93 s [-0.6%; +0.8%] (no difference)
startup:insecure-bank:tracing:Agent 12.92 s 12.97 s [-1.1%; +0.2%] (no difference)
startup:petclinic:appsec:Agent 16.86 s 16.52 s [+1.0%; +3.1%] (significantly worse)
startup:petclinic:iast:Agent 16.95 s 16.96 s [-1.0%; +0.8%] (no difference)
startup:petclinic:profiling:Agent 16.76 s 16.95 s [-2.2%; -0.2%] (maybe better)
startup:petclinic:sca:Agent 16.97 s 16.88 s [-0.6%; +1.7%] (no difference)
startup:petclinic:tracing:Agent 15.96 s 16.07 s [-1.7%; +0.3%] (no difference)

Commit: 1a6fd6d2 · CI Pipeline · Benchmarking Platform UI


Load and DaCapo benchmarks can be triggered manually in the GitLab pipeline. Results will appear in the Benchmarking Platform UI after completion.

… name

The checkDecoratorAnalyticsConfigurations task requires ANALYTICS entries for
each instrumentation name returned by Decorator.instrumentationNames(), not
just the shared name. FeignClientDecorator returns ['feign', 'feign-10.8'];
the 'feign' analytics keys were already added, but 'feign-10.8' was missing.

Adds:
- DD_TRACE_FEIGN_10_8_ANALYTICS_ENABLED
- DD_TRACE_FEIGN_10_8_ANALYTICS_SAMPLE_RATE (type: decimal)

Locally verified ./gradlew checkConfigurations BUILD SUCCESSFUL.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
jordan-wong and others added 2 commits June 23, 2026 21:42
R31 — drop assertInverse from muzzle:
  versions = '[10.8,)' with assertInverse = true was failing because feign 10.6.0
  actually passes muzzle (FeignClientInstrumentation sync class doesn't need 10.8
  features; only FeignAsyncClientInstrumentation does). assertInverse asserts
  inverse versions FAIL muzzle — but 10.6.0 PASSES, so the auto-test failed.

  Conservative omission of assertInverse is correct here. The min version remains
  10.8 (compileOnly + muzzle pass range).

  Fixes: muzzle: [2/8] CI failure (muzzle-AssertFail-io.github.openfeign-feign-core-10.6.0).

R32 — '-generated' exclusion:
  Added 'feign-10.8-generated' to instrumentationNaming.exclusions in
  dd-java-agent/instrumentation/build.gradle. Fixes check-instrumentation-naming.

Local verification:
  ./gradlew :dd-java-agent:instrumentation:feign:feign-10.8-generated:muzzle BUILD SUCCESSFUL
  ./gradlew checkInstrumentationNaming BUILD SUCCESSFUL

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Spotless moved the trailing comment 'org-json does not use semver' to its
own line. Fixes dd-gitlab/spotless CI failure introduced by the R32 edit.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant