Commit 5f2e83a
authored
[SVLS-6907] feat: Support span dedup (#939)
## TL;DR
- Support deduping spans by span_id
- which fixes trace stats overcount issue for Node.js
## Problem
Node.js tracer sometimes sends duplicate traces to the extension,
causing over-count of trace stats. In our tests, the over-count is
usually 1–4 for 50, 500 or 5000 invocations. This only happens when the
"default" flushing strategy (which uses the "continuous" strategy) is
used, and doesn't happen when the "end" strategy is used.
## Cause of problem
I think it's similar to a known problem of continuous flushing.
- The known problem is, when Lambda runtime is frozen, the connection
between **extension** and **DD endpoint** can time out, causing data
flush failure.
- In the trace stats case, the problem is, when Lambda runtime is
frozen, the connection between **tracer** and **extension** can time
out. Extension receives the request from tracer, then freezes before
sending a response, causing the tracer's request to time out, which
makes the tracer resend the trace. This doesn't happen with the END
flush strategy because in that case, after the Lambda handler finishes,
extension still needs to flush the data and doesn't freeze so fast, and
it has enough time to respond to tracer.
## Testing
### Steps
- Build a test extension layer
- Run e2e tests, including:
- Install it on various Lambda functions
- Invoke these functions with various traffic pattern
- Check the trace stats result
### Result
**Before:**
- Over-count happens for (1) Node.js runtime + (2) "Sampling" test,
which uses the default flush strategy
- (vs expected 50)
<img width="1336" height="277" alt="Screenshot 2025-11-20 at 9 30 00 PM"
src="https://github.com/user-attachments/assets/3bf33c26-8996-43e4-8df5-7313247926b3"
/>
**After:**
- No over-count (vs expected 5000)
<img width="1447" height="421" alt="Screenshot 2025-11-20 at 9 25 32 PM"
src="https://github.com/user-attachments/assets/21576483-dbdc-499f-acc8-1801d3927b0b"
/>
## Options considered
1. **At most once**: Disable retry in tracer, at least for Lambda.
2. **At least once**
- 2.1 Do nothing. Call out this as a known limitation.
- 2.2 Treat tracer as VIP. Before calling /next, make sure tracer's
requests have been responded. This may cause regression on invocation
duration, especially when volume is high.
3. **Exactly once**: Implement dedup in extension, by trace_id.
This PR chooses 3 because it's the easiest.
## Notes
Thanks @astuyve @rochdev @purple4reina for discussion.
Thanks Cursor for writing most of the code.
The under-count issue will be addressed separately.
Related issue:
#6881 parent 6094949 commit 5f2e83a
File tree
7 files changed
+408
-16
lines changed- bottlecap
- src
- bin/bottlecap
- traces
7 files changed
+408
-16
lines changedSome generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
61 | 61 | | |
62 | 62 | | |
63 | 63 | | |
64 | | - | |
65 | | - | |
66 | | - | |
67 | | - | |
68 | | - | |
69 | | - | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
70 | 70 | | |
71 | 71 | | |
72 | 72 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
62 | 62 | | |
63 | 63 | | |
64 | 64 | | |
| 65 | + | |
65 | 66 | | |
66 | 67 | | |
67 | 68 | | |
| |||
1085 | 1086 | | |
1086 | 1087 | | |
1087 | 1088 | | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
1088 | 1092 | | |
1089 | 1093 | | |
1090 | 1094 | | |
| |||
1105 | 1109 | | |
1106 | 1110 | | |
1107 | 1111 | | |
| 1112 | + | |
1108 | 1113 | | |
1109 | 1114 | | |
1110 | 1115 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
| 8 | + | |
| 9 | + | |
8 | 10 | | |
9 | 11 | | |
10 | 12 | | |
| |||
| 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 | + | |
0 commit comments