Skip to content

Commit 49c50c2

Browse files
Merge pull request #276 from digma-ai/fix/n-plus-one-pagination
Add pagination to Endpoint N-Plus-One insight
2 parents d5dd089 + d5e2b4b commit 49c50c2

File tree

2 files changed

+70
-54
lines changed

2 files changed

+70
-54
lines changed

src/views-ui/codeAnalytics/main.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ vscode-panel-view {
8585
padding: 1px 5px 2px 5px;
8686
border: none;
8787
color: inherit;
88+
height: fit-content;
8889

8990
&:disabled {
9091
opacity: 0.4;

src/views/codeAnalytics/InsightListView/EndpointInsight.ts

Lines changed: 69 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -332,63 +332,79 @@ export class EPNPlusSpansListViewItemsCreator
332332
public async createListViewItem(
333333
codeObjectsInsight: EPNPlusSpansInsight
334334
): Promise<IListViewItem> {
335-
const spans = codeObjectsInsight.spans.filter((x) => x.internalSpan);
336-
337-
const hints: CodeObjectLocationHints[] =
338-
this._spanLinkResolver.codeHintsFromSpans(
339-
spans.map((x) => x.internalSpan)
340-
);
341-
342-
const spansLocations =
343-
await this._spanLinkResolver.searchForSpansByHints(hints);
335+
const items = [];
336+
for (const span of codeObjectsInsight.spans) {
337+
let result;
338+
if (span.internalSpan) {
339+
const hints: CodeObjectLocationHints[] =
340+
this._spanLinkResolver.codeHintsFromSpans([
341+
span.internalSpan
342+
]);
343+
344+
const spansLocations =
345+
await this._spanLinkResolver.searchForSpansByHints(hints);
346+
347+
result = spansLocations[0];
348+
}
344349

345-
const items: string[] = [];
350+
let fractionSt = "";
351+
const fraction = span.fraction;
352+
if (fraction < 0.01) {
353+
fractionSt = "minimal";
354+
} else {
355+
fractionSt = `${fraction.toPrecision(1)} of request`;
356+
}
346357

347-
for (let i = 0; i < spansLocations.length; i++) {
348-
const result = spansLocations[i];
349-
const slowSpan = spans[i];
358+
const traceHtml = renderTraceLink(
359+
span.traceId,
360+
codeObjectsInsight.spanInfo?.name ||
361+
codeObjectsInsight.endpointSpan
362+
);
350363

351364
items.push(`
352-
<div class="endpoint-bottleneck-insight" >
353-
<div class="span-name flex-row ${
354-
result ? "link" : ""
355-
}" data-code-uri="${result?.documentUri}" data-code-line="${
356-
result?.range.end.line! + 1
357-
}">
358-
<span class="left-ellipsis">${
359-
slowSpan.internalSpan.displayName
360-
}</span>
365+
<div class="item vertical-spacer">
366+
<div class="endpoint-bottleneck-insight">
367+
<div class="span-name flex-row ${
368+
result ? "link" : ""
369+
}" data-code-uri="${
370+
result?.documentUri
371+
}" data-code-line="${result?.range.end.line! + 1}">
372+
<span class="left-ellipsis">${
373+
span.internalSpan
374+
? span.internalSpan.displayName
375+
: span.clientSpan.displayName
376+
}</span>
377+
</div>
361378
</div>
362-
</div>`);
379+
<div style="margin-top:0.5em" class="flex-row">
380+
<span class="error-property flex-stretch">
381+
<span class="label">Impact</span>
382+
<span>${fractionSt}</span>
383+
</span>
384+
<span class="error-property flex-stretch">
385+
<span class="label">Repeats</span>
386+
<span>${span.occurrences}</span>
387+
</span>
388+
<span class="error-property flex-stretch">
389+
<span class="label">Duration</span>
390+
<span>${span.duration.value} ${
391+
span.duration.unit
392+
}</span>
393+
</span>
394+
${traceHtml}
395+
</div>
396+
</div>
397+
`);
363398
}
364399

365-
const traceHtml = renderTraceLink(
366-
codeObjectsInsight.spans.firstOrDefault()?.traceId,
367-
codeObjectsInsight.spanInfo?.name || codeObjectsInsight.endpointSpan
368-
);
369-
370-
let fractionSt = "";
371-
const fraction = codeObjectsInsight.spans.firstOrDefault()?.fraction;
372-
if (fraction < 0.01) {
373-
fractionSt = "minimal";
374-
} else {
375-
fractionSt = `${fraction.toPrecision(1)} of request`;
376-
}
377-
const statsHtml = `
378-
<div style="margin-top:0.5em" class="flex-row">
379-
380-
<span class="error-property flex-stretch">
381-
<span class="label">Impact</span>
382-
<span>${fractionSt}</span>
383-
</span>
384-
<span class="error-property flex-stretch">
385-
<span class="label">Duration</span>
386-
<span>${
387-
codeObjectsInsight.spans.firstOrDefault().duration.value
388-
} ${
389-
codeObjectsInsight.spans.firstOrDefault().duration.unit
390-
}</span>
391-
</span>
400+
const bodyHtml = /*html*/ `
401+
<div class="pagination-list" data-current-page="1" data-records-per-page="1">
402+
${items.join("")}
403+
<div class="pagination-nav">
404+
<a class="prev">Prev</a>
405+
<a class="next">Next</a>
406+
<span class="page"></span>
407+
</div>
392408
</div>
393409
`;
394410

@@ -401,11 +417,10 @@ export class EPNPlusSpansListViewItemsCreator
401417
},
402418
description: "Check the following locations:",
403419
icon: this._viewUris.image("sql.png"),
404-
body: ` <div>
405-
${items.join("")}
420+
body: `<div>
421+
${bodyHtml}
406422
</div>
407-
${statsHtml}`,
408-
buttons: [traceHtml],
423+
`,
409424
insight: codeObjectsInsight
410425
},
411426
this._viewUris

0 commit comments

Comments
 (0)