Commit db19fda
* feat: add GenAI agent trace enrichment to otel_traces processor
Always-on enrichment in otel_traces processor:
- Normalizes vendor attributes (OpenInference, OpenLLMetry) to gen_ai.* semconv
- Propagates select gen_ai attributes from child spans to root
- Aggregates token counts across children to root
- Strips conflicting flattened sub-keys
No configuration required. No-op for non-GenAI traces.
RFC: #6542
* fix: use OTelProtoOpensearchCodec storage key format in GenAI enrichment
OTelProtoOpensearchCodec converts span attribute keys from dot-notation
to a prefixed @ format before storing them in the JacksonSpan attributes
map (e.g. gen_ai.system -> span.attributes.gen_ai@system). The enrichment
code was using dot-notation for lookups and writes, so it silently found
nothing in production even though unit tests passed (tests bypass the codec).
Fix: add toStorageKey()/toLogicalKey() helpers that convert between the
two formats. All attribute reads and writes in enrichRootSpan,
normalizeAttributes, and stripFlattenedSubkeys now use the storage format.
Test fix: add convertToStorageFormat() helper that renames attribute keys
to simulate the codec, and storageFormatRecords() that applies it before
passing spans to the processor. JSON fixtures stay in dot-notation.
All GenAI tests now exercise the real code path.
E2E validated: LangGraph, Strands, CrewAI root spans now have gen_ai.*
attributes propagated correctly.
* refactor: address PR review comments on GenAiAttributeMappings and tests
- Make MappingTarget fields private with getKey()/isWrapSlice() getters
- Make LOOKUP_TABLE/OPERATION_NAME_VALUES private with static getters
- Add GenAiAttributeMappingsTest with direct coverage of getters and mappings
- Assert result/attrs non-empty in testFlattenedSubkeysStripped to prevent
silent pass when collections are empty
* test: add integration test verifying GenAI enrichment runs in OTelTraceRawProcessor.doExecute
Adds testGenAiEnrichmentRunsDuringDoExecute to OTelTraceRawProcessorTest.
Passes a span with OpenLLMetry vendor attributes through doExecute and
asserts the normalized gen_ai.* attribute appears on the output span,
verifying the enrichment call is wired into the processor pipeline.
* refactor: load GenAI attribute mappings from YAML resource file
Moves hardcoded attribute mappings from GenAiAttributeMappings.java into
genai-attribute-mappings.yaml in the jar resources. Loaded at class init
via Jackson YAML. This separates data from code and makes it easier to
add new instrumentation library mappings without modifying Java.
Covers OpenInference (15 mappings) and OpenLLMetry (20 mappings) profiles
plus operation_name_values. Adds testMappingsFileExists to verify the
resource file is present and readable.
* rename: wrapSlice -> wrapAsArray for clarity in GenAI attribute mappings
Renamed the flag that wraps a scalar string value into a single-element
JSON array from wrapSlice to wrapAsArray (Java) and wrap_as_array (YAML).
The new name makes the behavior immediately clear without needing context.
* revert: remove storage-key format from GenAI enrichment
Reverts the behavioral changes from 5ac188a which converted attribute
lookups and writes to use span.attributes.* prefix with @ separators
(e.g. span.attributes.gen_ai@system). The enrichment code now uses
plain dot-notation keys (e.g. gen_ai.system) matching the format in
the JacksonSpan attributes map at processing time.
Removed: toStorageKey(), toLogicalKey(), STORAGE_PREFIX, and the
convertToStorageFormat()/storageFormatRecords() test helpers.
Preserves accessor refactors (getKey(), isWrapAsArray(), getLookupTable())
and test assertions from subsequent commits.
Unit tests: 35/35 pass (full otel-trace-raw-processor module)
E2E: Strands + LangGraph agents → local DP → OpenSearch verified
* fix: add license header to genai-attribute-mappings.yaml
---------
(cherry picked from commit 6eb06fe)
Signed-off-by: Kyle Hounslow <kylhouns@amazon.com>
Co-authored-by: Kyle Hounslow <7102778+kylehounslow@users.noreply.github.com>
1 parent a2ffa98 commit db19fda
22 files changed
Lines changed: 1133 additions & 0 deletions
File tree
- data-prepper-plugins/otel-trace-raw-processor/src
- main
- java/org/opensearch/dataprepper/plugins/processor/oteltrace
- resources
- test
- java/org/opensearch/dataprepper/plugins/processor/oteltrace
- resources
Lines changed: 125 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 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
Lines changed: 222 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 | + | |
| 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 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
Lines changed: 3 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
102 | 105 | | |
103 | 106 | | |
104 | 107 | | |
| |||
0 commit comments