argoproj/argo-workflows · warning
no artifact logs are available
Error message
no artifact logs are available
What it means
When a node has no log artifacts stored (hasArtifactLogs returns false) and a nodeId IS provided, the service throws 'no artifact logs are available'. This means Argo never archived logs for that container, so there is nothing to download from the artifact repository.
Source
Thrown at ui/src/shared/services/workflows-service.ts:246
async isWorkflowNodePendingOrRunning(workflow: Workflow, nodeId?: string) {
// We always refresh the workflow rather than inspecting the state locally since it doubles
// as a check to determine whether or not the API is currently reachable
const updatedWorkflow = await this.get(workflow.metadata.namespace, workflow.metadata.name);
const node = updatedWorkflow.status.nodes[nodeId];
if (!node) {
return !updatedWorkflow.status || ['Pending', 'Running'].includes(updatedWorkflow.status.phase);
}
return isNodePendingOrRunning(node);
},
getContainerLogsFromArtifact(workflow: Workflow, nodeId: string, container: string, grep: string, archived: boolean): Observable<LogEntry> {
return of(hasArtifactLogs(workflow, nodeId, container)).pipe(
switchMap(isArtifactLogs => {
if (!isArtifactLogs) {
if (!nodeId) {
throw new Error('Should specify a node when we get archived logs');
}
throw new Error('no artifact logs are available');
}
return from(requests.get(this.getArtifactLogsPath(workflow, nodeId, container, archived)));
}),
mergeMap(r => r.text.split('\n')),
map(content => ({content, podName: workflow.status.nodes[nodeId].displayName}) as LogEntry),
filter(x => !!x.content.match(grep))
);
},
getContainerLogs(workflow: Workflow, podName: string, nodeId: string, container: string, grep: string, archived: boolean): Observable<LogEntry> {
const getLogsFromArtifact = () => this.getContainerLogsFromArtifact(workflow, nodeId, container, grep, archived);
const getLogsFromCluster = () => this.getContainerLogsFromCluster(workflow, podName, container, grep);
// If our workflow was deleted, try to get logs from artifacts.
if (!isWorkflowInCluster(workflow)) {
return getLogsFromArtifact();
}View on GitHub (pinned to 35bff19146)
Solutions
- Check the node's outputs.artifacts in workflow.status.nodes[nodeId] for a logs artifact before requesting.
- Enable log archiving (workflow.spec.archiveLogs: true) or configure an artifact repository so logs are saved.
- Fall back to fetching live pod logs via the k8s API if the pod still exists.
Example fix
// before
logsService.getLogsFromArtifact(wf, nodeId, 'main', '', true).subscribe(...)
// after
const node = wf.status.nodes?.[nodeId];
const hasLogs = node?.outputs?.artifacts?.some(a => a.artifactGC || a.name === 'main-logs');
if (!hasLogs) { showError('no artifact logs are available'); } else { logsService.getLogsFromArtifact(wf, nodeId, 'main', '', true).subscribe(...); } Defensive patterns
Strategy: fallback
Validate before calling
const node = wf.status?.nodes?.[nodeId];
const hasLogArtifact = node?.outputs?.artifacts?.some(a => a.name.endsWith('-logs')) ?? false;
if (!hasLogArtifact) console.warn('No archived logs for node', nodeId); Type guard
function hasArchivedLogs(wf: Workflow, nodeId: string): boolean {
const node = wf.status?.nodes?.[nodeId];
return Array.isArray(node?.outputs?.artifacts) &&
node.outputs.artifacts.some(a => a.name.includes('logs'));
} Try / catch
service.getLogsFromArtifact(wf, nodeId, 'main', '', true).subscribe({
error: err => {
if (err.message === 'no artifact logs are available') {
showEmptyLogsMessage(nodeId);
}
}
}); Prevention
- Set workflow.spec.archiveLogs: true on workflows whose logs you need later.
- Configure an artifact repository so logs are actually persisted.
- Check node.outputs.artifacts before rendering the logs tab.
When it happens
Trigger: Calling getContainerLogsFromArtifact with a valid nodeId for a node whose outputs contain no logs artifact (e.g. logs were not saved, pod deleted before archiving, or container never ran).
Common situations: Pods deleted before log archiving completed; workflows run with archiveLogs disabled or no artifact repository configured; steps that failed before producing output; viewing old workflows in the archive UI.
Related errors
- Should specify a node when we get archived logs
- cron schedules must consist of 5 values only
- cron schedules must consist of 5 values only
- --since-time and --since cannot be used together
- Artifact driver connection validation failed: %v
AI-assisted analysis of argoproj/argo-workflows@35bff19146 (2026-09-03).
Data as JSON: /api/errors/f7763b55eae04065.
Report an issue: GitHub.