Skip to content

Commit

Permalink
Display crawl time usage history table (#1304)
Browse files Browse the repository at this point in the history
Partially resolves #1223, fixes #1298

- Adds crawl usage table in dashboard under metrics
- Shows skeleton loading indicator when metrics are loading (@Shrinks99
feel free to adjust how this looks)
- Shows max number of concurrent crawls running if any are running ("`running` / `max` Crawls Running")
  • Loading branch information
SuaYoo authored Oct 23, 2023
1 parent e274462 commit 2e5952a
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 8 deletions.
85 changes: 77 additions & 8 deletions frontend/src/pages/org/dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { when } from "lit/directives/when.js";
import { ifDefined } from "lit/directives/if-defined.js";
import { msg, localized, str } from "@lit/localize";
import type { SlSelectEvent } from "@shoelace-style/shoelace";
import humanizeDuration from "pretty-ms";

import LiteElement, { html } from "../../utils/LiteElement";
import type { AuthState } from "../../utils/AuthService";
Expand Down Expand Up @@ -180,7 +181,10 @@ export class Dashboard extends LiteElement {
(metrics) => html`
<dl>
${this.renderStat({
value: metrics.workflowsRunningCount,
value:
metrics.workflowsRunningCount && metrics.maxConcurrentCrawls
? `${metrics.workflowsRunningCount} / ${metrics.maxConcurrentCrawls}`
: metrics.workflowsRunningCount,
singleLabel: msg("Crawl Running"),
pluralLabel: msg("Crawls Running"),
iconProps: {
Expand Down Expand Up @@ -224,6 +228,7 @@ export class Dashboard extends LiteElement {
`
)}
</div>
<section class="mt-10">${this.renderUsageHistory()}</section>
</main> `;
}

Expand Down Expand Up @@ -337,17 +342,16 @@ export class Dashboard extends LiteElement {
renderFooter?: (metric: Metrics) => TemplateResult
) {
return html`
<section
class="flex-1 flex flex-col border rounded p-4 transition-opacity delay-75 ${this
.metrics
? "opacity-100"
: "opacity-0"}"
>
<section class="flex-1 flex flex-col border rounded p-4">
<h2 class="text-lg font-semibold leading-none border-b pb-3 mb-3">
${title}
</h2>
<div class="flex-1">
${when(this.metrics, () => renderContent(this.metrics!))}
${when(
this.metrics,
() => renderContent(this.metrics!),
this.renderCardSkeleton
)}
</div>
${when(renderFooter && this.metrics, () =>
renderFooter!(this.metrics!)
Expand Down Expand Up @@ -394,6 +398,71 @@ export class Dashboard extends LiteElement {
`;
}

private renderCardSkeleton = () =>
html`
<sl-skeleton class="mb-3" effect="sheen"></sl-skeleton>
<sl-skeleton class="mb-3" effect="sheen"></sl-skeleton>
<sl-skeleton class="mb-3" effect="sheen"></sl-skeleton>
<sl-skeleton class="mb-3" effect="sheen"></sl-skeleton>
`;

// TODO fix style when data-table is converted to slots
readonly usageTableCols = [
msg("Month"),
html`
${msg("Execution Time")}
<sl-tooltip>
<div slot="content" style="text-transform: initial">
${msg("Total running time of all crawler instances")}
</div>
<sl-icon name="info-circle" style="vertical-align: -.175em"></sl-icon>
</sl-tooltip>
`,
html`
${msg("Total Crawl Duration")}
<sl-tooltip>
<div slot="content" style="text-transform: initial">
${msg("Total time elapsed between when crawl starts and ends")}
</div>
<sl-icon name="info-circle" style="vertical-align: -.175em"></sl-icon>
</sl-tooltip>
`,
];

private renderUsageHistory() {
if (!this.org) return;
const rows = Object.entries(this.org.usage || {})
// Sort latest
.reverse()
.map(([mY, crawlTime]) => {
const value = this.org!.crawlExecSeconds?.[mY];
return [
html`
<sl-format-date
date="${mY}-01T00:00:00.000Z"
time-zone="utc"
month="long"
year="numeric"
>
</sl-format-date>
`,
value ? humanizeDuration(value * 1000) : "--",
humanizeDuration((crawlTime || 0) * 1000),
];
});
return html`
<h2 class="text-lg font-semibold leading-none mb-6">
${msg("Usage History")}
</h2>
<div class="border rounded overflow-hidden">
<btrix-data-table
.columns=${this.usageTableCols}
.rows=${rows}
></btrix-data-table>
</div>
`;
}

private renderPercentage(ratio: number) {
const percent = ratio * 100;
if (percent < 1) return `<1%`;
Expand Down
8 changes: 8 additions & 0 deletions frontend/src/types/org.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,14 @@ export type OrgData = {
slug: string;
quotas: Record<string, number>;
bytesStored: number;
usage: {
// Keyed by {4-digit year}-{2-digit month}
[key: string]: number;
} | null;
crawlExecSeconds: {
// Keyed by {4-digit year}-{2-digit month}
[key: string]: number;
} | null;
users?: {
[id: string]: {
role: (typeof AccessCode)[UserRole];
Expand Down

0 comments on commit 2e5952a

Please sign in to comment.