平台與維運 2026 年 8 月 22 日

2026-08-22 — GitHub Actions 用 microVM 隔離 AI Agent、OpenTelemetry 把慢查詢轉成可排序指標

primary=https://github.com/github/gh-aw/pull/45006 primary=https://docs.docker.com/ai/sandboxes/architecture/ primary=https://www.docker.com/blog/running-ai-agents-in-github-actions-with-docker-sandboxes/ primary=https://opentelemetry.io/docs/specs/semconv/database/ primary=https://github.com/causely-oss/slow-query-lab primary=https://www.cncf.io/blog/2026/08/21/how-to-turn-slow-queries-into-actionable-reliability-metrics-with-opentelemetry/

GitHub Actions 導入 Docker Sandboxes microVM,讓 AI Coding Agent 能安全跑 Testcontainers 自己開 PR

GitHub gh-aw PR #45006 · 2026-08-21

原本的問題

GitHub Agentic Workflows(gh-aw)讓 AI agent 在 CI 裡執行任意 shell 指令、啟動 Docker 容器、安裝套件,藉此完成除錯、修 bug、開 PR 等工作。但這類 agent 需要的權限範圍,與 CI runner 本身的信任邊界互相衝突:直接把 Docker socket 或 runner 權限交給 agent,一旦 agent 誤判或遭提示注入攻擊,破壞範圍就是整台 runner。

採用的方法

gh-aw 在 v0.82.9(PR #45006,2026 年 7 月 12 日合併)新增 docker-sbx runtime,把 agent 丟進一個獨立的 microVM,而不是共用 runner 的容器層。每個 sandbox 都有自己的核心、檔案系統與私有 Docker daemon,彼此不共用 image cache 與 layer。設定方式只需在 workflow frontmatter 宣告:

sandbox:
  agent:
    id: awf
    runtime: docker-sbx
    sudo: true

network:
  allowed:
    - defaults
    - github
    - containers
    - java

寫好的 Markdown workflow 透過 gh aw compile 編譯成標準 GitHub Actions .lock.yml,不需要額外自訂 action。VM 與 host 之間只有明確掛載的 repository 目錄互通,其餘檔案系統彼此隔離;對外流量統一經 host 端 proxy 做網路政策與憑證注入,MCP 呼叫也集中經由一個 gateway 端點轉發,而非讓 agent 直接持有各服務憑證。這個 runtime 的實作(docker_sbx_install.gosandbox_validation.go 等 13 個檔案)包含開機前的 KVM 可用性檢查、Docker 憑證驗證、daemon 初始化與 smoke test,並會擋掉巢狀虛擬化這類不相容設定。

實際效果

Docker 官方部落格用一個示範驗證了整條鏈路:workflow 在 GitHub-hosted Ubuntu runner 上,於 sandbox 內啟動 Java 21 + Maven 容器,跑 Testcontainers 搭配 PostgreSQL 的整合測試,找出一個刻意埋入的 email 大小寫比對 bug,agent 自行修正程式碼後開出 draft pull request,全程耗時 11 分 16 秒。

原始來源:gh-aw PR #45006Docker Sandboxes architectureDocker Blog


用 OpenTelemetry 資料庫語意慣例,把慢查詢攤平成可排序的可靠性指標

OpenTelemetry Database Semantic Conventions · 2026-08-21

原本的問題

資料庫慢查詢是連鎖故障最常見的起點,但多數團隊手上只有原始 trace span,回答不出「哪一條查詢現在最該修」。單看單次查詢耗時沒有意義——一條平均 200ms、但每秒被呼叫上千次的查詢,對整體延遲的影響遠大於一條耗時 2 秒、卻一天只跑一次的報表查詢。CNCF 部落格用一個開源實驗專案示範了如何把這些 span 轉成可直接排序、告警的指標。

採用的方法

整條管線起點是用 otelsql 這個 Go 函式庫包裝 database/sql driver,依照 資料庫語意慣例(Database Semantic Conventions)自動送出帶有 db.systemdb.query.textdb.namespace 等屬性的 client span。這份規範目前狀態是 Mixed(部分穩定、部分實驗性),舊版(v1.24.0 以前)實作預設不應自行切換慣例版本,新舊行為可用環境變數 OTEL_SEMCONV_STABILITY_OPT_IN=databasedatabase/dup 控制切換或雙送。

第二層是在 OpenTelemetry Collector 接上 spanmetrics connector,直接從 DB span 算出以下維度的 histogram 指標,不需要額外埋點:

connectors:
  spanmetrics:
    dimensions:
      - name: db.system
      - name: db.query.text
      - name: db.statement

第三層是拿這些指標接上 Prometheus 的 PromQL anomaly-detection recording rule,用自適應基準線(adaptive baseline)區分「本來就慢」與「這週忽然變慢」兩種查詢,而非設一個固定的絕對門檻。

實際效果

範例程式碼開源在 causely-oss/slow-query-lab,用 Go 服務、PostgreSQL 與 docker-otel-lgtm(打包 Loki、Tempo、Mimir、Grafana)組成一鍵可跑的環境,docker-compose up -d 後會自動起流量產生器灌資料,並附上四張 Grafana dashboard:

  • v1:單純依查詢耗時排序的基礎指標
  • v2:耗時 × 呼叫頻率的流量加權影響分析
  • v3:帶自適應邊界的異常偵測
  • 整合版:三種視角疊在同一張儀表板

原始來源:OpenTelemetry Database Semantic Conventionsslow-query-labCNCF Blog


End of article
0
Would love your thoughts, please comment.x
()
x