Commit fc6f5e4
skill(apm-integrations): add rules from recent reviews + refactor into sub references (#11760)
skill(add-apm-integrations): R13-R33 + Cat B (context-propagation) Step 4.4
Port reviewer-encoded rules from the toolkit's synced derivative
(`apm-integrations` skill in DataDog/apm-instrumentation-toolkit) back
to the canonical `add-apm-integrations` skill.
The toolkit accumulated 21+ numbered reviewer rules during eval research
(commits flowing through PR #11337 jedis-3.0, PR #11562 sparkjava-2.3,
PR #11717 commons-httpclient, PR #11709 feign, and PR #11506 RxJava 3).
These rules encode real failure modes observed during agent-generated
PRs and the fixes reviewers asked for.
Sections added:
- **Step 4.4** — Library category: span-creating vs context-propagation.
New axis that routes Cat B libraries (reactive, async, executors,
futures, actors) into a `context_propagation` codegen path producing
`InstrumenterModule.ContextTracking` instead of span-creating advice.
Includes the Flowable subscribe(FlowableSubscriber) overload rule
(hook the framework-internal overload, not the public wrapper).
- **Step 4.5** — Java naming consistency (module-name conventions).
R-rule placements:
- Step 4: R32 (dir name must end with version OR allowed suffix)
- Step 5: R13 (no single-type helper class for CallDepthThreadLocalMap)
R30 (preserve master's integration name when regenerating)
- Step 7: R15/R16/R17 (single delegate method, not all overloads)
R33 (no NullPointerException catches; use null-check guards)
- Step 9: R14 (test error/exception scenarios + spotless)
R18 (muzzle excludes incompatible majors)
R19 (latestDepTestImplementation range matches instrumented)
R20 (Java tests only; no new .groovy files)
R28 (compileOnly/testImplementation version split rationale)
R29 (register names in supported-configurations.json)
R31 (assertInverse only when declared min is true min)
- Step 4.4: R21-R27 (the Cat A vs Cat B classification + Cat B schema)
This PR pairs with toolkit-side PR DataDog/apm-instrumentation-toolkit#472
which adds the same content to the toolkit's synced derivative copy.
Both copies should stay in sync — this is the canonical home.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
skill(add-apm-integrations): clean up R-numbering and sub-step naming
Two cosmetic passes on the rule encoding ported from the toolkit's
synced derivative copy. Substantive content unchanged.
Pass 1 — strip R-numbering. The R13-R33 numbers are toolkit-internal
traceability tags that tie each rule to a specific reviewer comment on a
specific generated-PR review. They are meaningful to the toolkit-side
eval research workflow but meaningless to readers of the canonical
skill, who have no R1-R12 context here. Removes:
- '#### R<NN> — <title>' prefixes (14 sub-section headings)
- Inline '(R<NN>)', '(R<NN>/R<NN>/R<NN>)' parentheticals on existing
bullets that already convey the rule in their wording
- A stale cross-reference 'see R29 below' rewritten to 'see
"Register new integration names"'
The toolkit-side copy keeps the R-numbering — it remains the eval-research
home where the traceability matters. This is a one-way port convention.
Pass 2 — renumber half-steps so the decimals make sense. Was:
Step 4 → Step 4.4 → Step 4.5 → Step 5
implying missing 4.1, 4.2, 4.3. The original numbering was an artifact
of an earlier toolkit-side draft that had a 4.1-4.4 enumeration which
got collapsed. Renumbered to:
Step 4 → Step 4.1 → Step 4.2 → Step 5
Main integer steps (1-12) unchanged. Step 7.1 (Multiple advice classes
and @AppliesOn) left as-is since its decimal already makes sense
relative to Step 7.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): extract Category B routing to references/
Move the 62-line "Step 4.1 – Library category" section from SKILL.md
into references/category-b-context-propagation.md. SKILL.md keeps a
5-line stub linking to the reference file — enough context to know
when to read it, not enough to bury the rest of Step 4.
Preserves all content verbatim; no wording changes. Follows the
existing dd-trace-java skill convention of tracking specific
per-skill files (git add -f, matching the precedent set by
.claude/skills/migrate-groovy-to-java/QUALITY_RULES.md).
Part 1 of a refactor to slim the 794-line SKILL.md into a routing
overview (~250 lines target) with topic-oriented reference files.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): extract naming conventions to references/
Move two related naming rules from SKILL.md into
references/naming-conventions.md:
- Step 4's module-directory-name rule (must end with version or
"-common"/"-stubs"/"-iast" suffix)
- Step 4.2's Java filename ↔ class-name matching rule (with the
sanity-check script)
They belong together because both are enforcement rules for names.
SKILL.md keeps short stubs linking to the reference file.
Preserves all content verbatim. Part 2 of the SKILL.md slim.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): extract InstrumenterModule guidance to references/
Move Step 5's 103-line body from SKILL.md into
references/instrumenter-module.md, covering:
- @autoservice + narrow-interface preferences (ForSingleType >
ForKnownTypes > ForTypeHierarchy) with the interface-only API JAR
exception (JMS, JPA, JDBC, etc.)
- 'Must NOT do' — no static constants for one-shot methods
- instrumentationNames() version-qualified alias rule
- No helper class for single-target CallDepthThreadLocalMap
- Preserve master's integration name on regeneration
- Advanced: grouping multiple instrumentations under one module
SKILL.md keeps Step 5 as a 6-line summary + link. Preserves all
content verbatim; no wording changes. Part 3 of the SKILL.md slim.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): extract Advice class guidance to references/
Move Step 7's 149-line body from SKILL.md into
references/advice-class.md. This was the largest single-step body
in the skill and the highest-risk area to get wrong.
Reference file covers:
- Advice method annotations + parameter kinds
- Span lifecycle (enter/exit order)
- onExit resilience to onEnter throwing
- Explicit charset for byte[] to String
- No NullPointerException catches (SpotBugs enforces)
- Single-delegate-method instrumentation (not all overloads)
- @AppliesOn + multiple advice classes
- 'Must NOT do' list (no loggers, no lambdas, no inline=false, etc.)
SKILL.md keeps Step 7 as a summary + link. Preserves all content
verbatim. Part 4 of the SKILL.md slim.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): extract tests guidance to references/
Move Step 9's 'Instrumentation test' section + all its sub-rules
(no .groovy files, supported-configurations.json registration,
compileOnly/testImplementation version-split rationale,
prior-version-module inclusion) from SKILL.md into references/tests.md.
Muzzle content stays in place for now — it's a separate concern and
gets its own reference file next.
SKILL.md keeps Step 9.1 as a summary + link. Preserves all content
verbatim. Part 5 of the SKILL.md slim.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): extract muzzle guidance to references/
Move Step 9's 'Muzzle directives' section + all its sub-rules
(assertInverse gotchas, incompatible-major-version exclusion,
skipVersions for malformed release versions) from SKILL.md into
references/muzzle.md.
SKILL.md keeps Step 9.2 as a summary + link. Preserves all content
verbatim; no wording changes. Part 6 of the SKILL.md slim.
Final state: SKILL.md 794 → ~215 lines, split into 6 topic-oriented
reference files under references/.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
style(skill): add missing blank lines before Step/subsection headings
Cosmetic fixup after the section extractions. Three headings lost
their preceding blank line during the awk-based edits — restoring
them so the rendered Markdown reads cleanly.
No content changes.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): drop toolkit-internal 'Category A/B' language
The 'Category A' / 'Category B' labels came from toolkit-side research
where they were shorthand for the 'target_kind' Pydantic enum values.
They have no meaning in dd-trace-java on their own — a contributor
reading the skill has no context for what 'Category B' refers to.
Replace with the descriptive terms that already exist in dd-trace-java:
- 'span-creating instrumentation' — extends InstrumenterModule.Tracing
- 'context-tracking instrumentation' — extends InstrumenterModule.ContextTracking
(matches the class name + TargetSystem.CONTEXT_TRACKING enum)
Changes:
- Rename references/category-b-context-propagation.md → references/context-tracking.md
- Rewrite Step 4.1 stub in SKILL.md to drop Category A/B and 'target_kind'
- Rewrite context-tracking.md body from 'Category B target shape' Pydantic-
field enumeration to 'What a context-tracking instrumentation captures',
described in Java terms (boundary type, capture/restore points, wrapper
class, wrapper methods) instead of toolkit Pydantic field names
- Fix advice-class.md's stray 'context-propagation logic' → 'context-tracking
logic' to match dd-trace-java's TargetSystem.CONTEXT_TRACKING naming
No substantive guidance changed. Reference still points at rxjava-2.0 as
the canonical example.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
refactor(skill): remove toolkit-workflow language from reference files
Two remaining spots reframed from LLM-agent-workflow perspective to
dd-trace-java human-contributor perspective:
- muzzle.md 'Background' paragraph: 'a typical greenfield generation
produces...' + 'the agent picks the higher version...' → 'this
failure mode is common when a module has both a sync and async
instrumentation class' + 'declaring the higher version as the muzzle
min...'. Same technical content, no LLM-agent workflow assumption.
- tests.md 'How to discover' step: 'run the sample app' → 'run your
instrumentation test'. 'Sample app' was ambiguous ('the toolkit's
sample-app workflow step' vs 'your own test app'); the concrete
dd-trace-java term is 'instrumentation test'.
No substantive guidance changed. Preserves all rules verbatim.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
fix(skill): address review comments on #11760
Nine fixes from Copilot bot + @mcculls review comments:
SKILL.md
- Step 4 source layout: 'src/test/groovy/ — Spock tests' → 'src/test/java/
— JUnit 5 tests'. Contradicted Step 9.1's Java-only policy. (Copilot)
references/tests.md
- Rewrite the error-test example: 'List<List<SpanData>> traces = ...' used
OpenTelemetry's SpanData type (won't compile against dd-trace-java's
TEST_WRITER, which returns List<List<DDSpan>>). Now uses AgentSpan and
span.getTag() per mcculls's guidance that AgentSpan is enough for tests.
- Replace 'checkNewGroovyFiles' (unverifiable bot name) with the real
workflow: 'Enforce Groovy Migration'
(.github/workflows/enforce-groovy-migration.yaml). Both places.
- Default value in supported-configurations.json: change 'false' to 'true'
per mcculls — ~83% of typical integrations default to true; 'false' is
reserved for modules that override defaultEnabled() (OpenTelemetry,
Hazelcast, sparkjava). Add a note calling out the branching.
references/naming-conventions.md
- Remove gRPCInstrumentation as an example — it doesn't exist in the
codebase; the gRPC integration uses Grpc* (GrpcClientDecorator etc).
Reframe the section to acknowledge acronym casing is not uniform
across dd-trace-java and to defer to a reference instrumentation.
(Copilot)
- Drop the sanity-check bash script entirely. mcculls flagged that its
regex only matched 'class', missing enum/interface/@interface, and
would produce false MISMATCH lines for any such file (LogHandler.java,
ParameterCollector.java, etc.).
references/advice-class.md
- Rewrite the 'onExit resilient to onEnter throwing' section — the
claim that 'onThrowable = Throwable.class ensures exit fires even on
onEnter exception' was factually wrong. Per
docs/how_instrumentations_work.md:532-552, 'if the OnMethodEnter
method throws an exception, the OnMethodExit method is not invoked' —
unconditionally; onThrowable cannot override it. onThrowable controls
exit-on-target-method-throw, not exit-on-enter-throw. (mcculls)
- Add inline note that java.nio.charset.StandardCharsets is a java.nio.*
type and forbidden in bootstrap instrumentations (per the same file's
Must NOT list). In bootstrap advice, use the string charset name
('UTF-8') instead. (Copilot)
references/context-tracking.md
- Soften the 'rxjava-2.0 hooks subscribe(Observer)' statement. The
module's actual matcher is named('subscribe').and(takesArguments(1)),
matching any single-arg subscribe overload with the argument typed
as the base callback interface. Direct the reader at the module
source instead of copying overload names. (Copilot)
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
fix(skill): trim bootstrap note on charset to a single line
Copilot's suggestion was 'add an explicit note here'; the initial fix
was a full paragraph. Trimming to a single-sentence pointer since the
Must NOT list already carries the details.
Signed-off-by: Jordan Wong <jordan.wong@datadoghq.com>
review feedback
Fix docs inconsistencies
Rename skill to apm-integrations
remove redundant note
Renamed .claude/skills to .agents/skills and added symlink-style redirects for the old location
Align NIO docs advice with skill
Simplify SKILL
Fix constructor advice best-practice
Address codex comments
Co-authored-by: mcculls <stuart.mcculloch@datadoghq.com>
Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>1 parent 731a621 commit fc6f5e4
23 files changed
Lines changed: 801 additions & 294 deletions
File tree
- .agents/skills
- apm-integrations
- references
- migrate-groovy-to-java
- migrate-junit-source-to-tabletest
- review-groovy-migration
- techdebt
- .claude/skills
- add-apm-integrations
- docs
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
Lines changed: 109 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
0 commit comments