feat: adopt @sentry/api SDK for 37 of 40 API call sites#931
feat: adopt @sentry/api SDK for 37 of 40 API call sites#931MathurAditya724 wants to merge 22 commits into
Conversation
Add @sentry/api@^0.133.0 and migrate 28 of 40 API methods in SentryApiService from raw fetch (via requestJSON) to the typed SDK functions. Two helper methods added to SentryApiService: - getSdkConfig(opts?) — builds baseUrl + auth headers per call, supporting multi-region host overrides - unwrapSdkResult(result, context) — converts SDK discriminated-union results to the existing MCP error hierarchy (ApiError, ApiNotFoundError, ApiServerError, etc.) 17 direct replacements (no type casts needed): listOrganizations, getOrganization, listTeams, createTeam, listProjects, getProject, createProject, updateProject, addTeamToProject, createClientKey, listClientKeys, listReleases, listIssues, getEventForIssue, getLatestEventForIssue, listEventsForIssue, startAutofix, getAutofixState 11 replacements requiring type casts: searchReplays, getIssue, getIssueTagValues, getIssueExternalLinks, getReplayDetails, listReplayIdsForIssue, getReplayRecordingSegments, updateIssue, searchErrors, searchSpans, searchEvents 13 methods remain on requestJSON (no SDK equivalent): getAuthenticatedUser, regions endpoint, listTags, listTraceItemAttributes, event attachments, trace/profiling endpoints All Zod validation preserved — SDK results are unwrapped then passed through the existing schema.parse() calls. Error handling preserved via unwrapSdkResult mapping to existing error types.
|
fix-ci: starting attempt 1/3 |
Update 5 test files and 1 mock handler for compatibility with the @sentry/api SDK's Request-object-based fetch calls: - search-events, search-issue-events, search-issues: clear ANTHROPIC_API_KEY env var in tests to resolve agent provider conflicts that caused tests to take the wrong code path. Adjust MSW handler assertions for SDK parameter naming (limit vs per_page). - get-issue-tag-values: path traversal tests now verify that the SDK safely URL-encodes path params (../../../admin → ..%2F..%2Fadmin), neutralizing the attack vector at the SDK level. - mcp-server-mocks: remove request.json() call from addTeamToProject handler — the SDK sends POST with no body for this endpoint.
|
fix-ci: result — fixed 7 test failures across 5 test files. Root causes:
All 69 tests in the 5 affected files pass. Client unit tests (72/72) still pass. |
Biome's noDelete rule flags `delete process.env.X` as a performance concern. Use Reflect.deleteProperty() instead — same semantics, lint-clean.
Cross-referenced with CLI repo's migration patterns and found 3 behavioral regressions where query parameters were dropped during the SDK migration: - listTeams: restore per_page=25 and query filter params - listEventsForIssue: restore per_page (limit) and sort params - listOrganizations: restore per_page=25 across all 3 SDK call sites Also improved unwrapSdkResult error detail extraction: - Use JSON.stringify instead of String() to avoid [object Object] - Extract detail from nested error objects properly - Include context and status text in error messages (matching CLI pattern from infrastructure.ts throwApiError)
The improved error extraction now includes context and status text in the error message (getIssue: 404 Not Found) instead of the raw detail (The requested resource does not exist). Update the inline snapshot to match.
|
One f/u - i was hoping we'd be able to remove a bunch of typed schemas. Im not sure what we need to do to solve it, but it'd be great if @sentry/api had native zod structs that we could use that were either autogenerated or at minimum, we maintain them in one place vs here and cli etc |
Snapshot LLM provider env vars after dotenv loads and restore them after each test. This keeps search tool tests from leaking key changes when local Anthropic and OpenAI keys are both set. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
Pass replay environment arrays through to the Sentry API so multi-environment replay searches are not silently narrowed to the first environment. Remove duplicated test env restore blocks now that the shared setup restores managed LLM env vars after each test. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
Restore replay time range validation when routing through the Sentry API SDK and keep issue event sort serialization covered by tests. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
Start managed LLM environment variables unset for each mcp-core test and restore the original process environment after each test. Keep the OpenAI integration test explicit about reusing its captured real key. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
Assert invalid issue tag keys are rejected by the declared tool input schema instead of bypassing schema validation through direct handler calls. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
Replace hand-written Zod schemas with auto-generated ones from @sentry/api/zod where the generated schemas cover the same response shapes. Keep custom schemas for internal endpoints, recursive types, and schemas with transforms/preprocessors. Replaced: - AutofixRunSchema -> zAutofixPostResponse.passthrough() - EventsResponseSchema -> zOrganizationEventsResponseDict - ExternalIssueSchema/ExternalIssueListSchema -> zGroupExternalIssueResponse
Keep SDK-backed issue event requests aligned with the previous requestJSON behavior by omitting unset query params, preferring statsPeriod over absolute time ranges, and only sending full when requested. Normalize listProjects pagination to use a numeric per_page value and add focused regression coverage for issue event query serialization. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
…oject error detection createApiError checks the message param for multi-project access error patterns, but unwrapSdkResult was passing a generic context string instead of the actual API error text. This matches the behavior of the old request() path which passes data.detail as both message and detail.
Inspect API error detail text when classifying known permission failures so SDK-backed requests preserve the multi-project access guidance. Add regression coverage through an SDK-backed issue event request. Co-Authored-By: GPT-5 Codex <noreply@openai.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit eef83a3. Configure here.
eef83a3 to
67afdaa
Compare
67afdaa to
eef83a3
Compare
Bump @sentry/api from ^0.141.0 to ^0.171.0 and migrate 9 additional requestJSON call sites to typed SDK functions: - listTraceItemAttributes (via listTraceItemAttributes) - listEventAttachments (via listAnEvent_sAttachments) - getEventAttachment metadata (reuses listEventAttachments) - getTraceMeta (via retrieveTraceMetadata) - getTrace (via retrieveATrace) - getFlamegraph (via retrieveAFlamegraphForAnOrganization) - getTransactionProfile (via retrieveAProfile) - getProfileChunk (via retrieveProfileChunksForAnOrganization) - listReleases project-level (via listAProject_sReleases) - listIssues project-level (via listAProject_sIssues) Also fixes 3 type errors from SDK v0.171.0 type changes: - issue_id now expects number in getIssue/updateAnIssue - startAutofix body type narrowed Only 3 methods remain on requestJSON (no SDK equivalent): getAuthenticatedUser, regions fetch, listTags. Co-Authored-By: Claude (claude-opus-4-6)
The outer `as Parameters<typeof sdkFn>[0]` cast already overrides the entire options type, making the inner `as Record<string, unknown>` on the query property redundant. Removes 12 unnecessary casts. Co-Authored-By: Claude (claude-opus-4-6)
Merge main into feat/adopt-sentry-api-sdk, resolving conflicts in: - client.ts: merged schema/type imports from both branches, kept main's validateTraceItemAttributes and fetchTraceItemAttributesByType (new features), kept PR's project-scoped listIssues SDK path, removed unused sdkListTraceItemAttributes import - search-issues.test.ts: kept PR's informative SDK comment - search-events/utils.test.ts: aligned error message assertions with main's requestJSON error format (not SDK unwrapSdkResult format) - pnpm-lock.yaml: regenerated Co-Authored-By: Claude (claude-opus-4-6)
Replace the hand-written TagSchema object definition with
zTagKeyDetailsDict.pick({...}).transform(...) from @sentry/api/zod.
This keeps the base schema in sync with the upstream OpenAPI spec
while preserving the local transform that coalesces
totalValues/uniqueValues.
Uses .pick() to select only the 4 fields the transform needs,
avoiding validation of topValues inner elements which have stricter
nullability requirements than what the tags list endpoint returns.
Co-Authored-By: Claude (claude-opus-4-6)
getSdkConfig() was missing X-Sentry-MCP-Client-Id, X-Sentry-MCP-Client-Name, and X-Sentry-MCP-Client-Family headers that request() sends. All 37 SDK-migrated endpoints were silently dropping client identity tracking used for server-side analytics. Also normalizes searchReplays cast to match the Parameters<typeof> pattern used everywhere else and removes the now-unused Options type import. Co-Authored-By: Claude (claude-opus-4-6)
Bump @sentry/api to ^0.172.0 which exports the SdkResult type from getsentry/sentry-api-schema#74. The SDK functions return RequestResult whose conditional generic encoding (TData[keyof TData]) is not structurally assignable to SdkResult, so unwrapSdkResult keeps `any` for the parameter type. Updated the JSDoc to reference SdkResult as the runtime contract and explain why the type mismatch exists. Co-Authored-By: Claude (claude-opus-4-6)
Address Warden review findings:
- unwrapSdkResult now uses the API's detail text as the error message
when available (e.g. 'The requested resource does not exist') instead
of the internal context label ('getIssue: 404 Not Found'). Falls back
to the context-prefixed message when no detail is present.
- Remove dead code in listOrganizations: queryParams, queryString, and
path variables were left over from the pre-SDK migration and are no
longer referenced.
Co-Authored-By: Claude (claude-opus-4-6)

Adds
@sentry/api@^0.171.0and migrates 37 of 40 API methods inSentryApiServicefrom rawfetch(viarequestJSON) to the typed SDK functions. The remaining 3 methods use internal/undocumented endpoints with no SDK equivalent.What changed
Two helper methods added to
SentryApiService:getSdkConfig(opts?)— buildsbaseUrl+ auth headers per call, supporting multi-region host overridesunwrapSdkResult(result, context)— converts SDK discriminated-union results to the existing MCP error hierarchy (ApiError,ApiNotFoundError,ApiServerError, etc.)17 direct replacements (no casts)
listOrganizations,getOrganization,listTeams,createTeam,listProjects,getProject,createProject,updateProject,addTeamToProject,createClientKey,listClientKeys,listReleases,listIssues,getEventForIssue,getLatestEventForIssue,listEventsForIssue,startAutofix,getAutofixState11 replacements with type casts
searchReplays,getIssue,getIssueTagValues,getIssueExternalLinks,getReplayDetails,listReplayIdsForIssue,getReplayRecordingSegments,updateIssue,searchErrors,searchSpans,searchEvents9 new replacements (from SDK v0.171.0)
listTraceItemAttributes→listTraceItemAttributes(replacesfetchTraceItemAttributesByTypeprivate helper)listEventAttachments→listAnEvent_sAttachmentsgetEventAttachment— metadata vialistEventAttachments; binary download stays on rawrequest()getTraceMeta→retrieveTraceMetadatagetTrace→retrieveATrace(with cast forlimit/projectparams)getFlamegraph→retrieveAFlamegraphForAnOrganizationgetTransactionProfile→retrieveAProfilegetProfileChunk→retrieveProfileChunksForAnOrganizationlistReleases(project-level) →listAProject_sReleaseslistIssues(project-level) →listAProject_sIssues(with cast for extra query params)3 methods still on
requestJSONgetAuthenticatedUser, regions endpoint,listTags— no SDK equivalent exists for these.Preserved behavior
unwrapSdkResultmaps HTTP errors to the existingApiError/ApiNotFoundError/ApiServerErrortypesgetSdkConfigbuilds per-call base URLs fromopts.hostoverridesTesting
client.ts)client.test.ts: 72/72 passHttpHandlertype mismatches (not related to this PR)Dependencies
@sentry/api@^0.171.0— latest version, includes SDK wrappers for trace, profiling, project-level issues/releases, and event attachment endpoints