-
Notifications
You must be signed in to change notification settings - Fork 309
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Baggage support #4563
Baggage support #4563
Conversation
Overall package sizeSelf size: 7.81 MB Dependency sizes| name | version | self size | total size | |------|---------|-----------|------------| | @datadog/native-appsec | 8.2.1 | 19.18 MB | 19.19 MB | | @datadog/native-iast-taint-tracking | 3.2.0 | 13.9 MB | 13.91 MB | | @datadog/pprof | 5.4.1 | 9.76 MB | 10.13 MB | | protobufjs | 7.2.5 | 2.77 MB | 5.16 MB | | @datadog/native-iast-rewriter | 2.5.0 | 2.51 MB | 2.65 MB | | @opentelemetry/core | 1.14.0 | 872.87 kB | 1.47 MB | | @datadog/native-metrics | 2.0.0 | 898.77 kB | 1.3 MB | | @opentelemetry/api | 1.8.0 | 1.21 MB | 1.21 MB | | import-in-the-middle | 1.11.2 | 112.74 kB | 826.22 kB | | msgpack-lite | 0.1.26 | 201.16 kB | 281.59 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | lru-cache | 7.18.3 | 133.92 kB | 133.92 kB | | pprof-format | 2.1.0 | 111.69 kB | 111.69 kB | | @datadog/sketches-js | 2.1.0 | 109.9 kB | 109.9 kB | | semver | 7.6.3 | 95.82 kB | 95.82 kB | | lodash.sortby | 4.7.0 | 75.76 kB | 75.76 kB | | ignore | 5.3.1 | 51.46 kB | 51.46 kB | | int64-buffer | 0.1.10 | 49.18 kB | 49.18 kB | | shell-quote | 1.8.1 | 44.96 kB | 44.96 kB | | istanbul-lib-coverage | 3.2.0 | 29.34 kB | 29.34 kB | | rfdc | 1.3.1 | 25.21 kB | 25.21 kB | | tlhunter-sorted-set | 0.1.0 | 24.94 kB | 24.94 kB | | limiter | 1.1.5 | 23.17 kB | 23.17 kB | | dc-polyfill | 0.1.4 | 23.1 kB | 23.1 kB | | retry | 0.13.1 | 18.85 kB | 18.85 kB | | jest-docblock | 29.7.0 | 8.99 kB | 12.76 kB | | crypto-randomuuid | 1.0.0 | 11.18 kB | 11.18 kB | | koalas | 1.0.2 | 6.47 kB | 6.47 kB | | path-to-regexp | 0.1.10 | 6.38 kB | 6.38 kB | | module-details-from-path | 1.0.3 | 4.47 kB | 4.47 kB |🤖 This report was automatically generated by heaviest-objects-in-the-universe |
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## master #4563 +/- ##
===========================================
- Coverage 68.58% 54.77% -13.81%
===========================================
Files 12 125 +113
Lines 818 3980 +3162
===========================================
+ Hits 561 2180 +1619
- Misses 257 1800 +1543 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens when there is a conflict between a Datadog baggage and an OpenTelemetry baggage?
@@ -36,13 +36,15 @@ class DatadogSpanContext { | |||
? this._trace.tags[TRACE_ID_128] + this._traceId.toString(16).padStart(16, '0') | |||
: this._traceId.toString(16).padStart(32, '0') | |||
} | |||
// if (!this._traceId) return '' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Dead code should be removed and not just commented out.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
will do
when the new baggage propagation style this PR proposes comes into conflict with existing baggage propagation, the existing style takes precedence. Is this what you are asking? |
let buf = Buffer.from(baggage) | ||
if (buf.length > this._config.baggageMaxBytes) { | ||
const originalBaggages = baggage.split(',') | ||
buf = buf.subarray(0, this._config.baggageMaxBytes) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While this code looks mostly correct, there's an edge case in buf.subarray(0, this._config.baggageMaxBytes)
where we could theoretically split a multi-byte unicode character and end up with invalid UTF-8 bytes. I imagine if this happens the buf.toString('utf8')
below would fail.
BUT, I don't think this will actually ever happen because we should never get multi-byte characters here, since we should have encoded all of them already with encodeURIComponent(key)
above.
So now I'm thinking, if all characters in the string are guaranteed to be 1-byte ASCII characters after encoding, do we need even need Bugger.from(baggage)
and buf.toString('utf8')
? Or can we use the string's length directly without converting to UTF-8 bytes and back?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As a suggestion for my comment above, I think you can keep a count of bytes like the way you already keep a count of items, and follow similar logic. Something like
// consider this pseudo-code 😅
let baggage = ''
let itemCounter = 0
let byteCounter = 0
for (const [key, value] of Object.entries(spanContext._baggageItems)) {
let item = `${...},` // "key=value,"
itemCounter += 1
byteCounter += item.length // all characters are 1 byte after uri-encoding
// stop adding baggage items if we reach either limit
if (itemCounter > maxItems || byteCounter > maxBytes) break
baggage += item
}
baggage = baggage.slice(0, baggage.length - 1)
// ...
it('should handle special characters in baggage', () => { | ||
const carrier = {} | ||
const baggageItems = { | ||
'",;\\()/:<=>?@[]{}': '",;\\' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we add non-ASCII characters like é
or 我
or 🐶
to ensure those are encoded correctly, too?
(I thought I added this comment before, but I don't see it. Sorry if it's a duplicate.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
oops merged before I saw your comments, will create a separate PR to address your comments
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we can simplify the code that handles the header's byte limit and add a few test cases, but aside from that LGTM!
What does this PR do?
Add support for baggage in datadog public api
Motivation
Plugin Checklist
Additional Notes