Feat canceled state (#1228)

* feat: add cancel state to event list

* ops: db conns

* feat: add cancelled status to wfr

* feat: mark cancelled workflow runs
This commit is contained in:
Gabe Ruttner
2025-01-28 10:31:04 -08:00
committed by GitHub
parent 769fed7d97
commit 13024c09bd
17 changed files with 272 additions and 188 deletions

View File

@@ -115,6 +115,10 @@ EventWorkflowRunSummary:
type: integer type: integer
format: int64 format: int64
description: The number of failed runs. description: The number of failed runs.
cancelled:
type: integer
format: int64
description: The number of cancelled runs.
EventKeyList: EventKeyList:
properties: properties:

View File

@@ -302,6 +302,8 @@ WorkflowRunsMetricsCounts:
type: integer type: integer
QUEUED: QUEUED:
type: integer type: integer
CANCELLED:
type: integer
WorkflowRunsMetrics: WorkflowRunsMetrics:
type: object type: object

View File

@@ -78,6 +78,7 @@ func (t *WorkflowService) WorkflowRunGetMetrics(ctx echo.Context, request gen.Wo
queued := int(workflowRunsMetricsCount.QUEUED) queued := int(workflowRunsMetricsCount.QUEUED)
running := int(workflowRunsMetricsCount.RUNNING) running := int(workflowRunsMetricsCount.RUNNING)
succeeded := int(workflowRunsMetricsCount.SUCCEEDED) succeeded := int(workflowRunsMetricsCount.SUCCEEDED)
cancelled := int(workflowRunsMetricsCount.CANCELLED)
return gen.WorkflowRunGetMetrics200JSONResponse( return gen.WorkflowRunGetMetrics200JSONResponse(
gen.WorkflowRunsMetrics{ gen.WorkflowRunsMetrics{
@@ -87,6 +88,7 @@ func (t *WorkflowService) WorkflowRunGetMetrics(ctx echo.Context, request gen.Wo
QUEUED: &queued, QUEUED: &queued,
RUNNING: &running, RUNNING: &running,
SUCCEEDED: &succeeded, SUCCEEDED: &succeeded,
CANCELLED: &cancelled,
}, },
}, },
), nil ), nil

View File

@@ -470,6 +470,9 @@ type EventSearch = string
// EventWorkflowRunSummary defines model for EventWorkflowRunSummary. // EventWorkflowRunSummary defines model for EventWorkflowRunSummary.
type EventWorkflowRunSummary struct { type EventWorkflowRunSummary struct {
// Cancelled The number of cancelled runs.
Cancelled *int64 `json:"cancelled,omitempty"`
// Failed The number of failed runs. // Failed The number of failed runs.
Failed *int64 `json:"failed,omitempty"` Failed *int64 `json:"failed,omitempty"`
@@ -1389,6 +1392,7 @@ type WorkflowRunsMetrics struct {
// WorkflowRunsMetricsCounts defines model for WorkflowRunsMetricsCounts. // WorkflowRunsMetricsCounts defines model for WorkflowRunsMetricsCounts.
type WorkflowRunsMetricsCounts struct { type WorkflowRunsMetricsCounts struct {
CANCELLED *int `json:"CANCELLED,omitempty"`
FAILED *int `json:"FAILED,omitempty"` FAILED *int `json:"FAILED,omitempty"`
PENDING *int `json:"PENDING,omitempty"` PENDING *int `json:"PENDING,omitempty"`
QUEUED *int `json:"QUEUED,omitempty"` QUEUED *int `json:"QUEUED,omitempty"`
@@ -10837,173 +10841,173 @@ var swaggerSpec = []string{
"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",
"//8g0bHh1QICAA==", "4B657svty/8LAAD//1LInh9SAwIA",
} }
// GetSwagger returns the content of the embedded swagger specification file // GetSwagger returns the content of the embedded swagger specification file

View File

@@ -65,6 +65,7 @@ func ToEventFromSQLC(eventRow *dbsqlc.ListEventsRow) (*gen.Event, error) {
Succeeded: &eventRow.Succeededruns, Succeeded: &eventRow.Succeededruns,
Pending: &eventRow.Pendingruns, Pending: &eventRow.Pendingruns,
Queued: &eventRow.Queuedruns, Queued: &eventRow.Queuedruns,
Cancelled: &eventRow.Cancelledruns,
} }
return res, nil return res, nil

View File

@@ -2,7 +2,7 @@ version: "3.8"
services: services:
postgres: postgres:
image: postgres:15.6 image: postgres:15.6
command: postgres -c 'max_connections=200' command: postgres -c 'max_connections=500'
restart: always restart: always
environment: environment:
- POSTGRES_USER=hatchet - POSTGRES_USER=hatchet

View File

@@ -14,6 +14,8 @@ const badgeVariants = cva(
destructive: destructive:
'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80', 'border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80',
outline: 'text-foreground', outline: 'text-foreground',
outlineDestructive:
'border border-destructive rounded-sm px-1 font-normal text-red-800 dark:text-red-300 bg-transparent',
successful: successful:
'border-transparent rounded-sm px-1 font-normal text-green-800 dark:text-green-300 bg-green-500/20 ring-green-500/30', 'border-transparent rounded-sm px-1 font-normal text-green-800 dark:text-green-300 bg-green-500/20 ring-green-500/30',
failed: failed:

View File

@@ -534,6 +534,11 @@ export interface EventWorkflowRunSummary {
* @format int64 * @format int64
*/ */
failed?: number; failed?: number;
/**
* The number of cancelled runs.
* @format int64
*/
cancelled?: number;
} }
export interface Event { export interface Event {
@@ -1143,6 +1148,7 @@ export interface WorkflowRunsMetricsCounts {
SUCCEEDED?: number; SUCCEEDED?: number;
FAILED?: number; FAILED?: number;
QUEUED?: number; QUEUED?: number;
CANCELLED?: number;
} }
export interface WorkflowRunsMetrics { export interface WorkflowRunsMetrics {

View File

@@ -151,7 +151,7 @@ function WorkflowRunSummary({ event }: { event: Event }) {
invariant(tenant); invariant(tenant);
const [hoverCardOpen, setPopoverOpen] = useState< const [hoverCardOpen, setPopoverOpen] = useState<
'failed' | 'succeeded' | 'running' | 'queued' | 'pending' 'failed' | 'succeeded' | 'running' | 'queued' | 'pending' | 'cancelled'
>(); >();
const numFailed = event.workflowRunSummary?.failed || 0; const numFailed = event.workflowRunSummary?.failed || 0;
@@ -159,6 +159,7 @@ function WorkflowRunSummary({ event }: { event: Event }) {
const numRunning = event.workflowRunSummary?.running || 0; const numRunning = event.workflowRunSummary?.running || 0;
const numPending = event.workflowRunSummary?.pending || 0; const numPending = event.workflowRunSummary?.pending || 0;
const numQueued = event.workflowRunSummary?.queued || 0; const numQueued = event.workflowRunSummary?.queued || 0;
const numCancelled = event.workflowRunSummary?.cancelled || 0;
const listWorkflowRunsQuery = useQuery({ const listWorkflowRunsQuery = useQuery({
...queries.workflowRuns.list(tenant.metadata.id, { ...queries.workflowRuns.list(tenant.metadata.id, {
@@ -188,6 +189,9 @@ function WorkflowRunSummary({ event }: { event: Event }) {
if (hoverCardOpen == 'queued') { if (hoverCardOpen == 'queued') {
return run.status == 'QUEUED'; return run.status == 'QUEUED';
} }
if (hoverCardOpen == 'cancelled') {
return run.status == 'CANCELLED';
}
} }
return false; return false;
@@ -219,7 +223,6 @@ function WorkflowRunSummary({ event }: { event: Event }) {
{numFailed > 0 && ( {numFailed > 0 && (
<Popover <Popover
open={hoverCardOpen == 'failed'} open={hoverCardOpen == 'failed'}
// open={true}
onOpenChange={(open) => { onOpenChange={(open) => {
if (!open) { if (!open) {
setPopoverOpen(undefined); setPopoverOpen(undefined);
@@ -347,6 +350,26 @@ function WorkflowRunSummary({ event }: { event: Event }) {
</PopoverContent> </PopoverContent>
</Popover> </Popover>
)} )}
{numCancelled > 0 && (
<Popover
open={hoverCardOpen == 'cancelled'}
onOpenChange={(open) => {
if (!open) {
setPopoverOpen(undefined);
}
}}
>
<PopoverTrigger>
<Badge
variant="outlineDestructive"
className="cursor-pointer"
onClick={() => setPopoverOpen('cancelled')}
>
{numCancelled} Cancelled
</Badge>
</PopoverTrigger>
</Popover>
)}
</div> </div>
); );
} }

View File

@@ -336,6 +336,10 @@ function EventsTable() {
value: WorkflowRunStatus.FAILED, value: WorkflowRunStatus.FAILED,
label: 'Failed', label: 'Failed',
}, },
{
value: WorkflowRunStatus.CANCELLED,
label: 'Cancelled',
},
{ {
value: WorkflowRunStatus.RUNNING, value: WorkflowRunStatus.RUNNING,
label: 'Running', label: 'Running',

View File

@@ -13,7 +13,12 @@ type RunStatusType =
type RunStatusVariant = { type RunStatusVariant = {
text: string; text: string;
variant: 'inProgress' | 'successful' | 'failed' | 'outline'; variant:
| 'inProgress'
| 'successful'
| 'failed'
| 'outline'
| 'outlineDestructive';
}; };
const RUN_STATUS_VARIANTS: Record<RunStatusType, RunStatusVariant> = { const RUN_STATUS_VARIANTS: Record<RunStatusType, RunStatusVariant> = {
@@ -27,7 +32,7 @@ const RUN_STATUS_VARIANTS: Record<RunStatusType, RunStatusVariant> = {
}, },
CANCELLED: { CANCELLED: {
text: 'Cancelled', text: 'Cancelled',
variant: 'failed', variant: 'outlineDestructive',
}, },
CANCELLING: { CANCELLING: {
text: 'Cancelling', text: 'Cancelling',
@@ -121,6 +126,7 @@ const indicatorVariants = {
failed: 'border-transparent rounded-full bg-red-500', failed: 'border-transparent rounded-full bg-red-500',
inProgress: 'border-transparent rounded-full bg-yellow-500', inProgress: 'border-transparent rounded-full bg-yellow-500',
outline: 'border-transparent rounded-full bg-muted', outline: 'border-transparent rounded-full bg-muted',
outlineDestructive: 'border-transparent rounded-full bg-red-500',
}; };
export function RunIndicator({ export function RunIndicator({

View File

@@ -31,7 +31,8 @@ export const WorkflowRunsMetricsView: React.FC<WorkflowRunsMetricsProps> = ({
(counts?.RUNNING ?? 0) + (counts?.RUNNING ?? 0) +
(counts?.SUCCEEDED ?? 0) + (counts?.SUCCEEDED ?? 0) +
(counts?.QUEUED ?? 0) + (counts?.QUEUED ?? 0) +
(counts?.FAILED ?? 0); (counts?.FAILED ?? 0) +
(counts?.CANCELLED ?? 0);
const succeededPercentage = calculatePercentage( const succeededPercentage = calculatePercentage(
counts?.SUCCEEDED ?? 0, counts?.SUCCEEDED ?? 0,
@@ -41,7 +42,10 @@ export const WorkflowRunsMetricsView: React.FC<WorkflowRunsMetricsProps> = ({
const failedPercentage = calculatePercentage(counts?.FAILED ?? 0, total); const failedPercentage = calculatePercentage(counts?.FAILED ?? 0, total);
const pendingPercentage = calculatePercentage(counts?.PENDING ?? 0, total); const pendingPercentage = calculatePercentage(counts?.PENDING ?? 0, total);
const queuedPercentage = calculatePercentage(counts?.QUEUED ?? 0, total); const queuedPercentage = calculatePercentage(counts?.QUEUED ?? 0, total);
const cancelledPercentage = calculatePercentage(
counts?.CANCELLED ?? 0,
total,
);
return ( return (
<dl className="flex flex-row justify-start gap-6"> <dl className="flex flex-row justify-start gap-6">
<Badge <Badge
@@ -67,6 +71,14 @@ export const WorkflowRunsMetricsView: React.FC<WorkflowRunsMetricsProps> = ({
> >
{counts?.FAILED?.toLocaleString('en-US')} Failed ({failedPercentage}%) {counts?.FAILED?.toLocaleString('en-US')} Failed ({failedPercentage}%)
</Badge> </Badge>
<Badge
variant="outlineDestructive"
className="cursor-pointer text-sm px-2 py-1 w-fit"
onClick={() => onClick(WorkflowRunStatus.CANCELLED)}
>
{counts?.CANCELLED?.toLocaleString('en-US')} Cancelled (
{cancelledPercentage}%)
</Badge>
<Badge <Badge
variant="outline" variant="outline"
className="cursor-pointer rounded-sm font-normal text-sm px-2 py-1 w-fit" className="cursor-pointer rounded-sm font-normal text-sm px-2 py-1 w-fit"

View File

@@ -467,6 +467,9 @@ type EventSearch = string
// EventWorkflowRunSummary defines model for EventWorkflowRunSummary. // EventWorkflowRunSummary defines model for EventWorkflowRunSummary.
type EventWorkflowRunSummary struct { type EventWorkflowRunSummary struct {
// Cancelled The number of cancelled runs.
Cancelled *int64 `json:"cancelled,omitempty"`
// Failed The number of failed runs. // Failed The number of failed runs.
Failed *int64 `json:"failed,omitempty"` Failed *int64 `json:"failed,omitempty"`
@@ -1386,6 +1389,7 @@ type WorkflowRunsMetrics struct {
// WorkflowRunsMetricsCounts defines model for WorkflowRunsMetricsCounts. // WorkflowRunsMetricsCounts defines model for WorkflowRunsMetricsCounts.
type WorkflowRunsMetricsCounts struct { type WorkflowRunsMetricsCounts struct {
CANCELLED *int `json:"CANCELLED,omitempty"`
FAILED *int `json:"FAILED,omitempty"` FAILED *int `json:"FAILED,omitempty"`
PENDING *int `json:"PENDING,omitempty"` PENDING *int `json:"PENDING,omitempty"`
QUEUED *int `json:"QUEUED,omitempty"` QUEUED *int `json:"QUEUED,omitempty"`

View File

@@ -185,7 +185,8 @@ event_run_counts AS (
COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS queuedRuns, COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS queuedRuns,
COUNT(CASE WHEN runs."status" = 'RUNNING' THEN 1 END) AS runningRuns, COUNT(CASE WHEN runs."status" = 'RUNNING' THEN 1 END) AS runningRuns,
COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS succeededRuns, COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS succeededRuns,
COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS failedRuns COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS failedRuns,
COUNT(CASE WHEN runs."status" = 'CANCELLED' THEN 1 END) AS cancelledRuns
FROM FROM
filtered_events filtered_events
JOIN JOIN
@@ -203,7 +204,8 @@ SELECT
COALESCE(erc.queuedRuns, 0) AS queuedRuns, COALESCE(erc.queuedRuns, 0) AS queuedRuns,
COALESCE(erc.runningRuns, 0) AS runningRuns, COALESCE(erc.runningRuns, 0) AS runningRuns,
COALESCE(erc.succeededRuns, 0) AS succeededRuns, COALESCE(erc.succeededRuns, 0) AS succeededRuns,
COALESCE(erc.failedRuns, 0) AS failedRuns COALESCE(erc.failedRuns, 0) AS failedRuns,
COALESCE(erc.cancelledRuns, 0) AS cancelledRuns
FROM FROM
filtered_events fe filtered_events fe
JOIN JOIN

View File

@@ -426,7 +426,8 @@ event_run_counts AS (
COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS queuedRuns, COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS queuedRuns,
COUNT(CASE WHEN runs."status" = 'RUNNING' THEN 1 END) AS runningRuns, COUNT(CASE WHEN runs."status" = 'RUNNING' THEN 1 END) AS runningRuns,
COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS succeededRuns, COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS succeededRuns,
COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS failedRuns COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS failedRuns,
COUNT(CASE WHEN runs."status" = 'CANCELLED' THEN 1 END) AS cancelledRuns
FROM FROM
filtered_events filtered_events
JOIN JOIN
@@ -444,7 +445,8 @@ SELECT
COALESCE(erc.queuedRuns, 0) AS queuedRuns, COALESCE(erc.queuedRuns, 0) AS queuedRuns,
COALESCE(erc.runningRuns, 0) AS runningRuns, COALESCE(erc.runningRuns, 0) AS runningRuns,
COALESCE(erc.succeededRuns, 0) AS succeededRuns, COALESCE(erc.succeededRuns, 0) AS succeededRuns,
COALESCE(erc.failedRuns, 0) AS failedRuns COALESCE(erc.failedRuns, 0) AS failedRuns,
COALESCE(erc.cancelledRuns, 0) AS cancelledRuns
FROM FROM
filtered_events fe filtered_events fe
JOIN JOIN
@@ -476,6 +478,7 @@ type ListEventsRow struct {
Runningruns int64 `json:"runningruns"` Runningruns int64 `json:"runningruns"`
Succeededruns int64 `json:"succeededruns"` Succeededruns int64 `json:"succeededruns"`
Failedruns int64 `json:"failedruns"` Failedruns int64 `json:"failedruns"`
Cancelledruns int64 `json:"cancelledruns"`
} }
func (q *Queries) ListEvents(ctx context.Context, db DBTX, arg ListEventsParams) ([]*ListEventsRow, error) { func (q *Queries) ListEvents(ctx context.Context, db DBTX, arg ListEventsParams) ([]*ListEventsRow, error) {
@@ -514,6 +517,7 @@ func (q *Queries) ListEvents(ctx context.Context, db DBTX, arg ListEventsParams)
&i.Runningruns, &i.Runningruns,
&i.Succeededruns, &i.Succeededruns,
&i.Failedruns, &i.Failedruns,
&i.Cancelledruns,
); err != nil { ); err != nil {
return nil, err return nil, err
} }

View File

@@ -99,7 +99,8 @@ SELECT
COUNT(CASE WHEN runs."status" = 'RUNNING' OR runs."status" = 'CANCELLING' THEN 1 END) AS "RUNNING", COUNT(CASE WHEN runs."status" = 'RUNNING' OR runs."status" = 'CANCELLING' THEN 1 END) AS "RUNNING",
COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS "SUCCEEDED", COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS "SUCCEEDED",
COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS "FAILED", COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS "FAILED",
COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS "QUEUED" COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS "QUEUED",
COUNT(CASE WHEN runs."status" = 'CANCELLED' THEN 1 END) AS "CANCELLED"
FROM FROM
"WorkflowRun" as runs "WorkflowRun" as runs
LEFT JOIN LEFT JOIN
@@ -436,11 +437,13 @@ WITH jobRuns AS (
SET "status" = CASE SET "status" = CASE
-- Final states are final, cannot be updated -- Final states are final, cannot be updated
WHEN "status" IN ('SUCCEEDED', 'FAILED') THEN "status" WHEN "status" IN ('SUCCEEDED', 'FAILED') THEN "status"
-- We check for running first, because if a job run is running, then the workflow is running -- We check for cancelled first, because if a job run is cancelled, then the workflow is cancelled
WHEN j.cancelledRuns > 0 THEN 'CANCELLED'
-- Then we check for running, because if a job run is running, then the workflow is running
WHEN j.runningRuns > 0 THEN 'RUNNING' WHEN j.runningRuns > 0 THEN 'RUNNING'
-- When at least one job run has failed or been cancelled, then the workflow is failed -- Then we check for failed, because if a job run has failed, then the workflow is failed
WHEN j.failedRuns > 0 OR j.cancelledRuns > 0 THEN 'FAILED' WHEN j.failedRuns > 0 THEN 'FAILED'
-- When all job runs have succeeded, then the workflow is succeeded -- Then we check for succeeded, because if all job runs have succeeded, then the workflow is succeeded
WHEN j.succeededRuns > 0 AND j.pendingRuns = 0 AND j.runningRuns = 0 AND j.failedRuns = 0 AND j.cancelledRuns = 0 THEN 'SUCCEEDED' WHEN j.succeededRuns > 0 AND j.pendingRuns = 0 AND j.runningRuns = 0 AND j.failedRuns = 0 AND j.cancelledRuns = 0 THEN 'SUCCEEDED'
ELSE "status" ELSE "status"
END, END,

View File

@@ -3009,11 +3009,13 @@ WITH jobRuns AS (
SET "status" = CASE SET "status" = CASE
-- Final states are final, cannot be updated -- Final states are final, cannot be updated
WHEN "status" IN ('SUCCEEDED', 'FAILED') THEN "status" WHEN "status" IN ('SUCCEEDED', 'FAILED') THEN "status"
-- We check for running first, because if a job run is running, then the workflow is running -- We check for cancelled first, because if a job run is cancelled, then the workflow is cancelled
WHEN j.cancelledRuns > 0 THEN 'CANCELLED'
-- Then we check for running, because if a job run is running, then the workflow is running
WHEN j.runningRuns > 0 THEN 'RUNNING' WHEN j.runningRuns > 0 THEN 'RUNNING'
-- When at least one job run has failed or been cancelled, then the workflow is failed -- Then we check for failed, because if a job run has failed, then the workflow is failed
WHEN j.failedRuns > 0 OR j.cancelledRuns > 0 THEN 'FAILED' WHEN j.failedRuns > 0 THEN 'FAILED'
-- When all job runs have succeeded, then the workflow is succeeded -- Then we check for succeeded, because if all job runs have succeeded, then the workflow is succeeded
WHEN j.succeededRuns > 0 AND j.pendingRuns = 0 AND j.runningRuns = 0 AND j.failedRuns = 0 AND j.cancelledRuns = 0 THEN 'SUCCEEDED' WHEN j.succeededRuns > 0 AND j.pendingRuns = 0 AND j.runningRuns = 0 AND j.failedRuns = 0 AND j.cancelledRuns = 0 THEN 'SUCCEEDED'
ELSE "status" ELSE "status"
END, END,
@@ -3469,7 +3471,8 @@ SELECT
COUNT(CASE WHEN runs."status" = 'RUNNING' OR runs."status" = 'CANCELLING' THEN 1 END) AS "RUNNING", COUNT(CASE WHEN runs."status" = 'RUNNING' OR runs."status" = 'CANCELLING' THEN 1 END) AS "RUNNING",
COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS "SUCCEEDED", COUNT(CASE WHEN runs."status" = 'SUCCEEDED' THEN 1 END) AS "SUCCEEDED",
COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS "FAILED", COUNT(CASE WHEN runs."status" = 'FAILED' THEN 1 END) AS "FAILED",
COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS "QUEUED" COUNT(CASE WHEN runs."status" = 'QUEUED' THEN 1 END) AS "QUEUED",
COUNT(CASE WHEN runs."status" = 'CANCELLED' THEN 1 END) AS "CANCELLED"
FROM FROM
"WorkflowRun" as runs "WorkflowRun" as runs
LEFT JOIN LEFT JOIN
@@ -3532,6 +3535,7 @@ type WorkflowRunsMetricsCountRow struct {
SUCCEEDED int64 `json:"SUCCEEDED"` SUCCEEDED int64 `json:"SUCCEEDED"`
FAILED int64 `json:"FAILED"` FAILED int64 `json:"FAILED"`
QUEUED int64 `json:"QUEUED"` QUEUED int64 `json:"QUEUED"`
CANCELLED int64 `json:"CANCELLED"`
} }
func (q *Queries) WorkflowRunsMetricsCount(ctx context.Context, db DBTX, arg WorkflowRunsMetricsCountParams) (*WorkflowRunsMetricsCountRow, error) { func (q *Queries) WorkflowRunsMetricsCount(ctx context.Context, db DBTX, arg WorkflowRunsMetricsCountParams) (*WorkflowRunsMetricsCountRow, error) {
@@ -3552,6 +3556,7 @@ func (q *Queries) WorkflowRunsMetricsCount(ctx context.Context, db DBTX, arg Wor
&i.SUCCEEDED, &i.SUCCEEDED,
&i.FAILED, &i.FAILED,
&i.QUEUED, &i.QUEUED,
&i.CANCELLED,
) )
return &i, err return &i, err
} }