feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(server-utils): Add orchestrion aws-sdk channel integration core - #22142

Merged
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils
Jul 16, 2026
Merged

feat(server-utils): Add orchestrion aws-sdk channel integration core#22142
andreiborza merged 2 commits into
developfrom
ab/aws-sdk-server-utils

Conversation

@andreiborza

@andreiborzaandreiborza commented Jul 9, 2026

Copy link
Copy Markdown
Member

The integration subscribes to the orchestrion:<smithy-pkg>:send channels the transform injects into the smithy Client.prototype.send (@smithy/core, @smithy/smithy-client, @aws-sdk/smithy-client) and emits a client rpc span per command (rpc.system/rpc.method/rpc.service, cloud.region, request id metadata), with a distinct auto.aws.orchestrion.aws_sdk origin.

The per-service extension registry (span names, messaging/db/gen_ai attributes, trace propagation) starts empty and mirrors the OTel integration's ServiceExtension contract; the services are ported one group at a time in the follow-up PRs of this stack.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

User-facing differences to the vendored OTel instrumentation

  • span origin is auto.aws.orchestrion.aws_sdk instead of auto.otel.aws
  • spans started after SQS ReceiveMessage parent to the surrounding span instead of the receive span; receive-to-consumer linkage uses span links (messaging PR)
  • outgoing SQS/SNS/Lambda trace propagation uses sentry-trace/baggage message attributes instead of W3C headers (messaging PR)
  • errored spans may carry aws.request.id/aws.request.extended_id where the OTel path missed them ($metadata fallback)

Part of #20946

@github-actions

github-actionsBot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

PathSize% ChangeChange
@sentry/browser27.74 kB--
@sentry/browser - with treeshaking flags26.19 kB--
@sentry/browser (incl. Tracing)46.57 kB--
@sentry/browser (incl. Tracing + Span Streaming)48.36 kB--
@sentry/browser (incl. Tracing, Profiling)51.34 kB--
@sentry/browser (incl. Tracing, Replay)85.83 kB--
@sentry/browser (incl. Tracing, Replay) - with treeshaking flags75.46 kB--
@sentry/browser (incl. Tracing, Replay with Canvas)90.55 kB--
@sentry/browser (incl. Tracing, Replay, Feedback)103.18 kB--
@sentry/browser (incl. Feedback)44.92 kB--
@sentry/browser (incl. sendFeedback)32.54 kB--
@sentry/browser (incl. FeedbackAsync)37.67 kB--
@sentry/browser (incl. Metrics)28.84 kB--
@sentry/browser (incl. Logs)29.07 kB--
@sentry/browser (incl. Metrics & Logs)29.76 kB--
@sentry/react29.54 kB--
@sentry/react (incl. Tracing)48.82 kB--
@sentry/vue33.17 kB--
@sentry/vue (incl. Tracing)48.55 kB--
@sentry/svelte27.77 kB--
CDN Bundle30.14 kB--
CDN Bundle (incl. Tracing)48.52 kB--
CDN Bundle (incl. Logs, Metrics)31.72 kB--
CDN Bundle (incl. Tracing, Logs, Metrics)49.83 kB--
CDN Bundle (incl. Replay, Logs, Metrics)70.97 kB--
CDN Bundle (incl. Tracing, Replay)86.04 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics)87.33 kB--
CDN Bundle (incl. Tracing, Replay, Feedback)91.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics)93.09 kB--
CDN Bundle - uncompressed89.85 kB--
CDN Bundle (incl. Tracing) - uncompressed146.66 kB--
CDN Bundle (incl. Logs, Metrics) - uncompressed94.56 kB--
CDN Bundle (incl. Tracing, Logs, Metrics) - uncompressed150.64 kB--
CDN Bundle (incl. Replay, Logs, Metrics) - uncompressed219.28 kB--
CDN Bundle (incl. Tracing, Replay) - uncompressed265.86 kB--
CDN Bundle (incl. Tracing, Replay, Logs, Metrics) - uncompressed269.82 kB--
CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed279.56 kB--
CDN Bundle (incl. Tracing, Replay, Feedback, Logs, Metrics) - uncompressed283.52 kB--
@sentry/nextjs (client)51.38 kB--
@sentry/sveltekit (client)47 kB--
@sentry/core/server78.71 kB--
@sentry/core/browser65.08 kB--
@sentry/node-core63.2 kB-0.01%-1 B 🔽
@sentry/node125.45 kB--
@sentry/node (incl. diagnostics channel injection)143.61 kB+0.71%+1 kB 🔺
@sentry/node/import (ESM hook with diagnostics-channel injection)70.03 kB-0.01%-2 B 🔽
@sentry/node/light51.33 kB--
@sentry/node - without tracing74.7 kB--
@sentry/aws-serverless83.92 kB--
@sentry/cloudflare (withSentry) - minified182.1 kB--
@sentry/cloudflare (withSentry)450.9 kB--

View base workflow run

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 6b85478 to ca51438CompareJuly 9, 2026 21:22
@andreiborzaandreiborza changed the title feat(server-utils): Add orchestrion aws-sdk channel integrationfeat(server-utils): Add orchestrion aws-sdk channel integration coreJul 9, 2026
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/constants.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/index.ts Outdated
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 5 times, most recently from 61916ca to 828e59fCompareJuly 13, 2026 09:17
@andreiborza
andreiborza marked this pull request as ready for review July 13, 2026 12:02
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 13, 2026 12:02
@andreiborza
andreiborza requested review from JPeer264, isaacs and mydea and removed request for a teamJuly 13, 2026 12:02

@JPeer264JPeer264 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
Comment threadpackages/server-utils/src/integrations/tracing-channel/aws-sdk/utils.ts Outdated
Comment thread.oxlintrc.base.json
}
},
{
"files": ["**/integrations/tracing-channel/aws-sdk/**/*.ts"],

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

q: Any chance there is a way to not disable these entirely?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tightened this a bit, but kept no-explicit-any because it's used quite a bit.

* `@opentelemetry/semantic-conventions`), inlined here so the integration stays free of OTel deps.
* Attributes that exist in `@sentry/conventions/attributes` are imported from there instead;
* TODO(aws-sdk): the active attributes below are being added to sentry-conventions and should move
* to `@sentry/conventions/attributes` imports once a release containing them ships.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

to @sentry/conventions/attributes imports once a release containing them ships

Is there already a plan / PR to add them?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, they were added. We need to upgrade the conv package and switch over, but I'll do that at the end of this stack.

public constructor() {
// Per-service extensions, keyed by the client's `serviceId` (e.g. `'S3'`). Services without a
// registered extension still get the base rpc span from the subscriber.
this._services = new Map();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l/q: Wouldn't the following be the same? Then we could get rid of the constructor

exportclassServicesExtensionsimplementsServiceExtension{
#services =newMap<string,ServiceExtension>();
...
}

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, this code was taken verbatim from the vendored instrumentation but I'll adjust.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

# apparently uses an extra lookup so I just changed it to a private field in a3773ef

kind: requestMetadata.spanKind ?? SPAN_KIND.CLIENT,
// `rpc` matches what the exporter infers from `rpc.service` for the OTel aws-sdk spans;
// service extensions override it where inference yields a different op (DynamoDB: `db`).
op: requestMetadata.spanOp ?? 'rpc',

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

l: Maybe it is better to also guard against empty strings or general falsy values? Or is this not an issue here?

Suggested change
op: requestMetadata.spanOp??'rpc',
op: requestMetadata.spanOp||'rpc',

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, updated in 800d656

Comment threadpackages/server-utils/src/orchestrion/config/aws-sdk.ts Outdated
@andreiborza
andreiborza requested a review from a team as a code ownerJuly 14, 2026 10:15
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 88e502d to cdb3108CompareJuly 14, 2026 12:21

@isaacsisaacs left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM.

The OTel instrumentation was only added to the @sentry/aws-serverless SDK, but it is useable in other SDKS so the orchestrion version lives in server-utils now.

I love this :) We should make it available to other platforms.

expressIntegration: expressChannelIntegration,
graphqlIntegration: graphqlDiagnosticsChannelIntegration,
kafkajsIntegration: kafkajsChannelIntegration,
awsIntegration: awsChannelIntegration,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low/comment: I assume that eventually (once the stack completes) this will have coverage of the whole current awsIntegration. But, just a note to keep in mind, since as of this PR it's only partial, but wiring it in will fully disable the existing OTel integration, we might want to hold off on landing these (or at least, shipping them to production) until the full integration is covered.

Another approach would be to land the components in pieces, but only wire it in here once it's complete. If there's delays getting it finished, that might be safer, but tbh, just landing them all together in advance of a release is probably also fine.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, functionality will complete by the end of the gh stack and I'll only merge them in as a whole stack.

Good point though, I didn't consider that it will completely disable the otel integration without feature parity if we merge as is.

Anyway, I'll keep this open and merge the stack as a whole.

// The orchestrion aws-sdk channel integration has no service extensions yet (empty registry),
// so it can't emit the service-specific attributes asserted here. Stay on the OTel path until
// the service extensions land in a follow-up.
{ additionalDependencies, injectOrchestrion: false },

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low: I haven't seen the follow-up yet, so presumably it will be fully tested once it all lands (and if not, we can review/address it there), but this feels a little risky. I wouldn't gate on it, but it's a risk to make sure to address later.

Maybe overkill, but is it possible to add some tests that at least exercise the new code paths, even if it's just unit tests?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll merge this entire integration as a stack at once so I don't think it's worth the effort to implement here when the follow up PRs in the same stack are going to implement the actual tests.

If we were to merge this as a standalone I agree.

// open span).
let regionResult: string | Promise<string> | undefined;
try {
regionResult = clientConfig?.region?.();

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is fine, but an interesting wrinkle that might be worth calling out in the docs.

Since the AWS client itself calls config.region() to get the region, now we're invoking that twice. If it's cached, or just a string value, then that's fine. But if they're looking it up from EC2 metadata, then this would hit the endpoint twice. Probably fine, but potentially a performance/side-effect issue.

Technically we can delay the traced call the way the OTel middleware does, but it's gross and requires relying on orchestrion's mutable result swapping. I think the approach here is better, tbh, because it is more aligned with the paved-path of "define a tracing channel and just use it" rather than using orchestrion as a backdoor to monkeypatching. But if this becomes a problem in the future, that could be a way to address it.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 2 times, most recently from 1f13ab5 to 95b65ddCompareJuly 15, 2026 07:59
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 6 times, most recently from 83ad645 to 8889659CompareJuly 15, 2026 14:18

@cursorcursorBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 8889659. Configure here.

@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch 3 times, most recently from 75e28c4 to 54789f2CompareJuly 15, 2026 18:18
@andreiborza
andreiborzaforce-pushed the ab/aws-sdk-server-utils branch from 54789f2 to 298d80eCompareJuly 16, 2026 19:09
@andreiborza
andreiborza merged commit c406c07 into developJul 16, 2026
313 checks passed
@andreiborza
andreiborza deleted the ab/aws-sdk-server-utils branch July 16, 2026 19:59
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@andreiborza@isaacs@JPeer264