agentplat▸control runs deployments agents metering + agent
← runs

run_5d76cb66b6b476ea

SUCCEEDED retrigger →
workload-health v1 · workload-health-k8s · owner wstuckey@mozilla.com (web-user) · via cli · cloud-engineering

input

{
  "request": "Evaluate the workload health of the provided app_code + component_code",
  "references": [
    "app_code:mzcld-demo",
    "component_code:agentplat"
  ],
  "sourceContext": {}
}

summary

Evaluated the agentplat workload in the mzcld-demo tenant/namespace. I was unable to safely ground a scale or restart proposal: the k8s.workload.read call for mzcld-demo/agentplat was rejected with a 403 Forbidden (the service account mzcld-demo-dev/mzcld-demo lacks get permission on deployments in that namespace), so current replica count, HPA bounds, and restart-count could not be confirmed. Additionally, every metrics.query and logs.query call returned identical stub/sample payloads that are internally inconsistent with the request — each response's `resource` field says "testapp5-api" rather than "agentplat", and the metric field returned was always memory-used-bytes-ratio regardless of the metric requested (request_count, latency_p95, error_rate_5xx, cpu_usage). This indicates the observability backend is either not wired up for this workload or is returning generic canned data, not real telemetry for agentplat. Given no reliable current-state read and no trustworthy resource-specific traffic/resource/log signal, I am not proposing any scale or restart action — doing so would not be grounded in verified evidence for this workload, and could violate the action envelope (min=1/max=3 replicas, 2 restarts/hour) since I cannot confirm current replicas or restart count. Recommend fixing the RBAC binding for the mzcld-demo service account (grant get/list on deployments in namespace mzcld-demo) and verifying the metrics/logs backend is correctly scoped to agentplat before re-running this evaluation.

findings

  • Tenant action envelope for agentplat confirmed
  • Current workload state (replicas, HPA bounds, restart count) could not be read due to RBAC denial
  • Metrics tool responses are inconsistent/untrustworthy for this workload — all five distinct metric queries (request_count, latency_p95, error_rate_5xx, cpu usage, memory usage) returned the exact same stub payload referencing a different resource name
  • Logs tool response is also a generic stub not clearly tied to agentplat
  • No specific alert context was provided (sourceContext empty) — this was a general health-check request, not a response to a firing alert with a known failure signature

proposed actions

none

tool calls

[
  {
    "capability": "tenant.context.read",
    "args": {
      "tenant": "mzcld-demo"
    },
    "result": {
      "tenant": "mzcld-demo",
      "function": "webservices",
      "risk_level": "low",
      "owners": [
        "workgroups/mzcld-demo"
      ],
      "namespaces": [
        "mzcld-demo"
      ],
      "projects": [
        "moz-fx-mzcld-demo-nonprod",
        "moz-fx-mzcld-demo-prod"
      ],
      "workloads": {
        "agentplat": {
          "kind": "Deployment",
          "min_replicas": 1,
          "max_replicas": 3,
          "restart_budget_per_hour": 2
        },
        "mzcld-demo": {
          "kind": "Deployment",
          "min_replicas": 1,
          "max_replicas": 3,
          "restart_budget_per_hour": 2
        }
      },
      "source": "https://github.com/mozilla/global-platform-admin/blob/main/tenants/mzcld-demo.yaml"
    }
  },
  {
    "capability": "k8s.workload.read",
    "args": {
      "namespace": "mzcld-demo",
      "workload": "agentplat"
    },
    "result": {
      "error": "k8s read mzcld-demo/agentplat failed: (403)\nReason: Forbidden\nHTTP response headers: HTTPHeaderDict({'Audit-Id': '80c1cf17-b0c0-4ea6-a8a2-1be8be731a7f', 'Cache-Control': 'no-cache, private', 'Content-Type': 'application/json', 'X-Content-Type-Options': 'nosniff', 'X-Kubernetes-Pf-Flowschema-Uid': 'eab5f5d9-a9f6-4d1f-b07b-109061dd4ab6', 'X-Kubernetes-Pf-Prioritylevel-Uid': '77a566ac-7891-469e-a894-87edbc1d0f8e', 'Date': 'Thu, 23 Jul 2026 18:18:16 GMT', 'Content-Length': '372'})\nHTTP response body: {\"kind\":\"Status\",\"apiVersion\":\"v1\",\"metadata\":{},\"status\":\"Failure\",\"message\":\"deployments.apps \\\"agentplat\\\" is forbidden: User \\\"system:serviceaccount:mzcld-demo-dev:mzcld-demo\\\" cannot get resource \\\"deployments\\\" in API group \\\"apps\\\" in the namespace \\\"mzcld-demo\\\"\",\"reason\":\"Forbidden\",\"details\":{\"name\":\"agentplat\",\"group\":\"apps\",\"kind\":\"deployments\"},\"code\":403}\n\n"
    }
  },
  {
    "capability": "metrics.query",
    "args": {
      "metric": "request_count",
      "resource": "agentplat",
      "window": "30m"
    },
    "result": {
      "stub": true,
      "capability": "metrics.query",
      "args": {
        "metric": "request_count",
        "resource": "agentplat",
        "window": "30m"
      },
      "metric": "kubernetes.io/container/memory/used_bytes",
      "resource": "testapp5-api",
      "window": "30m",
      "unit": "ratio-of-limit",
      "points": [
        0.61,
        0.66,
        0.71,
        0.78,
        0.85
      ],
      "trend": "rising",
      "projection": "[sample] crosses 1.0 (limit) in ~18m at current slope"
    }
  },
  {
    "capability": "metrics.query",
    "args": {
      "metric": "latency_p95",
      "resource": "agentplat",
      "window": "30m"
    },
    "result": {
      "stub": true,
      "capability": "metrics.query",
      "args": {
        "metric": "latency_p95",
        "resource": "agentplat",
        "window": "30m"
      },
      "metric": "kubernetes.io/container/memory/used_bytes",
      "resource": "testapp5-api",
      "window": "30m",
      "unit": "ratio-of-limit",
      "points": [
        0.61,
        0.66,
        0.71,
        0.78,
        0.85
      ],
      "trend": "rising",
      "projection": "[sample] crosses 1.0 (limit) in ~18m at current slope"
    }
  },
  {
    "capability": "metrics.query",
    "args": {
      "metric": "error_rate_5xx",
      "resource": "agentplat",
      "window": "30m"
    },
    "result": {
      "stub": true,
      "capability": "metrics.query",
      "args": {
        "metric": "error_rate_5xx",
        "resource": "agentplat",
        "window": "30m"
      },
      "metric": "kubernetes.io/container/memory/used_bytes",
      "resource": "testapp5-api",
      "window": "30m",
      "unit": "ratio-of-limit",
      "points": [
        0.61,
        0.66,
        0.71,
        0.78,
        0.85
      ],
      "trend": "rising",
      "projection": "[sample] crosses 1.0 (limit) in ~18m at current slope"
    }
  },
  {
    "capability": "metrics.query",
    "args": {
      "metric": "kubernetes.io/container/cpu/core_usage_time",
      "resource": "agentplat",
      "window": "30m"
    },
    "result": {
      "stub": true,
      "capability": "metrics.query",
      "args": {
        "metric": "kubernetes.io/container/cpu/core_usage_time",
        "resource": "agentplat",
        "window": "30m"
      },
      "metric": "kubernetes.io/container/memory/used_bytes",
      "resource": "testapp5-api",
      "window": "30m",
      "unit": "ratio-of-limit",
      "points": [
        0.61,
        0.66,
        0.71,
        0.78,
        0.85
      ],
      "trend": "rising",
      "projection": "[sample] crosses 1.0 (limit) in ~18m at current slope"
    }
  },
  {
    "capability": "metrics.query",
    "args": {
      "metric": "kubernetes.io/container/memory/used_bytes",
      "resource": "agentplat",
      "window": "30m"
    },
    "result": {
      "stub": true,
      "capability": "metrics.query",
      "args": {
        "metric": "kubernetes.io/container/memory/used_bytes",
        "resource": "agentplat",
        "window": "30m"
      },
      "metric": "kubernetes.io/container/memory/used_bytes",
      "resource": "testapp5-api",
      "window": "30m",
      "unit": "ratio-of-limit",
      "points": [
        0.61,
        0.66,
        0.71,
        0.78,
        0.85
      ],
      "trend": "rising",
      "projection": "[sample] crosses 1.0 (limit) in ~18m at current slope"
    }
  },
  {
    "capability": "logs.query",
    "args": {
      "resource": "agentplat",
      "pattern": "OOMKilled|CrashLoopBackOff|error",
      "window": "15m"
    },
    "result": {
      "stub": true,
      "capability": "logs.query",
      "args": {
        "resource": "agentplat",
        "pattern": "OOMKilled|CrashLoopBackOff|error",
        "window": "15m"
      },
      "resource": "testapp5-api",
      "pattern": "OOMKilled",
      "window": "15m",
      "matches": [
        {
          "ts": "1710000000",
          "text": "[sample] Container testapp5-api terminated: reason=OOMKilled"
        },
        {
          "ts": "1710000090",
          "text": "[sample] Back-off restarting failed container"
        }
      ],
      "match_count": 2
    }
  }
]

usage

{
  "model": "claude-sonnet-5",
  "input_tokens": 16633,
  "output_tokens": 3517,
  "estimated_cost_usd": 0.102654
}

approvals

[]

log

launched k8s job run-run-5d76cb66b6b476ea in ns/mzcld-demo-dev image=us-docker.pkg.dev/moz-fx-mzcld-demo-prod/mzcld-demo-prod/agentplat:latest
runner started
live reasoning model=claude-sonnet-5