Replays Self-Serve Bulk Delete System#6
Conversation
This validates both the [Working Draft](https://www.w3.org/TR/reporting-1/#concept-reports) and the [Editor's Draft](https://w3c.github.io/reporting/#concept-reports) formats. Fixes [ID-730 - Accept current and upcoming data model](https://linear.app/getsentry/issue/ID-730/accept-current-and-upcoming-data-model).
…o 'low' (#93927)" This reverts commit 8d04522. Co-authored-by: roaga <47861399+roaga@users.noreply.github.com>
Missed in the initial commit, leading to some relevant logs being unannotated.
We have had a few tasks get killed at 10% rollout.
Also add a test, so that this doesn't happen again
Fixes DE-129 and DE-156 --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>
These transitions should be matching
…` (#93946) Use `project_id` on the replay record instead of the URL (where it does not always exist). --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: getsantry[bot] <66042841+getsantry[bot]@users.noreply.github.com>
Also fixed `replay.view_html` -> `replay.view-html` --------- Co-authored-by: Michelle Zhang <56095982+michellewzhang@users.noreply.github.com>
…948) gets `npx @typescript/native-preview` passing again
This adds mode for all things tracing. This encompasses transactions/metrics/spans. Taken from https://github.com/getsentry/sentry/blob/feeaf393deeca8b97675bff23039c6320270aab5/src/sentry/runner/commands/devserver.py#L370
The conditions associated with a DCG can change over time, and it's good if we can be completely confident that they're consistent within a given task execution.
This is unused and most regex experiments have required broader changes to ensure that regexes are evaluated in a specific order (ex: traceparent). Removing this for now to simplify the code and very slightly improve runtime performance.
From some testing (on feedback lists of all different lengths), this prompt seems to work better. It doesn't write overly long sentences and also does a better job at "summarizing" versus just mentioning a few specific topics and leaving out others.
Just remove a couple custom Flex* classes in favor of the Flex primitive
This has been killed a few times. Refs SENTRY-42M7
…n table (#93892) <!-- Describe your PR here. --> [ticket](https://linear.app/getsentry/issue/ID-156/grouping-info-remove-type-field-from-ui) The Type field in the Grouping Info section of the issue details page was redundant. This removes the Type row from all variant types while keeping the underlying data structure intact. before  after 
### Changes Related to this PR: getsentry/sentry#93810. This is part 1 of the change, which is pulling out the new component and just adding it to the repo. Also includes some simplification of the logic in the base component. Part 2 will be replacing tables in widgets. ### Before/After There is no UI change as the table is not being used yet. There is a new story page for the component.
…93943) to prevent this issue from becoming too noisy, add a noise config
Unfortunately, 'event_data' went from being the variable for current event context to being the complete parsed data from Redis, and we continued logging it per group. That's more data than we should be logging even arguably once, let alone per group.
Co-authored-by: Abdullah Khan <abdullahkhan@PG9Y57YDXQ.local>
Adds some simple analytics to our endpoint so we can begin building a dashboard in Amplitude.
Previously, explore supported multiple y axis per chart, so each visualize supported multiple y axis. That functionality has since been removed for simplicity so update the types here to match. Keep in mind that saved queries still store them as an array so when serializing/deserializing, we still need to treat it as an array.
We'll need the `useGetTraceItemAttributeKeys` hook in other places so refactoring it so that it can exported.
- getsentry/sentry#93894 removed usage - getsentry/sentry-options-automator#4243 removed the last override
When the max segment ID is null the process fails. We should exit early since if there aren't any segments to delete there's nothing to do.
|
@cubic-dev-ai review this pull request |
@ShashankFC I have started the AI code review. It will take a few minutes to complete. |
There was a problem hiding this comment.
21 issues found across 106 files
Note: This PR contains a large number of files. cubic only reviews up to 75 files per PR, so some files may not have been reviewed.
Prompt for AI agents (all issues)
Check if these issues are valid — if so, understand the root cause of each and fix them.
<file name="src/sentry/replays/usecases/delete.py">
<violation number="1" location="src/sentry/replays/usecases/delete.py:88">
P3: Typo: "segements" should be "segments".</violation>
</file>
<file name="static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.tsx">
<violation number="1" location="static/app/views/dashboards/widgets/tableWidget/tableWidgetVisualization.tsx:94">
P2: Incomplete defensive coding: `Object.keys(tableData?.meta.fields)` will throw `TypeError` if `tableData` is nullish, because `Object.keys(undefined)` crashes. The optional chaining short-circuits to `undefined` but there's no fallback. Compare with `tableData?.data ?? []` on line 107, which properly falls back. Either remove the unnecessary optional chaining (since `tableData` is required) or add a proper fallback.</violation>
</file>
<file name="src/sentry/preprod/api/endpoints/organization_preprod_artifact_assemble.py">
<violation number="1" location="src/sentry/preprod/api/endpoints/organization_preprod_artifact_assemble.py:81">
P2: Analytics is recorded before the feature flag check, which means events will be tracked even for organizations that don't have the feature enabled (and receive a 404). Move the `analytics.record()` call after the `features.has()` check to avoid polluting analytics data with rejected requests.</violation>
</file>
<file name="static/app/components/scrollCarousel.tsx">
<violation number="1" location="static/app/components/scrollCarousel.tsx:204">
P2: Using CSS `transparent` here will cause a visible dark band artifact in the gradient. `transparent` is `rgba(0,0,0,0)` (transparent **black**), so the gradient interpolates through dark color values on the way to `p.theme.background`. The `LeftMask` correctly avoids this by using `Color(p.theme.background).alpha(0).rgb().string()` — the `RightMask` should do the same for a smooth, artifact-free gradient.</violation>
</file>
<file name="static/app/views/dashboards/widgetCard/chart.tsx">
<violation number="1" location="static/app/views/dashboards/widgetCard/chart.tsx:165">
P1: The `TableWidgetVisualization` is rendered with hardcoded empty `columns` and `tableData` instead of the actual query results available in scope (`result.data`, `result.meta`, `fields`). When the `use-table-widget-visualization` feature flag is enabled, users will see a blank table. Even if this is a scaffold, passing `columns={[]}` (an empty array rather than `undefined`) also defeats the component's own fallback column derivation logic. Consider wiring through the real data, or at minimum omit the `columns` prop so the component can self-derive columns from `tableData.meta`.</violation>
</file>
<file name="src/sentry/issues/endpoints/browser_reporting_collector.py">
<violation number="1" location="src/sentry/issues/endpoints/browser_reporting_collector.py:52">
P1: Bug: Truthiness check `self.initial_data.get("age")` will be falsy when `age=0`, which is a valid value (e.g., a report just generated). This silently bypasses the mutual exclusivity validation, allowing both `age` and `timestamp` to coexist. Use an identity check against `None` or `in` instead.</violation>
<violation number="2" location="src/sentry/issues/endpoints/browser_reporting_collector.py:58">
P1: Bug: Same truthiness issue — `self.initial_data.get("timestamp")` will be falsy when `timestamp=0` (allowed by `min_value=0`). This bypasses the mutual exclusivity check.</violation>
</file>
<file name="static/app/views/performance/newTraceDetails/traceWaterfall.tsx">
<violation number="1" location="static/app/views/performance/newTraceDetails/traceWaterfall.tsx:712">
P2: Potential layout regression: the old `FlexBox` had `height: 100%` which is not carried over to the `Flex` component. If any ancestor relies on `height: 100%` to size this container (rather than flexbox), the waterfall may collapse or not fill available vertical space. Consider adding a `style={{ height: '100%' }}` or `h="100%"` prop if the `Flex` component supports it.</violation>
</file>
<file name="static/app/views/feedback/feedbackListPage.tsx">
<violation number="1" location="static/app/views/feedback/feedbackListPage.tsx:125">
P2: `SummaryListContainer` is missing `overflow: hidden` (or `min-height: 0`). As a flex-column container placed in a grid cell, it inherits `min-height: auto` by default, which can prevent it from properly constraining the inner `Container` (a `FluidHeight` component). This can cause the feedback list to overflow its grid area instead of scrolling within the container.</violation>
</file>
<file name="static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx">
<violation number="1" location="static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx:27">
P2: Style regression: the second `<Flex>` in `Placeholder` is missing `align="center"` and `gap={space(1)}` that the original `FlexBox` had. The first `FlexBox` replacement correctly includes these props — this one should too.</violation>
<violation number="2" location="static/app/views/performance/newTraceDetails/traceTabsAndVitals.tsx:93">
P2: Style regression: the main `Container` replacement is missing `align="center"` and `gap={space(1)}` that the original `Container` (which extended `FlexBox`) had. Compare with the `Placeholder` component's outer `Flex`, which correctly preserves all three properties.</violation>
</file>
<file name="devservices/config.yml">
<violation number="1" location="devservices/config.yml:171">
P2: New subscription results consumers are missing from `full` and `ingest-all` modes. Both modes appear to be comprehensive configurations that include all consumers, yet the four new consumers (`eap-spans-subscription-results`, `subscription-results-eap-items`, `metrics-subscription-results`, `generic-metrics-subscription-results`) added here are only included in the `tracing` mode. They should likely be added to `full` and `ingest-all` as well for consistency.</violation>
</file>
<file name="static/app/components/feedback/list/useFeedbackSummary.tsx">
<violation number="1" location="static/app/components/feedback/list/useFeedbackSummary.tsx:37">
P2: `Boolean(normalizedDateRange)` is always `true` because `normalizeDateTimeParams` returns a plain object, which is inherently truthy in JavaScript. This guard has no effect. If the intent is to verify that meaningful date parameters exist, check for specific properties instead (e.g., that `start`/`end` or `statsPeriod` is present).</violation>
</file>
<file name="static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx">
<violation number="1" location="static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx:67">
P1: Bug: `HIDDEN_ATTRIBUTES` are only filtered when a search query is present. When the search box is empty (default view), the early return on line 65 (`return sorted;`) skips the hidden-attributes filter entirely, so `is_segment`, `project_id`, and `received` will still be displayed. The filter should be applied unconditionally.</violation>
</file>
<file name="src/sentry/integrations/source_code_management/commit_context.py">
<violation number="1" location="src/sentry/integrations/source_code_management/commit_context.py:582">
P2: `_truncate_title` can return a string up to `max_length + 3` characters due to the appended `"..."`. If the intent of `ISSUE_TITLE_MAX_LENGTH = 50` is to cap the final output at 50 characters, the slice should account for the ellipsis (e.g., `title[:max_length - 3]`).</violation>
</file>
<file name="static/app/components/feedback/feedbackSummary.tsx">
<violation number="1" location="static/app/components/feedback/feedbackSummary.tsx:11">
P2: Missing null/empty guard on `summary` before rendering. If the API returns successfully but with `summary: null` (or an empty string), the component will render the summary container with a header but no content. Add a check for `!summary` alongside the other early-return conditions.</violation>
</file>
<file name="static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx">
<violation number="1" location="static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx:37">
P2: Overly broad dependency: `useMemo` depends on `selection` but only uses `selection.datetime`. This causes unnecessary recomputations when unrelated parts of `selection` (e.g., `environments`) change.</violation>
</file>
<file name="src/sentry/hybridcloud/tasks/deliver_webhooks.py">
<violation number="1" location="src/sentry/hybridcloud/tasks/deliver_webhooks.py:239">
P1: `processing_deadline_duration=120` (2 min) is shorter than the task's internal `BATCH_SCHEDULE_OFFSET` deadline of 3 minutes. The taskworker will consider this task timed out before the internal delivery loop naturally breaks. This should be at least 180 seconds, or ideally match `drain_mailbox`'s 300 seconds to provide buffer for the stale-message cleanup that precedes the loop.</violation>
</file>
<file name="static/app/components/events/eventAttachments.tsx">
<violation number="1" location="static/app/components/events/eventAttachments.tsx:143">
P2: Replacing `FlexCenter` with `<Flex align="center">` drops `overflow: hidden` from the container. In a CSS grid with `1fr` column, this means long attachment names will overflow instead of truncating with ellipsis. The flex container needs `overflow: hidden` or `min-width: 0` so the child `Name`'s `text-overflow: ellipsis` can take effect.</violation>
</file>
<file name="src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py">
<violation number="1" location="src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py:118">
P1: Bug: `zip(error_ids, events.values())` will misalign error IDs with event data when nodestore entries are missing. The dict returned by `get_multi` is keyed by `node_id`, and missing entries shrink the dict, causing subsequent IDs to pair with wrong data. Instead, iterate over `(error_id, node_id)` pairs and look up each node_id in the dict.</violation>
<violation number="2" location="src/sentry/replays/endpoints/project_replay_summarize_breadcrumbs.py:155">
P1: Potential timestamp unit mismatch: error event timestamps from nodestore are in Unix seconds while RRWeb replay segment event timestamps are in milliseconds. This comparison will always evaluate to `True` (seconds << milliseconds), causing all errors to be emitted before any breadcrumb events rather than being interleaved chronologically. Consider converting one format to match the other (e.g., `error_timestamp * 1000` or `event_timestamp / 1000`).</violation>
</file>
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
| <TableWidgetVisualization | ||
| columns={[]} | ||
| tableData={{ | ||
| data: [], | ||
| meta: { | ||
| fields: {}, | ||
| units: {}, | ||
| }, | ||
| }} | ||
| /> |
There was a problem hiding this comment.
P1: The TableWidgetVisualization is rendered with hardcoded empty columns and tableData instead of the actual query results available in scope (result.data, result.meta, fields). When the use-table-widget-visualization feature flag is enabled, users will see a blank table. Even if this is a scaffold, passing columns={[]} (an empty array rather than undefined) also defeats the component's own fallback column derivation logic. Consider wiring through the real data, or at minimum omit the columns prop so the component can self-derive columns from tableData.meta.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/views/dashboards/widgetCard/chart.tsx, line 165:
<comment>The `TableWidgetVisualization` is rendered with hardcoded empty `columns` and `tableData` instead of the actual query results available in scope (`result.data`, `result.meta`, `fields`). When the `use-table-widget-visualization` feature flag is enabled, users will see a blank table. Even if this is a scaffold, passing `columns={[]}` (an empty array rather than `undefined`) also defeats the component's own fallback column derivation logic. Consider wiring through the real data, or at minimum omit the `columns` prop so the component can self-derive columns from `tableData.meta`.</comment>
<file context>
@@ -162,23 +161,36 @@ class WidgetCardChart extends Component<WidgetCardChartProps> {
- minColumnWidth={minTableColumnWidth}
- />
+ {organization.features.includes('use-table-widget-visualization') ? (
+ <TableWidgetVisualization
+ columns={[]}
+ tableData={{
</file context>
| <TableWidgetVisualization | |
| columns={[]} | |
| tableData={{ | |
| data: [], | |
| meta: { | |
| fields: {}, | |
| units: {}, | |
| }, | |
| }} | |
| /> | |
| <TableWidgetVisualization | |
| tableData={{ | |
| data: result.data, | |
| meta: { | |
| fields: result.meta?.fields ?? {}, | |
| units: result.meta?.units ?? {}, | |
| }, | |
| }} | |
| /> |
|
|
||
| def validate_age(self, value: int) -> int: | ||
| """Validate that age is present, but not timestamp.""" | ||
| if self.initial_data.get("timestamp"): |
There was a problem hiding this comment.
P1: Bug: Same truthiness issue — self.initial_data.get("timestamp") will be falsy when timestamp=0 (allowed by min_value=0). This bypasses the mutual exclusivity check.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/issues/endpoints/browser_reporting_collector.py, line 58:
<comment>Bug: Same truthiness issue — `self.initial_data.get("timestamp")` will be falsy when `timestamp=0` (allowed by `min_value=0`). This bypasses the mutual exclusivity check.</comment>
<file context>
@@ -17,30 +18,46 @@
+
+ def validate_age(self, value: int) -> int:
+ """Validate that age is present, but not timestamp."""
+ if self.initial_data.get("timestamp"):
+ raise serializers.ValidationError("If age is present, timestamp must be absent")
+ return value
</file context>
| if self.initial_data.get("timestamp"): | |
| if "timestamp" in self.initial_data: |
|
|
||
| def validate_timestamp(self, value: int) -> int: | ||
| """Validate that age is absent, but timestamp is present.""" | ||
| if self.initial_data.get("age"): |
There was a problem hiding this comment.
P1: Bug: Truthiness check self.initial_data.get("age") will be falsy when age=0, which is a valid value (e.g., a report just generated). This silently bypasses the mutual exclusivity validation, allowing both age and timestamp to coexist. Use an identity check against None or in instead.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/issues/endpoints/browser_reporting_collector.py, line 52:
<comment>Bug: Truthiness check `self.initial_data.get("age")` will be falsy when `age=0`, which is a valid value (e.g., a report just generated). This silently bypasses the mutual exclusivity validation, allowing both `age` and `timestamp` to coexist. Use an identity check against `None` or `in` instead.</comment>
<file context>
@@ -17,30 +18,46 @@
+
+ def validate_timestamp(self, value: int) -> int:
+ """Validate that age is absent, but timestamp is present."""
+ if self.initial_data.get("age"):
+ raise serializers.ValidationError("If timestamp is present, age must be absent")
+ return value
</file context>
| if self.initial_data.get("age"): | |
| if "age" in self.initial_data: |
| @@ -31,6 +31,8 @@ import {makeReplaysPathname} from 'sentry/views/replays/pathnames'; | |||
|
|
|||
There was a problem hiding this comment.
P1: Bug: HIDDEN_ATTRIBUTES are only filtered when a search query is present. When the search box is empty (default view), the early return on line 65 (return sorted;) skips the hidden-attributes filter entirely, so is_segment, project_id, and received will still be displayed. The filter should be applied unconditionally.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/views/performance/newTraceDetails/traceDrawer/details/span/eapSections/attributes.tsx, line 67:
<comment>Bug: `HIDDEN_ATTRIBUTES` are only filtered when a search query is present. When the search box is empty (default view), the early return on line 65 (`return sorted;`) skips the hidden-attributes filter entirely, so `is_segment`, `project_id`, and `received` will still be displayed. The filter should be applied unconditionally.</comment>
<file context>
@@ -60,8 +62,10 @@ export function Attributes({
- attribute.name.toLowerCase().trim().includes(searchQuery.toLowerCase().trim())
+ return sorted.filter(
+ attribute =>
+ !HIDDEN_ATTRIBUTES.includes(attribute.name) &&
+ attribute.name.toLowerCase().trim().includes(searchQuery.toLowerCase().trim())
);
</file context>
| silo_mode=SiloMode.CONTROL, | ||
| taskworker_config=TaskworkerConfig( | ||
| namespace=hybridcloud_control_tasks, | ||
| processing_deadline_duration=120, |
There was a problem hiding this comment.
P1: processing_deadline_duration=120 (2 min) is shorter than the task's internal BATCH_SCHEDULE_OFFSET deadline of 3 minutes. The taskworker will consider this task timed out before the internal delivery loop naturally breaks. This should be at least 180 seconds, or ideally match drain_mailbox's 300 seconds to provide buffer for the stale-message cleanup that precedes the loop.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/hybridcloud/tasks/deliver_webhooks.py, line 239:
<comment>`processing_deadline_duration=120` (2 min) is shorter than the task's internal `BATCH_SCHEDULE_OFFSET` deadline of 3 minutes. The taskworker will consider this task timed out before the internal delivery loop naturally breaks. This should be at least 180 seconds, or ideally match `drain_mailbox`'s 300 seconds to provide buffer for the stale-message cleanup that precedes the loop.</comment>
<file context>
@@ -234,6 +236,7 @@ def drain_mailbox(payload_id: int) -> None:
silo_mode=SiloMode.CONTROL,
taskworker_config=TaskworkerConfig(
namespace=hybridcloud_control_tasks,
+ processing_deadline_duration=120,
),
)
</file context>
| processing_deadline_duration=120, | |
| processing_deadline_duration=300, |
| """Truncate title if it's too long and add ellipsis.""" | ||
| if len(title) <= max_length: | ||
| return title | ||
| return title[:max_length].rstrip() + "..." |
There was a problem hiding this comment.
P2: _truncate_title can return a string up to max_length + 3 characters due to the appended "...". If the intent of ISSUE_TITLE_MAX_LENGTH = 50 is to cap the final output at 50 characters, the slice should account for the ellipsis (e.g., title[:max_length - 3]).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/integrations/source_code_management/commit_context.py, line 582:
<comment>`_truncate_title` can return a string up to `max_length + 3` characters due to the appended `"..."`. If the intent of `ISSUE_TITLE_MAX_LENGTH = 50` is to cap the final output at 50 characters, the slice should account for the ellipsis (e.g., `title[:max_length - 3]`).</comment>
<file context>
@@ -570,6 +574,37 @@ def get_top_5_issues_by_count(
+ """Truncate title if it's too long and add ellipsis."""
+ if len(title) <= max_length:
+ return title
+ return title[:max_length].rstrip() + "..."
+
+ def get_environment_info(self, issue: Group) -> str:
</file context>
| return title[:max_length].rstrip() + "..." | |
| return title[:max_length - 3].rstrip() + "..." |
| import useOrganization from 'sentry/utils/useOrganization'; | ||
|
|
||
| export default function FeedbackSummary() { | ||
| const {isError, isPending, summary, tooFewFeedbacks} = useFeedbackSummary(); |
There was a problem hiding this comment.
P2: Missing null/empty guard on summary before rendering. If the API returns successfully but with summary: null (or an empty string), the component will render the summary container with a header but no content. Add a check for !summary alongside the other early-return conditions.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/components/feedback/feedbackSummary.tsx, line 11:
<comment>Missing null/empty guard on `summary` before rendering. If the API returns successfully but with `summary: null` (or an empty string), the component will render the summary container with a header but no content. Add a check for `!summary` alongside the other early-return conditions.</comment>
<file context>
@@ -0,0 +1,64 @@
+import useOrganization from 'sentry/utils/useOrganization';
+
+export default function FeedbackSummary() {
+ const {isError, isPending, summary, tooFewFeedbacks} = useFeedbackSummary();
+
+ const organization = useOrganization();
</file context>
| datetime: selection.datetime, | ||
| projectIds, | ||
| }); | ||
| }, [selection, traceItemType, type, projectIds]); |
There was a problem hiding this comment.
P2: Overly broad dependency: useMemo depends on selection but only uses selection.datetime. This causes unnecessary recomputations when unrelated parts of selection (e.g., environments) change.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/views/explore/hooks/useTraceItemAttributeKeys.tsx, line 37:
<comment>Overly broad dependency: `useMemo` depends on `selection` but only uses `selection.datetime`. This causes unnecessary recomputations when unrelated parts of `selection` (e.g., `environments`) change.</comment>
<file context>
@@ -36,76 +21,43 @@ export function useTraceItemAttributeKeys({
+ datetime: selection.datetime,
+ projectIds,
+ });
+ }, [selection, traceItemType, type, projectIds]);
+
+ const queryKey = useMemo(
</file context>
| }, [selection, traceItemType, type, projectIds]); | |
| }, [selection.datetime, traceItemType, type, projectIds]); |
| {attachments.map(attachment => ( | ||
| <Fragment key={attachment.id}> | ||
| <FlexCenter> | ||
| <Flex align="center"> |
There was a problem hiding this comment.
P2: Replacing FlexCenter with <Flex align="center"> drops overflow: hidden from the container. In a CSS grid with 1fr column, this means long attachment names will overflow instead of truncating with ellipsis. The flex container needs overflow: hidden or min-width: 0 so the child Name's text-overflow: ellipsis can take effect.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At static/app/components/events/eventAttachments.tsx, line 143:
<comment>Replacing `FlexCenter` with `<Flex align="center">` drops `overflow: hidden` from the container. In a CSS grid with `1fr` column, this means long attachment names will overflow instead of truncating with ellipsis. The flex container needs `overflow: hidden` or `min-width: 0` so the child `Name`'s `text-overflow: ellipsis` can take effect.</comment>
<file context>
@@ -139,9 +140,10 @@ function EventAttachmentsContent({
{attachments.map(attachment => (
<Fragment key={attachment.id}>
- <FlexCenter>
+ <Flex align="center">
<Name>{attachment.name}</Name>
- </FlexCenter>
</file context>
| <Flex align="center"> | |
| <Flex align="center" style={{overflow: 'hidden'}}> |
|
|
||
| def _make_recording_filenames(project_id: int, row: MatchedRow) -> list[str]: | ||
| # Null segment_ids can cause this to fail. If no segments were ingested then we can skip | ||
| # deleting the segements. |
There was a problem hiding this comment.
P3: Typo: "segements" should be "segments".
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/sentry/replays/usecases/delete.py, line 88:
<comment>Typo: "segements" should be "segments".</comment>
<file context>
@@ -84,6 +84,11 @@ def _delete_if_exists(filename: str) -> None:
def _make_recording_filenames(project_id: int, row: MatchedRow) -> list[str]:
+ # Null segment_ids can cause this to fail. If no segments were ingested then we can skip
+ # deleting the segements.
+ if row["max_segment_id"] is None:
+ return []
</file context>
| # deleting the segements. | |
| # deleting the segments. |
Test 5
Summary by CodeRabbit
Release Notes
New Features
Bug Fixes
Replicated from ai-code-review-evaluation/sentry-coderabbit#5