Replays Self-Serve Bulk Delete System#5
Conversation
This validates both the [Working Draft](https://www.w3.org/TR/reporting-1/#concept-reports) and the [Editor's Draft](https://w3c.github.io/reporting/#concept-reports) formats. Fixes [ID-730 - Accept current and upcoming data model](https://linear.app/getsentry/issue/ID-730/accept-current-and-upcoming-data-model).
…o 'low' (#93927)" This reverts commit 8d04522. Co-authored-by: roaga <47861399+roaga@users.noreply.github.com>
Missed in the initial commit, leading to some relevant logs being unannotated.
We have had a few tasks get killed at 10% rollout.
Also add a test, so that this doesn't happen again
Fixes DE-129 and DE-156 --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
These transitions should be matching
…` (#93946) Use `project_id` on the replay record instead of the URL (where it does not always exist). --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Also fixed `replay.view_html` -> `replay.view-html` --------- Co-authored-by: Michelle Zhang <56095982+michellewzhang@users.noreply.github.com>
…948) gets `npx @typescript/native-preview` passing again
This adds mode for all things tracing. This encompasses transactions/metrics/spans. Taken from https://github.com/getsentry/sentry/blob/feeaf393deeca8b97675bff23039c6320270aab5/src/sentry/runner/commands/devserver.py#L370
The conditions associated with a DCG can change over time, and it's good if we can be completely confident that they're consistent within a given task execution.
This is unused and most regex experiments have required broader changes to ensure that regexes are evaluated in a specific order (ex: traceparent). Removing this for now to simplify the code and very slightly improve runtime performance.
From some testing (on feedback lists of all different lengths), this prompt seems to work better. It doesn't write overly long sentences and also does a better job at "summarizing" versus just mentioning a few specific topics and leaving out others.
Just remove a couple custom Flex* classes in favor of the Flex primitive
This has been killed a few times. Refs SENTRY-42M7
…n table (#93892) <!-- Describe your PR here. --> [ticket](https://linear.app/getsentry/issue/ID-156/grouping-info-remove-type-field-from-ui) The Type field in the Grouping Info section of the issue details page was redundant. This removes the Type row from all variant types while keeping the underlying data structure intact. before  after 
### Changes Related to this PR: getsentry/sentry#93810. This is part 1 of the change, which is pulling out the new component and just adding it to the repo. Also includes some simplification of the logic in the base component. Part 2 will be replacing tables in widgets. ### Before/After There is no UI change as the table is not being used yet. There is a new story page for the component.
…93943) to prevent this issue from becoming too noisy, add a noise config
Unfortunately, 'event_data' went from being the variable for current event context to being the complete parsed data from Redis, and we continued logging it per group. That's more data than we should be logging even arguably once, let alone per group.
Co-authored-by: Abdullah Khan <abdullahkhan@PG9Y57YDXQ.local>
Adds some simple analytics to our endpoint so we can begin building a dashboard in Amplitude.
Previously, explore supported multiple y axis per chart, so each visualize supported multiple y axis. That functionality has since been removed for simplicity so update the types here to match. Keep in mind that saved queries still store them as an array so when serializing/deserializing, we still need to treat it as an array.
We'll need the `useGetTraceItemAttributeKeys` hook in other places so refactoring it so that it can exported.
- getsentry/sentry#93894 removed usage - getsentry/sentry-options-automator#4243 removed the last override
When the max segment ID is null the process fails. We should exit early since if there aren't any segments to delete there's nothing to do.
WalkthroughThis update introduces a broad set of changes across backend and frontend codebases. Major highlights include: a refactor of the visualization model in the Explore UI from supporting multiple y-axes per visualization to a single y-axis, new table widget visualization components and stories, enhanced error context integration for replay breadcrumb summaries, expanded feedback summary features, and improved input validation for browser reporting endpoints. Several backend tasks and options are updated, new analytics event handling is added, and numerous frontend components are refactored to use a shared Flex layout. Comprehensive test coverage accompanies these changes. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant UI as Explore UI
participant Backend
User->>UI: Selects a visualization
UI->>UI: Instantiates Visualize(yAxis: string)
UI->>Backend: Fetches data for yAxis
Backend-->>UI: Returns data for single yAxis
UI->>UI: Renders chart/table for single yAxis
sequenceDiagram
participant User
participant FeedbackSummary
participant API
User->>FeedbackSummary: Loads feedback list page
FeedbackSummary->>API: GET /organizations/{slug}/feedback-summary/
API-->>FeedbackSummary: Returns summary or error
FeedbackSummary-->>User: Shows summary or loading/error state
sequenceDiagram
participant ReplayEndpoint
participant Snuba
participant Nodestore
participant Seer
ReplayEndpoint->>Snuba: Query replay segments
ReplayEndpoint->>Snuba: Query error IDs within replay window
ReplayEndpoint->>Nodestore: Fetch error event details
ReplayEndpoint->>Seer: Send merged replay+error logs for summarization
Seer-->>ReplayEndpoint: Returns summary
Estimated code review effort🎯 5 (Critical) | ⏱️ ~90 minutes Poem
✨ Finishing Touches
🧪 Generate unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
✅ Actions performedReview triggered.
|
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
There was a problem hiding this comment.
Actionable comments posted: 7
🔭 Outside diff range comments (1)
static/app/views/codecov/tests/onboardingSteps/addUploadToken.tsx (1)
36-40:handleGenerateClickdoes not resetshowFullToken/ warning state – token never re-appears after a regenerate.
After the first “Done” clickshowFullTokenis set tofalse. Pressing “Regenerate” only flipsshowTokenDetails, leaving the UI stuck in the truncated-token state and with the warning permanently dismissed. Reset the other bits of state:const handleGenerateClick = () => { setShowTokenDetails(true); + setShowFullToken(true); // show full token again + setShowWarning(true); // show the one-time warning again };
🧹 Nitpick comments (16)
static/app/views/codecov/tests/onboardingSteps/addUploadToken.tsx (2)
77-85: Nested Flex wrappers are redundant – flatten to one container.
Both the outer and innerFlexuse the samejustify="space-between"/gap, creating unnecessary DOM depth and duplicated spacing. Dropping the inner wrapper keeps the layout identical.-<Flex justify="space-between" gap={space(1)}> - <Flex justify="space-between" gap={space(1)}> - <CodeSnippet dark>SENTRY_PREVENT_TOKEN</CodeSnippet> - <CodeSnippet dark>{FULL_TOKEN}</CodeSnippet> - </Flex> +<Flex justify="space-between" gap={space(1)}> + <CodeSnippet dark>SENTRY_PREVENT_TOKEN</CodeSnippet> + <CodeSnippet dark>{FULL_TOKEN}</CodeSnippet> <Button priority="primary" onClick={handleDoneClick}> {t('Done')} </Button> </Flex>
88-96: Same nesting duplication as above in the post-mask state.
Apply the same simplification here for consistency.-<Flex justify="space-between" gap={space(1)}> - <Flex justify="space-between" gap={space(1)}> - <CodeSnippet dark>SENTRY_PREVENT_TOKEN</CodeSnippet> - <CodeSnippet dark>{TRUNCATED_TOKEN}</CodeSnippet> - </Flex> +<Flex justify="space-between" gap={space(1)}> + <CodeSnippet dark>SENTRY_PREVENT_TOKEN</CodeSnippet> + <CodeSnippet dark>{TRUNCATED_TOKEN}</CodeSnippet> <Button priority="default" onClick={handleGenerateClick}> {t('Regenerate')} </Button> </Flex>static/app/components/events/groupingInfo/groupingVariant.tsx (1)
102-104: Drop the stray blank line to keep block compactA lone blank line was left behind after removing the “Type” logic. Trimming it keeps the switch-case visually consistent.
- component = variant.component; - + component = variant.component;static/app/components/feedback/feedbackSummary.tsx (1)
15-21: Consider consolidating early return conditions for better readability.The multiple conditions in the early return can be simplified and made more readable by extracting to a computed variable or using a more explicit structure.
+ const shouldHide = + !organization.features.includes('user-feedback-ai-summaries') || + tooFewFeedbacks || + isError; if ( - !organization.features.includes('user-feedback-ai-summaries') || - tooFewFeedbacks || - isError + shouldHide ) { return null; }static/app/views/dashboards/widgets/tableWidget/defaultTableCellRenderers.tsx (3)
27-31: Remove underscore prefix from used parameter.The
_columnIndexparameter is prefixed with an underscore indicating it's unused, but it's actually passed torenderTableHeadCellon line 31.function ( column: TabularColumn<keyof TabularRow>, - _columnIndex: number + columnIndex: number ): React.ReactNode { - const cell = renderTableHeadCell?.(column, _columnIndex); + const cell = renderTableHeadCell?.(column, columnIndex);
84-92: Remove unnecessary key prop from non-list element.The
keyprop is only needed when rendering arrays of elements. Since this function returns a single element, the key is unnecessary.return ( - <div key={`${rowIndex}-${columnIndex}:${column.name}`}> + <div> {fieldRenderer(dataRow, { organization, location, unit, theme, })} </div> );
99-104: Remove redundant type annotation in styled component.The type annotation in the template literal is redundant since TypeScript already knows the type from the generic parameter.
const CellWrapper = styled('div')<{align: Alignments}>` display: block; width: 100%; white-space: nowrap; - ${(p: {align: Alignments}) => (p.align ? `text-align: ${p.align};` : '')} + ${p => (p.align ? `text-align: ${p.align};` : '')} `;tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py (2)
518-524: Assert specific error message for invalid owner format.The test only checks that 'owner' key exists in the error response. Consider asserting the specific error message to ensure the validation is working as expected.
response = self.get_error_response( self.organization.slug, **data_with_invalid_owner, status_code=400, ) - assert "owner" in response.data + assert "owner" in response.data + # Verify the specific error message + assert "Invalid owner format" in str(response.data["owner"]) or \ + "Invalid actor" in str(response.data["owner"])
537-543: Assert specific error message for owner not in organization.Similar to the previous test, this should verify the specific error message about the owner not being in the organization.
response = self.get_error_response( self.organization.slug, **data_with_invalid_owner, status_code=400, ) - assert "owner" in response.data + assert "owner" in response.data + # Verify the specific error message about organization membership + assert "not found" in str(response.data["owner"]).lower() or \ + "not in organization" in str(response.data["owner"]).lower()static/app/views/explore/toolbar/toolbarVisualize.tsx (1)
188-196: Update aria-label to match new visualization model.The aria-label still references "overlay" which is no longer accurate after the refactor.
<Button borderless icon={<IconDelete />} size="zero" onClick={() => deleteOverlay(group)} - aria-label={t('Remove Overlay')} + aria-label={t('Remove Visualization')} />static/app/views/explore/hooks/useGetTraceItemAttributeKeys.tsx (1)
119-133: Consider renaming function to better indicate its purpose.The function name
isKnownAttributeis ambiguous. It returnstruefor attributes that should be skipped, not just known ones. A name likeshouldSkipAttributeorisInternalAttributewould be clearer.-function isKnownAttribute(attribute: Tag) { +function shouldSkipAttribute(attribute: Tag) { // For now, skip all the sentry. prefixed attributes as they // should be covered by the static attributes that will be // merged with these results. // For logs we include sentry.message.* since it contains params etc. if ( attribute.key.startsWith('sentry.message.') || attribute.key.startsWith('tags[sentry.message.') ) { return false; } return attribute.key.startsWith('sentry.') || attribute.key.startsWith('tags[sentry.'); }And update the usage:
- if (isKnownAttribute(attribute)) { + if (shouldSkipAttribute(attribute)) {tests/snuba/api/endpoints/test_organization_events_stats.py (1)
3086-3190: LGTM: Well-structured logs test class implementation.The new
OrganizationEventsStatsTopNEventsLogsclass follows the same pattern as the spans test class and provides appropriate test coverage for logs functionality. The implementation correctly:
- Inherits from the appropriate test case classes including
OurLogTestCase- Sets up synthetic log data with varying message bodies and counts
- Tests the top N events API functionality for the logs dataset
- Validates both response structure and data correctness
The test logic for counting expected messages and verifying the API response is thorough and follows established patterns.
Minor optimization suggestion: The microsecond-level timestamp differences in the log creation loop (lines 3099, 3107, 3114, etc.) add complexity but may not be necessary for this test. Consider using simpler timestamp increments unless the microsecond precision is specifically being tested.
static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (1)
37-82: Well-implemented refactor to single y-axis pattern.The
Visualizeclass refactor is clean and maintains backward compatibility through thetoJSONmethod. ThefromJSONmethod correctly transforms the stored format to individual instances.Consider documenting why the
stackproperty is hardcoded to'all':constructor(yAxis: string, options?: VisualizeOptions) { this.yAxis = yAxis; this.label = options?.label || ''; this.selectedChartType = options?.chartType; this.chartType = this.selectedChartType ?? determineDefaultChartType([yAxis]); + // Stack is always 'all' for single y-axis visualizations this.stack = 'all'; }src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py (3)
52-101: Well-implemented error context integration with proper feature toggling.The implementation correctly:
- Queries replay instance to get associated error IDs
- Provides a query parameter to disable error fetching
- Safely handles missing data with appropriate defaults
One suggestion: Consider adding error handling around the
query_replay_instancecall to handle potential failures gracefully.
104-124: Robust error fetching with proper exception handling.The function correctly:
- Uses nodestore to fetch event data efficiently
- Handles exceptions gracefully with SDK capture
- Filters out None values safely
Minor suggestion: Consider adding logging when exceptions occur for better debugging.
126-132: Consider formatting the timestamp for better readability.The current implementation shows the raw timestamp value. Consider formatting it as a human-readable date/time string.
- return f"User experienced an error: '{title}: {message}' at {timestamp}" + from datetime import datetime + formatted_time = datetime.fromtimestamp(timestamp).isoformat() + return f"User experienced an error: '{title}: {message}' at {formatted_time}"
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (106)
devservices/config.yml(4 hunks)src/sentry/constants.py(1 hunks)src/sentry/feedback/usecases/feedback_summaries.py(1 hunks)src/sentry/grouping/parameterization.py(2 hunks)src/sentry/hybridcloud/tasks/deliver_webhooks.py(3 hunks)src/sentry/integrations/github/integration.py(1 hunks)src/sentry/integrations/gitlab/integration.py(1 hunks)src/sentry/integrations/source_code_management/commit_context.py(2 hunks)src/sentry/issues/endpoints/browser_reporting_collector.py(4 hunks)src/sentry/issues/grouptype.py(1 hunks)src/sentry/migrations/0917_convert_org_saved_searches_to_views.py(1 hunks)src/sentry/migrations/0920_convert_org_saved_searches_to_views_revised.py(1 hunks)src/sentry/options/defaults.py(0 hunks)src/sentry/preprod/__init__.py(1 hunks)src/sentry/preprod/analytics.py(1 hunks)src/sentry/preprod/api/endpoints/organization_preprod_artifact_assemble.py(2 hunks)src/sentry/projectoptions/defaults.py(1 hunks)src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py(5 hunks)src/sentry/replays/usecases/delete.py(2 hunks)src/sentry/snuba/ourlogs.py(2 hunks)src/sentry/tasks/auth/check_auth.py(1 hunks)src/sentry/workflow_engine/endpoints/validators/base/detector.py(4 hunks)src/sentry/workflow_engine/processors/delayed_workflow.py(6 hunks)src/sentry/workflow_engine/processors/workflow.py(1 hunks)static/app/components/codeSnippet.tsx(2 hunks)static/app/components/codecov/branchSelector/branchSelector.tsx(2 hunks)static/app/components/codecov/datePicker/dateSelector.tsx(2 hunks)static/app/components/codecov/integratedOrgSelector/integratedOrgSelector.tsx(4 hunks)static/app/components/codecov/repoPicker/repoSelector.tsx(2 hunks)static/app/components/core/button/styles.chonk.tsx(1 hunks)static/app/components/events/eventAttachments.tsx(2 hunks)static/app/components/events/groupingInfo/groupingVariant.tsx(1 hunks)static/app/components/events/interfaces/spans/newTraceDetailsHeader.tsx(4 hunks)static/app/components/feedback/feedbackSummary.tsx(1 hunks)static/app/components/feedback/list/useFeedbackSummary.tsx(1 hunks)static/app/components/group/times.tsx(3 hunks)static/app/components/replays/breadcrumbs/breadcrumbItem.tsx(1 hunks)static/app/components/replays/timeAndScrubberGrid.tsx(4 hunks)static/app/components/scrollCarousel.tsx(1 hunks)static/app/utils/analytics/replayAnalyticsEvents.tsx(2 hunks)static/app/views/alerts/list/rules/alertRuleStatus.tsx(3 hunks)static/app/views/alerts/list/rules/row.tsx(3 hunks)static/app/views/codecov/tests/onboardingSteps/addUploadToken.tsx(2 hunks)static/app/views/dashboards/widgetCard/chart.tsx(4 hunks)static/app/views/dashboards/widgets/common/types.tsx(1 hunks)static/app/views/dashboards/widgets/tableWidget/defaultTableCellRenderers.tsx(1 hunks)static/app/views/dashboards/widgets/tableWidget/fixtures/sampleHTTPRequestTableData.ts(1 hunks)static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.spec.tsx(1 hunks)static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.stories.tsx(1 hunks)static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.tsx(1 hunks)static/app/views/explore/charts/index.tsx(4 hunks)static/app/views/explore/components/traceItemSearchQueryBuilder.tsx(2 hunks)static/app/views/explore/contexts/pageParamsContext/aggregateFields.tsx(4 hunks)static/app/views/explore/contexts/pageParamsContext/index.spec.tsx(17 hunks)static/app/views/explore/contexts/pageParamsContext/index.tsx(4 hunks)static/app/views/explore/contexts/pageParamsContext/sortBys.tsx(2 hunks)static/app/views/explore/contexts/pageParamsContext/visualizes.spec.tsx(3 hunks)static/app/views/explore/contexts/pageParamsContext/visualizes.tsx(4 hunks)static/app/views/explore/hooks/useAddToDashboard.tsx(2 hunks)static/app/views/explore/hooks/useAnalytics.tsx(5 hunks)static/app/views/explore/hooks/useExploreAggregatesTable.tsx(1 hunks)static/app/views/explore/hooks/useExploreTimeseries.tsx(3 hunks)static/app/views/explore/hooks/useGetTraceItemAttributeKeys.tsx(1 hunks)static/app/views/explore/hooks/useGetTraceItemAttributeValues.spec.tsx(4 hunks)static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx(3 hunks)static/app/views/explore/hooks/useTopEvents.tsx(1 hunks)static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx(2 hunks)static/app/views/explore/spans/spansTab.tsx(1 hunks)static/app/views/explore/tables/aggregateColumnEditorModal.spec.tsx(14 hunks)static/app/views/explore/tables/aggregateColumnEditorModal.tsx(4 hunks)static/app/views/explore/toolbar/index.spec.tsx(11 hunks)static/app/views/explore/toolbar/toolbarSaveAs.tsx(2 hunks)static/app/views/explore/toolbar/toolbarSortBy.tsx(1 hunks)static/app/views/explore/toolbar/toolbarVisualize.tsx(6 hunks)static/app/views/explore/types.tsx(1 hunks)static/app/views/explore/utils.spec.tsx(1 hunks)static/app/views/explore/utils.tsx(2 hunks)static/app/views/feedback/feedbackListPage.tsx(4 hunks)static/app/views/insights/common/components/chartActionDropdown.tsx(1 hunks)static/app/views/insights/pages/transactionNameSearchBar.tsx(2 hunks)static/app/views/organizationStats/teamInsights/teamMisery.tsx(3 hunks)static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx(2 hunks)static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx(4 hunks)static/app/views/performance/newTraceDetails/traceWaterfall.tsx(3 hunks)static/app/views/profiling/profileSummary/index.tsx(1 hunks)static/app/views/replays/detail/ai/index.tsx(2 hunks)static/app/views/settings/dynamicSampling/organizationSampleRateInput.tsx(4 hunks)static/app/views/settings/organizationAuditLog/auditLogList.tsx(2 hunks)static/app/views/settings/organizationIntegrations/detailedView/integrationLayout.tsx(2 hunks)static/app/views/settings/project/projectOwnership/codeOwnerFileTable.tsx(4 hunks)static/gsAdmin/views/instanceLevelOAuth/instanceLevelOAuthDetails.tsx(3 hunks)tests/js/fixtures/tabularColumn.ts(1 hunks)tests/js/fixtures/tabularColumns.ts(1 hunks)tests/sentry/api/endpoints/test_browser_reporting_collector.py(4 hunks)tests/sentry/api/endpoints/test_project_details.py(1 hunks)tests/sentry/api/serializers/test_project.py(1 hunks)tests/sentry/grouping/test_parameterization.py(1 hunks)tests/sentry/integrations/github/tasks/test_pr_comment.py(6 hunks)tests/sentry/integrations/gitlab/tasks/test_pr_comment.py(6 hunks)tests/sentry/migrations/test_0917_convert_org_saved_searches_to_views.py(0 hunks)tests/sentry/replays/tasks/test_delete_replays_bulk.py(1 hunks)tests/sentry/replays/test_project_replay_summarize_breadcrumbs.py(5 hunks)tests/sentry/workflow_engine/endpoints/test_organization_detector_details.py(1 hunks)tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py(1 hunks)tests/sentry/workflow_engine/processors/test_delayed_workflow.py(6 hunks)tests/snuba/api/endpoints/test_organization_events_stats.py(4 hunks)
💤 Files with no reviewable changes (2)
- tests/sentry/migrations/test_0917_convert_org_saved_searches_to_views.py
- src/sentry/options/defaults.py
🧰 Additional context used
🧬 Code Graph Analysis (37)
static/app/views/explore/utils.spec.tsx (1)
static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (1)
Visualize(37-83)
src/sentry/workflow_engine/processors/workflow.py (1)
src/sentry/workflow_engine/utils/log_context.py (1)
get_logger(71-77)
static/app/views/codecov/tests/onboardingSteps/addUploadToken.tsx (2)
static/app/components/codeSnippet.tsx (1)
CodeSnippet(71-208)static/app/components/core/button/index.tsx (1)
Button(24-70)
static/app/views/organizationStats/teamInsights/teamMisery.tsx (1)
static/app/views/insights/pages/backend/backendTable.tsx (1)
StyledIconStar(243-245)
static/app/components/replays/breadcrumbs/breadcrumbItem.tsx (1)
static/app/utils/analytics.tsx (1)
trackAnalytics(178-178)
static/app/views/explore/hooks/useGetTraceItemAttributeValues.spec.tsx (1)
static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx (1)
useGetTraceItemAttributeValues(78-131)
static/app/views/explore/components/traceItemSearchQueryBuilder.tsx (1)
static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx (1)
useGetTraceItemAttributeValues(78-131)
static/app/views/insights/pages/transactionNameSearchBar.tsx (1)
static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx (1)
useGetTraceItemAttributeValues(78-131)
static/app/components/codecov/integratedOrgSelector/integratedOrgSelector.tsx (2)
static/app/components/codecov/integratedOrgSelector/iconIntegratedOrg.tsx (1)
IconIntegratedOrg(9-28)static/app/components/core/compactSelect/control.tsx (1)
TriggerLabel(598-602)
static/app/views/explore/hooks/useExploreTimeseries.tsx (1)
static/app/views/explore/contexts/pageParamsContext/index.tsx (2)
groupBys(94-96)visualizes(98-100)
static/app/views/explore/toolbar/toolbarSortBy.tsx (1)
static/app/views/explore/contexts/pageParamsContext/index.tsx (1)
visualizes(98-100)
static/app/views/dashboards/widgets/tableWidget/fixtures/sampleHTTPRequestTableData.ts (1)
static/app/views/dashboards/widgets/common/types.tsx (1)
TabularData(71-74)
static/app/components/codecov/repoPicker/repoSelector.tsx (2)
static/app/components/codecov/repoPicker/iconRepository.tsx (1)
IconRepository(9-28)static/app/components/core/compactSelect/control.tsx (1)
TriggerLabel(598-602)
static/app/views/explore/toolbar/toolbarSaveAs.tsx (1)
static/app/views/explore/contexts/pageParamsContext/index.tsx (1)
visualizes(98-100)
static/app/views/replays/detail/ai/index.tsx (1)
static/app/components/codecov/summary.tsx (1)
SummaryContainer(140-144)
static/app/views/settings/dynamicSampling/organizationSampleRateInput.tsx (1)
static/app/views/traces/fieldRenderers.tsx (1)
Description(527-533)
static/app/components/replays/timeAndScrubberGrid.tsx (3)
static/app/utils/analytics.tsx (1)
trackAnalytics(178-178)static/app/components/core/button/buttonBar.tsx (1)
ButtonBar(16-22)static/app/components/core/button/index.tsx (1)
Button(24-70)
static/app/components/codecov/branchSelector/branchSelector.tsx (2)
static/app/components/codecov/branchSelector/iconBranch.tsx (1)
IconBranch(9-28)static/app/components/core/compactSelect/control.tsx (1)
TriggerLabel(598-602)
static/app/views/explore/contexts/pageParamsContext/sortBys.tsx (1)
static/app/views/explore/contexts/pageParamsContext/index.tsx (1)
visualizes(98-100)
tests/sentry/grouping/test_parameterization.py (1)
src/sentry/grouping/parameterization.py (1)
Parameterizer(271-359)
static/app/views/explore/hooks/useAddToDashboard.tsx (1)
static/app/views/explore/contexts/pageParamsContext/index.tsx (2)
visualizes(98-100)groupBys(94-96)
tests/sentry/api/endpoints/test_project_details.py (2)
tests/sentry/api/serializers/test_project.py (1)
project(834-835)src/sentry/testutils/cases.py (2)
feature(238-243)get_error_response(630-652)
static/app/views/explore/tables/aggregateColumnEditorModal.tsx (2)
static/app/views/explore/contexts/pageParamsContext/aggregateFields.tsx (1)
isVisualize(34-36)static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (2)
Visualize(37-83)DEFAULT_VISUALIZATION(21-21)
static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx (1)
static/app/views/explore/types.tsx (1)
UseTraceItemAttributeBaseProps(8-21)
src/sentry/integrations/github/integration.py (2)
src/sentry/integrations/source_code_management/commit_context.py (2)
get_merged_pr_single_issue_template(600-606)get_environment_info(584-597)src/sentry/integrations/gitlab/integration.py (2)
format_comment_url(246-247)format_comment_url(439-440)
static/app/views/explore/contexts/pageParamsContext/index.tsx (2)
static/app/views/explore/contexts/pageParamsContext/aggregateFields.tsx (2)
isVisualize(34-36)isBaseVisualize(21-28)static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (1)
BaseVisualize(32-35)
static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx (2)
static/app/views/explore/hooks/useGetTraceItemAttributeKeys.tsx (2)
makeTraceItemAttributeKeysQueryOptions(29-53)useGetTraceItemAttributeKeys(55-117)static/app/types/group.tsx (1)
TagCollection(342-342)
src/sentry/issues/endpoints/browser_reporting_collector.py (1)
src/sentry/api/api_owners.py (1)
ApiOwner(4-32)
tests/sentry/api/serializers/test_project.py (1)
src/sentry/api/serializers/models/project.py (7)
serialize(514-568)serialize(582-584)serialize(628-641)serialize(759-820)serialize(988-1128)serialize(1182-1189)DetailedProjectSerializer(960-1178)
static/app/views/explore/charts/index.tsx (1)
static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (1)
DEFAULT_VISUALIZATION(21-21)
tests/sentry/workflow_engine/endpoints/test_organization_detector_details.py (4)
src/sentry/users/models/user.py (1)
get_actor_identifier(287-288)tests/sentry/workflow_engine/endpoints/test_organization_workflow_details.py (1)
tasks(77-78)src/sentry/testutils/cases.py (1)
get_success_response(595-628)src/sentry/workflow_engine/models/detector.py (1)
Detector(42-129)
static/app/views/explore/contexts/pageParamsContext/visualizes.spec.tsx (1)
static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (1)
Visualize(37-83)
static/app/views/explore/hooks/useGetTraceItemAttributeKeys.tsx (3)
static/app/views/explore/types.tsx (1)
UseTraceItemAttributeBaseProps(8-21)static/app/types/core.tsx (1)
PageFilters(163-181)static/app/types/group.tsx (1)
TagCollection(342-342)
tests/sentry/replays/test_project_replay_summarize_breadcrumbs.py (4)
src/sentry/eventstore/models.py (3)
datetime(112-120)generate_node_id(278-285)message(104-109)src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py (4)
ErrorEvent(32-37)get_request_data(134-139)make_seer_request(184-208)get(52-101)src/sentry/replays/testutils.py (1)
mock_replay(148-244)src/sentry/testutils/cases.py (2)
TransactionTestCase(467-469)feature(238-243)
tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py (2)
src/sentry/users/models/user.py (1)
get_actor_identifier(287-288)src/sentry/testutils/cases.py (2)
get_success_response(595-628)get_error_response(630-652)
static/app/views/explore/hooks/useAnalytics.tsx (2)
static/app/views/explore/contexts/pageParamsContext/index.tsx (1)
visualizes(98-100)static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (1)
Visualize(37-83)
src/sentry/workflow_engine/processors/delayed_workflow.py (1)
src/sentry/workflow_engine/processors/data_condition_group.py (1)
get_slow_conditions_for_groups(46-58)
🔇 Additional comments (227)
static/app/views/codecov/tests/onboardingSteps/addUploadToken.tsx (1)
6-6: Import looks correct – thanks for standardizing on the shared Flex component.
No issues spotted here.static/app/components/events/groupingInfo/groupingVariant.tsx (1)
100-108: Confirm removal of the “Type” row – validate with design/PM before landingThe previous UI showed a “Type” entry with a tooltip for
COMPONENT,CUSTOM_FINGERPRINT,BUILT_IN_FINGERPRINT,SALTED_COMPONENT, andPERFORMANCE_PROBLEM.
With that code now deleted, users lose at-a-glance information about why a variant exists. If this was an intentional simplification, 👍 – otherwise we may have a silent regression in troubleshooting UX.Please double-check product requirements (or snapshot tests/storybook) to ensure the removal is desired.
static/app/views/insights/common/components/chartActionDropdown.tsx (1)
71-71: LGTM! Consistent referrer usage.Adding the
referrerproperty togetAlertsUrlimproves consistency with other URL generation functions in the component and provides better context for alert navigation tracking.static/app/components/scrollCarousel.tsx (1)
204-204: LGTM! Improved theme consistency.The change makes the gradient theme-aware by using
p.theme.backgroundinstead of hardcoded colors, ensuring proper visual consistency across different themes.static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx (2)
34-34: LGTM! Clean approach to hiding sensitive attributes.The
HIDDEN_ATTRIBUTESconstant provides a maintainable way to exclude internal attributes like'is_segment','project_id', and'received'from the user interface.
65-69: LGTM! Correct filtering logic implementation.The filtering logic properly excludes hidden attributes before applying the search filter, ensuring these internal attributes are never visible regardless of search terms.
src/sentry/preprod/analytics.py (2)
4-11: LGTM! Well-structured analytics event.The
PreprodArtifactApiAssembleEventfollows the standard Sentry analytics pattern with appropriate required and optional attributes for tracking artifact assembly operations.
14-14: LGTM! Proper event registration.The event is correctly registered with the analytics system.
static/app/views/replays/detail/ai/index.tsx (2)
59-59: LGTM! More reliable project ID retrieval.Using
replayRecord?.project_iddirectly is more reliable than parsing URL query parameters and simplifies the data flow.
90-96: LGTM! Improved error handling.The explicit error handling for missing projects prevents silent failures and provides clear feedback to users when the project cannot be found.
static/app/views/profiling/profileSummary/index.tsx (1)
338-346: LGTM: Type safety improvements enhance code clarity.The changes improve type safety by removing the
| undefinedunion and adding explicit parameter types to the arrow functions. This makes the code more maintainable and provides better IDE support while preserving the existing filtering logic.src/sentry/migrations/0920_convert_org_saved_searches_to_views_revised.py (1)
13-15: LGTM: Proper migration disabling with clear documentation.Converting the faulty migration to a no-op with an explanatory comment is the correct approach. The reference to the corrected migration (0921) provides clear guidance for future maintainers.
src/sentry/workflow_engine/endpoints/validators/base/detector.py (4)
8-8: LGTM: Appropriate import for actor field functionality.The
ActorFieldimport correctly supports the new owner field that can handle both user and team actors.
37-37: LGTM: Well-configured owner field definition.The owner field is properly configured as optional and nullable, using
ActorFieldwhich is designed for user/team selection scenarios.
66-79: LGTM: Robust owner field update logic.The update method properly handles all owner scenarios:
- Sets the appropriate ID field based on actor type (user vs team)
- Maintains mutual exclusivity between
owner_user_idandowner_team_id- Correctly clears both fields when owner is set to None
120-137: LGTM: Consistent owner field creation logic.The create method implements the same robust owner handling logic as the update method, properly extracting owner information and setting the appropriate ID fields within the atomic transaction.
src/sentry/migrations/0917_convert_org_saved_searches_to_views.py (1)
14-16: LGTM: Consistent migration disabling approach.Like the related migration 0920, this properly disables the faulty migration with clear documentation and references the corrected implementation. This maintains consistency in the migration handling approach.
devservices/config.yml (4)
23-29: LGTM: Well-configured metrics service addition.The
snuba-metricsservice is properly configured with appropriate description, repository details, and containerized-metrics-dev mode for development use.
132-139: LGTM: Comprehensive subscription result consumers.The new subscription result consumers are well-defined with clear descriptions covering spans, EAP items, metrics, and generic metrics processing.
157-179: LGTM: Well-structured tracing mode configuration.The tracing mode includes all necessary services and consumers for comprehensive metrics and tracing functionality. The dependency list is logical and complete.
325-332: LGTM: Consistent consumer command configuration.The new program commands follow the established pattern with appropriate consumer groups, offset reset settings, and consistent flag usage across all subscription result consumers.
src/sentry/constants.py (1)
724-724: LGTM! Configuration default updated consistently.The change from "low" to "off" for autofix automation tuning appears to be a coordinated update with corresponding changes in project options and tests, providing a more conservative default configuration.
static/app/components/core/button/styles.chonk.tsx (1)
113-113: LGTM! Animation timing optimization.Reducing the transition duration from 0.1s to 0.06s makes the button elevation effect feel more responsive while maintaining the same easing function. This is a good UX improvement.
static/app/components/replays/breadcrumbs/breadcrumbItem.tsx (1)
114-114: LGTM! Analytics event naming consistency.The change from underscore to hyphen format (
replay.view_html→replay.view-html) aligns with the standardized naming convention for replay analytics events.src/sentry/preprod/__init__.py (1)
1-1: LGTM! Package-level analytics API exposure.The star import in
__init__.pyto expose analytics functionality is a common pattern for creating convenient package-level APIs. The NOQA comment appropriately acknowledges the linting concern.src/sentry/projectoptions/defaults.py (1)
205-205: LGTM! Coordinated default value update.The change from "low" to "off" aligns with the corresponding constant update in
src/sentry/constants.py. This more conservative default for autofix automation is appropriate for a feature that automatically modifies code.src/sentry/workflow_engine/processors/workflow.py (1)
35-35: LGTM! Improved logging with workflow context.This change enhances logging by using the workflow engine's contextual logger instead of the standard Python logger. The
log_context.get_logger()provides automatic context enrichment for better observability in workflow processing.static/app/views/explore/utils.spec.tsx (1)
11-11: LGTM! Test updated for single-axis visualization API.The test correctly instantiates
Visualizewith a string parameter instead of an array, aligning with the updated API that supports single y-axis visualizations rather than multiple y-axes.src/sentry/preprod/api/endpoints/organization_preprod_artifact_assemble.py (2)
7-7: LGTM! Analytics import added for event tracking.The import enables recording analytics events for API usage tracking.
80-86: LGTM! Analytics event tracking added.The analytics event is properly recorded early in the method with relevant context identifiers (organization_id, project_id, user_id) to track API usage patterns for the preprod artifact assemble endpoint.
tests/sentry/replays/tasks/test_delete_replays_bulk.py (1)
97-97: LGTM! Test updated to handle None max_segment_id.The test correctly uses
Noneformax_segment_idto represent replays with no ingested segments, aligning with the updated data model and ensuring proper test coverage for this scenario.src/sentry/issues/grouptype.py (1)
514-514: LGTM! Appropriate noise reduction configuration added.The
NoiseConfig(ignore_limit=5)setting provides reasonable noise reduction for database query injection vulnerability issues, requiring 5 occurrences before creating a group while maintaining sensitivity for security-related detections.static/app/components/codecov/datePicker/dateSelector.tsx (1)
6-6: LGTM! Good standardization of flex layout components.This change replaces a locally defined styled
FlexContainerwith the sharedFlexcomponent from the core layout system, which improves code consistency and maintainability across the codebase.Also applies to: 84-87
static/app/views/explore/hooks/useGetTraceItemAttributeValues.spec.tsx (1)
13-13: LGTM! Test updates correctly reflect the hook interface changes.The test file has been properly updated to match the simplified hook interface:
- Hook renamed from
useTraceItemAttributeValuestouseGetTraceItemAttributeValues- Removed
attributeKeyparameter from hook calls- Test suite name updated accordingly
These changes align with the hook refactoring that simplified the interface to only require
traceItemTypeandtypeparameters.Also applies to: 30-30, 80-83, 127-130
tests/sentry/api/serializers/test_project.py (1)
812-814: LGTM! Test correctly updated to reflect the new default value.The test has been properly updated to expect the new default value of
"off"forautofixAutomationTuning, which aligns with the broader configuration changes mentioned in the AI summary.static/app/components/codeSnippet.tsx (1)
7-7: LGTM! Consistent flex layout standardization.This change replaces custom
FlexSpacerdivs with<Flex.Item grow={1} />components from the standardized layout system. The functionality remains the same (flexible spacing between elements) while improving consistency with the design system.Also applies to: 167-167, 172-172
static/app/views/explore/hooks/useTopEvents.tsx (1)
31-31: LGTM! Hook simplification aligns with visualization refactoring.The dependency array has been correctly simplified to remove
visualizes, which aligns with the broader refactoring from multiple y-axes to single y-axis handling mentioned in the AI summary. This reduces complexity while maintaining the core functionality of determining when to use top events based on mode and group-by parameters.static/app/views/dashboards/widgets/common/types.tsx (1)
76-81: LGTM! Well-designed generic type for tabular columns.The
TabularColumntype provides a clean, type-safe interface for defining table columns with appropriate optional properties for type information and width customization. The generic constraint ensures type safety while maintaining flexibility.static/app/views/insights/pages/transactionNameSearchBar.tsx (2)
19-19: LGTM! Hook import updated correctly.The import change aligns with the hook refactoring effort across the codebase.
54-57: Hook parameters simplified appropriately.The removal of
attributeKeyandenabledparameters simplifies the API while maintaining functionality. The new hook interface extracts the attribute key from the tag parameter passed to the returned function, which is a cleaner design.static/app/views/explore/components/traceItemSearchQueryBuilder.tsx (2)
11-11: LGTM! Consistent hook import update.The import change follows the same refactoring pattern applied across the codebase.
71-75: Hook parameters updated appropriately.The simplified parameter list removes unnecessary
attributeKeyandenabledparameters while addingprojectIdsfor proper project filtering. This aligns with the standardized hook interface.static/app/components/events/eventAttachments.tsx (2)
9-9: LGTM! Added shared Flex component import.The import aligns with the standardization effort to use shared layout components.
143-145: Good refactoring to use shared Flex component.Replacing the custom styled component with the shared
Flexcomponent improves consistency and reduces code duplication. Thealign="center"prop maintains the same visual behavior as the original implementation.static/app/views/alerts/list/rules/alertRuleStatus.tsx (2)
3-3: LGTM! Consistent with layout component standardization.The import follows the same pattern applied across multiple files in this refactoring effort.
92-113: Well-executed refactoring to shared Flex component.The replacement of custom styled components with the shared
Flexcomponent improves code consistency and maintainability. Thealign="center"prop preserves the original centering behavior.static/app/views/settings/project/projectOwnership/codeOwnerFileTable.tsx (1)
7-7: LGTM! Great standardization effort.The replacement of the custom
FlexCenterstyled component with the sharedFlexcomponent usingalign="center"andgap={space(1)}maintains the same visual appearance while improving code consistency across the application. This standardization makes the codebase more maintainable.Also applies to: 110-164
static/app/views/explore/toolbar/toolbarSaveAs.tsx (2)
61-61: LGTM! Y-axis refactoring simplifies data handling.The change from
visualizes.flatMap(v => v.yAxes)tovisualizes.map(v => v.yAxis)aligns with the broader refactor to support single y-axis per visualization instead of multiple y-axes. This simplifies the data model and removes complexity.
153-153: LGTM! Consistent with single y-axis refactor.Replacing
dedupeArray(chart.yAxes)with[chart.yAxis]is consistent with the single y-axis refactor. Since each chart now has a single y-axis, wrapping it in an array maintains the expected data structure for downstream consumers.static/app/views/explore/toolbar/toolbarSortBy.tsx (1)
40-40: LGTM! Consistent y-axis refactoring.The change from
visualizes.flatMap(v => v.yAxes)tovisualizes.map(v => v.yAxis)correctly adapts to the single y-axis per visualization model. This maintains the expected array format for theuseSortByFieldshook while simplifying the data extraction logic.static/app/views/organizationStats/teamInsights/teamMisery.tsx (1)
9-9: LGTM! Consistent layout standardization.The replacement of custom
FlexCentercomponents with the sharedFlex align="center"component follows the same standardization pattern seen across the codebase. This improves maintainability and ensures consistent flexbox behavior throughout the application.Also applies to: 98-100, 151-157
static/app/views/explore/hooks/useExploreAggregatesTable.tsx (1)
78-82: LGTM! Simplified logic consistent with y-axis refactor.The change from iterating over
aggregateField.yAxesto directly checking and addingaggregateField.yAxissimplifies the control flow by removing the inner loop. This is consistent with the broader refactor to single y-axis per visualization and maintains the duplicate checking logic while making the code more straightforward.static/app/views/settings/organizationAuditLog/auditLogList.tsx (2)
8-8: LGTM! Good refactoring toward component standardization.Adding the import for the shared
Flexcomponent aligns with the broader effort to standardize layout components across the codebase.
368-382: LGTM! Consistent replacement of custom styled components.The replacement of the custom
FlexCenterstyled component with<Flex align="center">maintains the same visual behavior while using a standardized shared component. This improves code consistency and reduces duplication across the codebase.static/app/views/explore/contexts/pageParamsContext/index.spec.tsx (2)
118-118: LGTM! Test correctly updated for new Visualize constructor.The change from array to single string parameter aligns with the refactor from multiple y-axes to single y-axis per visualization.
138-142: LGTM! Systematic test updates for Visualize constructor changes.All test cases have been consistently updated to reflect the new
Visualizeconstructor signature that takes a single string instead of an array. This maintains comprehensive test coverage while adapting to the API changes from multiple y-axes to single y-axis per visualization.Also applies to: 161-164, 184-187, 208-211, 231-234, 265-268, 313-316, 336-339, 359-362, 382-385, 415-422, 452-459, 489-492, 522-525, 545-545, 576-587
static/gsAdmin/views/instanceLevelOAuth/instanceLevelOAuthDetails.tsx (2)
7-7: LGTM! Consistent import addition for layout standardization.Adding the
Flexcomponent import supports the refactoring effort to use standardized layout components.
154-170: LGTM! Clean replacement of custom styled component.The replacement of the custom
FlexDivwith<Flex justify="right">maintains the same right-alignment behavior while using the standardized shared component. This improves consistency across the admin interface.static/app/components/codecov/repoPicker/repoSelector.tsx (2)
7-7: LGTM! Import addition supports layout standardization.Adding the
Flexcomponent import is consistent with the broader refactoring effort across the codebase.
122-127: LGTM! Effective replacement of custom styled component.The replacement of
FlexContainerwith<Flex align="center" gap={space(0.75)}>maintains identical layout behavior while using the standardized shared component. The props correctly replicate the centering and spacing functionality.tests/js/fixtures/tabularColumns.ts (1)
5-9: LGTM! Clean and useful test utility function.The
TabularColumnsFixturefunction provides a convenient way to create multiple tabular column test fixtures from partial inputs. The implementation is straightforward and follows good fixture patterns by leveraging the existingTabularColumnFixturefunction.static/app/components/codecov/branchSelector/branchSelector.tsx (1)
64-69: LGTM! Good refactoring to use shared Flex component.The replacement of custom styled flex containers with the shared
Flexcomponent improves code consistency and maintainability across the codebase. The props (align="center"andgap={space(0.75)}) are correctly applied to achieve the same layout behavior.static/app/components/codecov/integratedOrgSelector/integratedOrgSelector.tsx (2)
37-47: LGTM! Consistent use of shared Flex component.The replacement of custom styled containers with the shared
Flexcomponent in theOrgFooterMessagefunction maintains the same layout while improving code consistency. The props are appropriately configured for the intended layout.
99-106: LGTM! Good layout standardization.The dropdown trigger now uses the shared
Flexcomponent with appropriate props (justify="flex-start",gap={space(0.75)},align="center"), maintaining the intended layout while following the codebase's standardization effort.static/app/views/explore/hooks/useExploreTimeseries.tsx (2)
97-97: Consistent with the single y-axis refactor.The mapping logic correctly accesses the single
yAxisproperty instead of multipleyAxes. This maintains the same functionality while working with the simplified data model.
179-179: Simplified deduplication logic for single y-axis.The change from deduplicating an array of y-axes to creating a single-element array from the single
yAxisis logically correct and simplifies the code. This maintains the expected array interface for downstream processing.static/app/views/explore/toolbar/index.spec.tsx (18)
70-70: LGTM! Test updated to match single y-axis API.The test expectation correctly reflects the change from array-based to string-based y-axis in the Visualize constructor. This maintains proper test coverage for the refactored API.
93-93: Consistent test update for API change.The test expectation properly reflects the new single y-axis constructor signature.
103-103: Test maintains coverage with updated API.The expectation correctly uses the string-based y-axis parameter instead of an array.
108-108: Proper test alignment with refactored constructor.The test expectation accurately reflects the simplified Visualize constructor API.
129-129: Test updated for consistency with API changes.The expectation correctly uses the single y-axis string format.
156-156: Consistent test pattern maintained.All test expectations follow the same pattern of updating to the single y-axis API.
166-166: Test properly reflects API refactor.The expectation maintains test validity with the updated constructor signature.
171-171: Correct test update for epm() function.The test properly expects the epm() function without array wrapping.
177-177: Test maintains proper assertions.The expectation correctly reflects the single y-axis API change.
198-198: Consistent test coverage maintained.The test expectation properly uses the string-based y-axis format.
204-204: Test updated for count_unique aggregate.The expectation correctly reflects the single y-axis constructor signature.
214-214: Proper test alignment with API changes.The test maintains coverage while reflecting the refactored constructor.
220-220: Test expectation correctly updated.The single y-axis format is properly used in the test assertion.
243-243: Comprehensive test coverage maintained.The test expectation reflects the API change while preserving test logic.
257-257: Test properly updated for avg aggregate.The expectation uses the correct single y-axis constructor format.
262-262: Consistent test pattern with field changes.The test properly expects the updated constructor signature.
277-278: Multiple visualization test updated correctly.Both Visualize instances in the test expectation properly use the single y-axis format, maintaining test coverage for multiple chart scenarios.
283-283: Test cleanup maintains consistency.The remaining visualization after deletion correctly uses the single y-axis format.
static/app/views/explore/spans/spansTab.tsx (1)
349-349: LGTM! Simplified y-axis handling with single axis refactor.The change from deduplicating multiple y-axes to using a single y-axis per visualization simplifies the code while maintaining the expected array interface for downstream processing. This is consistent with the systematic refactor across the explore directory.
tests/sentry/api/endpoints/test_project_details.py (1)
2068-2068: LGTM! Test assertions updated to match new default value.The test assertions have been correctly updated to expect
"off"as the default value forsentry:autofix_automation_tuning, which aligns with the changes mentioned in the AI summary forsrc/sentry/constants.pyandsrc/sentry/projectoptions/defaults.py.Also applies to: 2076-2076
tests/js/fixtures/tabularColumn.ts (1)
1-11: Clean fixture implementation with one clarification needed.The fixture follows good patterns with sensible defaults and proper TypeScript typing. However, please verify that
width: -1is the intended default value for theTabularColumn.widthproperty.Is
width: -1a meaningful default value for table columns, or should it be a positive number ornull/undefined?static/app/views/settings/organizationIntegrations/detailedView/integrationLayout.tsx (1)
247-247: Excellent refactoring to use shared layout primitives.The replacement of custom styled
FlexContainerwithFlex.Item grow={1}maintains the same flexible growth behavior while using standardized components. This aligns well with the broader refactoring effort mentioned in the AI summary to improve layout consistency across the codebase.Also applies to: 264-264
static/app/views/dashboards/widgets/tableWidget/fixtures/sampleHTTPRequestTableData.ts (1)
3-41: Well-structured fixture data with realistic HTTP request metrics.The sample data provides good coverage of HTTP methods with realistic count distributions (GET having the highest volume makes sense). The meta information properly defines field types and units.
Are the empty
id: ''fields in each data row intentional for testing purposes, or should they contain unique identifiers?static/app/utils/analytics/replayAnalyticsEvents.tsx (2)
116-117: New timeline zoom events properly added.The new
replay.timeline.zoom-inandreplay.timeline.zoom-outevents follow the existing naming conventions and use appropriate parameter typing for generic events.
158-159: Event mappings are descriptive and consistent.The event mappings provide clear, descriptive names that follow the established pattern in the file.
static/app/components/replays/timeAndScrubberGrid.tsx (4)
1-1: LGTM! Clean imports for analytics integration.The imports for
useCallback,trackAnalytics, anduseOrganizationare properly added to support the new analytics functionality.Also applies to: 17-17, 22-22
32-32: Good practice using organization context for analytics.Properly retrieves organization context needed for analytics tracking.
37-43: Well-implemented zoom out handler with analytics.The callback is properly memoized with all necessary dependencies and includes appropriate analytics tracking. The zoom logic correctly prevents going below scale 1.
45-51: Well-implemented zoom in handler with analytics.The callback is properly memoized with all necessary dependencies and includes appropriate analytics tracking. The zoom logic correctly prevents exceeding the maximum scale.
src/sentry/replays/usecases/delete.py (2)
87-90: Excellent defensive programming improvement.Adding the null check for
max_segment_idprevents runtime errors when no segments were ingested. The early return with an empty list is the correct approach since there are no segments to delete.
112-112: Correct type annotation update.The TypedDict now accurately reflects that
max_segment_idcan beNone, aligning with the actual data structure and the new null handling logic.static/app/components/group/times.tsx (5)
4-5: Good imports for layout standardization.Adding
FlexandTextOverflowcomponents aligns with the systematic refactoring to use shared layout primitives.
24-24: Excellent refactoring to use shared Flex component.Replacing the custom
FlexWrapperwith the standardizedFlexcomponent improves consistency across the codebase. Thealign="center"prop properly maintains the vertical centering behavior.Also applies to: 45-45
27-27: Good modernization of icon size prop.Updating from legacy pixel value to the standardized
"xs"size token improves consistency with the design system.
28-30: Smart addition of TextOverflow handling.Wrapping the
TimeSincecomponents inTextOverflowimproves the user experience by properly handling text overflow scenarios in constrained layouts.Also applies to: 37-43
59-59: Good addition of minimum width for icon consistency.The
min-width: 12pxensures consistent spacing and prevents the icon from being squeezed in tight layouts.tests/sentry/grouping/test_parameterization.py (1)
3-3: Appropriate test cleanup aligning with upstream changes.Removing the
ParameterizationRegexExperimentimport correctly reflects the deletion of this class from the main codebase. The remaining test coverage forParameterizerandUniqueIdExperimentis comprehensive.static/app/views/feedback/feedbackListPage.tsx (4)
10-10: Clean import of new FeedbackSummary component.The import is properly added to support the new feedback summary feature integration.
88-93: Well-structured integration of feedback summary.The new
SummaryListContainercleanly organizes the feedback summary above the existing feedback list, maintaining the existing grid area assignment while adding the new functionality.
125-129: Appropriate styled container for vertical layout.The
SummaryListContaineruses a simple flex column layout with proper spacing to arrange the summary and list components vertically.
166-166: Reasonable grid column adjustment for new content.Updating the grid template columns from
minmax(195px, 1fr) 2frtominmax(195px, 1fr) 1.5frappropriately adjusts the layout proportions to accommodate the additional summary content.static/app/views/explore/types.tsx (1)
8-21: Well-structured interface with excellent documentation.The
UseTraceItemAttributeBasePropsinterface is cleanly designed with appropriate type constraints and clear documentation. The comments effectively communicate current limitations (only LOGS supported, only string/number types) and usage context.src/sentry/tasks/auth/check_auth.py (1)
76-78: Good addition of processing deadline for task timeout control.Adding a 60-second processing deadline duration is appropriate for auth identity checking tasks and aligns with best practices for preventing runaway tasks.
static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx (1)
4-4: Excellent refactoring to standardize layout components.The migration from custom styled divs (
Container,FlexBox) to the sharedFlexcomponent improves code consistency and maintainability. TheFlexcomponent usage is appropriate with correct props for spacing (gap={space(1)}) and alignment (justify="space-between",align="center").Also applies to: 21-32, 93-93, 106-106
static/app/views/explore/contexts/pageParamsContext/sortBys.tsx (1)
65-65: Model simplification from multiple y-axes to single y-axis implemented correctly.The changes properly reflect the refactoring from
yAxes: string[]toyAxis: stringin the visualization model. The logic correctly:
- Checks equality with the single
yAxisstring instead of array inclusion- Maps single
yAxisvalues instead of flattening arraysThis is a breaking change that simplifies the visualization model, which should improve maintainability.
Also applies to: 75-75
static/app/views/settings/dynamicSampling/organizationSampleRateInput.tsx (1)
6-6: Consistent layout standardization with proper styling preservation.The refactoring follows the established pattern of replacing custom styled containers with the shared
Flexcomponent while preserving existing visual design through the newSampleRateRowstyled component. TheFlexusage withgap={space(1)}maintains appropriate spacing.Also applies to: 51-51, 57-57, 88-88, 97-97, 101-106
static/app/views/alerts/list/rules/row.tsx (4)
13-13: LGTM! Good standardization with shared layout component.The import of the shared
Flexcomponent supports the standardization effort across the codebase.
269-278: LGTM! Consistent replacement of custom styled component.The replacement of
FlexCenterwith<Flex align="center">maintains the same centering behavior while using the standardized layout component. This reduces code duplication and improves consistency.
279-286: LGTM! Proper migration to shared Flex component.The ProjectBadge container now uses the standardized
Flexcomponent with appropriate alignment, maintaining the same visual behavior.
288-315: LGTM! Clean migration for assignee section.The assignee/owner section properly migrates to the shared
Flexcomponent while preserving the center alignment behavior for the avatar and dropdown elements.static/app/views/performance/newTraceDetails/traceWaterfall.tsx (2)
17-17: LGTM! Adding shared layout component import.The import supports the migration from custom styled flex containers to the standardized
Flexcomponent.
712-808: LGTM! Clean migration to shared Flex component.The replacement of the local
FlexBoxstyled component with<Flex direction="column" flex={1}>maintains equivalent flex behavior while using the standardized layout component. This improves consistency across the codebase and reduces duplication.static/app/views/explore/hooks/useAddToDashboard.tsx (3)
50-50: LGTM! Clean migration from multiple Y axes to single Y axis.The change from accessing
yAxesarray to directly usingyAxisstring aligns with the broader architectural shift described in the PR summary. This simplification should improve the API consistency across the Explore feature.
57-57: LGTM! Simplified field construction with single Y axis.The direct usage of
yAxisstring eliminates the need for array operations and slicing that was required when supporting multiple Y axes. This makes the code more straightforward.
70-70: LGTM! Maintains backward compatibility with EventView.Wrapping the single
yAxisin an array ensures compatibility with the EventView constructor while working with the new single-axis model. This is a clean transition approach.src/sentry/feedback/usecases/feedback_summaries.py (2)
13-13: LGTM! Improved feedback separator for clarity.The change from newline-dash separation to the "------" separator provides clearer delineation between individual feedback entries, which should help the LLM better distinguish and process separate feedback items.
16-21: LGTM! Enhanced prompt engineering for better summaries.The expanded instructions significantly improve the prompt quality by:
- Explicitly prohibiting generic statements like "Users report a variety of issues"
- Providing clear guidance on balancing specificity vs. generalization
- Setting strict constraints (55 words max, 2 sentences max)
- Emphasizing proportional topic mention based on frequency
These refinements should result in more focused, actionable feedback summaries.
static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.spec.tsx (4)
15-20: LGTM! Solid basic rendering test.The test properly verifies that the component renders the expected column headers using sample data. Good use of
findByTextfor async element detection.
22-44: LGTM! Thorough test of custom column configuration.This test effectively validates that custom column ordering and naming work correctly. The approach of checking
headers[0]?.children[0]?.textContentproperly verifies the rendered column names in the expected order.
46-67: LGTM! Comprehensive number formatting test.Excellent test coverage of different field types (duration, percentage, rate) with their respective units. The test data properly includes metadata about field types and units, and the assertions verify correct formatting:
- Duration:
123.00ms- Percentage:
10%- Rate:
6.00/min
69-106: LGTM! Well-designed custom renderer test.This test effectively validates the custom renderer functionality by:
- Defining clear custom head and body renderers with distinct output
- Verifying both custom renderers are properly invoked
- Testing with realistic date field data
The custom renderers provide good examples of the expected function signatures and behavior.
static/app/views/explore/tables/aggregateColumnEditorModal.tsx (4)
67-67: LGTM! Proper serialization before callback.The change correctly serializes Visualize objects to their JSON representation before passing to the onColumnsChange callback, ensuring compatibility with the expected BaseAggregateField format.
116-116: LGTM! Correct usage of updated Visualize constructor.The change properly instantiates a new Visualize object with the DEFAULT_VISUALIZATION string, aligning with the updated constructor signature that expects a single yAxis string.
277-278: LGTM! Correct property access for single y-axis.The change properly accesses the
yAxisproperty instead ofyAxes[0], consistent with the refactored Visualize class structure.
303-303: LGTM! Consistent updates using the replace method.Both changes correctly use the
replacemethod to update the yAxis value, maintaining immutability by returning new Visualize instances.Also applies to: 311-311
src/sentry/snuba/ourlogs.py (1)
157-157: LGTM! Backward-compatible parameter addition.The addition of the optional
equationsparameter extends the function's capabilities while maintaining backward compatibility. The parameter is correctly typed and passed through to the underlying RPC function.Also applies to: 170-170
static/app/components/feedback/list/useFeedbackSummary.tsx (1)
1-67: Well-structured hook implementation!The
useFeedbackSummaryhook is well-implemented with proper error handling, loading states, and feature flag gating. The caching strategy and retry logic are appropriate for this use case.static/app/views/explore/contexts/pageParamsContext/index.tsx (3)
125-125: LGTM! Correct mapping for single y-axis.The change from
flatMaptomapcorrectly handles the new singleyAxisstring property instead of the previousyAxesarray.
361-361: LGTM! Consistent field reference extraction.The change correctly extracts field references from the single
yAxisproperty, maintaining consistency with the refactored Visualize class.
375-376: LGTM! Proper backward compatibility handling.The code correctly uses
isBaseVisualizetype guard and continues to handle theyAxesarray format for BaseVisualize objects, ensuring backward compatibility with the serialized format.static/app/views/dashboards/widgetCard/chart.tsx (1)
141-141: LGTM! Organization context properly passed to field renderers.The addition of the organization parameter enables custom field renderers to access organization-specific features and settings.
Also applies to: 152-154
src/sentry/grouping/parameterization.py (2)
268-268: LGTM: Clean simplification of union type.The simplification from a union type to a single type alias is appropriate given the removal of
ParameterizationRegexExperiment. This makes the code cleaner and more maintainable.
345-350: LGTM: Simplified experiment execution logic.The removal of conditional logic that distinguished between callable and regex experiments is clean and consistent with the removal of
ParameterizationRegexExperiment. All experiments now follow the same execution pattern via theirrunmethod.static/app/views/explore/utils.tsx (2)
284-295: LGTM: Clean refactoring from multiple to single y-axis.The simplification from iterating over multiple
yAxesto handling a singleyAxisis well-implemented. The logic for parsing functions and extracting fields remains correct and the deduplication is still handled properly with theseenFieldsSet.
438-444: LGTM: Consistent single y-axis implementation.The change from
dedupeArray(visualizes.flatMap(visualize => visualize.yAxes))to[visualize.yAxis]is consistent with the broader refactoring. The logic maintains the same functionality while simplifying the data structure.src/sentry/integrations/github/integration.py (1)
406-412: LGTM: Enhanced PR comment with environment context.The refactoring to use an instance method
self.get_merged_pr_single_issue_templateinstead of a module constant is a good architectural improvement. The addition of environment information viaself.get_environment_info(issue)provides valuable context for developers.The removal of the
subtitleparameter (previously fromissue.culprit) suggests this information was not providing sufficient value compared to the environment context.src/sentry/integrations/gitlab/integration.py (1)
254-261: LGTM: Consistent refactoring with GitHub integration.The changes mirror the GitHub integration refactoring perfectly, maintaining consistency across SCM integrations. The use of
self.get_merged_pr_single_issue_templatewith environment information instead of subtitle provides better contextual information for developers reviewing PR comments.This standardization across integrations improves maintainability and user experience.
static/app/views/explore/contexts/pageParamsContext/visualizes.spec.tsx (3)
8-8: LGTM: Constructor changes align with new single y-axis APIThe test updates correctly reflect the refactoring of the
Visualizeclass from supporting multiple y-axes (array parameter) to a single y-axis (string parameter). All constructor calls have been properly updated.Also applies to: 25-25, 31-31, 39-39, 45-45, 53-53, 61-61, 72-72, 79-79, 92-92, 100-102
46-46: Verify parameter name change in replace methodThe
replacemethod calls have been updated to useyAxisinstead ofyAxes, which aligns with the new singular y-axis API. This is consistent with the relevant code snippet showing the new method signature.Also applies to: 63-63
92-92: Consistent fromJSON behavior with array returnThe
fromJSONtests correctly expect an array ofVisualizeinstances while testing with single string construction. This aligns with the relevant code snippet showing thatfromJSONmaps overyAxesarray to create multipleVisualizeinstances.Also applies to: 100-102
static/app/components/events/interfaces/spans/newTraceDetailsHeader.tsx (3)
4-4: Good: Added import for shared Flex componentAdding the import for the shared
Flexcomponent from the core layout library supports the standardization effort.
36-41: LGTM: Consistent replacement of custom styled components with shared FlexThe replacement of custom
FlexBoxandBreakDownRowcomponents with the sharedFlexcomponent is well-executed. Thealign="center"andjustify="space-between"props maintain the same layout behavior while improving code consistency across the application.Also applies to: 42-47, 61-67, 68-74
155-159: Good: Simplified BreakDownWrapper stylingThe
BreakDownWrapperhas been appropriately simplified to a basic flex column container with padding, removing the dependency on the customFlexBoxcomponent.static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx (3)
12-15: Good: Consolidated import statementsConsolidating the imports into a single import from the types file improves code organization and reduces import clutter.
25-28: Interface simplification looks appropriateThe new
UseGetTraceItemAttributeValuesPropsinterface appropriately extends the base props and addsdatetimewhile removingattributeKey,enabled, andsearchwhich appear to be handled internally by the hook's callback function.
78-83: LGTM: Hook renaming and signature updateThe hook has been properly renamed to
useGetTraceItemAttributeValueswith an updated interface. The internal logic remains unchanged, ensuring no functional regression while improving naming consistency.static/app/views/explore/tables/aggregateColumnEditorModal.spec.tsx (3)
73-73: LGTM: Visualize constructor calls updated correctlyAll
Visualizeconstructor calls have been properly updated from array parameters to single string parameters, aligning with the new API that supports a single y-axis instead of multiple y-axes.Also applies to: 101-102, 119-120, 128-129, 140-140, 165-165, 180-180, 191-192, 203-205, 228-228, 242-243, 256-257
151-151: Correct serialization format in test expectationsThe expected
onColumnsChangecalls now properly expect objects withyAxesarray properties instead ofVisualizeinstances, which correctly reflects the serialization behavior of the updatedVisualize.toJSON()method.Also applies to: 212-215, 263-263
282-282: Helper function correctly updated for singular yAxisThe
expectRowshelper function has been properly updated to usefield.yAxis(singular) instead offield.yAxes(array), maintaining correct test validation while aligning with the new API.Also applies to: 292-292
src/sentry/hybridcloud/tasks/deliver_webhooks.py (3)
85-85: Appropriate deadline for lightweight scheduling taskThe 30-second processing deadline for
schedule_webhook_deliveryis appropriate for this task, which primarily queries the database and schedules other tasks without performing the actual webhook deliveries.
161-161: Deadline aligns with existing batch timeout logicThe 300-second processing deadline for
drain_mailboxaligns well with the existingBATCH_SCHEDULE_OFFSETtimeout logic (lines 188-203) that already limits batch processing time, providing a consistent approach to task time management.
239-239: Reasonable deadline for parallel processing taskThe 120-second processing deadline for
drain_mailbox_parallelis appropriate for the parallel delivery approach, providing sufficient time for concurrent webhook delivery while being shorter than the sequential version due to the parallelization benefits.static/app/views/explore/contexts/pageParamsContext/aggregateFields.tsx (4)
21-28: LGTM! Export makes function available for reuse.The export of
isBaseVisualizeenables its use in other modules, which aligns with the broader refactor where this type guard is needed across multiple files.
81-91: Constructor call correctly updated for single y-axis model.The change from array iteration to passing individual
yAxisstrings to the Visualize constructor is consistent with the refactor. The loop still handles multiple y-axes fromBaseVisualizeobjects by creating separateVisualizeinstances.
34-36: Confirmed: Type Guard Aligns with Visualize Definition
TheVisualizeclass instatic/app/views/explore/contexts/pageParamsContext/visualizes.tsxindeed declares a singleyAxis: stringproperty, and itstoJSON/fromJSONmethods continue to wrap/unwrap that value in theyAxesarray for the external shape. TheisVisualizeguard correctly checks forvalue.yAxisas astring. Approving these changes.
- Visualize class declaration (lines 37–40) includes
yAxis: string.- Serialization still uses
yAxes: [this.yAxis]and deserializes viajson.yAxes.map(...).- No other references to a
yAxesarray remain in the in-memory model.
114-120: Serialization logic validated
ThefromJSONimplementation instatic/app/views/explore/contexts/pageParamsContext/visualizes.tsxreturns aVisualize[](one instance peryAxis), so your use ofaggregateFields.flatMap(…)followed bymap(visualize => JSON.stringify(visualize.toJSON()))correctly handles multiple visualizations. No further changes required.tests/sentry/integrations/github/tasks/test_pr_comment.py (4)
341-346: Test data updated to include environment information.The test events now include
environmentfields ("dev"and"prod"), which aligns with the new comment format that displays environment information alongside issue titles.Also applies to: 356-361
372-377: Expected comment format updated to match new bulleted list style.The expected comment format has been correctly updated from dash lists to bulleted markdown lists with:
- Dynamic organization slugs instead of hardcoded values
- Environment information appended in backticks (e.g., "in
dev")- Proper markdown link formatting with issue titles
This matches the new comment format described in the AI summary.
397-400: Good practice: Explicit ordering ensures test consistency.The explicit ordering of groups by ID (
Group.objects.order_by("id").all()) ensures consistent test results by removing dependency on database insertion order.Also applies to: 428-431
412-413: It looks like the integration template matches the test’s expectations exactly—using the same headings, lines, and emoji. The workflow serializes the body via JSON, which will escape non-ASCII characters (e.g. “👍” becomes “\ud83d\udc4d”), matching the test’s unicode-escaped assertions.No changes are needed. Please go ahead and merge.
tests/sentry/workflow_engine/endpoints/test_organization_detector_details.py (4)
244-272: Comprehensive test coverage for setting user owner.The test properly verifies:
- Initial state (no owner)
- Update request with user identifier
- Database state changes (owner_user_id set, owner_team_id cleared)
- Owner property returns correct actor
- API response includes correct owner identifier
273-304: Well-structured test for changing owner from user to team.The test correctly:
- Sets up initial user owner state
- Creates a team for testing
- Updates to team owner using proper identifier format (
team:{id})- Verifies ownership transfer (user cleared, team set)
- Validates API response format
305-332: Thorough test for clearing owner field.The test effectively validates:
- Initial owner state setup
- Update request with
Noneowner value- Complete owner field clearance in database
- Proper
Noneresponse in API serialization
249-251: Owner Identifier Formats Are ConsistentI confirmed that
User.get_actor_identifier()(defined insrc/sentry/users/models/user.py) returns"user:{id}", and all team identifiers use the"team:{id}"prefix (e.g. insrc/sentry/models/groupowner.pyand across tests). These match the application’s actor identifier scheme, so no changes are needed here.static/app/views/explore/charts/index.tsx (4)
153-155: Function signature correctly simplified for single y-axis model.The
getChartInfofunction now accepts a singleyAxisstring instead of an array, and the deduplication logic is simplified to just create a single-element array. This aligns perfectly with the single y-axis refactor.
199-199: Function calls updated consistently with new signature.Both calls to
getChartInfocorrectly pass single y-axis strings:
visualize.yAxisfor regular chart infoDEFAULT_VISUALIZATIONfor fallback sampling metadataThis ensures compatibility with the new function signature.
Also applies to: 210-210
226-226: ChartInfo yAxes property maintains expected array format.The
yAxesproperty correctly wraps the single y-axis in an array ([visualize.yAxis]), maintaining compatibility with downstream components that expect an array structure while supporting the single y-axis model.
152-178: Sampling metadata override logic is compatible with single Y-axis
Verified thatDEFAULT_VISUALIZATIONis defined as${DEFAULT_VISUALIZATION_AGGREGATE}(${DEFAULT_VISUALIZATION_FIELD}), which produces a valid single-y-axis string. The existing fallback logic will continue to work correctly—no changes required.tests/sentry/integrations/gitlab/tasks/test_pr_comment.py (3)
302-307: Test data consistently updated with environment information.The event data now includes
environmentfields ("dev"and"prod"), matching the pattern established in the GitHub integration tests. This ensures both integrations handle environment information consistently.Also applies to: 317-322
333-338: Expected comment format correctly updated for GitLab integration.The expected comment format uses:
- Bulleted list with markdown links
- Dynamic organization slugs (
{self.organization.slug})- Environment information in backticks when present
- Proper referrer parameter (
gitlab-pr-bot)This format is consistent with the GitHub integration while maintaining GitLab-specific referrer information.
356-358: Consistent ordering ensures test reliability.The explicit ordering by ID (
Group.objects.order_by("id").all()) matches the pattern used in GitHub tests, ensuring consistent and reliable test results across both integrations.Also applies to: 394-396
src/sentry/issues/endpoints/browser_reporting_collector.py (8)
4-4: LGTM on import changes.The addition of
Anytype annotation supports the new serializer implementation.
7-7: Good migration to DRF components.Adding DRF serializers and Response classes enables better validation and standardized error handling compared to the previous implementation.
Also applies to: 10-11
21-30: Improved data structure for browser report types.Converting from what was likely a
Literaltype to a list makes this more maintainable and allows for dynamic validation in the serializer.
33-48: Well-designed serializer with proper field constraints.The field definitions appropriately validate the browser report structure with proper constraints (min_value for attempts and timestamp).
50-60: Excellent mutual exclusion validation.The validation methods properly enforce that age and timestamp are mutually exclusive, which aligns with the different specification requirements mentioned in the comments.
89-91: Excellent migration to DRF Response with proper status codes.The use of DRF's
Responsewith appropriate HTTP status codes (422 for validation errors, 404 for disabled endpoint) follows REST API best practices.Also applies to: 104-104, 115-118, 130-130
106-121: Robust validation with detailed error reporting.The validation loop properly validates each report and returns detailed error information, which will greatly improve debugging and client-side error handling. The logging enhancement with validation errors is also valuable.
122-127: Clean processing of validated data.Using
validated_datafrom the serializer ensures type safety and proper data structure for downstream processing.static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.tsx (5)
17-64: Well-designed component interface with comprehensive documentation.The props interface is thoroughly documented with JSDoc comments, making it easy for developers to understand the available options. The optional props provide good flexibility while maintaining sensible defaults.
66-74: Clean styling constant for frameless mode.The
FRAMELESS_STYLESconstant provides a clean way to remove borders and adjust styling when frameless mode is enabled.
87-99: Smart fallback logic for column generation.The fallback to extract columns from
tableData.meta.fieldswhen no explicit columns are provided is well-implemented and provides good developer experience.
101-127: Clean GridEditable integration with proper prop forwarding.The component correctly forwards props to
GridEditablewhile applying custom styling and behavior based on the component's props. The conditional logic for frameless styling and scrollable behavior is well-handled.
130-134: Useful loading placeholder implementation.The static
LoadingPlaceholderprovides a consistent loading state that matches the main component's structure.src/sentry/integrations/source_code_management/commit_context.py (4)
142-144: Well-defined constants for PR comment formatting.The maximum title length of 50 characters is reasonable for readability, and the template string provides a consistent format for issue links with environment information.
577-582: Robust title truncation with proper handling.The truncation logic correctly handles edge cases by checking length first and using
rstrip()to avoid trailing whitespace before adding ellipsis.
584-597: Excellent defensive programming for environment extraction.The method properly handles potential exceptions during environment extraction and logs issues for debugging without breaking the calling code. The fallback to an empty string ensures robust operation.
599-606: Clean template formatting method.The static method properly combines title truncation and template formatting, providing a clean interface for generating formatted issue lines.
static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.stories.tsx (4)
13-33: Comprehensive getting started documentation.The story provides excellent context about the component's purpose, its relationship to GridEditable, and planned future features. The basic example demonstrates the minimal required props.
35-89: Thorough explanation of table data and columns.This story effectively demonstrates both the mandatory
tableDataprop and the optionalcolumnsprop, with clear examples showing how custom column ordering and naming works.
91-128: Excellent demonstration of custom rendering.The story clearly shows how custom cell renderers work, including the fallback behavior when returning
undefined. The example is practical and easy to understand.
130-141: Simple and effective loading state example.The loading placeholder story is concise and shows how to use the provided loading component.
tests/sentry/workflow_engine/processors/test_delayed_workflow.py (2)
41-44: Appropriate import addition for API changes.Adding the import for
get_slow_conditions_for_groupsaligns with the API changes where slow conditions are now passed explicitly to downstream functions.
409-412: Consistent test updates for new API requirements.The tests correctly adapt to the new function signatures by calling
get_slow_conditions_for_groupsand passing the result asdcg_to_slow_conditionsparameter. This maintains test functionality while supporting the performance optimization in the main code.Also applies to: 620-621, 628-628, 652-652, 674-674, 705-705
tests/snuba/api/endpoints/test_organization_events_stats.py (2)
4-4: LGTM: Import changes support new logs testing functionality.The new imports (
defaultdict,DefaultDict,OurLogTestCase) are correctly added to support the new logs test class implementation.Also applies to: 6-6, 22-22
1250-1250: LGTM: Class rename improves clarity.Renaming
OrganizationEventsStatsTopNEventstoOrganizationEventsStatsTopNEventsSpansclearly distinguishes this test class as being specific to spans functionality, which is helpful now that there's a separate logs test class.static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx (1)
3-12: LGTM! Clean refactoring to use declarative query pattern.The imports are well-organized and the shift to using
useQuerywith dedicated query options and data fetching hooks improves code maintainability and reusability.tests/sentry/replays/test_project_replay_summarize_breadcrumbs.py (5)
3-21: LGTM! Appropriate imports for error context testing.The imports correctly support the new test functionality, including Snuba interactions, event storage, and error handling components.
25-28: Correct test setup for Snuba-dependent tests.The
@requires_snubadecorator andTransactionTestCasebase class are appropriate choices for tests that interact with Snuba services.
40-45: LGTM! Clean helper method for Snuba test data insertion.The
store_replaysmethod appropriately uses the Snuba test endpoint for inserting replay data during tests.
141-281: Excellent test coverage for error context feature.The new test methods comprehensively cover:
- Error event creation and storage verification
- Error context inclusion in breadcrumb summaries
- Proper disabling of error context when requested
- Verification of data passed to Seer API
The tests follow good practices with clear assertions and proper test data setup.
283-331: Well-structured test for chronological event merging.The updated test effectively validates that error events and breadcrumb logs are merged in chronological order, with appropriate test data covering different timestamp scenarios.
static/app/views/explore/hooks/useAnalytics.tsx (3)
111-111: Consistent visualization serialization for analytics.Good practice using
toJSON()method to ensure consistent serialization ofVisualizeinstances for analytics tracking.Also applies to: 189-189, 276-276
378-380: Correct adaptation to single yAxis pattern.The mapping from
yAxesarray to individualVisualizeinstances properly maintains compatibility while adopting the new single y-axis pattern.
475-475: Clean simplification of y-axis handling.The removal of array deduplication logic and direct use of
visualize.yAxissimplifies the code while maintaining compatibility with the existing data processing logic.Also applies to: 496-496
src/sentry/workflow_engine/processors/delayed_workflow.py (4)
357-357: Good performance optimization through parameter passing.The addition of
dcg_to_slow_conditionsparameter to both functions eliminates redundant database calls by passing pre-computed slow conditions, improving performance.Also applies to: 414-414
652-663: Excellent centralization and monitoring of slow conditions.The centralized retrieval of slow conditions with informational logging for unexpected states (DCGs without slow conditions) aids in monitoring and debugging.
364-364: Consistent usage of pre-computed slow conditions.The code properly utilizes the
dcg_to_slow_conditionsdictionary throughout, maintaining consistency and avoiding redundant lookups.Also applies to: 419-419, 675-675, 702-702
583-583: Improved logging specificity.Using
workflow_event_datainstead ofevent_dataprovides more focused and relevant logging information.static/app/views/explore/contexts/pageParamsContext/visualizes.tsx (3)
24-24: Clean adaptation to single y-axis pattern.The
defaultVisualizesfunction correctly creates aVisualizeinstance with a single y-axis string.
85-111: Correct transformation from location query to Visualize instances.The function properly handles the conversion from the stored format (potentially containing multiple y-axes) to individual
Visualizeinstances with unique labels.
48-48: Maintains compatibility while supporting new pattern.The
determineDefaultChartTypefunction maintains its array-based signature for compatibility while being called with single-element arrays in the new pattern.Also applies to: 190-190
tests/sentry/api/endpoints/test_browser_reporting_collector.py (6)
1-6: LGTM! Appropriate imports for the new test functionality.The added imports (
deepcopyandResponse) are properly used in the new test methods and helper functions.
11-43: Well-structured test constants for both report formats.The constants provide clear, reusable examples of both Working Draft (deprecation) and Editor's Draft (intervention) report formats. The comments helpfully indicate which format each represents.
48-58: Clean helper method for validation error assertions.The
assert_invalid_report_datamethod effectively encapsulates the validation error checking logic, promoting DRY principles across the test suite.
64-73: Good simplification of test method.Removing the explicit content_type parameter is appropriate since the test client defaults to
application/json.
86-104: Improved test coverage for multiple report types.The updated test now properly validates that the endpoint can handle both deprecation and intervention reports in a single request, with appropriate metrics tracking for each type.
105-175: Excellent comprehensive validation test coverage.The new test methods thoroughly cover all validation scenarios including:
- Required field validation
- Field type and format validation
- Business rule validation (attempts >= 1, timestamp >= 0)
- Mutual exclusivity validation (age vs timestamp)
Each test is focused, well-named, and uses the helper method effectively.
src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py (3)
1-38: Well-structured type definition and appropriate imports.The
ErrorEventTypedDict provides clear type safety for error event data, and all new imports are properly utilized in the implementation.
134-169: Excellent chronological merging implementation.The implementation correctly:
- Sorts error events once for efficiency
- Merges events and errors in chronological order
- Handles all edge cases (errors before, during, and after replay events)
- Maintains proper state with error_idx across iterations
171-181: Clean integration of error events into the analysis pipeline.The minimal changes to this function effectively integrate error events while maintaining the existing structure.
| <SummaryIconContainer> | ||
| <IconSeer size="xs" /> | ||
| <SummaryContainer> | ||
| <SummaryHeader>{t('Feedback Summary')}</SummaryHeader> | ||
| <SummaryContent>{summary}</SummaryContent> | ||
| </SummaryContainer> | ||
| </SummaryIconContainer> | ||
| ); |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Add accessibility attributes for better screen reader support.
The summary container lacks proper ARIA labels and semantic structure that would help screen readers understand the AI-generated content.
return (
- <SummaryIconContainer>
+ <SummaryIconContainer role="region" aria-labelledby="feedback-summary-header">
<IconSeer size="xs" />
<SummaryContainer>
- <SummaryHeader>{t('Feedback Summary')}</SummaryHeader>
+ <SummaryHeader id="feedback-summary-header">{t('Feedback Summary')}</SummaryHeader>
<SummaryContent>{summary}</SummaryContent>
</SummaryContainer>
</SummaryIconContainer>
);📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <SummaryIconContainer> | |
| <IconSeer size="xs" /> | |
| <SummaryContainer> | |
| <SummaryHeader>{t('Feedback Summary')}</SummaryHeader> | |
| <SummaryContent>{summary}</SummaryContent> | |
| </SummaryContainer> | |
| </SummaryIconContainer> | |
| ); | |
| return ( | |
| <SummaryIconContainer role="region" aria-labelledby="feedback-summary-header"> | |
| <IconSeer size="xs" /> | |
| <SummaryContainer> | |
| <SummaryHeader id="feedback-summary-header">{t('Feedback Summary')}</SummaryHeader> | |
| <SummaryContent>{summary}</SummaryContent> | |
| </SummaryContainer> | |
| </SummaryIconContainer> | |
| ); |
🤖 Prompt for AI Agents
In static/app/components/feedback/feedbackSummary.tsx around lines 28 to 35, the
SummaryContainer lacks accessibility attributes for screen readers. Add
appropriate ARIA attributes such as aria-label or role to the SummaryContainer
or its child elements to clearly describe the AI-generated content. Consider
using semantic HTML elements or landmarks to improve screen reader
comprehension.
| {organization.features.includes('use-table-widget-visualization') ? ( | ||
| <TableWidgetVisualization | ||
| columns={[]} | ||
| tableData={{ | ||
| data: [], | ||
| meta: { | ||
| fields: {}, | ||
| units: {}, | ||
| }, | ||
| }} | ||
| /> |
There was a problem hiding this comment.
Incomplete implementation - TableWidgetVisualization receives empty data.
The new TableWidgetVisualization component is being rendered with empty columns and data, which appears to be a placeholder implementation. This needs to be updated to pass the actual table data:
- <TableWidgetVisualization
- columns={[]}
- tableData={{
- data: [],
- meta: {
- fields: {},
- units: {},
- },
- }}
- />
+ <TableWidgetVisualization
+ columns={fields}
+ tableData={{
+ data: result.data,
+ meta: result.meta || {
+ fields: {},
+ units: {},
+ },
+ }}
+ />📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| {organization.features.includes('use-table-widget-visualization') ? ( | |
| <TableWidgetVisualization | |
| columns={[]} | |
| tableData={{ | |
| data: [], | |
| meta: { | |
| fields: {}, | |
| units: {}, | |
| }, | |
| }} | |
| /> | |
| {organization.features.includes('use-table-widget-visualization') ? ( | |
| <TableWidgetVisualization | |
| columns={fields} | |
| tableData={{ | |
| data: result.data, | |
| meta: result.meta || { | |
| fields: {}, | |
| units: {}, | |
| }, | |
| }} | |
| /> |
🤖 Prompt for AI Agents
In static/app/views/dashboards/widgetCard/chart.tsx between lines 164 and 174,
the TableWidgetVisualization component is currently rendered with empty columns
and data, which is incomplete. Update this by passing the actual columns and
table data relevant to the widget instead of empty arrays and objects, ensuring
the component receives meaningful data to display.
| return [...groupBys, ...visualizes.flatMap(visualize => visualize.yAxes)].filter( | ||
| Boolean | ||
| ); | ||
| return [...groupBys, ...visualizes.map(visualize => visualize.yAxis)].filter(Boolean); |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
LGTM! Systematic refactor from multiple y-axes to single y-axis.
The change from visualize.yAxes array to visualize.yAxis string simplifies the visualization model. The logic correctly maps over visualizes to extract the single y-axis property.
🏁 Script executed:
#!/bin/bash
# Verify that all references to yAxes have been updated to yAxis in the explore directory
echo "Checking for any remaining yAxes references in explore directory:"
rg -A 2 -B 2 "\.yAxes" static/app/views/explore/
echo -e "\nChecking for yAxis usage to confirm the new pattern:"
rg -A 2 -B 2 "\.yAxis" static/app/views/explore/ | head -20Length of output: 15370
Multiple .yAxes references remain – complete single y-axis refactor
We ran rg '\.yAxes' static/app/views/explore/ and found that numerous files still expect an array of y-axes. To avoid runtime errors, please replace these with the new single-axis pattern (yAxis) and adjust any array logic accordingly. Notable locations include:
• static/app/views/explore/utils.tsx
• static/app/views/explore/savedQueries/exploreParams.tsx
• static/app/views/explore/contexts/pageParamsContext/visualizes.tsx
• static/app/views/explore/hooks/useGetSavedQueries.tsx
• static/app/views/explore/multiQueryMode/** (hooks, locationUtils, chart, queryConstructors, etc.)
Ensure each reference to visualize.yAxes or q.yAxes is updated, and any flatMap/array operations now map from the single yAxis field.
🤖 Prompt for AI Agents
In static/app/views/explore/hooks/useExploreTimeseries.tsx at line 85, update
the code to replace any references to the old array property `yAxes` with the
new single property `yAxis`. Since `visualize.yAxis` is now a single value,
remove any array operations like flatMap or map that expect multiple y-axes and
adjust the logic to handle a single y-axis value instead. Also, review and
update similar references in the other listed files to ensure consistency and
prevent runtime errors.
| } catch (e) { | ||
| throw new Error(`Unable to fetch trace item attribute keys: ${e}`); | ||
| } |
There was a problem hiding this comment.
Sanitize error messages to prevent information leakage.
The error handler includes the raw error message which could potentially expose sensitive information about the API or system internals.
} catch (e) {
- throw new Error(`Unable to fetch trace item attribute keys: ${e}`);
+ throw new Error('Unable to fetch trace item attribute keys');
}If you need to log the original error for debugging, consider using a logging service instead of including it in the thrown error.
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| } catch (e) { | |
| throw new Error(`Unable to fetch trace item attribute keys: ${e}`); | |
| } | |
| } catch (e) { | |
| throw new Error('Unable to fetch trace item attribute keys'); | |
| } |
🤖 Prompt for AI Agents
In static/app/views/explore/hooks/useGetTraceItemAttributeKeys.tsx around lines
84 to 86, the error message thrown includes the raw error object, which may
expose sensitive system details. Modify the catch block to throw a generic error
message without including the raw error. If detailed error information is needed
for debugging, log the original error separately using a logging service instead
of embedding it in the thrown error.
| const queryOptions = useMemo(() => { | ||
| return makeTraceItemAttributeKeysQueryOptions({ | ||
| traceItemType, | ||
| type, | ||
| datetime: selection.datetime, | ||
| projectIds, | ||
| }); | ||
| }, [selection, traceItemType, type, projectIds]); |
There was a problem hiding this comment.
Missing search parameter in query options.
The makeTraceItemAttributeKeysQueryOptions function accepts a search parameter according to the relevant code snippet, but it's not being passed here. This might affect the ability to filter attribute keys by search string.
Consider adding the search parameter if search functionality is needed:
const queryOptions = useMemo(() => {
return makeTraceItemAttributeKeysQueryOptions({
traceItemType,
type,
datetime: selection.datetime,
projectIds,
+ search: searchString, // Add this if search is needed
});
}, [selection, traceItemType, type, projectIds]);Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx around lines 30
to 37, the call to makeTraceItemAttributeKeysQueryOptions is missing the search
parameter, which is necessary for filtering attribute keys by a search string.
Update the function call to include the search parameter from the relevant state
or props so that the query options correctly reflect the search criteria.
| const deleteOverlay = useCallback( | ||
| (group: number, index: number) => { | ||
| (group: number) => { | ||
| const newVisualizes = visualizes | ||
| .map((visualize, orgGroup) => { | ||
| if (group === orgGroup) { | ||
| visualize = visualize.replace({ | ||
| yAxes: visualize.yAxes.filter((_, orgIndex) => index !== orgIndex), | ||
| }); | ||
| } | ||
| return visualize.toJSON(); | ||
| }) | ||
| .filter(visualize => visualize.yAxes.length > 0); | ||
| .toSpliced(group, 1) | ||
| .map(visualize => visualize.toJSON()); | ||
| setVisualizes(newVisualizes); | ||
| }, | ||
| [setVisualizes, visualizes] | ||
| ); |
There was a problem hiding this comment.
🛠️ Refactor suggestion
Rename deleteOverlay to reflect visualization deletion.
The function name deleteOverlay is outdated since the refactor removed the overlay concept. It now deletes entire visualizations, not overlays.
- const deleteOverlay = useCallback(
+ const deleteVisualization = useCallback(
(group: number) => {
const newVisualizes = visualizes
.toSpliced(group, 1)
.map(visualize => visualize.toJSON());
setVisualizes(newVisualizes);
},
[setVisualizes, visualizes]
);Also update the prop name and usage:
- deleteOverlay={deleteOverlay}
+ deleteVisualization={deleteVisualization}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const deleteOverlay = useCallback( | |
| (group: number, index: number) => { | |
| (group: number) => { | |
| const newVisualizes = visualizes | |
| .map((visualize, orgGroup) => { | |
| if (group === orgGroup) { | |
| visualize = visualize.replace({ | |
| yAxes: visualize.yAxes.filter((_, orgIndex) => index !== orgIndex), | |
| }); | |
| } | |
| return visualize.toJSON(); | |
| }) | |
| .filter(visualize => visualize.yAxes.length > 0); | |
| .toSpliced(group, 1) | |
| .map(visualize => visualize.toJSON()); | |
| setVisualizes(newVisualizes); | |
| }, | |
| [setVisualizes, visualizes] | |
| ); | |
| const deleteVisualization = useCallback( | |
| (group: number) => { | |
| const newVisualizes = visualizes | |
| .toSpliced(group, 1) | |
| .map(visualize => visualize.toJSON()); | |
| setVisualizes(newVisualizes); | |
| }, | |
| [setVisualizes, visualizes] | |
| ); |
🤖 Prompt for AI Agents
In static/app/views/explore/toolbar/toolbarVisualize.tsx around lines 47 to 55,
rename the function `deleteOverlay` to a name that clearly indicates it deletes
visualizations, such as `deleteVisualization`. Also update any related prop
names and their usage to reflect this change, ensuring consistency with the
current functionality that deletes entire visualizations rather than overlays.
| * ‼️ [**{titles[0]}**](http://testserver/organizations/{self.organization.slug}/issues/{groups[0]}/?referrer=gitlab-pr-bot) | ||
|
|
||
| * ‼️ [**{titles[1]}**](http://testserver/organizations/{self.another_organization.slug}/issues/{groups[1]}/?referrer=gitlab-pr-bot) | ||
| """ |
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Verify GitLab and GitHub comment formats remain consistent.
Both integrations should produce similar comment formats with only minor differences (like referrer parameters). The format should be consistent in structure and styling.
Also applies to: 430-433
🏁 Script executed:
#!/bin/bash
# Compare comment templates between GitHub and GitLab integrations
echo "=== GitHub Integration ==="
rg -A 5 -B 2 "Suspect Issues" src/sentry/integrations/github/
echo "=== GitLab Integration ==="
rg -A 5 -B 2 "Suspect Issues" src/sentry/integrations/gitlab/Length of output: 1348
Ensure consistent “Suspect Issues” comment templates across GitHub and GitLab
We’ve confirmed that the GitHub and GitLab templates differ beyond the “pull request” vs “merge request” wording:
- GitHub’s template includes a feedback footer (
<sub>Did you find this useful?…</sub>) and an extra blank line around{issue_list}. - GitLab’s template omits the footer and has no trailing blank line.
To align them, update MERGED_PR_COMMENT_BODY_TEMPLATE in src/sentry/integrations/gitlab/integration.py:
@@ src/sentry/integrations/gitlab/integration.py
MERGED_PR_COMMENT_BODY_TEMPLATE = """\
## Suspect Issues
This merge request was deployed and Sentry observed the following issues:
{issue_list}
+
+<sub>Did you find this useful? React with a 👍 or 👎</sub>"""- Add a blank line after
{issue_list} - Append the feedback footer identical to GitHub’s
Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In tests/sentry/integrations/gitlab/tasks/test_pr_comment.py around lines 375 to
378, the GitLab "Suspect Issues" comment template differs from GitHub's by
missing a blank line after {issue_list} and the feedback footer. To fix this,
update the MERGED_PR_COMMENT_BODY_TEMPLATE in
src/sentry/integrations/gitlab/integration.py by adding a blank line after
{issue_list} and appending the same feedback footer used in the GitHub template
to ensure consistency.
Test 5
Summary by CodeRabbit
New Features
Improvements
Flexlayout system, replacing various custom flexbox wrappers for consistency.Bug Fixes
Tests
Chores