fix: expose argo operation timing

This commit is contained in:
Codex
2026-07-03 19:12:08 +00:00
parent 4d370bd0fb
commit e2810d02d7
5 changed files with 19 additions and 2 deletions
@@ -48,6 +48,8 @@ Follower-scoped commands such as `status --follower`, `events --follower`, `logs
Argo closeout visibility must include the bounded reason for non-ready health, not only `Synced/Progressing`: health message, operation phase/message, short Application conditions and a small list of non-healthy resources when available.
When Argo exposes operation start/finish timestamps, stage timing rows should report the Argo operation duration directly. Missing timestamps still render `-`; do not infer Argo duration from total elapsed time or from unrelated runtime polling.
The automatic controller loop is non-blocking, so closeout acceleration cannot live only in the user-facing `--wait` path. Once a triggered PipelineRun has succeeded and required runtime/GitOps gates are not aligned, the in-cluster controller path should perform the same bounded target-side Argo refresh used by wait closeout; otherwise convergence depends on Argo's background poll interval and can exceed the 120s budget even when Tekton finished quickly.
Stage timing rows must not label optional gates as `not-ready` when they are not part of that follower's closeout contract. For sentinel-like followers without a GitOps branch flush gate, git-mirror source snapshot readiness should render as source-ready/ready, while missing GitOps `githubInSync` remains `-`/not-applicable instead of a failure-looking state.
@@ -115,7 +115,13 @@ if (key === "pipelineRun") {
: [],
nonReadyResources,
operationState: input?.status?.operationState
? { phase: input.status.operationState.phase || null, message: input.status.operationState.message || null, finishedAt: input.status.operationState.finishedAt || null }
? {
phase: input.status.operationState.phase || null,
message: input.status.operationState.message || null,
startedAt: input.status.operationState.startedAt || null,
finishedAt: input.status.operationState.finishedAt || null,
durationSeconds: durationSeconds(input.status.operationState.startedAt, input.status.operationState.finishedAt),
}
: null,
},
};
@@ -194,6 +194,9 @@ function compactArgo(argo) {
revision: stringOrNull(value.revision),
operationPhase: stringOrNull(value.operationPhase),
operationMessage: stringOrNull(value.operationMessage),
operationStartedAt: stringOrNull(value.operationStartedAt),
operationFinishedAt: stringOrNull(value.operationFinishedAt),
operationDurationSeconds: numberOrNull(value.operationDurationSeconds),
conditions: arrayRecords(value.conditions).slice(0, 5),
nonReadyResources: arrayRecords(value.nonReadyResources).slice(0, 5),
ready: value.ready === true,
+3
View File
@@ -319,6 +319,9 @@ function compactStatusGates(payload: Record<string, unknown> | null): Record<str
revision: stringOrNull(argo.revision),
operationPhase: stringOrNull(argo.operationPhase),
operationMessage: stringOrNull(argo.operationMessage),
operationStartedAt: stringOrNull(argo.operationStartedAt),
operationFinishedAt: stringOrNull(argo.operationFinishedAt),
operationDurationSeconds: numberOrNull(argo.operationDurationSeconds),
conditions: Array.isArray(argo.conditions) ? argo.conditions.slice(0, 5) : [],
nonReadyResources: Array.isArray(argo.nonReadyResources) ? argo.nonReadyResources.slice(0, 5) : [],
ready: argo.ready === true,
+4 -1
View File
@@ -1755,6 +1755,9 @@ function nativeArgoSummary(application: Record<string, unknown> | null): Record<
revision: stringOrNull(sync?.revision),
operationPhase: stringOrNull(operationState?.phase),
operationMessage: stringOrNull(operationState?.message),
operationStartedAt: stringOrNull(operationState?.startedAt),
operationFinishedAt: stringOrNull(operationState?.finishedAt),
operationDurationSeconds: numberOrNull(operationState?.durationSeconds),
conditions: Array.isArray(status?.conditions) ? status.conditions.slice(0, 5) : [],
nonReadyResources: Array.isArray(status?.nonReadyResources) ? status.nonReadyResources.slice(0, 5) : [],
ready: argoApplicationReady(application),
@@ -2423,7 +2426,7 @@ function stageTimingsFromNativePayload(payload: Record<string, unknown> | null):
}
const argo = asOptionalRecord(payload.argo);
if (argo !== null) {
stages.push(stageTiming("argo", `${stringOrNull(argo.syncStatus) ?? "unknown"}/${stringOrNull(argo.healthStatus) ?? "unknown"}`, null, null, "argocd", stringOrNull(argo.name)));
stages.push(stageTiming("argo", `${stringOrNull(argo.syncStatus) ?? "unknown"}/${stringOrNull(argo.healthStatus) ?? "unknown"}`, numberOrNull(argo.operationDurationSeconds), null, "argocd", stringOrNull(argo.name)));
}
const runtime = asOptionalRecord(payload.runtime);
if (runtime !== null) {