Skip to content

Replays Self-Serve Bulk Delete System#5

Open
everettbu wants to merge 32 commits into
replays-delete-vulnerablefrom
replays-delete-stable
Open

Replays Self-Serve Bulk Delete System#5
everettbu wants to merge 32 commits into
replays-delete-vulnerablefrom
replays-delete-stable

Conversation

@everettbu

@everettbu everettbu commented Jul 26, 2025

Copy link
Copy Markdown

Test 5

Summary by CodeRabbit

  • New Features

    • Introduced AI-generated feedback summaries in the feedback list page, including a new summary component and supporting data-fetching hook.
    • Added a new table visualization component for dashboards, with customizable columns, loading states, and Storybook/test coverage.
    • Enhanced replay breadcrumb summaries by integrating error context and interleaving error events with logs.
    • Added analytics event tracking for replay timeline zoom actions.
  • Improvements

    • Updated layout components across the app to use a shared Flex layout system, replacing various custom flexbox wrappers for consistency.
    • Improved browser report validation and error handling, now providing detailed validation errors for invalid submissions.
    • Enhanced PR comment formatting for GitHub and GitLab integrations, now including environment information and improved markdown formatting.
    • Added support for an optional owner field in workflow engine detectors, with full API and validation coverage.
    • Updated default values for autofix automation tuning options to "off".
    • Added noise reduction configuration for database query injection vulnerability group type.
    • Improved error handling in replay AI summary loading when the project is not found.
  • Bug Fixes

    • Fixed replay deletion logic to handle cases where segment IDs may be missing.
    • Corrected y-axis handling in explore visualizations, simplifying to a single y-axis per visualization and updating related logic and tests.
  • Tests

    • Expanded test coverage for browser report validation, replay error context, workflow detector ownership, and dashboard table visualization.
    • Added new fixtures for tabular column testing and logs dataset top events tests.
    • Removed obsolete or redundant tests related to deleted or refactored features.
  • Chores

    • Refactored and cleaned up internal code, removing unused options, constants, and outdated migration/test files.
    • Updated analytics event mappings and improved logging/context in workflow processors.

armenzg and others added 30 commits June 20, 2025 12:49
…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
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
![Screenshot 2025-06-20 at 12 00
54 PM](https://github.com/user-attachments/assets/97ca72da-0a52-4446-9825-cd4fcb505adf)

after
![Screenshot 2025-06-20 at 11 59
29 AM](https://github.com/user-attachments/assets/a4284d2b-c9f5-442f-b010-7fe72a598e39)
### 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.
mrduncan and others added 2 commits June 20, 2025 13:20
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.
@coderabbitai

coderabbitai Bot commented Jul 26, 2025

Copy link
Copy Markdown

Walkthrough

This 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

Cohort / File(s) Change Summary
Explore Visualization Model Refactor
static/app/views/explore/contexts/pageParamsContext/visualizes.tsx, static/app/views/explore/contexts/pageParamsContext/visualizes.spec.tsx, static/app/views/explore/contexts/pageParamsContext/index.tsx, static/app/views/explore/contexts/pageParamsContext/aggregateFields.tsx, static/app/views/explore/contexts/pageParamsContext/sortBys.tsx, static/app/views/explore/contexts/pageParamsContext/index.spec.tsx, static/app/views/explore/hooks/useAnalytics.tsx, static/app/views/explore/hooks/useAddToDashboard.tsx, static/app/views/explore/hooks/useExploreAggregatesTable.tsx, static/app/views/explore/hooks/useExploreTimeseries.tsx, static/app/views/explore/hooks/useTopEvents.tsx, static/app/views/explore/spans/spansTab.tsx, static/app/views/explore/toolbar/toolbarSaveAs.tsx, static/app/views/explore/toolbar/toolbarSortBy.tsx, static/app/views/explore/toolbar/toolbarVisualize.tsx, static/app/views/explore/tables/aggregateColumnEditorModal.tsx, static/app/views/explore/tables/aggregateColumnEditorModal.spec.tsx, static/app/views/explore/utils.tsx, static/app/views/explore/utils.spec.tsx, static/app/views/explore/toolbar/index.spec.tsx, static/app/views/explore/charts/index.tsx
Refactors the Explore UI to represent each visualization as having a single y-axis instead of multiple. Updates all related logic, tests, and serialization accordingly. Removes deduplication and overlay logic for multiple y-axes.
Table Widget Visualization Feature
static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.tsx, static/app/views/dashboards/widgets/tableWidget/defaultTableCellRenderers.tsx, static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.stories.tsx, static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.spec.tsx, static/app/views/dashboards/widgets/tableWidget/fixtures/sampleHTTPRequestTableData.ts, static/app/views/dashboards/widgets/common/types.tsx, tests/js/fixtures/tabularColumn.ts, tests/js/fixtures/tabularColumns.ts
Adds a new TableWidgetVisualization React component with supporting stories, tests, default cell renderers, and sample data/fixtures. Introduces a TabularColumn type and fixtures for testing.
Replay Breadcrumb Summarization with Error Context
src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py, tests/sentry/replays/test_project_replay_summarize_breadcrumbs.py
Integrates error event context into replay breadcrumb summaries, merging error logs with replay logs, updating endpoint logic and adding comprehensive tests for error scenarios.
Feedback Summary Feature
static/app/components/feedback/feedbackSummary.tsx, static/app/components/feedback/list/useFeedbackSummary.tsx, static/app/views/feedback/feedbackListPage.tsx
Introduces an AI-generated feedback summary component and hook, integrates it into the feedback list page, and manages feature gating and loading/error states.
Browser Reporting Collector Input Validation
src/sentry/issues/endpoints/browser_reporting_collector.py, tests/sentry/api/endpoints/test_browser_reporting_collector.py
Replaces dataclass with DRF serializer for browser reports, adds robust input validation and error handling, and expands test coverage for invalid input scenarios.
Integrations PR Comment Formatting Update
src/sentry/integrations/github/integration.py, src/sentry/integrations/gitlab/integration.py, src/sentry/integrations/source_code_management/commit_context.py, tests/sentry/integrations/github/tasks/test_pr_comment.py, tests/sentry/integrations/gitlab/tasks/test_pr_comment.py
Refactors PR comment formatting logic for GitHub and GitLab integrations, centralizes template logic, adds environment info, and updates tests to match new format.
Parameterization Experiment Cleanup
src/sentry/grouping/parameterization.py, tests/sentry/grouping/test_parameterization.py, src/sentry/options/defaults.py
Removes ParameterizationRegexExperiment and its usage, updates type aliases, and removes related option registration and tests.
Project Option Default Value Change
src/sentry/constants.py, src/sentry/projectoptions/defaults.py, tests/sentry/api/endpoints/test_project_details.py, tests/sentry/api/serializers/test_project.py
Changes the default value for autofix automation tuning from "low" to "off" and updates related tests and constants.
Workflow Engine Ownership Support
src/sentry/workflow_engine/endpoints/validators/base/detector.py, src/sentry/workflow_engine/processors/delayed_workflow.py, src/sentry/workflow_engine/processors/workflow.py, tests/sentry/workflow_engine/endpoints/test_organization_detector_details.py, tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py, tests/sentry/workflow_engine/processors/test_delayed_workflow.py
Adds support for optional owner field (user/team) in detectors, updates delayed workflow processing to centralize slow condition handling, and expands tests for ownership and processor changes.
Task Processing Deadline Configuration
src/sentry/hybridcloud/tasks/deliver_webhooks.py, src/sentry/tasks/auth/check_auth.py
Adds processing_deadline_duration to taskworker configs for webhook delivery and auth check tasks.
Preprod Analytics Event
src/sentry/preprod/analytics.py, src/sentry/preprod/api/endpoints/organization_preprod_artifact_assemble.py, src/sentry/preprod/__init__.py
Adds a new analytics event for preprod artifact assembly, records this event in the relevant API endpoint, and updates module exports.
Noise Config for DB Query Injection
src/sentry/issues/grouptype.py
Adds a noise_config attribute to the DBQueryInjectionVulnerabilityGroupType.
No-op Migrations and Test Removal
src/sentry/migrations/0917_convert_org_saved_searches_to_views.py, src/sentry/migrations/0920_convert_org_saved_searches_to_views_revised.py, tests/sentry/migrations/test_0917_convert_org_saved_searches_to_views.py
Replaces two migrations with no-ops and removes associated migration test.
Snuba Ourlogs Top Events Query Update and Test
src/sentry/snuba/ourlogs.py, tests/snuba/api/endpoints/test_organization_events_stats.py
Adds an optional equations parameter to the top events timeseries query and introduces a new test for top events in the "ourlogs" dataset.
Devservices and Service Config Additions
devservices/config.yml
Adds new service definitions, Kafka consumers, and a new mode to the devservices configuration.
Trace Item Attribute Key/Value Hooks
static/app/views/explore/hooks/useGetTraceItemAttributeKeys.tsx, static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx, static/app/views/explore/hooks/useGetTraceItemAttributeValues.spec.tsx, static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx, static/app/views/explore/components/traceItemSearchQueryBuilder.tsx, static/app/views/insights/pages/transactionNameSearchBar.tsx, static/app/views/explore/types.tsx
Adds and refactors hooks for fetching trace item attribute keys/values, updates types, and modifies usage throughout the codebase.
Analytics Event Additions and Replay Timeline Tracking
static/app/components/replays/timeAndScrubberGrid.tsx, static/app/utils/analytics/replayAnalyticsEvents.tsx
Adds analytics events for replay timeline zoom actions and updates timeline zoom button handlers to track these events.
Frontend Layout Refactor to Shared Flex
static/app/components/codeSnippet.tsx, static/app/components/codecov/branchSelector/branchSelector.tsx, static/app/components/codecov/datePicker/dateSelector.tsx, static/app/components/codecov/integratedOrgSelector/integratedOrgSelector.tsx, static/app/components/codecov/repoPicker/repoSelector.tsx, static/app/components/core/button/styles.chonk.tsx, static/app/components/events/eventAttachments.tsx, static/app/components/events/groupingInfo/groupingVariant.tsx, static/app/components/events/interfaces/spans/newTraceDetailsHeader.tsx, static/app/components/group/times.tsx, static/app/views/alerts/list/rules/alertRuleStatus.tsx, static/app/views/alerts/list/rules/row.tsx, static/app/views/codecov/tests/onboardingSteps/addUploadToken.tsx, static/app/views/dashboards/widgetCard/chart.tsx, static/app/views/organizationStats/teamInsights/teamMisery.tsx, static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx, static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx, static/app/views/performance/newTraceDetails/traceWaterfall.tsx, static/app/views/settings/dynamicSampling/organizationSampleRateInput.tsx, static/app/views/settings/organizationAuditLog/auditLogList.tsx, static/app/views/settings/organizationIntegrations/detailedView/integrationLayout.tsx, static/app/views/settings/project/projectOwnership/codeOwnerFileTable.tsx, static/gsAdmin/views/instanceLevelOAuth/instanceLevelOAuthDetails.tsx
Refactors many UI components to use a shared Flex layout system, removing custom styled flex containers throughout the codebase.
Other Feature and Test Updates
src/sentry/replays/usecases/delete.py, static/app/views/replays/detail/ai/index.tsx, src/sentry/migrations/0917_convert_org_saved_searches_to_views.py, src/sentry/migrations/0920_convert_org_saved_searches_to_views_revised.py, src/sentry/feedback/usecases/feedback_summaries.py
Various improvements: replay deletion handles None segment IDs, AI summary error handling, migration no-ops, and feedback summary prompt refinement.

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
Loading
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
Loading
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
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~90 minutes

Poem

A rabbit hopped through fields of code,
Where y-axes once did crowd the road.
Now single lines, so clear and neat,
And tables render data sweet.
Breadcrumbs merge with error tales,
Flex layouts trim the old travails.
With every test and prompt refined—
This code, like carrots, well-aligned! 🥕

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch replays-delete-stable

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need 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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@coderabbitai

coderabbitai Bot commented Jul 28, 2025

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@everettbu

Copy link
Copy Markdown
Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 28, 2025

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🔭 Outside diff range comments (1)
static/app/views/codecov/tests/onboardingSteps/addUploadToken.tsx (1)

36-40: handleGenerateClick does not reset showFullToken / warning state – token never re-appears after a regenerate.
After the first “Done” click showFullToken is set to false. Pressing “Regenerate” only flips showTokenDetails, 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 inner Flex use the same justify="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 compact

A 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 _columnIndex parameter is prefixed with an underscore indicating it's unused, but it's actually passed to renderTableHeadCell on 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 key prop 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 isKnownAttribute is ambiguous. It returns true for attributes that should be skipped, not just known ones. A name like shouldSkipAttribute or isInternalAttribute would 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 OrganizationEventsStatsTopNEventsLogs class follows the same pattern as the spans test class and provides appropriate test coverage for logs functionality. The implementation correctly:

  1. Inherits from the appropriate test case classes including OurLogTestCase
  2. Sets up synthetic log data with varying message bodies and counts
  3. Tests the top N events API functionality for the logs dataset
  4. 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 Visualize class refactor is clean and maintains backward compatibility through the toJSON method. The fromJSON method correctly transforms the stored format to individual instances.

Consider documenting why the stack property 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_instance call 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

📥 Commits

Reviewing files that changed from the base of the PR and between 49a2758 and ea188e2.

📒 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 landing

The previous UI showed a “Type” entry with a tooltip for COMPONENT, CUSTOM_FINGERPRINT, BUILT_IN_FINGERPRINT, SALTED_COMPONENT, and PERFORMANCE_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 referrer property to getAlertsUrl improves 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.background instead 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_ATTRIBUTES constant 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 PreprodArtifactApiAssembleEvent follows 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_id directly 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 | undefined union 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 ActorField import 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 ActorField which 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_id and owner_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-metrics service 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_htmlreplay.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__.py to 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 Visualize with 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 None for max_segment_id to 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 FlexContainer with the shared Flex component 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 useTraceItemAttributeValues to useGetTraceItemAttributeValues
  • Removed attributeKey parameter from hook calls
  • Test suite name updated accordingly

These changes align with the hook refactoring that simplified the interface to only require traceItemType and type parameters.

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" for autofixAutomationTuning, 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 FlexSpacer divs 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 TabularColumn type 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 attributeKey and enabled parameters 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 attributeKey and enabled parameters while adding projectIds for 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 Flex component improves consistency and reduces code duplication. The align="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 Flex component improves code consistency and maintainability. The align="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 FlexCenter styled component with the shared Flex component using align="center" and gap={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) to visualizes.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) to visualizes.map(v => v.yAxis) correctly adapts to the single y-axis per visualization model. This maintains the expected array format for the useSortByFields hook while simplifying the data extraction logic.

static/app/views/organizationStats/teamInsights/teamMisery.tsx (1)

9-9: LGTM! Consistent layout standardization.

The replacement of custom FlexCenter components with the shared Flex 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.yAxes to directly checking and adding aggregateField.yAxis simplifies 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 Flex component 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 FlexCenter styled 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 Visualize constructor 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 Flex component import supports the refactoring effort to use standardized layout components.


154-170: LGTM! Clean replacement of custom styled component.

The replacement of the custom FlexDiv with <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 Flex component import is consistent with the broader refactoring effort across the codebase.


122-127: LGTM! Effective replacement of custom styled component.

The replacement of FlexContainer with <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 TabularColumnsFixture function 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 existing TabularColumnFixture function.

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 Flex component improves code consistency and maintainability across the codebase. The props (align="center" and gap={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 Flex component in the OrgFooterMessage function 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 Flex component 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 yAxis property instead of multiple yAxes. 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 yAxis is 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 for sentry:autofix_automation_tuning, which aligns with the changes mentioned in the AI summary for src/sentry/constants.py and src/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: -1 is the intended default value for the TabularColumn.width property.

Is width: -1 a meaningful default value for table columns, or should it be a positive number or null/undefined?

static/app/views/settings/organizationIntegrations/detailedView/integrationLayout.tsx (1)

247-247: Excellent refactoring to use shared layout primitives.

The replacement of custom styled FlexContainer with Flex.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-in and replay.timeline.zoom-out events 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, and useOrganization are 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_id prevents 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_id can be None, 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 Flex and TextOverflow components aligns with the systematic refactoring to use shared layout primitives.


24-24: Excellent refactoring to use shared Flex component.

Replacing the custom FlexWrapper with the standardized Flex component improves consistency across the codebase. The align="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 TimeSince components in TextOverflow improves 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: 12px ensures 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 ParameterizationRegexExperiment import correctly reflects the deletion of this class from the main codebase. The remaining test coverage for Parameterizer and UniqueIdExperiment is 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 SummaryListContainer cleanly 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 SummaryListContainer uses 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) 2fr to minmax(195px, 1fr) 1.5fr appropriately 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 UseTraceItemAttributeBaseProps interface 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 shared Flex component improves code consistency and maintainability. The Flex component 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[] to yAxis: string in the visualization model. The logic correctly:

  • Checks equality with the single yAxis string instead of array inclusion
  • Maps single yAxis values instead of flattening arrays

This 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 Flex component while preserving existing visual design through the new SampleRateRow styled component. The Flex usage with gap={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 Flex component supports the standardization effort across the codebase.


269-278: LGTM! Consistent replacement of custom styled component.

The replacement of FlexCenter with <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 Flex component 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 Flex component 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 Flex component.


712-808: LGTM! Clean migration to shared Flex component.

The replacement of the local FlexBox styled 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 yAxes array to directly using yAxis string 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 yAxis string 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 yAxis in 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 findByText for 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]?.textContent properly 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:

  1. Defining clear custom head and body renderers with distinct output
  2. Verifying both custom renderers are properly invoked
  3. 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 yAxis property instead of yAxes[0], consistent with the refactored Visualize class structure.


303-303: LGTM! Consistent updates using the replace method.

Both changes correctly use the replace method 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 equations parameter 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 useFeedbackSummary hook 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 flatMap to map correctly handles the new single yAxis string property instead of the previous yAxes array.


361-361: LGTM! Consistent field reference extraction.

The change correctly extracts field references from the single yAxis property, maintaining consistency with the refactored Visualize class.


375-376: LGTM! Proper backward compatibility handling.

The code correctly uses isBaseVisualize type guard and continues to handle the yAxes array 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 their run method.

static/app/views/explore/utils.tsx (2)

284-295: LGTM: Clean refactoring from multiple to single y-axis.

The simplification from iterating over multiple yAxes to handling a single yAxis is well-implemented. The logic for parsing functions and extracting fields remains correct and the deduplication is still handled properly with the seenFields Set.


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_template instead of a module constant is a good architectural improvement. The addition of environment information via self.get_environment_info(issue) provides valuable context for developers.

The removal of the subtitle parameter (previously from issue.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_template with 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 API

The test updates correctly reflect the refactoring of the Visualize class 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 method

The replace method calls have been updated to use yAxis instead of yAxes, 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 return

The fromJSON tests correctly expect an array of Visualize instances while testing with single string construction. This aligns with the relevant code snippet showing that fromJSON maps over yAxes array to create multiple Visualize instances.

Also applies to: 100-102

static/app/components/events/interfaces/spans/newTraceDetailsHeader.tsx (3)

4-4: Good: Added import for shared Flex component

Adding the import for the shared Flex component from the core layout library supports the standardization effort.


36-41: LGTM: Consistent replacement of custom styled components with shared Flex

The replacement of custom FlexBox and BreakDownRow components with the shared Flex component is well-executed. The align="center" and justify="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 styling

The BreakDownWrapper has been appropriately simplified to a basic flex column container with padding, removing the dependency on the custom FlexBox component.

static/app/views/explore/hooks/useGetTraceItemAttributeValues.tsx (3)

12-15: Good: Consolidated import statements

Consolidating the imports into a single import from the types file improves code organization and reduces import clutter.


25-28: Interface simplification looks appropriate

The new UseGetTraceItemAttributeValuesProps interface appropriately extends the base props and adds datetime while removing attributeKey, enabled, and search which appear to be handled internally by the hook's callback function.


78-83: LGTM: Hook renaming and signature update

The hook has been properly renamed to useGetTraceItemAttributeValues with 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 correctly

All Visualize constructor 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 expectations

The expected onColumnsChange calls now properly expect objects with yAxes array properties instead of Visualize instances, which correctly reflects the serialization behavior of the updated Visualize.toJSON() method.

Also applies to: 212-215, 263-263


282-282: Helper function correctly updated for singular yAxis

The expectRows helper function has been properly updated to use field.yAxis (singular) instead of field.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 task

The 30-second processing deadline for schedule_webhook_delivery is 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 logic

The 300-second processing deadline for drain_mailbox aligns well with the existing BATCH_SCHEDULE_OFFSET timeout 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 task

The 120-second processing deadline for drain_mailbox_parallel is 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 isBaseVisualize enables 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 yAxis strings to the Visualize constructor is consistent with the refactor. The loop still handles multiple y-axes from BaseVisualize objects by creating separate Visualize instances.


34-36: Confirmed: Type Guard Aligns with Visualize Definition
The Visualize class in static/app/views/explore/contexts/pageParamsContext/visualizes.tsx indeed declares a single yAxis: string property, and its toJSON/fromJSON methods continue to wrap/unwrap that value in the yAxes array for the external shape. The isVisualize guard correctly checks for value.yAxis as a string. Approving these changes.

  • Visualize class declaration (lines 37–40) includes yAxis: string.
  • Serialization still uses yAxes: [this.yAxis] and deserializes via json.yAxes.map(...).
  • No other references to a yAxes array remain in the in-memory model.

114-120: Serialization logic validated
The fromJSON implementation in static/app/views/explore/contexts/pageParamsContext/visualizes.tsx returns a Visualize[] (one instance per yAxis), so your use of aggregateFields.flatMap(…) followed by map(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 environment fields ("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 None owner value
  • Complete owner field clearance in database
  • Proper None response in API serialization

249-251: Owner Identifier Formats Are Consistent

I confirmed that User.get_actor_identifier() (defined in src/sentry/users/models/user.py) returns "user:{id}", and all team identifiers use the "team:{id}" prefix (e.g. in src/sentry/models/groupowner.py and 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 getChartInfo function now accepts a single yAxis string 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 getChartInfo correctly pass single y-axis strings:

  • visualize.yAxis for regular chart info
  • DEFAULT_VISUALIZATION for fallback sampling metadata

This ensures compatibility with the new function signature.

Also applies to: 210-210


226-226: ChartInfo yAxes property maintains expected array format.

The yAxes property 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 that DEFAULT_VISUALIZATION is 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 environment fields ("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 Any type 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 Literal type 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 Response with 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_data from 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_STYLES constant 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.fields when 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 GridEditable while 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 LoadingPlaceholder provides 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 tableData prop and the optional columns prop, 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_groups aligns 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_groups and passing the result as dcg_to_slow_conditions parameter. 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 OrganizationEventsStatsTopNEvents to OrganizationEventsStatsTopNEventsSpans clearly 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 useQuery with 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_snuba decorator and TransactionTestCase base class are appropriate choices for tests that interact with Snuba services.


40-45: LGTM! Clean helper method for Snuba test data insertion.

The store_replays method 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 of Visualize instances for analytics tracking.

Also applies to: 189-189, 276-276


378-380: Correct adaptation to single yAxis pattern.

The mapping from yAxes array to individual Visualize instances 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.yAxis simplifies 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_conditions parameter 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_conditions dictionary throughout, maintaining consistency and avoiding redundant lookups.

Also applies to: 419-419, 675-675, 702-702


583-583: Improved logging specificity.

Using workflow_event_data instead of event_data provides 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 defaultVisualizes function correctly creates a Visualize instance 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 Visualize instances with unique labels.


48-48: Maintains compatibility while supporting new pattern.

The determineDefaultChartType function 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 (deepcopy and Response) 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_data method 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 ErrorEvent TypedDict 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.

Comment on lines +28 to +35
<SummaryIconContainer>
<IconSeer size="xs" />
<SummaryContainer>
<SummaryHeader>{t('Feedback Summary')}</SummaryHeader>
<SummaryContent>{summary}</SummaryContent>
</SummaryContainer>
</SummaryIconContainer>
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ 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.

Suggested change
<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.

Comment on lines +164 to +174
{organization.features.includes('use-table-widget-visualization') ? (
<TableWidgetVisualization
columns={[]}
tableData={{
data: [],
meta: {
fields: {},
units: {},
},
}}
/>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

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.

Suggested change
{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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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 -20

Length 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.

Comment on lines +84 to +86
} catch (e) {
throw new Error(`Unable to fetch trace item attribute keys: ${e}`);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

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.

Suggested change
} 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.

Comment on lines +30 to +37
const queryOptions = useMemo(() => {
return makeTraceItemAttributeKeysQueryOptions({
traceItemType,
type,
datetime: selection.datetime,
projectIds,
});
}, [selection, traceItemType, type, projectIds]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

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.

Comment on lines 47 to 55
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]
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ 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.

Suggested change
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.

Comment on lines +375 to +378
* ‼️ [**{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)
"""

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.