Milestone 465 "Swarm task awareness". Fixes three defects from the live MCP review #4973: - #5008 "Swarm task history read as live state" - #5009 "Crash-loop detection is blind to Swarm services" - #5011 "Swarm task errors are not captured" Agent and ingest (agent 1.8.0): - A manager's agent now reports each service's newest tasks: slot, node, desired and current state, Swarm's Err/Message, exit code and time. - They are stored in docker_swarm_services.tasks_json (migration docker_010_swarm_tasks). Swarm view (pure): - A task container is "replaced" when Swarm set its task's desired state off `running`. Without the task on record, a newer or running task in the same slot decides. - Replaced containers are no longer replicas or crashes. - Each service gets, from the task records: - failures_1h and failures_24h (failed or rejected tasks); - crash_looping (Settings → Thresholds count); - last_error, in Swarm's own words. MCP: - New findings: swarm_service_crash_looping (critical) and swarm_task_failed (warning, on a healthy service with a failure in 24h). - Down and degraded findings name the last task error. - list_swarm_services carries the failure fields. - Container rows mark swarm_replaced and give a replaced task no problems. Web: - The containers page swarm cards and the Swarm topology page show crash loops, recent failures and the last task error. - The dashboard widget flags a crash loop, and its "failed (24h)" count no longer counts a rolling update's killed task. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
1.1 KiB
Python
31 lines
1.1 KiB
Python
"""Docker swarm service tasks column
|
|
|
|
Adds docker_swarm_services.tasks_json — each service's newest tasks as a
|
|
manager's agent (≥ 1.8.0) reports them: slot, node, desired and current state,
|
|
Swarm's error and message, exit code and time. Lets Steward tell a task Swarm
|
|
replaced from one that crashed, count a service's failures across task
|
|
retries, and say why its last task failed. Additive column; no DROP+recreate.
|
|
|
|
Revision ID: docker_010_swarm_tasks
|
|
Revises: docker_009_container_logs
|
|
Create Date: 2026-10-06
|
|
"""
|
|
from typing import Sequence, Union
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
|
|
revision: str = "docker_010_swarm_tasks"
|
|
down_revision: Union[str, None] = "docker_009_container_logs"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.add_column("docker_swarm_services",
|
|
sa.Column("tasks_json", sa.Text, nullable=False,
|
|
server_default="[]"))
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_column("docker_swarm_services", "tasks_json")
|