feat: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee
, '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: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee
, '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: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee
, '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: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee
, '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: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee
, '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: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee
, '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: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee
, '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: telemetry for removed v2 interface imports (stacked on #6004) - #6006

Open
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry
Open

feat: telemetry for removed v2 interface imports (stacked on #6004)#6006
jam-jee wants to merge 2 commits into
aws:masterfrom
jam-jee:feat/v3-removed-interface-telemetry

Conversation

@jam-jee

Copy link
Copy Markdown
Collaborator

Issue #, if available: N/A

⚠️Stacked PR. This is based on #6004 (actionable guidance for removed v2 interfaces), not directly on master. The base branch is jam-jee:feat/v3-removed-module-guidance, so this PR's diff shows only the telemetry delta. Merge #6004 first, then this will be retargeted to master. Telemetry has nothing to instrument without the guidance code, hence the stack.

Description of changes:

Adds usage telemetry for the removed-v2-interface imports introduced in #6004 — so we can measure how often each removed interface (sagemaker.estimator, etc.) is still being imported in v3 and prioritize migration support.

  • New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed module name travels in x-extra, so one feature code covers all removed interfaces and you slice by module.
  • Removed imports have no sagemaker_session, so a session-less emit resolves account id + region best-effort and sends the same field to the same endpoint as the existing session-based emitter (no new data category — this is the same account-id field already collected on normal operations).
  • Strictly best-effort: hard time-bounded via a daemon worker (a slow/hung STS/S3 call can never delay the ModuleNotFoundError), once per module per process, and never raises.
  • Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded session-lessly via load_sagemaker_config()), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an additional env-var fallback.
  • Wired into raise_removed_in_v3 and the fallback finder via a lazily-imported, fully-guarded hook.

Testing done:

  • Extends tests/unit/test_removed_v2_modules.py (+8 telemetry tests, 44 total, all pass): dedup, opt-out via config and env var, time-bounding under a simulated 5s hang, never-raises, account fallback to NotAvailable, and the end-to-end import→hook path.
  • Verified end-to-end: a simulated 10s STS hang still lets the import raise in ~1.5s; a real TelemetryOptOut: true config file opts the emit out.
  • black + flake8 (repo tox.ini) clean.

Merge Checklist

General

  • I have read the CONTRIBUTING doc
  • I certify that the changes I am introducing will be backward compatible, and I have discussed concerns about this, if any, with the Python SDK team
    • Note for reviewers: account-id resolution happens on the import path (session-less). It is consistent with the existing telemetry's data collection, opt-out is honored, and it is hard-timeout-bounded. Data-quality caveat: account id will be NotAvailable in credential-less import environments.
  • I used the commit message format described in CONTRIBUTING
  • I have passed the region in to all S3 and STS clients that I've initialized as part of this change. (STS client uses tight timeouts; region resolved from the boto session, default us-west-2.)
  • I have updated any necessary documentation

Tests

  • I have added tests that prove my feature works
  • I have added unit tests as appropriate
  • I have checked that my tests are not configured for a specific region or account
  • I have used unique_name_from_base for integ resource names (N/A — unit tests only)
  • If adding any dependency in requirements.txt files, I have spell checked and ensured they exist in PyPi (N/A — botocore.config already a transitive dep)

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

jam-jee added 2 commits July 8, 2026 20:42
In v3 the v2 top-level modules (sagemaker.estimator, sagemaker.model, ...)
were removed, so importing them fails with a bare
"ModuleNotFoundError: No module named 'sagemaker.estimator'" that gives the
caller no path forward. This adds an actionable migration experience.
- raise_removed_in_v3() helper in sagemaker.core.deprecations: emits a
DeprecationWarning and raises a ModuleNotFoundError naming the v3
replacement (and the exact import where the migration guide publishes
one), plus the migration-guide link.
- 12 curated "tombstone" modules under sagemaker/ for the high-traffic
removed interfaces (estimator, model, predictor, base_predictor,
predictor_async, transformer, tuner, processing, pipeline,
multidatamodel, automl, algorithm). These ship with sagemaker-core.
- A fallback meta-path finder (_RemovedV2ModuleFinder) registered from
sagemaker.core.__init__ as a last resort: any other removed
sagemaker.<name> gets a generic "not available in v3, see migration
guide" message instead of a bare error. Appended to sys.meta_path so it
never shadows real v3 packages or the tombstones, with a
_KNOWN_V3_TOPLEVEL guard protecting real packages
(core/train/serve/mlops/lineage/ai_registry).
Adds tests/unit/test_removed_v2_modules.py (36 tests) covering tombstone
messages and the fallback finder (registration, ordering, non-shadowing of
real packages, pass-through of non-sagemaker and nested names).
Track how often removed v2 interfaces are imported in v3, building on the
actionable-guidance change (raise_removed_in_v3 + the fallback finder).
- New Feature.DEPRECATED_V2_INTERFACE (code 21); the specific removed
module name travels in x-extra so one feature code covers all of them.
- Removed imports have no sagemaker_session, so a session-less emit
resolves account id + region best-effort and sends the same field to the
same endpoint as the existing session-based emitter (no new data
category).
- Strictly best-effort: hard time-bounded via a daemon worker so it can
never delay the import, once-per-module-per-process, and never raises.
- Opt-out honors the standard TelemetryOptOut SDK-defaults config (loaded
session-lessly), with SAGEMAKER_DEPRECATION_TELEMETRY_OPT_OUT as an
additional env-var fallback.
- Wires the emit into raise_removed_in_v3 and the fallback finder via a
lazily-imported, fully-guarded hook.
Extends tests/unit/test_removed_v2_modules.py (+8 tests, 44 total) covering
dedup, opt-out via config and env var, time-bounding under a simulated
hang, never-raises, account fallback, and the end-to-end import hook.
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.

1 participant

@jam-jee