|
@@ -10,6 +10,7 @@ import {
|
|
boundsGenerator,
|
|
boundsGenerator,
|
|
getMeasurements,
|
|
getMeasurements,
|
|
} from 'sentry/components/events/interfaces/spans/utils';
|
|
} from 'sentry/components/events/interfaces/spans/utils';
|
|
|
|
+import Panel from 'sentry/components/panels/panel';
|
|
import {MessageRow} from 'sentry/components/performance/waterfall/messageRow';
|
|
import {MessageRow} from 'sentry/components/performance/waterfall/messageRow';
|
|
import {
|
|
import {
|
|
DividerSpacer,
|
|
DividerSpacer,
|
|
@@ -29,7 +30,6 @@ import {
|
|
} from 'sentry/utils/performance/quickTrace/types';
|
|
} from 'sentry/utils/performance/quickTrace/types';
|
|
import {
|
|
import {
|
|
TraceDetailBody,
|
|
TraceDetailBody,
|
|
- TracePanel,
|
|
|
|
TraceViewContainer,
|
|
TraceViewContainer,
|
|
TraceViewHeaderContainer,
|
|
TraceViewHeaderContainer,
|
|
} from 'sentry/views/performance/traceDetails/styles';
|
|
} from 'sentry/views/performance/traceDetails/styles';
|
|
@@ -64,24 +64,50 @@ type Props = Pick<RouteComponentProps<{}, {}>, 'location'> & {
|
|
function TraceHiddenMessage({
|
|
function TraceHiddenMessage({
|
|
isVisible,
|
|
isVisible,
|
|
numberOfHiddenTransactionsAbove,
|
|
numberOfHiddenTransactionsAbove,
|
|
|
|
+ numberOfHiddenErrorsAbove,
|
|
}: {
|
|
}: {
|
|
isVisible: boolean;
|
|
isVisible: boolean;
|
|
|
|
+ numberOfHiddenErrorsAbove: number;
|
|
numberOfHiddenTransactionsAbove: number;
|
|
numberOfHiddenTransactionsAbove: number;
|
|
}) {
|
|
}) {
|
|
- if (!isVisible || numberOfHiddenTransactionsAbove < 1) {
|
|
|
|
|
|
+ if (
|
|
|
|
+ !isVisible ||
|
|
|
|
+ (numberOfHiddenTransactionsAbove < 1 && numberOfHiddenErrorsAbove < 1)
|
|
|
|
+ ) {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ const numOfTransaction = <strong>{numberOfHiddenTransactionsAbove}</strong>;
|
|
|
|
+ const numOfErrors = <strong>{numberOfHiddenErrorsAbove}</strong>;
|
|
|
|
+
|
|
|
|
+ const hiddenTransactionsMessage =
|
|
|
|
+ numberOfHiddenTransactionsAbove < 1
|
|
|
|
+ ? ''
|
|
|
|
+ : numberOfHiddenTransactionsAbove === 1
|
|
|
|
+ ? tct('[numOfTransaction] hidden transaction', {
|
|
|
|
+ numOfTransaction,
|
|
|
|
+ })
|
|
|
|
+ : tct('[numOfTransaction] hidden transactions', {
|
|
|
|
+ numOfTransaction,
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ const hiddenErrorsMessage =
|
|
|
|
+ numberOfHiddenErrorsAbove < 1
|
|
|
|
+ ? ''
|
|
|
|
+ : numberOfHiddenErrorsAbove === 1
|
|
|
|
+ ? tct('[numOfErrors] hidden error', {
|
|
|
|
+ numOfErrors,
|
|
|
|
+ })
|
|
|
|
+ : tct('[numOfErrors] hidden errors', {
|
|
|
|
+ numOfErrors,
|
|
|
|
+ });
|
|
|
|
+
|
|
return (
|
|
return (
|
|
<MessageRow>
|
|
<MessageRow>
|
|
<span key="trace-info-message">
|
|
<span key="trace-info-message">
|
|
- {numberOfHiddenTransactionsAbove === 1
|
|
|
|
- ? tct('[numOfTransaction] hidden transaction', {
|
|
|
|
- numOfTransaction: <strong>{numberOfHiddenTransactionsAbove}</strong>,
|
|
|
|
- })
|
|
|
|
- : tct('[numOfTransaction] hidden transactions', {
|
|
|
|
- numOfTransaction: <strong>{numberOfHiddenTransactionsAbove}</strong>,
|
|
|
|
- })}
|
|
|
|
|
|
+ {hiddenTransactionsMessage}
|
|
|
|
+ {hiddenErrorsMessage && hiddenTransactionsMessage && ', '}
|
|
|
|
+ {hiddenErrorsMessage}
|
|
</span>
|
|
</span>
|
|
</MessageRow>
|
|
</MessageRow>
|
|
);
|
|
);
|
|
@@ -193,6 +219,7 @@ export default function TraceView({
|
|
<TraceHiddenMessage
|
|
<TraceHiddenMessage
|
|
isVisible={isVisible}
|
|
isVisible={isVisible}
|
|
numberOfHiddenTransactionsAbove={numberOfHiddenTransactionsAbove}
|
|
numberOfHiddenTransactionsAbove={numberOfHiddenTransactionsAbove}
|
|
|
|
+ numberOfHiddenErrorsAbove={0}
|
|
/>
|
|
/>
|
|
<TransactionGroup
|
|
<TransactionGroup
|
|
location={location}
|
|
location={location}
|
|
@@ -283,33 +310,53 @@ export default function TraceView({
|
|
);
|
|
);
|
|
|
|
|
|
// Build transaction groups for orphan errors
|
|
// Build transaction groups for orphan errors
|
|
|
|
+ let numOfHiddenErrorsAbove = 0;
|
|
|
|
+ let totalNumOfHiddenErrors = 0;
|
|
if (hasOrphanErrors) {
|
|
if (hasOrphanErrors) {
|
|
orphanErrors.forEach((error, index) => {
|
|
orphanErrors.forEach((error, index) => {
|
|
const isLastError = index === orphanErrors.length - 1;
|
|
const isLastError = index === orphanErrors.length - 1;
|
|
|
|
+ const isVisible = isRowVisible(error, filteredEventIds);
|
|
|
|
+ const currentHiddenCount = numOfHiddenErrorsAbove;
|
|
|
|
+
|
|
|
|
+ if (!isVisible) {
|
|
|
|
+ numOfHiddenErrorsAbove += 1;
|
|
|
|
+ totalNumOfHiddenErrors += 1;
|
|
|
|
+ } else {
|
|
|
|
+ numOfHiddenErrorsAbove = 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
transactionGroups.push(
|
|
transactionGroups.push(
|
|
- <TransactionGroup
|
|
|
|
- key={error.event_id}
|
|
|
|
- location={location}
|
|
|
|
- organization={organization}
|
|
|
|
- traceInfo={traceInfo}
|
|
|
|
- transaction={{
|
|
|
|
- ...error,
|
|
|
|
- generation: 1,
|
|
|
|
- }}
|
|
|
|
- generateBounds={generateBounds(traceInfo)}
|
|
|
|
- measurements={
|
|
|
|
- traces && traces.length > 0
|
|
|
|
- ? getMeasurements(traces[0], generateBounds(traceInfo))
|
|
|
|
- : undefined
|
|
|
|
- }
|
|
|
|
- continuingDepths={[]}
|
|
|
|
- isOrphan
|
|
|
|
- isLast={isLastError}
|
|
|
|
- index={lastIndex + index + 1}
|
|
|
|
- isVisible={isRowVisible(error, filteredEventIds)}
|
|
|
|
- hasGuideAnchor
|
|
|
|
- renderedChildren={[]}
|
|
|
|
- />
|
|
|
|
|
|
+ <React.Fragment key={error.event_id}>
|
|
|
|
+ <TraceHiddenMessage
|
|
|
|
+ isVisible={isVisible}
|
|
|
|
+ numberOfHiddenTransactionsAbove={
|
|
|
|
+ index === 0 ? numberOfHiddenTransactionsAbove : 0
|
|
|
|
+ }
|
|
|
|
+ numberOfHiddenErrorsAbove={index > 0 ? currentHiddenCount : 0}
|
|
|
|
+ />
|
|
|
|
+ <TransactionGroup
|
|
|
|
+ location={location}
|
|
|
|
+ organization={organization}
|
|
|
|
+ traceInfo={traceInfo}
|
|
|
|
+ transaction={{
|
|
|
|
+ ...error,
|
|
|
|
+ generation: 1,
|
|
|
|
+ }}
|
|
|
|
+ generateBounds={generateBounds(traceInfo)}
|
|
|
|
+ measurements={
|
|
|
|
+ traces && traces.length > 0
|
|
|
|
+ ? getMeasurements(traces[0], generateBounds(traceInfo))
|
|
|
|
+ : undefined
|
|
|
|
+ }
|
|
|
|
+ continuingDepths={[]}
|
|
|
|
+ isOrphan
|
|
|
|
+ isLast={isLastError}
|
|
|
|
+ index={lastIndex + index + 1}
|
|
|
|
+ isVisible={isVisible}
|
|
|
|
+ hasGuideAnchor
|
|
|
|
+ renderedChildren={[]}
|
|
|
|
+ />
|
|
|
|
+ </React.Fragment>
|
|
);
|
|
);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
@@ -399,6 +446,7 @@ export default function TraceView({
|
|
<TraceHiddenMessage
|
|
<TraceHiddenMessage
|
|
isVisible
|
|
isVisible
|
|
numberOfHiddenTransactionsAbove={numberOfHiddenTransactionsAbove}
|
|
numberOfHiddenTransactionsAbove={numberOfHiddenTransactionsAbove}
|
|
|
|
+ numberOfHiddenErrorsAbove={totalNumOfHiddenErrors}
|
|
/>
|
|
/>
|
|
<LimitExceededMessage
|
|
<LimitExceededMessage
|
|
traceInfo={traceInfo}
|
|
traceInfo={traceInfo}
|
|
@@ -420,8 +468,9 @@ export default function TraceView({
|
|
return traceView;
|
|
return traceView;
|
|
}
|
|
}
|
|
|
|
|
|
-const StyledTracePanel = styled(TracePanel)`
|
|
|
|
- overflow: visible;
|
|
|
|
|
|
+export const StyledTracePanel = styled(Panel)`
|
|
|
|
+ height: 100%;
|
|
|
|
+ overflow-x: visible;
|
|
|
|
|
|
${TraceViewContainer} {
|
|
${TraceViewContainer} {
|
|
overflow-x: visible;
|
|
overflow-x: visible;
|