-
Notifications
You must be signed in to change notification settings - Fork 307
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
[serverless] Add S3 Span Pointers #4875
base: master
Are you sure you want to change the base?
Conversation
40640b8
to
6094019
Compare
Overall package sizeSelf size: 8.01 MB Dependency sizes| name | version | self size | total size | |------|---------|-----------|------------| | @datadog/libdatadog | 0.2.2 | 29.27 MB | 29.27 MB | | @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 | 3.0.1 | 1.06 MB | 1.46 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 |
BenchmarksBenchmark execution time: 2024-11-15 21:56:03 Comparing candidate commit 6e7d38f in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 259 metrics, 7 unstable metrics. |
AWS = require(`../../../versions/${s3ClientName}@${version}`).get() | ||
|
||
s3 = new AWS.S3({ endpoint: 'http://127.0.0.1:4567', s3ForcePathStyle: true, region: 'us-east-1' }) | ||
s3 = new AWS.S3({ endpoint: 'http://127.0.0.1:4566', s3ForcePathStyle: true, region: 'us-east-1' }) |
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.
The port here was wrong
492496e
to
7cba2af
Compare
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #4875 +/- ##
============================================
Coverage ? 58.76%
============================================
Files 0 280 +280
Lines 0 13017 +13017
============================================
+ Hits 0 7649 +7649
- Misses 0 5368 +5368 ☔ View full report in Codecov by Sentry. |
// Fix for LocationConstraint issue - only for SDK v2 | ||
if (s3ClientName === 'aws-sdk') { | ||
s3.api.globalEndpoint = '127.0.0.1' | ||
} |
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.
Fixes an issue with localstack. I followed the 'quick workaround' mentioned in this LocalStack comment
2cee24b
to
f2dc82f
Compare
/** | ||
* Generates a unique hash for an S3 object using its bucket name, key, and ETag | ||
* https://github.com/DataDog/dd-span-pointer-rules/blob/main/AWS/S3/Object/README.md | ||
* @param {string} bucketName - The name of the S3 bucket containing the object | ||
* @param {string} objectKey - The full path/key of the object in the bucket | ||
* @param {string} eTag - The ETag value from S3, which may be wrapped in quotes | ||
* @returns {string|null} A hash uniquely identifying the S3 request, or null if missing parameters. | ||
*/ |
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.
Adding detailed comments here, since this function is public API and will be used in datadog-lambda-js
after(done => { | ||
s3.deleteBucket({ Bucket: bucketName }, () => { | ||
done() | ||
}) |
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.
No need to do this, since we already call
after(async () => {
await resetLocalStackS3()
…ultipartUpload` requests.
f2dc82f
to
2a7a3d5
Compare
2a7a3d5
to
4ca5b30
Compare
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.
some notes, though mostly on the span pointers and their api. the javascript looks fine to my inexpert eyes
…s for trace+span id; add debug logs
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.
looks good from the span pointer perspective! i'll leave the js-specific things to other reviewers, though.
Mainly looks good to me just need some unit tests for addSpanPointer to increase code coverage in these files: packages/dd-trace/test/noop.spec.js |
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.
Sorry, accidentally approved the changes. Just need unit tests in the above files and then it should be good
1536b1f
to
a7c44f3
Compare
a7c44f3
to
346ec99
Compare
Added tests for two files, but I don't think it makes sense to add tests to |
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.
still looks fine, though i've added some structural comments after seeing how this is used in the lambda layer
* @param {string} eTag - The ETag value from S3, which may be wrapped in quotes | ||
* @returns {string} A hash uniquely identifying the S3 request. | ||
*/ | ||
function generateS3PointerHash (bucketName, objectKey, eTag) { |
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.
a little weird that we have an aws s3-specifc funciton here in a file that seems to be general span pointers code?
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.
Agreed, I will create a single generateHash
function and separate whatever parameters are provided with a pipe. That way I can reuse it once I get to dynamo
…wnstream callers don't have to worry about passing it.
4faec6f
to
a0ce63e
Compare
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.
Some minor comments, everything else looks good
const SPAN_POINTER_DIRECTION = Object.freeze({ | ||
UPSTREAM: 'u', | ||
DOWNSTREAM: 'd' | ||
}) |
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.
NIT: can we move these constants to: packages/dd-trace/src/constants.js
* @param {string[]} components - Array of strings to hash | ||
* @returns {string} A 32-character hash uniquely identifying the components | ||
*/ | ||
function generatePointerHash (components) { |
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.
NIT: rather then adding a new file, would it make more sense for this function to be in:
packages/datadog-plugin-aws-sdk/src/base.js
Or
packages/dd-trace/src/util.js
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.
We can't do base.js because we need to access it from dd-trace in https://github.com/DataDog/datadog-lambda-js, but we can move it to util.js!
What does this PR do?
Adds span pointers in S3 for
putObject
,copyObject
, andcompleteMultipartUpload
requests.Span pointers are similar to Span Links, but for cases when it is impossible to pass the Trace ID and Span ID between the spans that need to be linked.
When the calculated hashes for the upstream and downstream lambdas match, the Datadog backend will automatically link the two traces together.
When clicking on the linked span, a new tab opens linking to the downstream Lambda function that was triggered by this S3 object update.Motivation
This feature already exists in Python, and I'm working on adding it to all other runtimes (Node, .NET, Java, Golang).
Testing Guidelines
Easy: Checkout this span, enable the feature flag, and you will see that it's pointing to the downstream Lambda.
Run this Lambda function with the event payload
and change one of the bools to true. Also, try both with AWS SDK v2 and v3. Enable the span pointers feature flag, and check Datadog to ensure that the spans are properly linked.
I also added tests:
Additional Notes
packages/dd-trace/src/span_pointers.js
is a public API, sincedatadog-lambda-js
will reuse the exported fields.